Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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 orders, or build marketing automation. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | 180% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 310% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 217% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 268% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 535% | 0% |
Access the ClickFunnels 2.0 API with managed OAuth authentication. Manage contacts, products, orders, courses, forms, webhooks, and more.
bash# 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.0Environment Variable: Set your API key as MATON_API_KEY:
bashexport MATON_API_KEY="YOUR_API_KEY"
Manage your ClickFunnels OAuth connections at https://ctrl.maton.ai.
bashpython <<'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
bashpython <<'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
bashpython <<'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:
json{ "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.
bashpython <<'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:
bashpython <<'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.
bashGET /clickfunnels/api/v2/teams
Response:
json[ { "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" } ]
bashGET /clickfunnels/api/v2/teams/{team_id}
bashGET /clickfunnels/api/v2/teams/{team_id}/workspaces
Response:
json[ { "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" } ]
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts
With filtering:
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user@example.com
Response:
json[ { "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" } ]
bashGET /clickfunnels/api/v2/contacts/{contact_id}
bashPOST /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" } }
bashPUT /clickfunnels/api/v2/contacts/{contact_id} Content-Type: application/json { "contact": { "first_name": "Updated Name", "phone_number": "+1987654321" } }
bashDELETE /clickfunnels/api/v2/contacts/{contact_id}
Returns HTTP 204 on success.
Create or update a contact based on matching email:
bashPOST /clickfunnels/api/v2/workspaces/{workspace_id}/contacts/upsert Content-Type: application/json { "contact": { "email_address": "user@example.com", "first_name": "Updated" } }
bashDELETE /clickfunnels/api/v2/workspaces/{workspace_id}/contacts/{contact_id}/gdpr_destroy
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/products
Response:
json[ { "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" } ]
bashGET /clickfunnels/api/v2/products/{product_id}
bashPOST /clickfunnels/api/v2/workspaces/{workspace_id}/products Content-Type: application/json { "product": { "name": "New Product", "visible_in_store": true, "visible_in_customer_center": true } }
bashPUT /clickfunnels/api/v2/products/{product_id} Content-Type: application/json { "product": { "name": "Updated Product Name" } }
bashPOST /clickfunnels/api/v2/products/{product_id}/archive
bashPOST /clickfunnels/api/v2/products/{product_id}/unarchive
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/orders
bashGET /clickfunnels/api/v2/orders/{order_id}
bashPUT /clickfunnels/api/v2/orders/{order_id} Content-Type: application/json { "order": { "notes": "Updated order notes" } }
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillments
bashGET /clickfunnels/api/v2/fulfillments/{fulfillment_id}
bashPOST /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 } }
bashPOST /clickfunnels/api/v2/fulfillments/{fulfillment_id}/cancel
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/courses
bashGET /clickfunnels/api/v2/courses/{course_id}
bashGET /clickfunnels/api/v2/courses/{course_id}/enrollments
bashPOST /clickfunnels/api/v2/courses/{course_id}/enrollments Content-Type: application/json { "courses_enrollment": { "contact_id": 1087091674 } }
bashPUT /clickfunnels/api/v2/courses/{course_id}/enrollments/{enrollment_id} Content-Type: application/json { "courses_enrollment": { "suspended": true, "suspension_reason": "Payment failed" } }
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/forms
Response:
json[ { "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" } ]
bashGET /clickfunnels/api/v2/forms/{form_id}
bashGET /clickfunnels/api/v2/forms/{form_id}/submissions
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/images
Response:
json[ { "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" } ]
bashPOST /clickfunnels/api/v2/workspaces/{workspace_id}/images Content-Type: application/json { "image": { "upload_source_url": "https://example.com/image.png" } }
bashGET /clickfunnels/api/v2/workspaces/{workspace_id}/webhooks/outgoing/endpoints
Response:
json[ { "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" } ]
bashPOST /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"] } }
bashGET /clickfunnels/api/v2/webhooks/outgoing/endpoints/{endpoint_id}
bashPUT /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"] } }
bashDELETE /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:
bashGET /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:
bash# 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:
bash# 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
javascriptconst 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();
pythonimport os import requests response = 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()
pythonimport os import requests response = 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:bashecho $MATON_API_KEY
bashpython <<'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/teamsOther measured skills in the registry, with their headline benchmark lift.