Co-Create CRM™

API version 1 · OpenAPI document

API docs

Read and update your CRM from your own tools, and hear about changes with webhooks. Every example uses https://crm.example.com and the made-up token ccrm_your_token_here: use your CRM's address and your own token.

Getting started

Make a personal access token in your CRM profile, under AI assistants and API. Send it on every request as a bearer token. A token acts as you, in the workspace you made it in: it sees the same companies and locations you do, with your role, and nothing more.

A read only token can list and read. A read and write token can also add and change contacts, consent, tags, deals and tasks, and manage webhooks if you're an agency admin or a company owner.

The API never sends email, text messages or social posts to anyone. There are no send endpoints.

This reference is also an OpenAPI 3.1 document at /api/v1/openapi.json, which needs no token.

curl https://crm.example.com/api/v1/locations \
  -H "Authorization: Bearer ccrm_your_token_here"

Responses and pages

One record comes back as { "data": { ... } }. Lists come back as { "data": [ ... ], "next_cursor": "..." }, in the order each list describes. Pass next_cursor as the cursor parameter to get the next page; it is null on the last page. limit sets the page size, up to 200 (50 if you leave it out).

Ids are uuids. Times are ISO 8601 in UTC. Money is whole CAD cents. Keys are snake_case. Request bodies are JSON, and fields the API doesn't know are refused rather than ignored.

To keep a copy in sync, list contacts with updated_since set a minute or two before your last sync started, and page through.

Errors

Errors come back as { "error": { "code": "...", "message": "..." } }, with details for validation errors. The message is written for people; the code is for your program.

Codes: unauthorized (401), read_only_token, forbidden, two_factor_required (403), not_found (404), invalid_request, invalid_json, invalid_cursor, invalid_url, consent_evidence_missing, consent_backdating (400), duplicate_contact, consent_on_record, webhook_paused, too_many_webhooks, conflict (409), payload_too_large (413), rate_limited (429) and internal_error (500).

Rate limits

Each token can make 300 requests a minute. Past that, requests get 429 with a Retry-After header saying how many seconds to wait. Requests with a missing or wrong token are limited to 20 a minute from each IP address, and that address then waits before even a good token works.

Request bodies can be up to 256 KB.

AI and API access policy

Each company's owners decide what tokens can see about its people, in the company's AI and API access settings. It applies to every token, because the CRM can't tell an AI assistant from any other app. Contacts outside the policy, and everything linked to them, are simply not there: lists leave them out and asking for one by id gets 404.

Details the policy holds back come back as the text [hidden by policy] in place of the value: email, phone, town and consent addresses, or custom fields. Notes and messages, deals and orders, and form answers can be held back as a whole. When a company turns personal tokens off, its people's tokens get 403 tokens_off until it's turned back on.

Every request that returns or changes people's records is logged for the company's owners, with the token's name.

Webhooks

Agency admins and company owners can have the CRM post events to an https address: in Settings, or with /webhooks below. Each event is a POST with a JSON body: { "id", "type", "created_at", "company_id", "data" }. data is the record, shaped as the API returns it. The id is the same for every webhook that gets the event, so you can drop repeats.

Answer with any 2xx status within 10 seconds. Anything else, including a redirect, counts as a failure. Failures are tried again after 1, 3, 9, 27 and 81 minutes, then about 4 hours and 12 hours: 8 tries in all, over about 18 hours. After 5 failures in a row the webhook is marked as failing in Settings until a delivery gets through.

Every delivery is signed. The ccrm-signature header looks like t=1760500000,v1=5257a869..., where v1 is the hex HMAC-SHA256 of the time, a full stop and the raw body, keyed with your signing secret (all of it, including whsec_). Check it against the raw body before you parse it, and refuse deliveries more than 5 minutes old. Other headers: ccrm-event, ccrm-event-id and ccrm-delivery.

