Every object the API returns is on this page, with its fields and an example. Each resource's reference page shows the same objects next to the endpoints that return them.
How responses are shaped
Responses take one of five shapes:
- One object. A request for one record returns the object itself.
GET /v1/leads/{id}returns the lead with its two facets,attributionandresponse, inside it. - A list. Lists return
object: "list", the objects indata,has_more, andnext_cursor, which isnullon the last page. Lists and pagination explains it. - A changes-feed page. The same envelope, but
dataholds feed items (theFeedItemobject below) andnext_cursoris always a string, even on an empty page. Keep a copy in sync explains it. - An error. An
application/problem+jsonbody, described in Errors. - The health check.
GET /v1/healthanswers{"object": "health", "status": "ok"}.
Records, such as a lead, a call or a team, carry object, which names their type, and livemode, which is true on everything the API returns. The records the changes feed delivers also carry version and updated_at, as Conventions explains.
How to read a field list
- Every field is always there. In a response, each field listed is present in every object, with two exceptions: a feed item carries exactly one of
objectandremoved, and an error carriesparamonly when it names one. A field with no value isnull: never missing, and never an empty string. - Nullable marks a field that can be
null. Data coverage says what anullcan mean for each kind of fact. - Possible values lists the values a field can take today. New values can appear in any version, so keep the record when you meet one you do not know, as Conventions explains.
- Ids show the prefix of the record they point to, such as
brd_for a board, and a type that is another object links to it. - Nested objects are folded: open one to see its fields.
The same information is in the OpenAPI document, and every example comes from the kit's example data, fixtures.json: fictitious contacts with livemode: false.
The integration that owns the key, with the teams the key reads.
Attributes
objectstringAlways
integration.idstring ID prefixprn_…Public id of the integration.
livemodebooleantruefor a real key;falsein example data.namestringThe name an administrator gave the integration.
keyobjectThe key used for this request.
last4string 4 charsThe last four characters of the key used for this request.
teamsArray<string> ID prefixteam_…The teams this key reads today. Their details are in
GET /v1/teams.scopesArray<string>The key's scopes: the fixed read set in v1.0a.
Possible valuesteams:readcrm:readcalls:readmessages:readcalendar:read
{
"object": "integration",
"id": "prn_m1NFIcoIU8smXfqR4ymgt6j07TfRF",
"livemode": false,
"name": "Example CRM sync",
"key": {
"last4": "Q7xZ"
},
"teams": [
"team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR"
],
"scopes": [
"teams:read",
"crm:read",
"calls:read",
"messages:read",
"calendar:read"
]
}A team this key reads, with its time zone and default country.
Attributes
idstring ID prefixteam_…Public id of the record.
objectstringAlways
team.livemodebooleantruefor real data;falsein example data.namestring Nullable ≥ 1 charsThe team's name as it appears in Totem, or null when none is stored.
timezonestring ≥ 1 charsThe team's IANA time zone: its business-hours zone when that is valid, otherwise its default country's (Europe/Madrid when neither is set). Interpret the team's local times with it.
default_countrystring Nullable Pattern^[A-Z]{2}$The team's default country (ISO 3166-1 alpha-2), which Totem uses when someone types a phone number without a prefix; null when none is set. The API does not apply it:
Lead.phoneis validated without a default country, so a number stored without its country prefix readsphone_status: invalid.
{
"id": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"object": "team",
"livemode": false,
"name": "Example Dental",
"timezone": "America/New_York",
"default_country": "US"
}A team member, by display name only: Totem exports no email, phone or role.
Attributes
idstring ID prefixmem_…Public id of the record.
objectstringAlways
member.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
display_namestring Nullable ≥ 1 charsThe member's display name, or first and last name, or null when none is stored. Totem exports no email, phone or role.
{
"id": "mem_h548E7UiYhutHhucVrQCzkM0eaea0",
"object": "member",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"display_name": "Sam Lee"
}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"
}A call: its direction, timing and a normalized outcome. No recording or transcript.
Attributes
idstring ID prefixcall_…Public id of the record.
objectstringAlways
call.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
leadstring Nullable ID prefixlead_…The lead this call is linked to, or null when it is unlinked or the lead no longer exists. Identity (name, phone) travels on the lead only.
directionstring Nullableinboundoroutbound; null when not stored.Possible valuesinboundoutbound
started_atstring Nullable Formatdate-timeWhen the call started (UTC), or when it was recorded if the provider gave no start time.
duration_secondsinteger Nullable Range ≥ 0Whole seconds of the call (rounded down); null while the call is still live, or when not stored.
outcomestringHow the call ended:
answered_human,answered_ai,voicemail,no_answer,busy,failed, orunknown(still live, or no evidence of who answered). Read it withoutcome_basis.Possible valuesanswered_humananswered_aivoicemailno_answerbusyfailedunknown
outcome_basisstringThe evidence behind
outcome:inbound_verdict(Totem's classification of an inbound call on its phone lines),ai_analysis(Totem's classification of the status, end reason and length that Retell reports),duration_floor(a call on a connected Zadarma PBX, where at least 10 seconds counts as answered),carrier_answer_only(only the carrier's answer signal, which never counts as answered, so a connected call readsunknown: every outbound call on Totem's phone lines, made by the AI or by a person, and an inbound one Totem has not classified),browser_session(a web voice session with the assistant), ornone(no evidence, as for a call that is still live).Possible valuesinbound_verdictai_analysisduration_floorcarrier_answer_onlybrowser_sessionnone
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": "call_m2kUbFcayHlZ5Lgs9xZNmDS3c3Jvk",
"object": "call",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"direction": "inbound",
"started_at": "2026-09-28T10:17:00.000Z",
"duration_seconds": 184,
"outcome": "answered_ai",
"outcome_basis": "inbound_verdict",
"version": 2,
"updated_at": "2026-09-28T10:21:04.010Z"
}A conversation on one channel: its status, assignee and the times of the latest messages, never their content.
Attributes
idstring ID prefixconv_…Public id of the record.
objectstringAlways
conversation.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
leadstring Nullable ID prefixlead_…The lead this conversation is linked to, or null when it is unlinked or the lead no longer exists. Identity (name, phone, handle) travels on the lead only.
channel_typestring NullableThe channel:
whatsapp,email,chatbot(the web chat),facebook,instagram,smsortiktok; null for a value this version does not know. A lead can have several conversations on the same channel and business account, one for each contact address (phone number, email address or handle) it has used, so key your copy onid.Possible valuessmswhatsappfacebookinstagramtiktokchatbotemail
statusstring Nullableactiveorarchivedin the team's inbox; null for a value this version does not know.Possible valuesactivearchived
assigneestring Nullable ID prefixmem_…The team member assigned to the conversation (see
/members), or null.reply_modestringhumanwhile a person has taken the conversation over, including a WhatsApp chat answered from the WhatsApp Business app;aiotherwise.aimeans no takeover is active, not that an assistant is set up or answering on this channel. A timed takeover returns toaiwhen it expires, and the record's version changes then.Possible valuesaihuman
created_atstring Nullable Formatdate-timeWhen the conversation was created (UTC).
last_inbound_atstring Nullable Formatdate-timeThe latest customer message (UTC). Not counted: erased messages, imported WhatsApp history and web-chat visitor turns, so a
chatbotconversation reads null. Instagram shares cannot be told apart and count.last_outbound_atstring Nullable Formatdate-timeThe latest message sent to the customer that did not fail (UTC), whoever sent it. Imported WhatsApp history counts.
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": "conv_m3GhGjRHmFbww1g10oqOp7j3gWqPJ",
"object": "conversation",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"channel_type": "whatsapp",
"status": "active",
"assignee": "mem_h548E7UiYhutHhucVrQCzkM0eaea0",
"reply_mode": "ai",
"created_at": "2026-09-28T10:16:00.000Z",
"last_inbound_at": "2026-10-01T08:58:00.000Z",
"last_outbound_at": "2026-10-01T08:59:30.000Z",
"version": 12,
"updated_at": "2026-10-01T08:59:31.040Z"
}A booking and its kind: an appointment for a bookable service, an event from the connected calendar, or a booking imported from another system.
Attributes
idstring ID prefixbkg_…Public id of the record.
objectstringAlways
booking.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
leadstring Nullable ID prefixlead_…The lead this booking belongs to, or null for a booking without a lead or when the lead no longer exists. Names and contact details appear only on the lead.
kindstringservice_booking(booked for a bookable service, by the AI, a customer or a person),calendar_event(an event from the connected calendar) orexternal_import(synced from an external booking system or read from a portal email). A booking from an origin this version does not know is reported ascalendar_event.Possible valuesservice_bookingcalendar_eventexternal_import
servicestring Nullable ID prefixsvc_…The booked service (see
/booking_services) on aservice_booking; null otherwise.statusstring Nullablescheduled,rescheduled,cancelled,postponed,attended,no_showorteam_no_show(attendance is recorded only by people); null for a value this version does not know.rescheduledmeans the booking was moved in place and its times are the new ones; a booking the AI replaced with a new one readscancelled, withrescheduled_toset.Possible valuesscheduledrescheduledcancelledpostponedattendedno_showteam_no_show
starts_atstring Nullable Formatdate-timeWhen the booking starts (UTC).
ends_atstring Nullable Formatdate-timeWhen the booking ends (UTC).
meeting_typestring Nullableonline,in_personorphone; null when not stored.Possible valuesonlinein_personphone
sourcestring NullableWho booked it:
ai,customeroroperator; null when not recorded.Possible valuesaicustomeroperator
rescheduled_fromstring Nullable ID prefixbkg_…The booking this one replaced in a reschedule, or null. For a few seconds the replaced booking can still read
scheduled; bookings rescheduled before Totem started recording this link may not have it.rescheduled_tostring Nullable ID prefixbkg_…The booking that replaced this one in a reschedule, or null. When it is set, this booking reads
cancelled.created_atstring Nullable Formatdate-timeWhen the booking was recorded in Totem (UTC).
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": "bkg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3ttMKHRR9ADk3N7Cr3NSuY0",
"object": "booking",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"kind": "service_booking",
"service": "svc_h42kgwwJGPzsm2Zoy1A1RBv1KIrX5",
"status": "scheduled",
"starts_at": "2026-10-06T15:00:00.000Z",
"ends_at": "2026-10-06T15:30:00.000Z",
"meeting_type": "in_person",
"source": "ai",
"rescheduled_from": null,
"rescheduled_to": null,
"created_at": "2026-10-01T09:01:00.000Z",
"version": 1,
"updated_at": "2026-10-01T09:01:02.000Z"
}A service customers can book, with its meeting type.
Attributes
idstring ID prefixsvc_…Public id of the record.
objectstringAlways
booking_service.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
namestring Nullable ≥ 1 charsThe service's name, or null when none is stored.
meeting_typestringHow the service happens:
online(the default when none is stored),in_personorphone.Possible valuesonlinein_personphone
{
"id": "svc_h42kgwwJGPzsm2Zoy1A1RBv1KIrX5",
"object": "booking_service",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"name": "First visit",
"meeting_type": "in_person"
}One change: the record's current state, or its removal.
Attributes of every variant
kindstringThe kind of the record, such as
leadorcall.Possible valuesleadlead_attributionlead_responseactivitycallconversationbookingboard
versioninteger Range ≥ 1The record's version. Apply the item only when it is greater than the version you hold.
Variants
Each FeedItem is exactly one of these 2 variants.
With object
idstring ID prefixlead_…act_…call_…conv_…bkg_…brd_…Public id of the record; the facets
lead_attributionandlead_responseuse their lead's id.objectone of 8 objectsThe record as it is now.
Matcheskind:leaduses Leadlead_attributionuses LeadAttributionlead_responseuses LeadResponseactivityuses Activitycalluses Callconversationuses Conversationbookinguses Bookingboarduses Board
With removed
idstring ID prefixlead_…act_…call_…conv_…bkg_…brd_…Public id of the removed record.
removedobjectPresent only on a removal.
reasonstringerasedafter an erasure, which is also what deleting a lead, call or conversation in Totem does: erasing a lead erases its calls, conversations and merged duplicates too, while its bookings stay withleadset tonull.deletedfor any other removal. Either way, delete your copy and keep this version, so an older copy delivered later is ignored.Possible valueseraseddeleted
{
"kind": "lead",
"id": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"version": 3,
"object": {
"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"
}
}