# ClickFunnels Routing Reference

**App name:** `clickfunnels`
**Base URL proxied:** `{subdomain}.myclickfunnels.com`

The router automatically handles the subdomain from your OAuth connection.

## API Path Pattern

```
/clickfunnels/api/v2/{resource}
```

## Required Headers

THe `User-Agent` header is required to avoid Cloudflare blocks:

```
User-Agent: Maton/1.0
```

## Common Endpoints

### Teams

#### List Teams
```bash
GET /clickfunnels/api/v2/teams
```

#### Get Team
```bash
GET /clickfunnels/api/v2/teams/{team_id}
```

### Workspaces

#### List Workspaces
```bash
GET /clickfunnels/api/v2/teams/{team_id}/workspaces
```

#### Get Workspace
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}
```

### Contacts

#### List Contacts
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts
```

#### Get Contact
```bash
GET /clickfunnels/api/v2/contacts/{contact_id}
```

#### Create Contact
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/contacts
Content-Type: application/json

{
  "contact": {
    "email_address": "user@example.com",
    "first_name": "John",
    "last_name": "Doe"
  }
}
```

#### Update Contact
```bash
PUT /clickfunnels/api/v2/contacts/{contact_id}
Content-Type: application/json

{
  "contact": {
    "first_name": "Updated"
  }
}
```

#### Delete Contact
```bash
DELETE /clickfunnels/api/v2/contacts/{contact_id}
```

#### Upsert Contact
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/contacts/upsert
```

### Products

#### List Products
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/products
```

#### Get Product
```bash
GET /clickfunnels/api/v2/products/{product_id}
```

#### Create Product
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/products
Content-Type: application/json

{
  "product": {
    "name": "New Product",
    "visible_in_store": true
  }
}
```

#### Archive/Unarchive Product
```bash
POST /clickfunnels/api/v2/products/{product_id}/archive
POST /clickfunnels/api/v2/products/{product_id}/unarchive
```

### Orders

#### List Orders
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/orders
```

#### Get Order
```bash
GET /clickfunnels/api/v2/orders/{order_id}
```

### Fulfillments

#### List Fulfillments
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillments
```

#### Create Fulfillment
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/fulfillments
```

#### Cancel Fulfillment
```bash
POST /clickfunnels/api/v2/fulfillments/{fulfillment_id}/cancel
```

### Courses & Enrollments

#### List Courses
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/courses
```

#### List Enrollments
```bash
GET /clickfunnels/api/v2/courses/{course_id}/enrollments
```

#### Create Enrollment
```bash
POST /clickfunnels/api/v2/courses/{course_id}/enrollments
```

### Forms & Submissions

#### List Forms
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/forms
```

#### List Submissions
```bash
GET /clickfunnels/api/v2/forms/{form_id}/submissions
```

### Webhooks

#### List Webhook Endpoints
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/webhooks/outgoing/endpoints
```

#### Create Webhook Endpoint
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/webhooks/outgoing/endpoints
Content-Type: application/json

{
  "webhooks_outgoing_endpoint": {
    "url": "https://example.com/webhook",
    "name": "My Webhook",
    "event_type_ids": ["contact.created"]
  }
}
```

#### Delete Webhook Endpoint
```bash
DELETE /clickfunnels/api/v2/webhooks/outgoing/endpoints/{endpoint_id}
```

### Images

#### List Images
```bash
GET /clickfunnels/api/v2/workspaces/{workspace_id}/images
```

#### Upload Image via URL
```bash
POST /clickfunnels/api/v2/workspaces/{workspace_id}/images
Content-Type: application/json

{
  "image": {
    "upload_source_url": "https://example.com/image.png"
  }
}
```

## Pagination

Cursor-based pagination with 20 items per page:

```bash
# First page
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts

# Next page (use ID from Pagination-Next header)
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?after=1087091674
```

Response headers:
- `Pagination-Next`: ID of last item
- `Link`: Full URL for next page

## Filtering

```bash
# Single filter
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user@example.com

# Multiple values (OR)
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=a@example.com,b@example.com

# Multiple filters (AND)
GET /clickfunnels/api/v2/workspaces/{workspace_id}/contacts?filter[email_address]=user@example.com&filter[id]=123
```

## Notes

- Subdomain is automatically determined from your OAuth connection
- IDs are integers; each resource also has a `public_id` string
- Request bodies use nested keys: `{"contact": {...}}`, `{"product": {...}}`
- List endpoints: use `workspaces/{id}/{resource}` pattern
- Single resource: use `/{resource}/{id}` pattern (no workspace prefix)
- Delete operations return HTTP 204 with empty body
- Max 20 items per page, use `after` parameter for pagination

## Resources

- [ClickFunnels API Introduction](https://developers.myclickfunnels.com/docs/intro)
- [ClickFunnels API Reference](https://developers.myclickfunnels.com/reference)
- [Pagination Guide](https://developers.myclickfunnels.com/docs/pagination)
- [Filtering Guide](https://developers.myclickfunnels.com/docs/filtering)