Events: contact.created (a contact is added), contact.updated (a contact's details or tags change), consent.recorded (consent is recorded), consent.withdrawn (someone unsubscribes), form.submitted (a form is submitted), deal.created (a deal is added), deal.moved (a deal moves stage), task.completed (a task is done), appointment.booked (an appointment is booked), appointment.updated (an appointment is moved, confirmed, cancelled or marked done), order.paid (an order is paid at a checkout). contact.updated data also lists the changed fields in changed. The test button sends webhook.test.

// Node: check a delivery before trusting it.
import { createHmac, timingSafeEqual } from "node:crypto";

function verify(secret, header, rawBody) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  const given = Buffer.from(parts.v1 || "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}

Locations

The business locations your token can see.

GET /api/v1/locations

List the locations your token can see

Token access: read only or read and write.

Returns 200 A page of Location

curl "https://crm.example.com/api/v1/locations" \
  -H "Authorization: Bearer ccrm_your_token_here"

Contacts

People at a location. Consent fields are read only; record consent with the consent endpoint.

GET /api/v1/contacts

List contacts, most recently changed first

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
location_idquerystring (uuid)NoOnly this location
tagquerystringNoA tag. Trimmed and stored in lower case.. 1 to 50 characters
emailquerystringNoOnly contacts with this email address (any case). up to 254 characters
updated_sincequerystring (date-time)NoOnly contacts changed at or after this time (ISO 8601)
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Contact

curl "https://crm.example.com/api/v1/contacts?updated_since=2026-10-01T00:00:00Z&limit=50" \
  -H "Authorization: Bearer ccrm_your_token_here"

POST /api/v1/contacts

Add a contact

Records no consent and sends nothing. If a contact at that location already has the email, you get 409 duplicate_contact with existing_id.

Token access: read and write.

Body (JSON)

FieldTypeRequiredAbout
location_idstring (uuid)Yes
full_namestringYes1 to 200 characters.
emailstring (email), or nullNoUp to 254 characters.
phonestring, or nullNoAt least 10 digits. Stored as +1 and the number. Up to 40 characters.
tagsarray of stringNoUp to 20 items.

Returns 201 Contact

curl -X POST "https://crm.example.com/api/v1/contacts" \
  -H "Authorization: Bearer ccrm_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "location_id": "8d2f4b6a-1c3e-4a5b-9d7f-0e1a2b3c4d5e",
  "full_name": "Avery Example",
  "email": "avery@example.com",
  "phone": "250-555-0142",
  "tags": [
    "newsletter"
  ]
}'

GET /api/v1/contacts/{id}

Get one contact, with what the consent check decides right now

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Returns 200 ContactDetail

curl "https://crm.example.com/api/v1/contacts/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b" \
  -H "Authorization: Bearer ccrm_your_token_here"

PATCH /api/v1/contacts/{id}

Change a contact's name, email or phone

Consent can't be changed here. Changing an email or phone that has consent on record is refused with 409 consent_on_record.

Token access: read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Body (JSON)

FieldTypeRequiredAbout
full_namestringNo1 to 200 characters.
emailstring (email), or nullNoUp to 254 characters.
phonestring, or nullNoUp to 40 characters.

Returns 200 Contact

curl -X PATCH "https://crm.example.com/api/v1/contacts/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b" \
  -H "Authorization: Bearer ccrm_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "full_name": "Avery Example-Smith"
}'

Tags

Short labels on contacts, like vip or newsletter.

GET /api/v1/tags

List the tags in use, with how many contacts have each

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
location_idquerystring (uuid)NoOnly this location

Returns 200 A page of Tag

curl "https://crm.example.com/api/v1/tags" \
  -H "Authorization: Bearer ccrm_your_token_here"

POST /api/v1/contacts/{id}/tags

Add tags to a contact

Token access: read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Body (JSON)

FieldTypeRequiredAbout
tagsarray of stringYesUp to 20 items.

Returns 200 Contact

curl -X POST "https://crm.example.com/api/v1/contacts/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b/tags" \
  -H "Authorization: Bearer ccrm_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "tags": [
    "vip",
    "spring open house"
  ]
}'

