Skip to content
Beta

Reference All objects

All objects

Every object the API returns, field by field, with an example of each.

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, attribution and response, inside it.
  • A list. Lists return object: "list", the objects in data, has_more, and next_cursor, which is null on the last page. Lists and pagination explains it.
  • A changes-feed page. The same envelope, but data holds feed items (the FeedItem object below) and next_cursor is always a string, even on an empty page. Keep a copy in sync explains it.
  • An error. An application/problem+json body, described in Errors.
  • The health check. GET /v1/health answers {"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 object and removed, and an error carries param only when it names one. A field with no value is null: never missing, and never an empty string.
  • Nullable marks a field that can be null. Data coverage says what a null can 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 Me object

The integration that owns the key, with the teams the key reads.

Attributes

  • object string

    Always integration.

  • id string ID prefix prn_…

    Public id of the integration.

  • livemode boolean

    true for a real key; false in example data.

  • name string

    The name an administrator gave the integration.

  • key object

    The key used for this request.

  • teams Array<string> ID prefix team_…

    The teams this key reads today. Their details are in GET /v1/teams.

  • scopes Array<string>

    The key's scopes: the fixed read set in v1.0a.

    Possible values
    • teams:read
    • crm:read
    • calls:read
    • messages:read
    • calendar:read
Me · exampleJSON
{
  "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"
  ]
}

The Team object

A team this key reads, with its time zone and default country.

Attributes

  • id string ID prefix team_…

    Public id of the record.

  • object string

    Always team.

  • livemode boolean

    true for real data; false in example data.

  • name string Nullable ≥ 1 chars

    The team's name as it appears in Totem, or null when none is stored.

  • timezone string ≥ 1 chars

    The 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_country string 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.phone is validated without a default country, so a number stored without its country prefix reads phone_status: invalid.

Team · exampleJSON
{
  "id": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
  "object": "team",
  "livemode": false,
  "name": "Example Dental",
  "timezone": "America/New_York",
  "default_country": "US"
}

The Member object

A team member, by display name only: Totem exports no email, phone or role.

Attributes

  • id string ID prefix mem_…

    Public id of the record.

  • object string

    Always member.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team this record belongs to.

  • display_name string Nullable ≥ 1 chars

    The member's display name, or first and last name, or null when none is stored. Totem exports no email, phone or role.

Member · exampleJSON
{
  "id": "mem_h548E7UiYhutHhucVrQCzkM0eaea0",
  "object": "member",
  "livemode": false,
  "team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
  "display_name": "Sam Lee"
}

The Lead object

A lead or client record: lead fields only.

