Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
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.
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.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
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"
Sign in or create an account at maton.ai Go to maton.ai/settings Copy 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.
List Teams 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 Team GET /clickfunnels/api/v2/teams/{team_id}
List Workspaces 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 Workspace GET /clickfunnels/api/v2/workspaces/{workspace_id}
List Contacts 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 Contact GET /clickfunnels/api/v2/contacts/{contact_id} Create Contact 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" } } Update Contact PUT /clickfunnels/api/v2/contacts/{contact_id} Content-Type: application/json { "contact": { "first_name": "Updated Name", "phone_number": "+1987654321" } } Delete Contact DELETE /clickfunnels/api/v2/contacts/{contact_id} Returns HTTP 204 on success. Upsert Contact 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" } } GDPR Redact Contact DELETE /clickfunnels/api/v2/workspaces/{workspace_id}/contacts/{contact_id}/gdpr_destroy
List Products 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 Product GET /clickfunnels/api/v2/products/{product_id} Create Product 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 } } Update Product PUT /clickfunnels/api/v2/products/{product_id} Content-Type: application/json { "product": { "name": "Updated Product Name" } } Archive Product POST /clickfunnels/api/v2/products/{product_id}/archive Unarchive Product POST /clickfunnels/api/v2/products/{product_id}/unarchive
List Orders GET /clickfunnels/api/v2/workspaces/{workspace_id}/orders Get Order GET /clickfunnels/api/v2/orders/{order_id} Update Order PUT /clickfunnels/api/v2/orders/{order_id} Content-Type: application/json { "order": { "notes": "Updated order notes" } }
List Fulfillments GET /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillments Get Fulfillment GET /clickfunnels/api/v2/fulfillments/{fulfillment_id} Create Fulfillment 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 } } Cancel Fulfillment POST /clickfunnels/api/v2/fulfillments/{fulfillment_id}/cancel
List Courses GET /clickfunnels/api/v2/workspaces/{workspace_id}/courses Get Course GET /clickfunnels/api/v2/courses/{course_id}
List Enrollments GET /clickfunnels/api/v2/courses/{course_id}/enrollments Create Enrollment POST /clickfunnels/api/v2/courses/{course_id}/enrollments Content-Type: application/json { "courses_enrollment": { "contact_id": 1087091674 } } Update Enrollment PUT /clickfunnels/api/v2/courses/{course_id}/enrollments/{enrollment_id} Content-Type: application/json { "courses_enrollment": { "suspended": true, "suspension_reason": "Payment failed" } }
List Forms 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 Form GET /clickfunnels/api/v2/forms/{form_id} List Form Submissions GET /clickfunnels/api/v2/forms/{form_id}/submissions
List Images 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" } ] Create Image (via URL) POST /clickfunnels/api/v2/workspaces/{workspace_id}/images Content-Type: application/json { "image": { "upload_source_url": "https://example.com/image.png" } }
List Webhook Endpoints 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" } ] Create Webhook Endpoint 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 Webhook Endpoint GET /clickfunnels/api/v2/webhooks/outgoing/endpoints/{endpoint_id} Update Webhook Endpoint 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 Webhook Endpoint 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 page Example 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://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 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()
import 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()
Team IDs, workspace IDs, and resource IDs are integers Each resource also has a public_id (string) for public-facing URLs List endpoints return max 20 items per page by default Use after parameter for pagination Delete operations return HTTP 204 with empty response Request bodies use nested resource keys (e.g., {"contact": {...}}) Images max size: 10MB, max dimensions: 10,000 x 10,000 pixels Supported image formats: JPEG, PNG, WebP, GIF, SVG IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments
StatusMeaning400Missing ClickFunnels connection401Invalid or missing Maton API key404Resource not found422Validation error (check response body)429Rate limited4xx/5xxPassthrough error from ClickFunnels API
Check that the MATON_API_KEY environment variable is set: echo $MATON_API_KEY Verify the API key is valid by listing connections: 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
Ensure your URL path starts with clickfunnels. For example: Correct: https://gateway.maton.ai/clickfunnels/api/v2/teams Incorrect: https://gateway.maton.ai/api/v2/teams
ClickFunnels API Introduction ClickFunnels API Reference Pagination Guide Filtering Guide Webhooks Overview Maton Community Maton Support
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.