DELETE /api/v1/contacts/{id}/tags/{tag}

Take a tag off a contact

Token access: read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe contact's id
tagpathstringYesA tag. Trimmed and stored in lower case.. 1 to 50 characters

Returns 200 Contact

curl -X DELETE "https://crm.example.com/api/v1/contacts/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b/tags/vip" \
  -H "Authorization: Bearer ccrm_your_token_here"

Forms

Website forms and what people sent through them.

GET /api/v1/forms

List forms, newest first

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
location_idquerystring (uuid)NoOnly this location
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Form

curl "https://crm.example.com/api/v1/forms" \
  -H "Authorization: Bearer ccrm_your_token_here"

GET /api/v1/forms/{id}/submissions

List one form's submissions, newest first

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id
created_sincequerystring (date-time)NoOnly submissions sent at or after this time (ISO 8601)
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Submission

curl "https://crm.example.com/api/v1/forms/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b/submissions" \
  -H "Authorization: Bearer ccrm_your_token_here"

Pipeline

Pipelines, their stages, and deals in CAD.

GET /api/v1/pipelines

List pipelines and their stages

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
location_idquerystring (uuid)NoOnly this location

Returns 200 A page of Pipeline

curl "https://crm.example.com/api/v1/pipelines" \
  -H "Authorization: Bearer ccrm_your_token_here"

GET /api/v1/deals

List deals, newest first

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
location_idquerystring (uuid)No
pipeline_idquerystring (uuid)No
stage_idquerystring (uuid)No
contact_idquerystring (uuid)No
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Deal

curl "https://crm.example.com/api/v1/deals" \
  -H "Authorization: Bearer ccrm_your_token_here"

POST /api/v1/deals

Add a deal

Goes in the first open stage unless you give stage_id. Owned by you unless you give owner_membership_id (null for nobody).

Token access: read and write.

Body (JSON)

FieldTypeRequiredAbout
pipeline_idstring (uuid)Yes
stage_idstring (uuid)No
namestringYes1 to 200 characters.
value_centsintegerNoValue in CAD cents. 0 to 100000000000.
contact_idstring (uuid), or nullNo
owner_membership_idstring (uuid), or nullNo

Returns 201 Deal

curl -X POST "https://crm.example.com/api/v1/deals" \
  -H "Authorization: Bearer ccrm_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "pipeline_id": "5a7c9e1b-3d5f-4a6b-8c0d-2e4f6a8b0c1d",
  "name": "Kitchen refresh quote",
  "value_cents": 1250000
}'

POST /api/v1/deals/{id}/move

Move a deal to another stage of its pipeline

Token access: read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Body (JSON)

FieldTypeRequiredAbout
stage_idstring (uuid)Yes

Returns 200 Deal

curl -X POST "https://crm.example.com/api/v1/deals/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b/move" \
  -H "Authorization: Bearer ccrm_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "stage_id": "9b1d3f5a-7c9e-4b0d-8f2a-4c6e8a0b2d4f"
}'

Tasks

To-dos at a location.

GET /api/v1/tasks

List tasks, newest first

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
location_idquerystring (uuid)No
statusqueryone of open, doneNo
assignee_membership_idquerystring (uuid)No
contact_idquerystring (uuid)No
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Task

curl "https://crm.example.com/api/v1/tasks?status=open" \
  -H "Authorization: Bearer ccrm_your_token_here"

POST /api/v1/tasks

Add a task

Assigned to you unless you give assignee_membership_id (null for nobody). The assignee must work at the location.

Token access: read and write.

Body (JSON)

FieldTypeRequiredAbout
location_idstring (uuid)Yes
titlestringYes1 to 300 characters.
notesstringNoUp to 5000 characters.
due_onstring, or nullNoA date, like 2026-10-15.
assignee_membership_idstring (uuid), or nullNo
contact_idstring (uuid), or nullNo

Returns 201 Task