Attributes

  • id string ID prefix lead_…

    Public id of the record.

  • object string

    Always lead.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team the record belongs to.

  • record_kind string

    lead when the record has a pipeline status, otherwise client. A lead whose status this version does not know reads status: null.

    Possible values
    • lead
    • client
  • name string Nullable

    First name or display name, or null.

  • surname string Nullable

    Surname, or null.

  • email string Nullable

    Email address as stored, or null.

  • company string Nullable

    Company, or null.

  • phone string Nullable

    Phone in E.164, only when the stored number validates; otherwise null.

  • phone_status string

    valid (see phone), invalid (a number is stored but does not validate, for example one stored without its country prefix) or missing.

    Possible values
    • valid
    • invalid
    • missing
  • status string Nullable

    Pipeline status; null for a client record, or for a status this version does not know. converted is not "won".

    Possible values
    • new
    • contacted
    • qualified
    • negotiating
    • converted
    • lost
    • archived
    • unreachable
  • status_set_by string Nullable

    Who set the current status: a person, the AI, Totem automation, an API caller, or unknown (no recorded transition lands on it). Null when status is null.

    Possible values
    • human
    • ai
    • system
    • api
    • unknown
  • archive_reason string Nullable

    Why the record was archived, as a closed code; stored free text is other. Null when none is stored.

    Possible values
    • opt_out
    • no_consent
    • not_interested
    • not_qualified
    • no_contact
    • merged
    • family_transfer
    • other
  • archived_from_status string Nullable

    The status the lead had before its current archive; null while it is not archived or when unknown.

    Possible values
    • new
    • contacted
    • qualified
    • negotiating
    • converted
    • lost
    • archived
    • unreachable
  • contact_permissions object

    Contact permissions. Apply them before any outreach from your own systems.

  • merged_into string Nullable ID prefix lead_…

    The lead this record was merged into, or null (also when that lead no longer exists).

  • transferred_to object Nullable

    Where a transfer to another team of your organization sent this lead, or null. The team may be one your key does not read.

  • revived_at string Nullable Format date-time

    When the contact last came back on their own and revived an archived lead, or null.

  • pipeline_cleared boolean

    True when the lead was converted with "clear pipeline data": board, stage, priority, assignees, estimated value and the source fields other than source_channel are null because they were cleared.

  • converted_at string Nullable Format date-time

    When the lead was converted, while its status is converted; otherwise null.

  • value_at_conversion number Nullable

    The estimated value when it was converted, in major units. Survives "clear pipeline data".

  • priority string Nullable

    Priority, or null.

    Possible values
    • low
    • medium
    • high
    • urgent
  • tags Array<string>

    Labels as stored. lead and booking are system labels.

  • board string Nullable ID prefix brd_…

    The board, resolved through the stage when it has one; or null.

  • stage string Nullable ID prefix stg_…

    The stage, or null.

  • assignees Array<string> Nullable ID prefix mem_…

    Assigned members, sorted. Null when the record has no pipeline data.

  • estimated_value number Nullable

    Estimated value in major units as stored (decimals allowed), or null.

  • estimated_value_currency null Nullable

    Always null: Totem stores no currency with the value.

  • source string Nullable

    The stored lead source; api also covers leads created by Totem itself (for example from a conversation or a call), see source_detail. Null when none is stored.

    Possible values
    • meta_lead_ads
    • manual
    • website_form
    • booking_page
    • csv_import
    • api
  • source_channel string Nullable

    The channel the record started on (for example whatsapp, phone, widget), or null. Team members can edit it.

  • source_detail string Nullable

    conversation, call, external:<provider>, gated_ad:<source>, family_handoff, api_intake or unknown; null when source needs no detail.

  • source_provenance string Nullable

    server_written when Totem set the source from what the ad platform reported; otherwise member_editable (team members can change it). Null with source.

    Possible values
    • server_written
    • member_editable
  • created_at string Format date-time

    When the record was created.

  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When Totem recorded this version (UTC). It is not the time the business event happened.

Lead · exampleJSON
{
  "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"
}

