Overview
A lead is a person or company in a team's pipeline: their contact details, where they stand (board and stage), their status and their contact_permissions. A record with record_kind: "client" is a client rather than a lead: it has no pipeline status, so its status is null. Leads and clients come from the same endpoints.
The eight statuses are new, contacted, qualified, negotiating, converted, lost, archived and unreachable. converted does not mean "won". A lead whose status this version of the API does not know keeps record_kind: "lead" and reads status: null. An archived lead says why in archive_reason, including merged and family_transfer for the leads that merges and transfers leave behind.
Apply contact_permissions before any of your systems contacts the person: Keep a copy in sync explains each one.
Attribution and response
GET /v1/leads/{id} returns the lead with two facets: attribution, where it came from, and response, how the team has answered it across its conversations and calls. Each facet has its own version, so a new message changes the lead's response without changing the lead. A facet is null while Totem is still preparing it. Lists return the lead alone. The changes feed delivers the facets as items of their own, lead_attribution and lead_response, with the lead's id. Data coverage explains what each facet can and cannot tell you.
Search by phone or email
POST /v1/leads/search finds a team's leads by exact phone or email. Send exactly one of phone or email in the JSON body, never in a URL:
curl https://api.totemstudio.ai/v1/leads/search \
-H "Authorization: Bearer $TOTEM_API_KEY" \
-H "Totem-Team: $TOTEM_TEAM_ID" \
-H "Content-Type: application/json" \
-d '{"email": "alex.rivera@example.com"}'Matching is exact on the number as Totem stores it, not on the normalized phone a lead shows. A phone matches a record stored in E.164, with or without its leading +; a record stored with spaces or without its country prefix is not found, even by the phone the API returns for it. An email matches the address as you sent it or in lower case. Records Totem has not delivered to the API yet are skipped until it does. Search returns archived, merged and client records too; follow merged_into to the lead that was kept. It returns at most 10 leads, in one response that never pages, so when many records share a phone number or an email address, it may not return them all.
Activities
GET /v1/leads/{id}/activities returns a lead's history, a page at a time: each change of its stage, status or assigned members, and when it happened. actor_kind says who made it: a person (human), the AI (ai), Totem automation (system), an API caller (api), or unknown. Totem knows who made a change only when the same save wrote the lead's status, so a stage or assignee change made on its own reads unknown. Pages are not in date order, so sort by occurred_at. Activities never change once written, but they are removed together with their lead, and new ones also arrive in the changes feed.
Boards and stages
A board is a pipeline, with its stages in order. A lead's stage names the step it is on. Each stage has a mode that says who moves leads: people only (standard), people and the AI, which may move leads in (supervised), or the AI, which runs outreach and moves leads in and out (automated).
GET /v1/boards returns a team's boards with their stages, a page at a time. Boards also travel in the changes feed; read this list when a lead names a stage you have not seen yet. A stage with no stored position is left out of its board, so do not re-read the list for a stage it did not include last time.
GET /
Returns a page of the team's leads and clients, in a stable order that carries no meaning. Filter by at most one of board, stage or status; a board or stage the team does not have returns an empty page. To keep a copy up to date, follow the changes feed instead of re-reading this list.
Query parameters
limitinteger Range 1–100 Default25Items per page, 1–100. Defaults to 25.
cursorstring 1–512 charsThe
next_cursorof the previous page. Omit it for the first page.boardstring ID prefixbrd_…Only leads on this board. At most one of
board,stageandstatus.stagestring ID prefixstg_…Only leads in this stage. At most one of
board,stageandstatus.statusstringOnly leads with this status. At most one of
board,stageandstatus.Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
Headers
Totem-Teamstring Conditional ID prefixteam_…The team to read, as a
team_…id. Omit it when the key reads one team; it is required when the key reads several (400 team_required). When you send it, it must name a team the key reads: a malformed id gets400 invalid_request, and a team outside the key gets404 team_not_accessible, as does a request without it once the key reads no team at all.
Returns
Returns a list of Lead objects.
objectstringAlways
list.dataArray<Lead>The items of this page.
has_morebooleantruewhen another page follows: fetch it withnext_cursor, even if this page holds fewer items thanlimit.next_cursorstring NullableOpaque cursor for the next page, or null on the last page. Never parse it.
Errors
- 400
team_requiredTeam required - 403
team_state_restrictedTeam restricted - 403
sector_restrictedSector restricted - 404
team_not_accessibleTeam not accessible - 409
capture_not_readyTeam data is still being prepared - 429
quota_exceededDaily quota exceeded
curl 'https://api.totemstudio.ai/v1/leads?limit=25' \
-H "Authorization: Bearer $TOTEM_API_KEY" \
-H "Totem-Team: $TOTEM_TEAM_ID"{
"object": "list",
"data": [
{
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"record_kind": "lead",
"name": "Alex",
"surname": "Rivera",
"email": "alex.rivera@example.com",
"company": "Example Dental",
"phone": "+12025550123",
"phone_status": "valid",
"status": "contacted",
"status_set_by": "ai",
"archive_reason": null,
"archived_from_status": null,
"contact_permissions": {
"do_not_contact": false,
"email_opt_out": false,
"email_opt_out_at": null,
"whatsapp_consent": null,
"provenance": {
"do_not_contact": null,
"email_opt_out": null,
"whatsapp_consent": null
}
},
"merged_into": null,
"transferred_to": null,
"revived_at": null,
"pipeline_cleared": false,
"converted_at": null,
"value_at_conversion": null,
"priority": "high",
"tags": [
"spring-check-up"
],
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"assignees": [
"mem_h548E7UiYhutHhucVrQCzkM0eaea0"
],
"estimated_value": 1200,
"estimated_value_currency": null,
"source": "meta_lead_ads",
"source_channel": null,
"source_detail": null,
"source_provenance": "member_editable",
"created_at": "2026-09-28T10:15:00.000Z",
"version": 3,
"updated_at": "2026-09-28T10:20:01.250Z"
}
],
"has_more": true,
"next_cursor": "eyJ2IjoxLCJrIjoibGVhZCIsImEiOiJsZWFkX3I3MkVmYlJOVXp1cU9SRkpSME84SHhBd0VYZDkzakdVVFlNYU1NWEtTRjBRYkxTOENpVUtKcEVQMzRMRlFHIiwicyI6ImYzNTI3NzI2MTkwYiJ93iHyRg"
}GET /
Returns one lead with its two facets: attribution (where it came from) and response (how the team has answered it), each with its own version. A lead created moments ago can answer 404 resource_missing until Totem has prepared it; the changes feed delivers it then.
Path parameters
idstring Required ID prefixlead_…The lead's public id.
Returns
Returns a LeadDetail object.
idstring ID prefixlead_…Public id of the record.
objectstringAlways
lead.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team the record belongs to.
record_kindstringleadwhen the record has a pipeline status, otherwiseclient. A lead whose status this version does not know readsstatus: null.Possible valuesleadclient
namestring NullableFirst name or display name, or null.
surnamestring NullableSurname, or null.
emailstring NullableEmail address as stored, or null.
companystring NullableCompany, or null.
phonestring NullablePhone in E.164, only when the stored number validates; otherwise null.
phone_statusstringvalid(seephone),invalid(a number is stored but does not validate, for example one stored without its country prefix) ormissing.Possible valuesvalidinvalidmissing
statusstring NullablePipeline status; null for a client record, or for a status this version does not know.
convertedis not "won".Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
status_set_bystring NullableWho set the current status: a person, the AI, Totem automation, an API caller, or unknown (no recorded transition lands on it). Null when
statusis null.Possible valueshumanaisystemapiunknown
archive_reasonstring NullableWhy the record was archived, as a closed code; stored free text is
other. Null when none is stored.Possible valuesopt_outno_consentnot_interestednot_qualifiedno_contactmergedfamily_transferother
archived_from_statusstring NullableThe status the lead had before its current archive; null while it is not archived or when unknown.
Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
contact_permissionsobjectContact permissions. Apply them before any outreach from your own systems.
do_not_contactbooleanTrue when the person asked never to be contacted (the
opt_outarchive reason). Stop every channel.email_opt_outbooleanTrue when the person unsubscribed from marketing and follow-up email.
email_opt_out_atstring Nullable Formatdate-timeWhen the email opt-out was recorded, or null.
whatsapp_consentboolean NullableWhatsApp consent: false when refused, true when recorded, null when unknown.
provenanceobjectThe source of each permission.
do_not_contactstring NullableWhere
do_not_contactcomes from, or null when it is false.Possible valuesarchive_reason
email_opt_outstring NullableWho recorded the email opt-out: the unsubscribe link, a person in Totem, or unknown. Null when there is none.
Possible valuesunsubscribe_linkmanualunknown
whatsapp_consentstring Nullablearchive_reasonwhen a refusal is recorded as the archive reason;storedfor the value kept on the record, which team members can edit. Null when unknown.Possible valuesstoredarchive_reason
merged_intostring Nullable ID prefixlead_…The lead this record was merged into, or null (also when that lead no longer exists).
transferred_toobject NullableWhere a transfer to another team of your organization sent this lead, or null. The team may be one your key does not read.
teamstring ID prefixteam_…The destination team.
leadstring Nullable ID prefixlead_…The destination lead, or null when its id cannot be named across teams: an assistant handoff created it, or the transfer landed on an existing lead-ads lead (Meta, Google Ads or LinkedIn) or another lead with a fixed id.
revived_atstring Nullable Formatdate-timeWhen the contact last came back on their own and revived an archived lead, or null.
pipeline_clearedbooleanTrue when the lead was converted with "clear pipeline data": board, stage, priority, assignees, estimated value and the source fields other than
source_channelare null because they were cleared.converted_atstring Nullable Formatdate-timeWhen the lead was converted, while its status is
converted; otherwise null.value_at_conversionnumber NullableThe estimated value when it was converted, in major units. Survives "clear pipeline data".
prioritystring NullablePriority, or null.
Possible valueslowmediumhighurgent
tagsArray<string>Labels as stored.
leadandbookingare system labels.boardstring Nullable ID prefixbrd_…The board, resolved through the stage when it has one; or null.
stagestring Nullable ID prefixstg_…The stage, or null.
assigneesArray<string> Nullable ID prefixmem_…Assigned members, sorted. Null when the record has no pipeline data.
estimated_valuenumber NullableEstimated value in major units as stored (decimals allowed), or null.
estimated_value_currencynull NullableAlways null: Totem stores no currency with the value.
sourcestring NullableThe stored lead source;
apialso covers leads created by Totem itself (for example from a conversation or a call), seesource_detail. Null when none is stored.Possible valuesmeta_lead_adsmanualwebsite_formbooking_pagecsv_importapichatbotgoogle_adslinkedinother
source_channelstring NullableThe channel the record started on (for example
whatsapp,phone,widget), or null. Team members can edit it.source_detailstring Nullableconversation,call,external:<provider>,gated_ad:<source>,family_handoff,api_intakeorunknown; null whensourceneeds no detail.source_provenancestring Nullableserver_writtenwhen Totem set the source from what the ad platform reported; otherwisemember_editable(team members can change it). Null withsource.Possible valuesserver_writtenmember_editable
created_atstring Formatdate-timeWhen the record was created.
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
The lead's attribution facet, or null while Totem is still preparing it.
The lead's response facet, or null while Totem is still preparing it.
Errors
- 403
team_state_restrictedTeam restricted - 403
sector_restrictedSector restricted - 404
resource_missingResource not found - 409
capture_not_readyTeam data is still being prepared
curl 'https://api.totemstudio.ai/v1/leads/lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG' \
-H "Authorization: Bearer $TOTEM_API_KEY"{
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"record_kind": "lead",
"name": "Alex",
"surname": "Rivera",
"email": "alex.rivera@example.com",
"company": "Example Dental",
"phone": "+12025550123",
"phone_status": "valid",
"status": "contacted",
"status_set_by": "ai",
"archive_reason": null,
"archived_from_status": null,
"contact_permissions": {
"do_not_contact": false,
"email_opt_out": false,
"email_opt_out_at": null,
"whatsapp_consent": null,
"provenance": {
"do_not_contact": null,
"email_opt_out": null,
"whatsapp_consent": null
}
},
"merged_into": null,
"transferred_to": null,
"revived_at": null,
"pipeline_cleared": false,
"converted_at": null,
"value_at_conversion": null,
"priority": "high",
"tags": [
"spring-check-up"
],
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"assignees": [
"mem_h548E7UiYhutHhucVrQCzkM0eaea0"
],
"estimated_value": 1200,
"estimated_value_currency": null,
"source": "meta_lead_ads",
"source_channel": null,
"source_detail": null,
"source_provenance": "member_editable",
"created_at": "2026-09-28T10:15:00.000Z",
"version": 3,
"updated_at": "2026-09-28T10:20:01.250Z",
"attribution": {
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead_attribution",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"original_capture": {
"capture": "at_creation",
"captured_at": "2026-09-28T10:15:00.000Z",
"source": "meta_lead_ads",
"source_hint": null,
"source_channel": null,
"external_provider": null,
"received_at": "2026-09-28T10:15:00.000Z",
"submitted_at": "2026-09-28T10:14:30.000Z",
"origin": null,
"campaign": {
"id": {
"value": "120210000000000101",
"provenance": "provider"
},
"name": {
"value": "Spring check-up",
"provenance": "provider"
}
},
"ad": {
"id": {
"value": "120210000000000303",
"provenance": "provider"
},
"name": {
"value": "Free first visit",
"provenance": "provider"
}
},
"ad_set": {
"id": {
"value": "120210000000000202",
"provenance": "provider"
},
"name": {
"value": "Families nearby",
"provenance": "provider"
}
},
"ad_group": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"form": {
"id": {
"value": "900000000000000404",
"provenance": "provider"
},
"name": {
"value": "Book a check-up",
"provenance": "provider"
}
},
"creative": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"asset_group": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"page": {
"id": {
"value": "100000000000000505",
"provenance": "provider"
},
"name": {
"value": "Example Dental",
"provenance": "provider"
}
},
"utm": null,
"click_network": {
"value": null,
"provenance": "not_captured"
},
"ad_referral": null,
"family_origin": null,
"audience": {
"value": null,
"missing_reason": "unsupported"
}
},
"original_capture_missing_reason": null,
"latest_submission": null,
"latest_submission_missing_reason": "not_captured",
"version": 1,
"updated_at": "2026-09-28T10:15:02.100Z"
},
"response": {
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead_response",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"last_inbound_at": "2026-10-01T08:58:00.000Z",
"last_outbound_at": "2026-10-01T08:59:30.000Z",
"awaiting_reply": false,
"last_answered_call_at": "2026-09-28T10:17:00.000Z",
"last_whatsapp_delivery_status": "read",
"coverage": {
"conversations": 2,
"calls": 1,
"channels_without_delivery_data": [
"email"
],
"truncated": false
},
"version": 7,
"updated_at": "2026-10-01T08:59:31.040Z"
}
}POST /
Finds the team's leads whose phone or email matches exactly, including archived, merged and client records (follow merged_into to the lead that was kept). Send exactly one of phone or email in the JSON body, never in the URL. Returns at most 10 leads, chosen from the first 20 records that match, in one response that never paginates.
Headers
Totem-Teamstring Conditional ID prefixteam_…The team to read, as a
team_…id. Omit it when the key reads one team; it is required when the key reads several (400 team_required). When you send it, it must name a team the key reads: a malformed id gets400 invalid_request, and a team outside the key gets404 team_not_accessible, as does a request without it once the key reads no team at all.
Request body
Exactly one of phone or email, in the JSON body and never in the URL.
phonestring Conditional 3–40 charsA phone number in E.164 (
+12025550123). It finds the number stored in E.164, with or without the+, and in the layouts phone libraries write:+1 202-555-0123,(202) 555-0123and2025550123. Other layouts, such as202 555 0123, are not found.emailstring Conditional 3–254 charsAn email address. It finds records stored exactly as sent, or stored in lowercase.
Returns
Returns a list of Lead objects.
objectstringAlways
list.The matching leads: at most 10.
has_morebooleanAlways
false, even when more records match: search returns at most 10 leads and has no next page.next_cursornull NullableAlways
null: search does not paginate.
Errors
- 400
team_requiredTeam required - 403
team_state_restrictedTeam restricted - 403
sector_restrictedSector restricted - 404
team_not_accessibleTeam not accessible - 409
capture_not_readyTeam data is still being prepared
curl -X POST 'https://api.totemstudio.ai/v1/leads/search' \
-H "Authorization: Bearer $TOTEM_API_KEY" \
-H "Totem-Team: $TOTEM_TEAM_ID" \
-H "Content-Type: application/json" \
--data '{"phone": "+12025550123"}'{
"object": "list",
"data": [
{
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"record_kind": "lead",
"name": "Alex",
"surname": "Rivera",
"email": "alex.rivera@example.com",
"company": "Example Dental",
"phone": "+12025550123",
"phone_status": "valid",
"status": "contacted",
"status_set_by": "ai",
"archive_reason": null,
"archived_from_status": null,
"contact_permissions": {
"do_not_contact": false,
"email_opt_out": false,
"email_opt_out_at": null,
"whatsapp_consent": null,
"provenance": {
"do_not_contact": null,
"email_opt_out": null,
"whatsapp_consent": null
}
},
"merged_into": null,
"transferred_to": null,
"revived_at": null,
"pipeline_cleared": false,
"converted_at": null,
"value_at_conversion": null,
"priority": "high",
"tags": [
"spring-check-up"
],
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"assignees": [
"mem_h548E7UiYhutHhucVrQCzkM0eaea0"
],
"estimated_value": 1200,
"estimated_value_currency": null,
"source": "meta_lead_ads",
"source_channel": null,
"source_detail": null,
"source_provenance": "member_editable",
"created_at": "2026-09-28T10:15:00.000Z",
"version": 3,
"updated_at": "2026-09-28T10:20:01.250Z"
}
],
"has_more": false,
"next_cursor": null
}GET /
Returns a page of the lead's activities: each change of its stage, status or assigned members, with when it happened and, when Totem recorded it, who made it. Pages are not in date order, so sort by occurred_at. Activities never change once written, and new ones also arrive in the changes feed.
Path parameters
idstring Required ID prefixlead_…The lead's public id.
Query parameters
limitinteger Range 1–100 Default25Items per page, 1–100. Defaults to 25.
cursorstring 1–512 charsThe
next_cursorof the previous page. Omit it for the first page.
Returns
Returns a list of Activity objects.
objectstringAlways
list.dataArray<Activity>The items of this page.
has_morebooleantruewhen another page follows: fetch it withnext_cursor, even if this page holds fewer items thanlimit.next_cursorstring NullableOpaque cursor for the next page, or null on the last page. Never parse it.
Errors
- 403
team_state_restrictedTeam restricted - 403
sector_restrictedSector restricted - 404
resource_missingResource not found - 409
capture_not_readyTeam data is still being prepared - 429
quota_exceededDaily quota exceeded
curl 'https://api.totemstudio.ai/v1/leads/lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG/activities?limit=25' \
-H "Authorization: Bearer $TOTEM_API_KEY"{
"object": "list",
"data": [
{
"id": "act_aBgzeetVKDEjpAAkXfEFF53ZGd2ZMmGhUDKgagqLbh6c7R1GqOl0xsFw7pyRhD3SqqYWGMdb371xxj",
"object": "activity",
"livemode": false,
"type": "stage_changed",
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"occurred_at": "2026-09-28T10:20:00.000Z",
"actor_kind": "ai",
"stage_snapshot": {
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"name": "Contacted"
},
"value_snapshot": 1200,
"from": {
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVR3422Yg",
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst"
},
"to": {
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst"
},
"version": 1,
"updated_at": "2026-09-28T10:20:01.500Z"
}
],
"has_more": false,
"next_cursor": null
}GET /
Returns a page of the team's boards, each with its stages in pipeline order. Boards also arrive in the changes feed; read this list when you need them at once, for example when a lead names a stage you have not seen yet.
Query parameters
limitinteger Range 1–100 Default25Items per page, 1–100. Defaults to 25.
cursorstring 1–512 charsThe
next_cursorof the previous page. Omit it for the first page.
Headers
Totem-Teamstring Conditional ID prefixteam_…The team to read, as a
team_…id. Omit it when the key reads one team; it is required when the key reads several (400 team_required). When you send it, it must name a team the key reads: a malformed id gets400 invalid_request, and a team outside the key gets404 team_not_accessible, as does a request without it once the key reads no team at all.
Returns
Returns a list of Board objects.
objectstringAlways
list.dataArray<Board>The items of this page.
has_morebooleantruewhen another page follows: fetch it withnext_cursor, even if this page holds fewer items thanlimit.next_cursorstring NullableOpaque cursor for the next page, or null on the last page. Never parse it.
Errors
- 400
team_requiredTeam required - 403
team_state_restrictedTeam restricted - 403
sector_restrictedSector restricted - 404
team_not_accessibleTeam not accessible - 409
capture_not_readyTeam data is still being prepared - 429
quota_exceededDaily quota exceeded
curl 'https://api.totemstudio.ai/v1/boards?limit=25' \
-H "Authorization: Bearer $TOTEM_API_KEY" \
-H "Totem-Team: $TOTEM_TEAM_ID"{
"object": "list",
"data": [
{
"id": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"object": "board",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"name": "New patients",
"is_default": true,
"is_archived": false,
"appointment_booked_stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVT1QpfZ5",
"stages": [
{
"object": "stage",
"id": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVR3422Yg",
"name": "New",
"position": 0,
"is_default": true,
"is_final": false,
"is_archive": false,
"mode": "automated"
},
{
"object": "stage",
"id": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"name": "Contacted",
"position": 1,
"is_default": false,
"is_final": false,
"is_archive": false,
"mode": "supervised"
},
{
"object": "stage",
"id": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVT1QpfZ5",
"name": "Visit booked",
"position": 2,
"is_default": false,
"is_final": true,
"is_archive": false,
"mode": "standard"
}
],
"version": 4,
"updated_at": "2026-09-02T16:40:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}A lead or client record: lead fields only.
Attributes
idstring ID prefixlead_…Public id of the record.
objectstringAlways
lead.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team the record belongs to.
record_kindstringleadwhen the record has a pipeline status, otherwiseclient. A lead whose status this version does not know readsstatus: null.Possible valuesleadclient
namestring NullableFirst name or display name, or null.
surnamestring NullableSurname, or null.
emailstring NullableEmail address as stored, or null.
companystring NullableCompany, or null.
phonestring NullablePhone in E.164, only when the stored number validates; otherwise null.
phone_statusstringvalid(seephone),invalid(a number is stored but does not validate, for example one stored without its country prefix) ormissing.Possible valuesvalidinvalidmissing
statusstring NullablePipeline status; null for a client record, or for a status this version does not know.
convertedis not "won".Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
status_set_bystring NullableWho set the current status: a person, the AI, Totem automation, an API caller, or unknown (no recorded transition lands on it). Null when
statusis null.Possible valueshumanaisystemapiunknown
archive_reasonstring NullableWhy the record was archived, as a closed code; stored free text is
other. Null when none is stored.Possible valuesopt_outno_consentnot_interestednot_qualifiedno_contactmergedfamily_transferother
archived_from_statusstring NullableThe status the lead had before its current archive; null while it is not archived or when unknown.
Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
contact_permissionsobjectContact permissions. Apply them before any outreach from your own systems.
do_not_contactbooleanTrue when the person asked never to be contacted (the
opt_outarchive reason). Stop every channel.email_opt_outbooleanTrue when the person unsubscribed from marketing and follow-up email.
email_opt_out_atstring Nullable Formatdate-timeWhen the email opt-out was recorded, or null.
whatsapp_consentboolean NullableWhatsApp consent: false when refused, true when recorded, null when unknown.
provenanceobjectThe source of each permission.
do_not_contactstring NullableWhere
do_not_contactcomes from, or null when it is false.Possible valuesarchive_reason
email_opt_outstring NullableWho recorded the email opt-out: the unsubscribe link, a person in Totem, or unknown. Null when there is none.
Possible valuesunsubscribe_linkmanualunknown
whatsapp_consentstring Nullablearchive_reasonwhen a refusal is recorded as the archive reason;storedfor the value kept on the record, which team members can edit. Null when unknown.Possible valuesstoredarchive_reason
merged_intostring Nullable ID prefixlead_…The lead this record was merged into, or null (also when that lead no longer exists).
transferred_toobject NullableWhere a transfer to another team of your organization sent this lead, or null. The team may be one your key does not read.
teamstring ID prefixteam_…The destination team.
leadstring Nullable ID prefixlead_…The destination lead, or null when its id cannot be named across teams: an assistant handoff created it, or the transfer landed on an existing lead-ads lead (Meta, Google Ads or LinkedIn) or another lead with a fixed id.
revived_atstring Nullable Formatdate-timeWhen the contact last came back on their own and revived an archived lead, or null.
pipeline_clearedbooleanTrue when the lead was converted with "clear pipeline data": board, stage, priority, assignees, estimated value and the source fields other than
source_channelare null because they were cleared.converted_atstring Nullable Formatdate-timeWhen the lead was converted, while its status is
converted; otherwise null.value_at_conversionnumber NullableThe estimated value when it was converted, in major units. Survives "clear pipeline data".
prioritystring NullablePriority, or null.
Possible valueslowmediumhighurgent
tagsArray<string>Labels as stored.
leadandbookingare system labels.boardstring Nullable ID prefixbrd_…The board, resolved through the stage when it has one; or null.
stagestring Nullable ID prefixstg_…The stage, or null.
assigneesArray<string> Nullable ID prefixmem_…Assigned members, sorted. Null when the record has no pipeline data.
estimated_valuenumber NullableEstimated value in major units as stored (decimals allowed), or null.
estimated_value_currencynull NullableAlways null: Totem stores no currency with the value.
sourcestring NullableThe stored lead source;
apialso covers leads created by Totem itself (for example from a conversation or a call), seesource_detail. Null when none is stored.Possible valuesmeta_lead_adsmanualwebsite_formbooking_pagecsv_importapichatbotgoogle_adslinkedinother
source_channelstring NullableThe channel the record started on (for example
whatsapp,phone,widget), or null. Team members can edit it.source_detailstring Nullableconversation,call,external:<provider>,gated_ad:<source>,family_handoff,api_intakeorunknown; null whensourceneeds no detail.source_provenancestring Nullableserver_writtenwhen Totem set the source from what the ad platform reported; otherwisemember_editable(team members can change it). Null withsource.Possible valuesserver_writtenmember_editable
created_atstring Formatdate-timeWhen the record was created.
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
{
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"record_kind": "lead",
"name": "Alex",
"surname": "Rivera",
"email": "alex.rivera@example.com",
"company": "Example Dental",
"phone": "+12025550123",
"phone_status": "valid",
"status": "contacted",
"status_set_by": "ai",
"archive_reason": null,
"archived_from_status": null,
"contact_permissions": {
"do_not_contact": false,
"email_opt_out": false,
"email_opt_out_at": null,
"whatsapp_consent": null,
"provenance": {
"do_not_contact": null,
"email_opt_out": null,
"whatsapp_consent": null
}
},
"merged_into": null,
"transferred_to": null,
"revived_at": null,
"pipeline_cleared": false,
"converted_at": null,
"value_at_conversion": null,
"priority": "high",
"tags": [
"spring-check-up"
],
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"assignees": [
"mem_h548E7UiYhutHhucVrQCzkM0eaea0"
],
"estimated_value": 1200,
"estimated_value_currency": null,
"source": "meta_lead_ads",
"source_channel": null,
"source_detail": null,
"source_provenance": "member_editable",
"created_at": "2026-09-28T10:15:00.000Z",
"version": 3,
"updated_at": "2026-09-28T10:20:01.250Z"
}A lead with its attribution and response facets, each with its own version. A facet is null only while Totem is still preparing it.
Attributes
idstring ID prefixlead_…Public id of the record.
objectstringAlways
lead.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team the record belongs to.
record_kindstringleadwhen the record has a pipeline status, otherwiseclient. A lead whose status this version does not know readsstatus: null.Possible valuesleadclient
namestring NullableFirst name or display name, or null.
surnamestring NullableSurname, or null.
emailstring NullableEmail address as stored, or null.
companystring NullableCompany, or null.
phonestring NullablePhone in E.164, only when the stored number validates; otherwise null.
phone_statusstringvalid(seephone),invalid(a number is stored but does not validate, for example one stored without its country prefix) ormissing.Possible valuesvalidinvalidmissing
statusstring NullablePipeline status; null for a client record, or for a status this version does not know.
convertedis not "won".Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
status_set_bystring NullableWho set the current status: a person, the AI, Totem automation, an API caller, or unknown (no recorded transition lands on it). Null when
statusis null.Possible valueshumanaisystemapiunknown
archive_reasonstring NullableWhy the record was archived, as a closed code; stored free text is
other. Null when none is stored.Possible valuesopt_outno_consentnot_interestednot_qualifiedno_contactmergedfamily_transferother
archived_from_statusstring NullableThe status the lead had before its current archive; null while it is not archived or when unknown.
Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
contact_permissionsobjectContact permissions. Apply them before any outreach from your own systems.
do_not_contactbooleanTrue when the person asked never to be contacted (the
opt_outarchive reason). Stop every channel.email_opt_outbooleanTrue when the person unsubscribed from marketing and follow-up email.
email_opt_out_atstring Nullable Formatdate-timeWhen the email opt-out was recorded, or null.
whatsapp_consentboolean NullableWhatsApp consent: false when refused, true when recorded, null when unknown.
provenanceobjectThe source of each permission.
do_not_contactstring NullableWhere
do_not_contactcomes from, or null when it is false.Possible valuesarchive_reason
email_opt_outstring NullableWho recorded the email opt-out: the unsubscribe link, a person in Totem, or unknown. Null when there is none.
Possible valuesunsubscribe_linkmanualunknown
whatsapp_consentstring Nullablearchive_reasonwhen a refusal is recorded as the archive reason;storedfor the value kept on the record, which team members can edit. Null when unknown.Possible valuesstoredarchive_reason
merged_intostring Nullable ID prefixlead_…The lead this record was merged into, or null (also when that lead no longer exists).
transferred_toobject NullableWhere a transfer to another team of your organization sent this lead, or null. The team may be one your key does not read.
teamstring ID prefixteam_…The destination team.
leadstring Nullable ID prefixlead_…The destination lead, or null when its id cannot be named across teams: an assistant handoff created it, or the transfer landed on an existing lead-ads lead (Meta, Google Ads or LinkedIn) or another lead with a fixed id.
revived_atstring Nullable Formatdate-timeWhen the contact last came back on their own and revived an archived lead, or null.
pipeline_clearedbooleanTrue when the lead was converted with "clear pipeline data": board, stage, priority, assignees, estimated value and the source fields other than
source_channelare null because they were cleared.converted_atstring Nullable Formatdate-timeWhen the lead was converted, while its status is
converted; otherwise null.value_at_conversionnumber NullableThe estimated value when it was converted, in major units. Survives "clear pipeline data".
prioritystring NullablePriority, or null.
Possible valueslowmediumhighurgent
tagsArray<string>Labels as stored.
leadandbookingare system labels.boardstring Nullable ID prefixbrd_…The board, resolved through the stage when it has one; or null.
stagestring Nullable ID prefixstg_…The stage, or null.
assigneesArray<string> Nullable ID prefixmem_…Assigned members, sorted. Null when the record has no pipeline data.
estimated_valuenumber NullableEstimated value in major units as stored (decimals allowed), or null.
estimated_value_currencynull NullableAlways null: Totem stores no currency with the value.
sourcestring NullableThe stored lead source;
apialso covers leads created by Totem itself (for example from a conversation or a call), seesource_detail. Null when none is stored.Possible valuesmeta_lead_adsmanualwebsite_formbooking_pagecsv_importapichatbotgoogle_adslinkedinother
source_channelstring NullableThe channel the record started on (for example
whatsapp,phone,widget), or null. Team members can edit it.source_detailstring Nullableconversation,call,external:<provider>,gated_ad:<source>,family_handoff,api_intakeorunknown; null whensourceneeds no detail.source_provenancestring Nullableserver_writtenwhen Totem set the source from what the ad platform reported; otherwisemember_editable(team members can change it). Null withsource.Possible valuesserver_writtenmember_editable
created_atstring Formatdate-timeWhen the record was created.
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
The lead's attribution facet, or null while Totem is still preparing it.
The lead's response facet, or null while Totem is still preparing it.
{
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"record_kind": "lead",
"name": "Alex",
"surname": "Rivera",
"email": "alex.rivera@example.com",
"company": "Example Dental",
"phone": "+12025550123",
"phone_status": "valid",
"status": "contacted",
"status_set_by": "ai",
"archive_reason": null,
"archived_from_status": null,
"contact_permissions": {
"do_not_contact": false,
"email_opt_out": false,
"email_opt_out_at": null,
"whatsapp_consent": null,
"provenance": {
"do_not_contact": null,
"email_opt_out": null,
"whatsapp_consent": null
}
},
"merged_into": null,
"transferred_to": null,
"revived_at": null,
"pipeline_cleared": false,
"converted_at": null,
"value_at_conversion": null,
"priority": "high",
"tags": [
"spring-check-up"
],
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"assignees": [
"mem_h548E7UiYhutHhucVrQCzkM0eaea0"
],
"estimated_value": 1200,
"estimated_value_currency": null,
"source": "meta_lead_ads",
"source_channel": null,
"source_detail": null,
"source_provenance": "member_editable",
"created_at": "2026-09-28T10:15:00.000Z",
"version": 3,
"updated_at": "2026-09-28T10:20:01.250Z",
"attribution": {
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead_attribution",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"original_capture": {
"capture": "at_creation",
"captured_at": "2026-09-28T10:15:00.000Z",
"source": "meta_lead_ads",
"source_hint": null,
"source_channel": null,
"external_provider": null,
"received_at": "2026-09-28T10:15:00.000Z",
"submitted_at": "2026-09-28T10:14:30.000Z",
"origin": null,
"campaign": {
"id": {
"value": "120210000000000101",
"provenance": "provider"
},
"name": {
"value": "Spring check-up",
"provenance": "provider"
}
},
"ad": {
"id": {
"value": "120210000000000303",
"provenance": "provider"
},
"name": {
"value": "Free first visit",
"provenance": "provider"
}
},
"ad_set": {
"id": {
"value": "120210000000000202",
"provenance": "provider"
},
"name": {
"value": "Families nearby",
"provenance": "provider"
}
},
"ad_group": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"form": {
"id": {
"value": "900000000000000404",
"provenance": "provider"
},
"name": {
"value": "Book a check-up",
"provenance": "provider"
}
},
"creative": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"asset_group": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"page": {
"id": {
"value": "100000000000000505",
"provenance": "provider"
},
"name": {
"value": "Example Dental",
"provenance": "provider"
}
},
"utm": null,
"click_network": {
"value": null,
"provenance": "not_captured"
},
"ad_referral": null,
"family_origin": null,
"audience": {
"value": null,
"missing_reason": "unsupported"
}
},
"original_capture_missing_reason": null,
"latest_submission": null,
"latest_submission_missing_reason": "not_captured",
"version": 1,
"updated_at": "2026-09-28T10:15:02.100Z"
},
"response": {
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead_response",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"last_inbound_at": "2026-10-01T08:58:00.000Z",
"last_outbound_at": "2026-10-01T08:59:30.000Z",
"awaiting_reply": false,
"last_answered_call_at": "2026-09-28T10:17:00.000Z",
"last_whatsapp_delivery_status": "read",
"coverage": {
"conversations": 2,
"calls": 1,
"channels_without_delivery_data": [
"email"
],
"truncated": false
},
"version": 7,
"updated_at": "2026-10-01T08:59:31.040Z"
}
}Where a lead came from: its original capture and latest submission.
Attributes
idstring ID prefixlead_…Public id of the record.
objectstringAlways
lead_attribution.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team the lead belongs to.
original_captureobject NullableHow the lead first entered the CRM, frozen once; null when it was not captured. "Original" is the first time the contact entered the CRM, not the first ad it answered.
capturestringat_creation: frozen from the lead as it was first saved.at_activation: copied once from the lead as it was when the API was activated, for a lead with no capture record (created before Totem started recording attribution, or whose creation was not recorded).Possible valuesat_creationat_activation
captured_atstring Formatdate-timeWhen the record was written.
sourcestring NullableThe lead source at capture, from the same set as the lead's
source;apialso covers leads created by Totem itself (for example from a conversation or a call, seeorigin). Null when none was stored.Possible valuesmeta_lead_adsmanualwebsite_formbooking_pagecsv_importapichatbotgoogle_adslinkedinother
source_hintstring NullableThe real source of a gated ad lead stored as
api, or null.source_channelstring NullableThe channel at capture, or null.
external_providerstring NullableThe portal or booking platform of a forwarded or synced lead, or null.
received_atstring Nullable Formatdate-timeWhen the lead was received, as first written, or null.
submitted_atstring Nullable Formatdate-timeWhen the ad platform says the form was submitted, or null.
originobject NullableThe conversation or call that created the lead (never its id), or null (also for an origin of another kind).
kindstringconversationorcall.Possible valuesconversationcall
channelstring NullableIts channel, or null.
campaignobjectThe campaign.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
adobjectThe ad.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
ad_setobjectThe Meta ad set.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
ad_groupobjectThe Google Ads ad group.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
formobjectThe lead form.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
creativeobjectThe creative.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
asset_groupobjectThe Google Ads asset group.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
pageobjectThe Facebook page.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
utmobject NullableThe five standard UTM keys, or null when none was captured.
sourceobjectutm_source.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
mediumobjectutm_medium.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
campaignobjectutm_campaign.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
termobjectutm_term.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
contentobjectutm_content.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
click_networkobjectThe network of the first click id (
googleormeta). The click id itself is never kept.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
ad_referralobject NullableThe first Meta ad referral of the conversation that created the lead, or null.
channelstringThe channel.
Possible valueswhatsappfacebookinstagram
source_typestringWhat opened the conversation.
Possible valuesadpostlinkother
ad_idstring NullableThe ad or post id, or null.
referred_atstring Formatdate-timeMeta's time for the referral.
provenancestringAlways
provider: only the signed Meta webhooks write it.
family_originobject NullableThe transfer from another team of your organization that created the lead, or null.
teamstring ID prefixteam_…The team of your organization the lead came from.
leadstring Nullable ID prefixlead_…Its lead there, or null when that id cannot be named across teams: an assistant handed off a caller without one, or the lead there is a lead-ads lead (Meta, Google Ads or LinkedIn) or another lead with a fixed id.
automatedtells an assistant's handoff from a move made by a person.automatedbooleanTrue for an assistant's handoff.
audienceobjectNot available in this version.
valuenull NullableAlways null.
missing_reasonstringTotem does not record audiences; an ad set is not one.
Valueunsupported
original_capture_missing_reasonstring Nullablenot_capturedwhenoriginal_captureis null, otherwise null.Possible valuesnot_captured
latest_submissionobject NullableThe newest ad submission recorded for this lead, including a repeat on an existing contact; null when none is recorded. A submission the ad platform reports deleted (a LinkedIn member deleting their form response) is no longer shown, and once the newest one expires or is withdrawn an older one can show instead.
providerstringThe ad platform.
Possible valuesmetagoogle_adslinkedin
submitted_atstring Nullable Formatdate-timeWhen the platform says it was submitted, or null.
campaignobjectThe campaign.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
adobjectThe ad.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
ad_setobjectThe Meta ad set.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
ad_groupobjectThe Google Ads ad group.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
formobjectThe lead form.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
nameobjectIts name.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
creativeobjectThe creative.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
asset_groupobjectThe Google Ads asset group.
idobjectIts id.
valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
utmobject NullableIts UTM keys, or null.
sourceobjectutm_source.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
mediumobjectutm_medium.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
campaignobjectutm_campaign.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
termobjectutm_term.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
contentobjectutm_content.valuestring NullableThe value, or null when it was not captured.
provenancestringprovider(reported by the ad platform),team_alias(typed by staff),stored_metadata(editable lead data),stored_metadata_at_activation(copied once when the API was activated, for a lead created before capture), ornot_capturedexactly whenvalueis null.Possible valuesproviderteam_aliasstored_metadatastored_metadata_at_activationnot_captured
expires_atstring Nullable Formatdate-timeWhen this submission stops being readable (Google Ads and LinkedIn keep it 90 days); null for Meta.
latest_submission_missing_reasonstring Nullablenot_capturedwhenlatest_submissionis null, otherwise null.Possible valuesnot_captured
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
{
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead_attribution",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"original_capture": {
"capture": "at_creation",
"captured_at": "2026-09-28T10:15:00.000Z",
"source": "meta_lead_ads",
"source_hint": null,
"source_channel": null,
"external_provider": null,
"received_at": "2026-09-28T10:15:00.000Z",
"submitted_at": "2026-09-28T10:14:30.000Z",
"origin": null,
"campaign": {
"id": {
"value": "120210000000000101",
"provenance": "provider"
},
"name": {
"value": "Spring check-up",
"provenance": "provider"
}
},
"ad": {
"id": {
"value": "120210000000000303",
"provenance": "provider"
},
"name": {
"value": "Free first visit",
"provenance": "provider"
}
},
"ad_set": {
"id": {
"value": "120210000000000202",
"provenance": "provider"
},
"name": {
"value": "Families nearby",
"provenance": "provider"
}
},
"ad_group": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"form": {
"id": {
"value": "900000000000000404",
"provenance": "provider"
},
"name": {
"value": "Book a check-up",
"provenance": "provider"
}
},
"creative": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"asset_group": {
"id": {
"value": null,
"provenance": "not_captured"
}
},
"page": {
"id": {
"value": "100000000000000505",
"provenance": "provider"
},
"name": {
"value": "Example Dental",
"provenance": "provider"
}
},
"utm": null,
"click_network": {
"value": null,
"provenance": "not_captured"
},
"ad_referral": null,
"family_origin": null,
"audience": {
"value": null,
"missing_reason": "unsupported"
}
},
"original_capture_missing_reason": null,
"latest_submission": null,
"latest_submission_missing_reason": "not_captured",
"version": 1,
"updated_at": "2026-09-28T10:15:02.100Z"
}How the team has answered a lead across its conversations and calls: the latest messages each way and whether a reply is due. It uses its lead's id.
Attributes
idstring ID prefixlead_…Public id of the record.
objectstringAlways
lead_response.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
last_inbound_atstring Nullable Formatdate-timeThe latest message from the customer on any of the lead's conversations (UTC), or null. Not counted: erased messages, imported WhatsApp history and web-chat visitor turns. Instagram shares cannot be told apart and count.
last_outbound_atstring Nullable Formatdate-timeThe latest message sent to the customer that did not fail, on any of the lead's conversations and whoever sent it (UTC), or null. Imported WhatsApp history counts.
awaiting_replybooleanTrue when
last_inbound_atis newer than the latest reply on any of the lead's conversations. A reply is a sent message that did not fail and was recorded as a conversation reply or with no purpose; outreach, transactional messages (such as reminders) and imported history do not count. Most stored messages carry no purpose, so an automated send recorded without one also counts as a reply. False when the customer has never written.last_answered_call_atstring Nullable Formatdate-timeWhen the latest of the lead's calls whose
outcomeisanswered_humanoranswered_aistarted (UTC), or null. A connected outbound call on Totem's phone lines readsunknown, so it is not counted.last_whatsapp_delivery_statusstring Nullabledelivered,readorfailedfor the latest message sent to the lead on WhatsApp. Null when that message has no receipt yet (sentis never stored) or the lead has no message sent on WhatsApp.Possible valuesdeliveredreadfailed
coverageobjectWhat these facts were computed from.
conversationsinteger Range 0–20The lead's conversations these facts were computed from, newest first; at most 20.
callsinteger Range 0–50The lead's calls
last_answered_call_atwas computed from, newest first; at most 50.channels_without_delivery_dataArray<string>The channels of those conversations that store no delivery receipts (every channel but WhatsApp), sorted.
Possible valuessmsfacebookinstagramtiktokchatbotemail
truncatedbooleanTrue when a read limit was reached (20 conversations, 200 messages or 50 calls): older activity was not read, so a time can be null or older than the truth, and
awaiting_replycan miss an older reply.
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
{
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"object": "lead_response",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"last_inbound_at": "2026-10-01T08:58:00.000Z",
"last_outbound_at": "2026-10-01T08:59:30.000Z",
"awaiting_reply": false,
"last_answered_call_at": "2026-09-28T10:17:00.000Z",
"last_whatsapp_delivery_status": "read",
"coverage": {
"conversations": 2,
"calls": 1,
"channels_without_delivery_data": [
"email"
],
"truncated": false
},
"version": 7,
"updated_at": "2026-10-01T08:59:31.040Z"
}One stage, status or assignee transition of a lead. Activities never change once written.
Attributes of every variant
idstring ID prefixact_…Public id of the record.
objectstringAlways
activity.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team the lead belongs to.
leadstring Nullable ID prefixlead_…The lead that moved. Null only while Totem has not yet assigned the lead its id.
occurred_atstring Formatdate-timeWhen the change was saved.
actor_kindstringWho made the change: a person, the AI, Totem automation, an API caller, or unknown. Totem knows who made a change only when the same save wrote the lead's status, so a stage or assignee change made on its own reads unknown.
Possible valueshumanaisystemapiunknown
stage_snapshotobject NullableThe stage the lead was in after the change (for "clear pipeline data", the stage it left), or null.
stagestring Nullable ID prefixstg_…The stage.
boardstring Nullable ID prefixbrd_…Its board, or null for a legacy stage without one.
namestring NullableThe stage name when the change was recorded, or null when the stage was already deleted.
value_snapshotnumber NullableThe estimated value at that moment, in major units, or null.
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
Variants
Each Activity is exactly one of these 3 variants.
A status transition
When type is one of status_changed archived unarchived revived
typestringstatus_changed,archived,unarchived, orrevived(the contact came back on their own and reopened an archived lead).Possible valuesstatus_changedarchivedunarchivedrevived
fromstring NullableThe status before, or null when there was none.
Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
tostringThe status after.
Possible valuesnewcontactedqualifiednegotiatingconvertedlostarchivedunreachable
A stage move
When type is stage_changed
typestringAlways
stage_changed.fromobject NullableThe stage and board before, or null when the lead had neither.
stagestring Nullable ID prefixstg_…The stage.
boardstring Nullable ID prefixbrd_…The board, or null for a legacy stage without one.
toobjectThe stage and board after.
stagestring Nullable ID prefixstg_…The stage.
boardstring Nullable ID prefixbrd_…The board, or null for a legacy stage without one.
A change of assigned members
When type is assignees_changed
typestringAlways
assignees_changed.fromArray<string> ID prefixmem_…The assigned members before, sorted.
toArray<string> ID prefixmem_…The assigned members after, sorted.
{
"id": "act_aBgzeetVKDEjpAAkXfEFF53ZGd2ZMmGhUDKgagqLbh6c7R1GqOl0xsFw7pyRhD3SqqYWGMdb371xxj",
"object": "activity",
"livemode": false,
"type": "stage_changed",
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"occurred_at": "2026-09-28T10:20:00.000Z",
"actor_kind": "ai",
"stage_snapshot": {
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"name": "Contacted"
},
"value_snapshot": 1200,
"from": {
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVR3422Yg",
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst"
},
"to": {
"stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"board": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst"
},
"version": 1,
"updated_at": "2026-09-28T10:20:01.500Z"
}A board with its stages in pipeline order.
Attributes
idstring ID prefixbrd_…Public id of the record.
objectstringAlways
board.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
namestring Nullable ≥ 1 charsThe board's name, or null when none is stored.
is_defaultbooleanTrue for the team's default board, where new leads land unless routed elsewhere.
is_archivedbooleanTrue when the board is archived (hidden from the board selector). Its leads still export.
appointment_booked_stagestring Nullable ID prefixstg_…The stage of this board a lead moves to when its first appointment is confirmed, or null when none is set or it names no stage of this board.
stagesArray<object>The board's stages, ordered by position, then by id. A stage with no position stored at all is left out, although a lead can still name it.
objectstringAlways
stage.idstring ID prefixstg_…Public id of the stage; a lead's
stagenames it.namestring Nullable ≥ 1 charsThe stage's name, or null when none is stored.
positionnumber NullableThe stage's position on its board, left to right; null when the stored position is not a number. Stages are listed in this order.
is_defaultbooleanTrue for the stage new leads of this board enter.
is_finalbooleanTrue for a final stage: moving a lead here marks it converted.
is_archivebooleanTrue for an archive stage, whose leads are hidden from the main board view.
modestring NullableWho moves leads:
standard(people only),supervised(AI may move leads in, people move them out) orautomated(AI runs outreach and moves leads in and out); null for a value this version does not know.Possible valuesstandardsupervisedautomated
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
{
"id": "brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst",
"object": "board",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"name": "New patients",
"is_default": true,
"is_archived": false,
"appointment_booked_stage": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVT1QpfZ5",
"stages": [
{
"object": "stage",
"id": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVR3422Yg",
"name": "New",
"position": 0,
"is_default": true,
"is_final": false,
"is_archive": false,
"mode": "automated"
},
{
"object": "stage",
"id": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0",
"name": "Contacted",
"position": 1,
"is_default": false,
"is_final": false,
"is_archive": false,
"mode": "supervised"
},
{
"object": "stage",
"id": "stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVT1QpfZ5",
"name": "Visit booked",
"position": 2,
"is_default": false,
"is_final": true,
"is_archive": false,
"mode": "standard"
}
],
"version": 4,
"updated_at": "2026-09-02T16:40:00.000Z"
}