curl -X POST "https://crm.example.com/api/v1/tasks" \
  -H "Authorization: Bearer ccrm_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "location_id": "8d2f4b6a-1c3e-4a5b-9d7f-0e1a2b3c4d5e",
  "title": "Call back about the quote",
  "due_on": "2026-10-20"
}'

POST /api/v1/tasks/{id}/complete

Mark a task done

Staff can complete their own tasks only, as in the CRM.

Token access: read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Returns 200 Task

curl -X POST "https://crm.example.com/api/v1/tasks/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b/complete" \
  -H "Authorization: Bearer ccrm_your_token_here"

Appointments

Bookings on each location's calendar, soonest first. Read only.

GET /api/v1/appointments

List appointments, soonest first

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
location_idquerystring (uuid)No
fromquerystring (date-time)NoStarting at or after this time. Defaults to now.
toquerystring (date-time)NoStarting before this time
statusqueryone of booked, confirmed, done, no_show, cancelledNo
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Appointment

curl "https://crm.example.com/api/v1/appointments?status=booked" \
  -H "Authorization: Bearer ccrm_your_token_here"

Events

Events and who registered. Read only.

GET /api/v1/events

List events, latest start first

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
location_idquerystring (uuid)No
statusqueryone of draft, open, closed, cancelledNo
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Event

curl "https://crm.example.com/api/v1/events" \
  -H "Authorization: Bearer ccrm_your_token_here"

GET /api/v1/events/{id}/registrations

List one event's registrations, newest first

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id
statusqueryone of going, waitlist, cancelledNo
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Registration

curl "https://crm.example.com/api/v1/events/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b/registrations" \
  -H "Authorization: Bearer ccrm_your_token_here"

Webhooks

Where the CRM posts events. Agency admins and company owners only.

GET /api/v1/webhooks

List webhooks

Agency admins and company owners only.

Token access: read only or read and write.

Returns 200 A page of Webhook

curl "https://crm.example.com/api/v1/webhooks" \
  -H "Authorization: Bearer ccrm_your_token_here"

POST /api/v1/webhooks

Add a webhook

The answer includes the signing secret, this once only. The address must be https and must not point to a private or local network. Agency admins and company owners only.

Token access: read and write.

Body (JSON)

FieldTypeRequiredAbout
urlstringYesWhere to post events. https only. 1 to 2000 characters.
eventsarray of one of contact.created, contact.updated, consent.recorded, consent.withdrawn, form.submitted, deal.created, deal.moved, task.completed, appointment.booked, appointment.updated, order.paidYesEvents to send: contact.created, contact.updated, consent.recorded, consent.withdrawn, form.submitted, deal.created, deal.moved, task.completed, appointment.booked, appointment.updated, order.paid. Up to 11 items.
descriptionstring, or nullNoA note to tell webhooks apart. Up to 200 characters.
company_idstring (uuid), or nullNoAgency admins: one company, or null for every company. Owners: always their own company.

Returns 201 NewWebhook

curl -X POST "https://crm.example.com/api/v1/webhooks" \
  -H "Authorization: Bearer ccrm_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://hooks.example.com/crm",
  "events": [
    "contact.created",
    "form.submitted"
  ],
  "description": "New leads to our booking tool"
}'

GET /api/v1/webhooks/{id}

Get one webhook

Agency admins and company owners only.

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Returns 200 Webhook

curl "https://crm.example.com/api/v1/webhooks/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b" \
  -H "Authorization: Bearer ccrm_your_token_here"

PATCH /api/v1/webhooks/{id}

Change, pause or resume a webhook

Agency admins and company owners only.

Token access: read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Body (JSON)

FieldTypeRequiredAbout
urlstringNo1 to 2000 characters.
eventsarray of one of contact.created, contact.updated, consent.recorded, consent.withdrawn, form.submitted, deal.created, deal.moved, task.completed, appointment.booked, appointment.updated, order.paidNoEvents to send: contact.created, contact.updated, consent.recorded, consent.withdrawn, form.submitted, deal.created, deal.moved, task.completed, appointment.booked, appointment.updated, order.paid. Up to 11 items.
descriptionstring, or nullNoA note to tell webhooks apart. Up to 200 characters.
activebooleanNofalse pauses deliveries; true resumes them and clears a failing streak.