The LeadDetail object

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

  • id string ID prefix lead_…

    Public id of the record.

  • object string

    Always lead.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team the record belongs to.

  • record_kind string

    lead when the record has a pipeline status, otherwise client. A lead whose status this version does not know reads status: null.

    Possible values
    • lead
    • client
  • name string Nullable

    First name or display name, or null.

  • surname string Nullable

    Surname, or null.

  • email string Nullable

    Email address as stored, or null.

  • company string Nullable

    Company, or null.

  • phone string Nullable

    Phone in E.164, only when the stored number validates; otherwise null.

  • phone_status string

    valid (see phone), invalid (a number is stored but does not validate, for example one stored without its country prefix) or missing.

    Possible values
    • valid
    • invalid
    • missing
  • status string Nullable

    Pipeline status; null for a client record, or for a status this version does not know. converted is not "won".

    Possible values
    • new
    • contacted
    • qualified
    • negotiating
    • converted
    • lost
    • archived
    • unreachable
  • status_set_by string Nullable

    Who set the current status: a person, the AI, Totem automation, an API caller, or unknown (no recorded transition lands on it). Null when status is null.

    Possible values
    • human
    • ai
    • system
    • api
    • unknown
  • archive_reason string Nullable

    Why the record was archived, as a closed code; stored free text is other. Null when none is stored.

    Possible values
    • opt_out
    • no_consent
    • not_interested
    • not_qualified
    • no_contact
    • merged
    • family_transfer
    • other
  • archived_from_status string Nullable

    The status the lead had before its current archive; null while it is not archived or when unknown.

    Possible values
    • new
    • contacted
    • qualified
    • negotiating
    • converted
    • lost
    • archived
    • unreachable
  • contact_permissions object

    Contact permissions. Apply them before any outreach from your own systems.

  • merged_into string Nullable ID prefix lead_…

    The lead this record was merged into, or null (also when that lead no longer exists).

  • transferred_to object Nullable

    Where a transfer to another team of your organization sent this lead, or null. The team may be one your key does not read.

  • revived_at string Nullable Format date-time

    When the contact last came back on their own and revived an archived lead, or null.

  • pipeline_cleared boolean

    True when the lead was converted with "clear pipeline data": board, stage, priority, assignees, estimated value and the source fields other than source_channel are null because they were cleared.

  • converted_at string Nullable Format date-time

    When the lead was converted, while its status is converted; otherwise null.

  • value_at_conversion number Nullable

    The estimated value when it was converted, in major units. Survives "clear pipeline data".

  • priority string Nullable

    Priority, or null.

    Possible values
    • low
    • medium
    • high
    • urgent
  • tags Array<string>

    Labels as stored. lead and booking are system labels.

  • board string Nullable ID prefix brd_…

    The board, resolved through the stage when it has one; or null.

  • stage string Nullable ID prefix stg_…

    The stage, or null.

  • assignees Array<string> Nullable ID prefix mem_…

    Assigned members, sorted. Null when the record has no pipeline data.

  • estimated_value number Nullable

    Estimated value in major units as stored (decimals allowed), or null.

  • estimated_value_currency null Nullable

    Always null: Totem stores no currency with the value.

  • source string Nullable

    The stored lead source; api also covers leads created by Totem itself (for example from a conversation or a call), see source_detail. Null when none is stored.

    Possible values
    • meta_lead_ads
    • manual
    • website_form
    • booking_page
    • csv_import
    • api
  • source_channel string Nullable

    The channel the record started on (for example whatsapp, phone, widget), or null. Team members can edit it.

  • source_detail string Nullable

    conversation, call, external:<provider>, gated_ad:<source>, family_handoff, api_intake or unknown; null when source needs no detail.

  • source_provenance string Nullable

    server_written when Totem set the source from what the ad platform reported; otherwise member_editable (team members can change it). Null with source.

    Possible values
    • server_written
    • member_editable
  • created_at string Format date-time

    When the record was created.

  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When Totem recorded this version (UTC). It is not the time the business event happened.

  • attribution LeadAttribution Nullable

    The lead's attribution facet, or null while Totem is still preparing it.

  • response LeadResponse Nullable

    The lead's response facet, or null while Totem is still preparing it.

LeadDetail · exampleJSON
{
  "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"
  }
}

The LeadAttribution object

Where a lead came from: its original capture and latest submission.

Attributes

  • id string ID prefix lead_…

    Public id of the record.

  • object string

    Always lead_attribution.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team the lead belongs to.

  • original_capture object Nullable

    How 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.

  • original_capture_missing_reason string Nullable

    not_captured when original_capture is null, otherwise null.

    Possible values
    • not_captured
  • latest_submission object Nullable

    The 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.

  • latest_submission_missing_reason string Nullable

    not_captured when latest_submission is null, otherwise null.

    Possible values
    • not_captured
  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When Totem recorded this version (UTC). It is not the time the business event happened.

LeadAttribution · exampleJSON
{
  "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"
}

The LeadResponse object

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

  • id string ID prefix lead_…

    Public id of the record.

  • object string

    Always lead_response.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team this record belongs to.

  • last_inbound_at string Nullable Format date-time

    The 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_at string Nullable Format date-time

    The 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_reply boolean

    True when last_inbound_at is 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_at string Nullable Format date-time

    When the latest of the lead's calls whose outcome is answered_human or answered_ai started (UTC), or null. A connected outbound call on Totem's phone lines reads unknown, so it is not counted.

  • last_whatsapp_delivery_status string Nullable

    delivered, read or failed for the latest message sent to the lead on WhatsApp. Null when that message has no receipt yet (sent is never stored) or the lead has no message sent on WhatsApp.

    Possible values
    • delivered
    • read
    • failed
  • coverage object

    What these facts were computed from.

  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When Totem recorded this version (UTC). It is not the time the business event happened.

LeadResponse · exampleJSON
{
  "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"
}

The Activity object

One stage, status or assignee transition of a lead. Activities never change once written.

