ClickFunnels
ClickFunnels API integration with managed OAuth. Manage contacts, products, orders, courses, forms, and webhooks. Use this skill when users want to create sales funnels, manage contacts, process order
ClickFunnels API integration with managed OAuth. Manage contacts, products, orders, courses, forms, and webhooks. Use this skill when users want to create sales funnels, manage contacts, process order
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
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://gateway.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://gateway.maton.ai/clickfunnels/{native-api-path}
Replace
{native-api-path} with the actual ClickFunnels API endpoint path. The gateway 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://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.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://ctrl.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://ctrl.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": "21fd90f9-5935-43cd-b6c8-bde9d915ca80", "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://ctrl.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://gateway.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', '21fd90f9-5935-43cd-b6c8-bde9d915ca80') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
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}/imagesResponse 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.comFilter 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://gateway.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 requestsresponse = requests.get( 'https://gateway.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 requestsresponse = requests.post( 'https://gateway.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://ctrl.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://gateway.maton.ai/clickfunnels/api/v2/teamshttps://gateway.maton.ai/api/v2/teamsNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.