Returns 200 Webhook

curl -X PATCH "https://crm.example.com/api/v1/webhooks/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b" \
  -H "Authorization: Bearer ccrm_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "active": false
}'

DELETE /api/v1/webhooks/{id}

Delete a webhook

Deliveries still waiting are cancelled. Past deliveries are kept as history. Agency admins and company owners only.

Token access: read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Returns 200 object

curl -X DELETE "https://crm.example.com/api/v1/webhooks/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b" \
  -H "Authorization: Bearer ccrm_your_token_here"

GET /api/v1/webhooks/{id}/deliveries

List a webhook's deliveries, newest first

Agency admins and company owners only.

Token access: read only or read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id
limitqueryintegerNoHow many to return. 1 to 200, default 50
cursorquerystringNonext_cursor from the previous page. up to 200 characters

Returns 200 A page of Delivery

curl "https://crm.example.com/api/v1/webhooks/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b/deliveries" \
  -H "Authorization: Bearer ccrm_your_token_here"

POST /api/v1/webhooks/{id}/test

Send a test event

Queues a webhook.test delivery, sent and retried like any other. Agency admins and company owners only.

Token access: read and write.

Parameters

NameInTypeRequiredAbout
idpathstring (uuid)YesThe record's id

Returns 202 Delivery

curl -X POST "https://crm.example.com/api/v1/webhooks/3f1c5a7e-2b4d-4e6f-8a1b-9c0d1e2f3a4b/test" \
  -H "Authorization: Bearer ccrm_your_token_here"

Webhook events

Each event's data is the record shown, as the API returns it. See Webhooks for the signature and retries.

EventWhendata
contact.createdA contact is addedContact
contact.updatedA contact's details or tags changeContact
consent.recordedConsent is recordedConsentRecord
consent.withdrawnSomeone unsubscribesConsentRecord
form.submittedA form is submittedSubmission
deal.createdA deal is addedDeal
deal.movedA deal moves stageDeal
task.completedA task is doneTask
appointment.bookedAn appointment is bookedAppointment
appointment.updatedAn appointment is moved, confirmed, cancelled or marked doneAppointment
order.paidAn order is paid at a checkoutobject

Records

Location

FieldTypeAlways thereAbout
idstring (uuid)Yes
namestringYes
company_idstring (uuid)Yes
company_namestringYes
business_namestring, or nullYes
provincestring, or nullYesTwo-letter province or territory code.
timezonestringYes
regulated_retailbooleanYesCannabis or liquor: marketing only to age-verified contacts.
sender_missingarray of stringYesSender details still needed before marketing can go out.
created_atstring (date-time)Yes

Contact

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
full_namestringYes
emailstring, or nullYes
phonestring, or nullYesE.164, like +12505550123.
age_verifiedbooleanYesRead only. Set in the CRM.
tagsarray of stringYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

ContactDetail

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
full_namestringYes
emailstring, or nullYes
phonestring, or nullYesE.164, like +12505550123.
age_verifiedbooleanYesRead only. Set in the CRM.
tagsarray of stringYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
consentobjectYesRead only. What the consent check decides right now, per channel.

ConsentRecord

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
contact_idstring (uuid)Yes
channelone of email, sms, dmYes
typeone of express, implied_purchase, implied_inquiry, implied_donation, implied_volunteer, implied_membership, withdrawnYes
recorded_atstring (date-time)YesAlways the moment the CRM received it.
sourcestringYes
wordingstring, or nullYes
created_atstring (date-time)Yes

Tag

FieldTypeAlways thereAbout
tagstringYes
contactsintegerYesHow many contacts you can see have it.