Attributes of every variant

  • id string ID prefix act_…

    Public id of the record.

  • object string

    Always activity.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team the lead belongs to.

  • lead string Nullable ID prefix lead_…

    The lead that moved. Null only while Totem has not yet assigned the lead its id.

  • occurred_at string Format date-time

    When the change was saved.

  • actor_kind string

    Who 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 values
    • human
    • ai
    • system
    • api
    • unknown
  • stage_snapshot object Nullable

    The stage the lead was in after the change (for "clear pipeline data", the stage it left), or null.

  • value_snapshot number Nullable

    The estimated value at that moment, in major units, or null.

  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When 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

  • type string

    status_changed, archived, unarchived, or revived (the contact came back on their own and reopened an archived lead).

    Possible values
    • status_changed
    • archived
    • unarchived
    • revived
  • from string Nullable

    The status before, or null when there was none.

    Possible values
    • new
    • contacted
    • qualified
    • negotiating
    • converted
    • lost
    • archived
    • unreachable
  • to string

    The status after.

    Possible values
    • new
    • contacted
    • qualified
    • negotiating
    • converted
    • lost
    • archived
    • unreachable

A stage move

When type is stage_changed

  • type string

    Always stage_changed.

  • from object Nullable

    The stage and board before, or null when the lead had neither.

  • to object

    The stage and board after.

A change of assigned members

When type is assignees_changed

  • type string

    Always assignees_changed.

  • from Array<string> ID prefix mem_…

    The assigned members before, sorted.

  • to Array<string> ID prefix mem_…

    The assigned members after, sorted.

Activity · exampleJSON
{
  "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"
}

The Board object

A board with its stages in pipeline order.

Attributes

  • id string ID prefix brd_…

    Public id of the record.

  • object string

    Always board.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team this record belongs to.

  • name string Nullable ≥ 1 chars

    The board's name, or null when none is stored.

  • is_default boolean

    True for the team's default board, where new leads land unless routed elsewhere.

  • is_archived boolean

    True when the board is archived (hidden from the board selector). Its leads still export.

  • appointment_booked_stage string Nullable ID prefix stg_…

    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.

  • stages Array<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.

  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When Totem recorded this version (UTC). It is not the time the business event happened.

Board · exampleJSON
{
  "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"
}

The Call object

A call: its direction, timing and a normalized outcome. No recording or transcript.

Attributes

  • id string ID prefix call_…

    Public id of the record.

  • object string

    Always call.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team this record belongs to.

  • lead string Nullable ID prefix lead_…

    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.

  • direction string Nullable

    inbound or outbound; null when not stored.

    Possible values
    • inbound
    • outbound
  • started_at string Nullable Format date-time

    When the call started (UTC), or when it was recorded if the provider gave no start time.

  • duration_seconds integer Nullable Range ≥ 0

    Whole seconds of the call (rounded down); null while the call is still live, or when not stored.

  • outcome string

    How the call ended: answered_human, answered_ai, voicemail, no_answer, busy, failed, or unknown (still live, or no evidence of who answered). Read it with outcome_basis.

    Possible values
    • answered_human
    • answered_ai
    • voicemail
    • no_answer
    • busy
    • failed
    • unknown
  • outcome_basis string

    The 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 reads unknown: 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), or none (no evidence, as for a call that is still live).

    Possible values
    • inbound_verdict
    • ai_analysis
    • duration_floor
    • carrier_answer_only
    • browser_session
    • none
  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When Totem recorded this version (UTC). It is not the time the business event happened.

Call · exampleJSON
{
  "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"
}

The Conversation object

A conversation on one channel: its status, assignee and the times of the latest messages, never their content.

