Access 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共 2 个版本