Install
openclaw skills install clickfunnelsClickFunnels 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.
openclaw skills install clickfunnelsAccess 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