Attributes

  • id string ID prefix conv_…

    Public id of the record.

  • object string

    Always conversation.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team this record belongs to.

  • lead string Nullable ID prefix lead_…

    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_type string Nullable

    The channel: whatsapp, email, chatbot (the web chat), facebook, instagram, sms or tiktok; 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 on id.

    Possible values
    • sms
    • whatsapp
    • facebook
    • instagram
    • tiktok
    • chatbot
    • email
  • status string Nullable

    active or archived in the team's inbox; null for a value this version does not know.

    Possible values
    • active
    • archived
  • assignee string Nullable ID prefix mem_…

    The team member assigned to the conversation (see /members), or null.

  • reply_mode string

    human while a person has taken the conversation over, including a WhatsApp chat answered from the WhatsApp Business app; ai otherwise. ai means no takeover is active, not that an assistant is set up or answering on this channel. A timed takeover returns to ai when it expires, and the record's version changes then.

    Possible values
    • ai
    • human
  • created_at string Nullable Format date-time

    When the conversation was created (UTC).

  • last_inbound_at string Nullable Format date-time

    The latest customer message (UTC). Not counted: erased messages, imported WhatsApp history and web-chat visitor turns, so a chatbot conversation reads null. Instagram shares cannot be told apart and count.

  • last_outbound_at string Nullable Format date-time

    The latest message sent to the customer that did not fail (UTC), whoever sent it. Imported WhatsApp history counts.

  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When Totem recorded this version (UTC). It is not the time the business event happened.

Conversation · exampleJSON
{
  "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"
}

The Booking object

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

  • id string ID prefix bkg_…

    Public id of the record.

  • object string

    Always booking.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team this record belongs to.

  • lead string Nullable ID prefix lead_…

    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.

  • kind string

    service_booking (booked for a bookable service, by the AI, a customer or a person), calendar_event (an event from the connected calendar) or external_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 as calendar_event.

    Possible values
    • service_booking
    • calendar_event
    • external_import
  • service string Nullable ID prefix svc_…

    The booked service (see /booking_services) on a service_booking; null otherwise.

  • status string Nullable

    scheduled, rescheduled, cancelled, postponed, attended, no_show or team_no_show (attendance is recorded only by people); null for a value this version does not know. rescheduled means the booking was moved in place and its times are the new ones; a booking the AI replaced with a new one reads cancelled, with rescheduled_to set.

    Possible values
    • scheduled
    • rescheduled
    • cancelled
    • postponed
    • attended
    • no_show
    • team_no_show
  • starts_at string Nullable Format date-time

    When the booking starts (UTC).

  • ends_at string Nullable Format date-time

    When the booking ends (UTC).

  • meeting_type string Nullable

    online, in_person or phone; null when not stored.

    Possible values
    • online
    • in_person
    • phone
  • source string Nullable

    Who booked it: ai, customer or operator; null when not recorded.

    Possible values
    • ai
    • customer
    • operator
  • rescheduled_from string Nullable ID prefix bkg_…

    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_to string Nullable ID prefix bkg_…

    The booking that replaced this one in a reschedule, or null. When it is set, this booking reads cancelled.

  • created_at string Nullable Format date-time

    When the booking was recorded in Totem (UTC).

  • version integer Range ≥ 1

    Increases 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_at string Format date-time

    When Totem recorded this version (UTC). It is not the time the business event happened.

Booking · exampleJSON
{
  "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"
}

The BookingService object

A service customers can book, with its meeting type.

Attributes

  • id string ID prefix svc_…

    Public id of the record.

  • object string

    Always booking_service.

  • livemode boolean

    true for real data; false in example data.

  • team string ID prefix team_…

    The team this record belongs to.

  • name string Nullable ≥ 1 chars

    The service's name, or null when none is stored.

  • meeting_type string

    How the service happens: online (the default when none is stored), in_person or phone.

    Possible values
    • online
    • in_person
    • phone
BookingService · exampleJSON
{
  "id": "svc_h42kgwwJGPzsm2Zoy1A1RBv1KIrX5",
  "object": "booking_service",
  "livemode": false,
  "team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
  "name": "First visit",
  "meeting_type": "in_person"
}

The FeedItem object

One change: the record's current state, or its removal.

Attributes of every variant

  • kind string

    The kind of the record, such as lead or call.

    Possible values
    • lead
    • lead_attribution
    • lead_response
    • activity
    • call
    • conversation
    • booking
    • board
  • version integer Range ≥ 1

    The 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

  • id string ID prefix lead_… act_… call_… conv_… bkg_… brd_…

    Public id of the record; the facets lead_attribution and lead_response use their lead's id.

  • object one of 8 objects

    The record as it is now.

    Matches kind:

With removed

  • id string ID prefix lead_… act_… call_… conv_… bkg_… brd_…

    Public id of the removed record.

  • removed object

    Present only on a removal.

FeedItem · exampleJSON
{
  "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"
  }
}

API version 1.0a