Authenticate every request with a workspace API key, in either header:
Authorization: Bearer <key>
The key prefix selects the host — co_live_… → https://api.custom.one,
co_test_… → https://dev.api.custom.one. All paths are under /api/v1.
Grouped by what you are doing. This table is an index — the contract is the
OpenAPI document at the bottom of the page, generated from the API itself, and a
build check fails if the two ever disagree.
Method & path
Purpose
GET /me
Test authentication.
Method & path
Purpose
GET /funnels
List funnels of the workspace (for platform dropdowns).
GET /funnels/:id
One custom: its three version pointers, whether the draft has moved, and where a person opens it.
GET /templates
Templates you can clone.
GET /funnels/:id/fields
List a funnel’s mappable columns.
GET /funnels/:id/readiness
What still stands between this draft and a publish.
GET /funnels/:id/questions
The draft’s questions.
GET /funnels/:id/scores
The draft’s score definitions.
GET /funnels/:id/segments
The scenes: which clips exist and when each plays.
Method & path
Purpose
POST /funnels
Create a custom, optionally cloned from a template.
PATCH /funnels/:id/questions
REPLACE the question set.
PATCH /funnels/:id/scores
REPLACE the score set.
PATCH /funnels/:id/segments
REPLACE the scenes.
POST /funnels/:id/clip-scripts
Write the words a human will read on camera.
POST /funnels/:id/pages/:pageSlug/html-blocks
Add Custom HTML blocks to a result page, and get a link showing how it renders. Placement only — you write the HTML.
POST /funnels/:id/result-page-previews
See a draft result page for one set of answers, without publishing. Returns a link that expires.
POST /funnels/:id/publish
Take the draft live.
DELETE /funnels/:id
Move a custom to the trash. Soft — it stays recoverable from the dashboard.
Method & path
Purpose
GET /leads
List the workspace’s leads, newest first.
POST /leads
Create a lead in a funnel (Action).
PATCH /leads/:id
Update a lead.
GET /leads/sample
Recent leads shaped like the diagnostic.submitted payload (for platform trigger tests).
GET /tags
List the workspace tags (for dropdowns).
POST /leads/:id/tags
Add tags (by name, created if missing) to the lead’s contact.
DELETE /leads/:id/tags
Remove tags (by name) from the lead’s contact.
Method & path
Purpose
POST /sources
Create a per-funnel inbound endpoint.
GET /sources
List a funnel’s inbound sources (never the secret).
GET /sources/:id
One inbound source (never the secret).
PATCH /sources/:id
Amend name, field mappings, active state or autoSubmit.
DELETE /sources/:id
Delete an inbound source.
GET /sources/:id/secret
Rebuild the ingest URL for an existing source.
POST /sources/:id/rotate-secret
Mint a new secret.
POST /sources/:id/import
Import CSV text as PENDING rows.
Method & path
Purpose
POST /hooks
Subscribe a REST hook (instant trigger).
GET /hooks
List API-created hooks of the workspace.
PATCH /hooks/:id
Change a subscription in place.
DELETE /hooks/:id
Unsubscribe a REST hook (dashboard-created webhooks are not reachable here).
The complete, machine-readable contract — every parameter, response schema and
error — is the OpenAPI document, generated from the API itself:
Point your code generator or AI agent at that URL. A rendered interactive
explorer is coming.