Form

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
namestringYes
statusone of active, pausedYes
consent_enabledbooleanYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Submission

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
form_idstring (uuid)Yes
contact_idstring (uuid), or nullYes
answersobject of stringYesField id to answer.
consent_givenbooleanYes
page_urlstring, or nullYes
referrerstring, or nullYes
utmobject of stringYes
created_atstring (date-time)Yes

Pipeline

FieldTypeAlways thereAbout
idstring (uuid)Yes
location_idstring (uuid)Yes
namestringYes
stagesarray of objectYes
created_atstring (date-time)Yes

Deal

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
pipeline_idstring (uuid)Yes
stage_idstring (uuid)Yes
namestringYes
value_centsintegerYes
currencyCADYes
contact_idstring (uuid), or nullYes
owner_membership_idstring (uuid), or nullYes
stage_entered_atstring (date-time)Yes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Task

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
titlestringYes
notesstring, or nullYes
due_onstring, or nullYesA date, like 2026-10-15.
statusone of open, doneYes
kindone of todo, social_postYes
assignee_membership_idstring (uuid), or nullYes
contact_idstring (uuid), or nullYes
done_atstring (date-time), or nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Appointment

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
type_idstring (uuid)Yes
type_namestringYes
contact_idstring (uuid)Yes
staff_membership_idstring (uuid), or nullYes
starts_atstring (date-time)Yes
ends_atstring (date-time)Yes
time_zonestringYesThe location's time zone, like America/Vancouver.
buffer_minutesintegerYes
price_centsinteger, or nullYes
currencyCADYes
deposit_requiredbooleanYes
statusone of booked, confirmed, done, no_show, cancelledYes
notesstring, or nullYes
sourceone of staff, booking_pageYes
created_atstring (date-time)Yes

Event

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid)Yes
location_idstring (uuid)Yes
titlestringYes
descriptionstring, or nullYes
venuestring, or nullYes
starts_atstring (date-time)Yes
ends_atstring (date-time), or nullYes
capacityinteger, or nullYes
statusone of draft, open, closed, cancelledYes
goingintegerYes
waitlistintegerYes
checked_inintegerYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Registration

FieldTypeAlways thereAbout
idstring (uuid)Yes
event_idstring (uuid)Yes
contact_idstring (uuid)Yes
full_namestringYes
statusone of going, waitlist, cancelledYes
sourceone of public_form, staffYes
checked_in_atstring (date-time), or nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Webhook

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid), or nullYesnull: every company in the agency.
descriptionstring, or nullYes
urlstringYes
eventsarray of stringYes
activebooleanYes
healthybooleanYes
failure_countintegerYesFailed attempts in a row.
unhealthy_sincestring (date-time), or nullYes
last_success_atstring (date-time), or nullYes
last_failure_atstring (date-time), or nullYes
secret_prefixstringYesThe first characters of the signing secret.
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

NewWebhook

FieldTypeAlways thereAbout
idstring (uuid)Yes
company_idstring (uuid), or nullYesnull: every company in the agency.
descriptionstring, or nullYes
urlstringYes
eventsarray of stringYes
activebooleanYes
healthybooleanYes
failure_countintegerYesFailed attempts in a row.
unhealthy_sincestring (date-time), or nullYes
last_success_atstring (date-time), or nullYes
last_failure_atstring (date-time), or nullYes
secret_prefixstringYesThe first characters of the signing secret.
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
secretstringYesThe signing secret. Shown only this once.

Delivery

FieldTypeAlways thereAbout
idstring (uuid)Yes
endpoint_idstring (uuid)Yes
event_idstring (uuid)Yes
eventstringYes
statusone of pending, delivered, failed, cancelledYes
attemptsintegerYes
next_attempt_atstring (date-time), or nullYes
last_attempt_atstring (date-time), or nullYes
last_status_codeinteger, or nullYes
last_errorstring, or nullYes
delivered_atstring (date-time), or nullYes
created_atstring (date-time)Yes

Built for the Mighty Small™. Made in Canada.