Install
openclaw skills install kitKit (formerly ConvertKit) API integration with managed OAuth. Manage email subscribers, forms, tags, sequences, broadcasts, and custom fields. Use this skill when users want to manage their email marketing lists, create or update subscribers, manage tags, or work with email sequences and broadcasts. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
openclaw skills install kitAccess the Kit (formerly ConvertKit) API with managed OAuth authentication. Manage subscribers, tags, forms, sequences, broadcasts, custom fields, and webhooks.
# List subscribers
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/kit/v4/subscribers?per_page=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/kit/{native-api-path}
Maton proxies requests to api.kit.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Kit OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=kit&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'kit'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-02-07T00:04:08.476727Z",
"last_updated_time": "2026-02-07T00:05:58.001964Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "kit",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Kit connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/kit/v4/subscribers')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
GET /kit/v4/subscribers
Query parameters:
per_page - Results per page (default: 500, max: 1000)after - Cursor for next pagebefore - Cursor for previous pagestatus - Filter by: active, inactive, bounced, complained, cancelled, or allemail_address - Filter by specific emailcreated_after / created_before - Filter by creation date (yyyy-mm-dd)updated_after / updated_before - Filter by update date (yyyy-mm-dd)include_total_count - Include total count (slower)Response:
{
"subscribers": [
{
"id": 3914682852,
"first_name": "Test User",
"email_address": "test@example.com",
"state": "active",
"created_at": "2026-02-07T00:42:54Z",
"fields": {"company": null}
}
],
"pagination": {
"has_previous_page": false,
"has_next_page": false,
"start_cursor": "WzE0OV0=",
"end_cursor": "WzE0OV0=",
"per_page": 500
}
}
GET /kit/v4/subscribers/{id}
POST /kit/v4/subscribers
Content-Type: application/json
{
"email_address": "user@example.com",
"first_name": "John"
}
PUT /kit/v4/subscribers/{id}
Content-Type: application/json
{
"first_name": "Updated Name"
}
GET /kit/v4/tags
Query parameters: per_page, after, before, include_total_count
POST /kit/v4/tags
Content-Type: application/json
{
"name": "new-tag"
}
Response:
{
"tag": {
"id": 15690016,
"name": "new-tag",
"created_at": "2026-02-07T00:42:53Z"
}
}
PUT /kit/v4/tags/{id}
Content-Type: application/json
{
"name": "updated-tag-name"
}
DELETE /kit/v4/tags/{id}
Returns 204 No Content on success.
POST /kit/v4/tags/{tag_id}/subscribers
Content-Type: application/json
{
"email_address": "user@example.com"
}
DELETE /kit/v4/tags/{tag_id}/subscribers/{subscriber_id}
Returns 204 No Content on success.
GET /kit/v4/tags/{tag_id}/subscribers
GET /kit/v4/forms
Query parameters:
per_page, after, before, include_total_countstatus - Filter by: active, archived, trashed, or alltype - embed for embedded forms, hosted for landing pagesResponse:
{
"forms": [
{
"id": 9061198,
"name": "Creator Profile",
"created_at": "2026-02-07T00:00:32Z",
"type": "embed",
"format": null,
"embed_js": "https://chris-kim-2.kit.com/c682763b07/index.js",
"embed_url": "https://chris-kim-2.kit.com/c682763b07",
"archived": false,
"uid": "c682763b07"
}
],
"pagination": {...}
}
POST /kit/v4/forms/{form_id}/subscribers
Content-Type: application/json
{
"email_address": "user@example.com"
}
GET /kit/v4/forms/{form_id}/subscribers
GET /kit/v4/sequences
Response:
{
"sequences": [
{
"id": 123,
"name": "Welcome Sequence",
"hold": false,
"repeat": false,
"created_at": "2026-01-01T00:00:00Z"
}
],
"pagination": {...}
}
POST /kit/v4/sequences/{sequence_id}/subscribers
Content-Type: application/json
{
"email_address": "user@example.com"
}
GET /kit/v4/sequences/{sequence_id}/subscribers
GET /kit/v4/broadcasts
Query parameters: per_page, after, before, include_total_count
Response:
{
"broadcasts": [
{
"id": 123,
"publication_id": 456,
"created_at": "2026-02-07T00:00:00Z",
"subject": "My Broadcast",
"preview_text": "Preview...",
"content": "<p>Content</p>",
"public": false,
"published_at": null,
"send_at": null,
"email_template": {"id": 123, "name": "Text only"}
}
],
"pagination": {...}
}
GET /kit/v4/segments
Query parameters: per_page, after, before, include_total_count
GET /kit/v4/custom_fields
Response:
{
"custom_fields": [
{
"id": 1192946,
"name": "ck_field_1192946_company",
"key": "company",
"label": "Company"
}
],
"pagination": {...}
}
POST /kit/v4/custom_fields
Content-Type: application/json
{
"label": "Company"
}
PUT /kit/v4/custom_fields/{id}
Content-Type: application/json
{
"label": "Company Name"
}
DELETE /kit/v4/custom_fields/{id}
Returns 204 No Content on success.
GET /kit/v4/purchases
Query parameters: per_page, after, before, include_total_count
GET /kit/v4/email_templates
Response:
{
"email_templates": [
{
"id": 4956167,
"name": "Text only",
"is_default": true,
"category": "Classic"
}
],
"pagination": {...}
}
GET /kit/v4/webhooks
POST /kit/v4/webhooks
Content-Type: application/json
{
"target_url": "https://example.com/webhook",
"event": {"name": "subscriber.subscriber_activate"}
}
Response:
{
"webhook": {
"id": 5291560,
"account_id": 2596262,
"event": {
"name": "subscriber_activate",
"initiator_value": null
},
"target_url": "https://example.com/webhook"
}
}
DELETE /kit/v4/webhooks/{id}
Returns 204 No Content on success.
Kit uses cursor-based pagination. Use after and before query parameters with cursor values from the response.
GET /kit/v4/subscribers?per_page=100&after=WzE0OV0=
Response includes pagination info:
{
"subscribers": [...],
"pagination": {
"has_previous_page": false,
"has_next_page": true,
"start_cursor": "WzE0OV0=",
"end_cursor": "WzI0OV0=",
"per_page": 100
}
}
const response = await fetch(
'https://api.maton.ai/kit/v4/subscribers?per_page=10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
import os
import requests
response = requests.get(
'https://api.maton.ai/kit/v4/subscribers',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'per_page': 10}
)
data = response.json()
curl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| 400 | Missing Kit connection |
| 401 | Invalid or missing Maton API key |
| 403 | Insufficient permissions (check OAuth scopes) |
| 404 | Resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Kit API |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
kit. For example:https://api.maton.ai/kit/v4/subscribershttps://api.maton.ai/v4/subscribers