Access the ClickFunnels 2.0 API with managed OAuth authentication. Manage contacts, products, orders, courses, forms, webhooks, and more.
# List teams
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/clickfunnels/api/v2/teams')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('User-Agent', 'Maton/1.0')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/clickfunnels/{native-api-path}
Maton proxies requests to {subdomain}.myclickfunnels.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header and a User-Agent header:
Authorization: Bearer $MATON_API_KEY
User-Agent: Maton/1.0
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your ClickFunnels OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=clickfunnels&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': 'clickfunnels'}).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": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "clickfunnels",
"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 ClickFunnels 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/clickfunnels/api/v2/teams')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('User-Agent', 'Maton/1.0')
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 /clickfunnels/api/v2/teams
Response:
[
{
"id": 412840,
"public_id": "vPNqAp",
"name": "My Team",
"time_zone": "Pacific Time (US & Canada)",
"locale": "en",
"created_at": "2026-02-07T09:28:29.709Z",
"updated_at": "2026-02-07T11:14:32.118Z"
}
]
GET /clickfunnels/api/v2/teams/{team_id}
GET /clickfunnels/api/v2/teams/{team_id}/workspaces
Response:
[
{
"id": 435231,
"public_id": "JZqWGb",
"team_id": 412840,
"name": "My Workspace",
"subdomain": "myworkspace",
"created_at": "2026-02-07T09:28:31.268Z",
"updated_at": "2026-02-07T09:28:34.498Z"
}
]
GET /clickfunnels/api/v2/workspaces/{workspace_id}
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts
With filtering:
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user@example.com
Response:
[
{
"id": 1087091674,
"public_id": "PWzmxEx",
"workspace_id": 435231,
"email_address": "user@example.com",
"first_name": "John",
"last_name": "Doe",
"phone_number": null,
"time_zone": null,
"uuid": "eb7a970c-727d-4c82-9209-bd8f7457a801",
"tags": [],
"custom_attributes": {},
"created_at": "2026-02-07T09:28:52.713Z",
"updated_at": "2026-02-07T09:28:52.777Z"
}
]
GET /clickfunnels/api/v2/contacts/{contact_id}
POST /clickfunnels/api/v2/workspaces/{workspace_id}/contacts
Content-Type: application/json
{
"contact": {
"email_address": "newuser@example.com",
"first_name": "Jane",
"last_name": "Smith",
"phone_number": "+1234567890"
}
}
PUT /clickfunnels/api/v2/contacts/{contact_id}
Content-Type: application/json
{
"contact": {
"first_name": "Updated Name",
"phone_number": "+1987654321"
}
}
DELETE /clickfunnels/api/v2/contacts/{contact_id}
Returns HTTP 204 on success.
Create or update a contact based on matching email:
POST /clickfunnels/api/v2/workspaces/{workspace_id}/contacts/upsert
Content-Type: application/json
{
"contact": {
"email_address": "user@example.com",
"first_name": "Updated"
}
}
DELETE /clickfunnels/api/v2/workspaces/{workspace_id}/contacts/{contact_id}/gdpr_destroy
GET /clickfunnels/api/v2/workspaces/{workspace_id}/products
Response:
[
{
"id": 962732,
"public_id": "jAvBEA",
"workspace_id": 435231,
"name": "My Product",
"current_path": "/my-product",
"archived": false,
"visible_in_store": true,
"visible_in_customer_center": true,
"default_variant_id": 5361073,
"variant_ids": [5361073],
"price_ids": [],
"tag_ids": [],
"created_at": "2026-02-09T07:23:02.158Z",
"updated_at": "2026-02-09T07:23:02.163Z"
}
]
GET /clickfunnels/api/v2/products/{product_id}
POST /clickfunnels/api/v2/workspaces/{workspace_id}/products
Content-Type: application/json
{
"product": {
"name": "New Product",
"visible_in_store": true,
"visible_in_customer_center": true
}
}
PUT /clickfunnels/api/v2/products/{product_id}
Content-Type: application/json
{
"product": {
"name": "Updated Product Name"
}
}
POST /clickfunnels/api/v2/products/{product_id}/archive
POST /clickfunnels/api/v2/products/{product_id}/unarchive
GET /clickfunnels/api/v2/workspaces/{workspace_id}/orders
GET /clickfunnels/api/v2/orders/{order_id}
PUT /clickfunnels/api/v2/orders/{order_id}
Content-Type: application/json
{
"order": {
"notes": "Updated order notes"
}
}
GET /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillments
GET /clickfunnels/api/v2/fulfillments/{fulfillment_id}
POST /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillments
Content-Type: application/json
{
"fulfillment": {
"contact_id": 1087091674,
"location_id": 12345,
"tracking_url": "https://tracking.example.com/123",
"shipping_provider": "ups",
"tracking_code": "1Z999AA10123456784",
"notify_customer": true
}
}
POST /clickfunnels/api/v2/fulfillments/{fulfillment_id}/cancel
GET /clickfunnels/api/v2/workspaces/{workspace_id}/courses
GET /clickfunnels/api/v2/courses/{course_id}
GET /clickfunnels/api/v2/courses/{course_id}/enrollments
POST /clickfunnels/api/v2/courses/{course_id}/enrollments
Content-Type: application/json
{
"courses_enrollment": {
"contact_id": 1087091674
}
}
PUT /clickfunnels/api/v2/courses/{course_id}/enrollments/{enrollment_id}
Content-Type: application/json
{
"courses_enrollment": {
"suspended": true,
"suspension_reason": "Payment failed"
}
}
GET /clickfunnels/api/v2/workspaces/{workspace_id}/forms
Response:
[
{
"id": 442896,
"public_id": "NdOxzL",
"workspace_id": 435231,
"name": "Contact Form",
"created_at": "2026-02-07T09:28:33.316Z",
"updated_at": "2026-02-07T09:28:33.316Z"
}
]
GET /clickfunnels/api/v2/forms/{form_id}
GET /clickfunnels/api/v2/forms/{form_id}/submissions
GET /clickfunnels/api/v2/workspaces/{workspace_id}/images
Response:
[
{
"id": 20670308,
"public_id": "mvvWWM",
"url": "https://statics.myclickfunnels.com/workspace/JZqWGb/image/20670308/file/image.png",
"workspace_id": 435231,
"alt_text": null,
"name": null,
"created_at": "2026-02-07T09:28:40.102Z",
"updated_at": "2026-02-07T09:29:01.697Z"
}
]
POST /clickfunnels/api/v2/workspaces/{workspace_id}/images
Content-Type: application/json
{
"image": {
"upload_source_url": "https://example.com/image.png"
}
}
GET /clickfunnels/api/v2/workspaces/{workspace_id}/webhooks/outgoing/endpoints
Response:
[
{
"id": 96677,
"public_id": "vBZlEl",
"workspace_id": 435231,
"url": "https://example.com/webhook",
"name": "My Webhook",
"event_type_ids": ["contact.created"],
"api_version": 2,
"webhook_secret": "e779d4b2faa7d986...",
"created_at": "2026-02-09T07:23:22.295Z",
"updated_at": "2026-02-09T07:23:22.295Z"
}
]
POST /clickfunnels/api/v2/workspaces/{workspace_id}/webhooks/outgoing/endpoints
Content-Type: application/json
{
"webhooks_outgoing_endpoint": {
"url": "https://example.com/webhook",
"name": "New Webhook",
"event_type_ids": ["contact.created", "order.created"]
}
}
GET /clickfunnels/api/v2/webhooks/outgoing/endpoints/{endpoint_id}
PUT /clickfunnels/api/v2/webhooks/outgoing/endpoints/{endpoint_id}
Content-Type: application/json
{
"webhooks_outgoing_endpoint": {
"name": "Updated Webhook",
"event_type_ids": ["contact.created", "contact.updated"]
}
}
DELETE /clickfunnels/api/v2/webhooks/outgoing/endpoints/{endpoint_id}
Returns HTTP 204 on success.
ClickFunnels uses cursor-based pagination. Each list endpoint returns a maximum of 20 items.
Use the after parameter with the ID of the last item to get the next page:
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?after=1087091674
Response Headers:
Pagination-Next: ID of the last item (use for next page)Link: Full URL for the next pageExample pagination flow:
# First page
GET /clickfunnels/api/v2/workspaces/{workspace_id}/images
# Response header: Pagination-Next: 20670327
# Next page
GET /clickfunnels/api/v2/workspaces/{workspace_id}/images?after=20670327
Use the filter query parameter to filter list results:
# Filter by email
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user@example.com
# Filter by multiple emails (OR)
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user1@example.com,user2@example.com
# Multiple filters (AND)
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user@example.com&filter[id]=1087091674
const response = await fetch(
'https://api.maton.ai/clickfunnels/api/v2/teams',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
'User-Agent': 'Maton/1.0'
}
}
);
const teams = await response.json();
import os
import requests
response = requests.get(
'https://api.maton.ai/clickfunnels/api/v2/teams',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'User-Agent': 'Maton/1.0'
}
)
teams = response.json()
import os
import requests
response = requests.post(
'https://api.maton.ai/clickfunnels/api/v2/workspaces/435231/contacts',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json',
'User-Agent': 'Maton/1.0'
},
json={
'contact': {
'email_address': 'newuser@example.com',
'first_name': 'Jane',
'last_name': 'Smith'
}
}
)
contact = response.json()
public_id (string) for public-facing URLsafter parameter for pagination{"contact": {...}})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 ClickFunnels connection |
| 401 | Invalid or missing Maton API key |
| 404 | Resource not found |
| 422 | Validation error (check response body) |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from ClickFunnels 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
clickfunnels. For example:https://api.maton.ai/clickfunnels/api/v2/teamshttps://api.maton.ai/api/v2/teams共 2 个版本