[{"data":1,"prerenderedAt":599},["ShallowReactive",2],{"developers:\u002Fdevelopers\u002Fcoverage":3},{"doc":4,"lang":431,"nav":442,"alternatePath":546,"policy":547,"specVersion":591,"reference":7,"layout":592,"toc":593,"prev":596,"next":597,"operations":598,"overview":7,"heroExample":7},{"id":5,"title":6,"apiTag":7,"body":8,"description":428,"draft":429,"extension":430,"lang":431,"meta":432,"navTitle":7,"navigation":433,"order":434,"path":435,"rawbody":436,"section":437,"seo":438,"stem":439,"translationKey":440,"version":7,"__hash__":441},"developers_en\u002Fdevelopers\u002Fcoverage.md","Data coverage",null,{"type":9,"value":10,"toc":421},"minimark",[11,15,56,61,310,314,317,395,398,416],[12,13,14],"p",{},"The API returns what Totem has recorded, and tells you where each fact came from. It does not rebuild old attribution, invent status changes nobody recorded, or include the content of messages. This page tells you which facts you can rely on, and what an empty value means.",[16,17,20],"dev-callout",{"title":18,"type":19},"Some facts start on a fixed date","note",[12,21,22,23,27,28,27,31,34,35,38,39,44,45,27,48,51,52,55],{},"Totem records a few facts for the API only from the day it started capturing each one, the same day for every team: the ad that opened a conversation; the activities of a lead and what Totem reads from them (",[24,25,26],"code",{},"converted_at",", ",[24,29,30],{},"revived_at",[24,32,33],{},"status_set_by"," and ",[24,36,37],{},"archived_from_status","); the Meta ad set of an ad form submission; and the links between a rescheduled booking and its replacement. Neither this page nor the API gives that day; ask ",[40,41,43],"a",{"href":42},"\u002Fdevelopers\u002Fsupport","support"," if you need it. Records from before it carry ",[24,46,47],{},"null",[24,49,50],{},"unknown"," or ",[24,53,54],{},"not_captured"," for those facts, so do not treat your history as complete.",[57,58,60],"h2",{"id":59},"what-totem-records-and-since-when","What Totem records, and since when",[62,63,64,80],"table",{},[65,66,67],"thead",{},[68,69,70,74,77],"tr",{},[71,72,73],"th",{},"Fact",[71,75,76],{},"Where it comes from",[71,78,79],{},"Limits",[81,82,83,121,151,182,199,215,232,269,292],"tbody",{},[68,84,85,92,105],{},[86,87,88],"td",{},[89,90,91],"strong",{},"Who the lead is, and where it stands",[86,93,94,95,27,98,34,101,104],{},"The lead as it is now: contact details, ",[24,96,97],{},"status",[24,99,100],{},"board",[24,102,103],{},"stage",".",[86,106,107,108,27,110,51,113,115,116,120],{},"People on the team can edit these at any time. A value this version of the API does not know arrives as ",[24,109,47],{},[24,111,112],{},"other",[24,114,50],{},", depending on the field; ",[40,117,119],{"href":118},"\u002Fdevelopers\u002Fobjects","All objects"," says which.",[68,122,123,133,144],{},[86,124,125,128,129,132],{},[89,126,127],{},"How the lead first arrived"," (",[24,130,131],{},"attribution.original_capture",")",[86,134,135,136,139,140,143],{},"Recorded once, when the lead was created (",[24,137,138],{},"capture: at_creation","). A lead with no such record, because it was created before Totem started recording it or its creation was not recorded, gets a copy of the lead as it was when its team was first added to an integration (",[24,141,142],{},"capture: at_activation",").",[86,145,146,147,150],{},"An ",[24,148,149],{},"at_activation"," copy shows the lead on that day, not the form the person first filled in.",[68,152,153,161,164],{},[86,154,155,128,158,132],{},[89,156,157],{},"The latest ad form",[24,159,160],{},"attribution.latest_submission",[86,162,163],{},"The newest ad form submission recorded for the lead, including a repeat from a contact Totem already had.",[86,165,166,167,170,171,174,175,51,178,181],{},"It never changes how the lead first arrived. Google Ads and LinkedIn submissions stop being readable after 90 days (",[24,168,169],{},"expires_at","). A LinkedIn submission the person later deleted is no longer shown. When a submission expires or is withdrawn, the changes feed delivers a new ",[24,172,173],{},"lead_attribution"," version without it, which can show an older submission instead; replace your copy with it. LinkedIn Lead Sync cannot be connected today, and only Totem can connect Google Ads lead forms, so most teams have no ",[24,176,177],{},"google_ads",[24,179,180],{},"linkedin"," submissions.",[68,183,184,190,196],{},[86,185,186,189],{},[89,187,188],{},"Campaign, ad and form details"," from Google, LinkedIn and Meta",[86,191,192,193,104],{},"What the ad platform sent, field by field, each with its ",[24,194,195],{},"provenance",[86,197,198],{},"Totem does not attribute leads after the fact, and does not look ids up in the platforms' APIs to fill gaps.",[68,200,201,209,212],{},[86,202,203,128,206,132],{},[89,204,205],{},"The ad that opened a conversation",[24,207,208],{},"original_capture.ad_referral",[86,210,211],{},"The first Meta ad referral of the conversation that created the lead.",[86,213,214],{},"Only from the day Totem started recording it, as the note above explains. Never the messages.",[68,216,217,226,229],{},[86,218,219,128,222,27,224,132],{},[89,220,221],{},"Activities, and the dates they set",[24,223,26],{},[24,225,30],{},[86,227,228],{},"Each change of stage, status or assigned members that Totem recorded.",[86,230,231],{},"Only from the day Totem started recording them, as the note above explains. Totem does not invent changes it did not record.",[68,233,234,243,246],{},[86,235,236,239,240,132],{},[89,237,238],{},"How the team has responded"," (the lead's ",[24,241,242],{},"response",[86,244,245],{},"The times of messages and calls across the lead's conversations.",[86,247,248,249,253,254,257,258,261,262,265,266,104],{},"Erased messages and web-chat visitor messages are not counted, and imported WhatsApp history does not count as a customer message or as a reply. A reply is a sent message recorded as a conversation reply or with no purpose. Outreach and transactional messages, such as reminders, are left out when they are recorded as such, but many automated sends carry no purpose and do count as replies. Totem reads at most ",[250,251],"api-const",{"name":252},"LEAD_RESPONSE_READ_BUDGET.conversations"," conversations, ",[250,255],{"name":256},"LEAD_RESPONSE_READ_BUDGET.messageReads"," messages and ",[250,259],{"name":260},"LEAD_RESPONSE_READ_BUDGET.calls"," calls per lead; past that, ",[24,263,264],{},"coverage.truncated"," is ",[24,267,268],{},"true",[68,270,271,276,279],{},[86,272,273],{},[89,274,275],{},"Calls, conversations and bookings",[86,277,278],{},"The metadata Totem stores for each one.",[86,280,281,282,284,285,51,288,291],{},"A link to a lead that no longer exists is ",[24,283,47],{},". No recordings, transcripts, notes or payments. A booking rescheduled before Totem started recording reschedule links may lack its ",[24,286,287],{},"rescheduled_from",[24,289,290],{},"rescheduled_to"," link.",[68,293,294,299,304],{},[86,295,296],{},[89,297,298],{},"Contact permissions",[86,300,301,302,104],{},"The refusals Totem stored, each with its ",[24,303,195],{},[86,305,306,307,309],{},"A ",[24,308,47],{}," consent means unknown, never yes. Apply permissions before you contact anyone.",[57,311,313],{"id":312},"provenance-and-empty-values","Provenance and empty values",[12,315,316],{},"Many fields tell you where their value came from:",[318,319,320,338,367,381],"ul",{},[321,322,323,326,327,330,331,334,335,337],"li",{},[24,324,325],{},"capture",", on ",[24,328,329],{},"original_capture",": ",[24,332,333],{},"at_creation"," when it was recorded as the lead was created, or ",[24,336,149],{}," when it was copied once, as the team was first added to an integration, for a lead that had no capture record: one created before Totem started recording attribution, or whose creation was not recorded.",[321,339,340,342,343,346,347,350,351,354,355,358,359,361,362,265,365,104],{},[24,341,195],{},", on each campaign, ad, form and UTM field: ",[24,344,345],{},"provider"," when the ad platform sent it, ",[24,348,349],{},"team_alias"," when someone on the team typed it, ",[24,352,353],{},"stored_metadata"," when it comes from lead data the team can edit, ",[24,356,357],{},"stored_metadata_at_activation"," when that data was copied once at activation, and ",[24,360,54],{}," exactly when ",[24,363,364],{},"value",[24,366,47],{},[321,368,369,372,373,376,377,380],{},[24,370,371],{},"source_provenance",", on a lead: ",[24,374,375],{},"server_written"," when Totem stamped the source itself from the ad platform, or ",[24,378,379],{},"member_editable"," when people on the team can change it.",[321,382,383,34,386,330,389,391,392,394],{},[24,384,385],{},"original_capture_missing_reason",[24,387,388],{},"latest_submission_missing_reason",[24,390,54],{}," whenever the object next to them is ",[24,393,47],{},", whatever the reason: Totem did not record it, the lead never came from an ad form, or the submission expired or was withdrawn.",[12,396,397],{},"And when a value is empty:",[318,399,400,405,410],{},[321,401,306,402,404],{},[24,403,47],{}," date is not proof that something never happened. It can mean Totem did not record it.",[321,406,306,407,409],{},[24,408,47],{}," consent is unknown. It is never consent.",[321,411,412,413,415],{},"Check ",[24,414,264],{}," before you treat a lead's response as complete.",[12,417,418,420],{},[40,419,119],{"href":118}," describes every field, and lists every value each of these fields can take today.",{"title":422,"searchDepth":423,"depth":423,"links":424},"",3,[425,427],{"id":59,"depth":426,"text":60},2,{"id":312,"depth":426,"text":313},"What Totem records, since when, and how to tell an empty value from a fact that was never recorded.",false,"md","en",{},true,"30","\u002Fdevelopers\u002Fcoverage","---\ntitle: Data coverage\ndescription: What Totem records, since when, and how to tell an empty value from a fact that was never recorded.\nsection: guides\norder: 30\ntranslationKey: coverage\nlang: en\ndraft: false\n---\n\nThe API returns what Totem has recorded, and tells you where each fact came from. It does not rebuild old attribution, invent status changes nobody recorded, or include the content of messages. This page tells you which facts you can rely on, and what an empty value means.\n\n::dev-callout{type=\"note\" title=\"Some facts start on a fixed date\"}\nTotem records a few facts for the API only from the day it started capturing each one, the same day for every team: the ad that opened a conversation; the activities of a lead and what Totem reads from them (`converted_at`, `revived_at`, `status_set_by` and `archived_from_status`); the Meta ad set of an ad form submission; and the links between a rescheduled booking and its replacement. Neither this page nor the API gives that day; ask [support](\u002Fdevelopers\u002Fsupport) if you need it. Records from before it carry `null`, `unknown` or `not_captured` for those facts, so do not treat your history as complete.\n::\n\n## What Totem records, and since when\n\n| Fact | Where it comes from | Limits |\n|---|---|---|\n| **Who the lead is, and where it stands** | The lead as it is now: contact details, `status`, `board` and `stage`. | People on the team can edit these at any time. A value this version of the API does not know arrives as `null`, `other` or `unknown`, depending on the field; [All objects](\u002Fdevelopers\u002Fobjects) says which. |\n| **How the lead first arrived** (`attribution.original_capture`) | Recorded once, when the lead was created (`capture: at_creation`). A lead with no such record, because it was created before Totem started recording it or its creation was not recorded, gets a copy of the lead as it was when its team was first added to an integration (`capture: at_activation`). | An `at_activation` copy shows the lead on that day, not the form the person first filled in. |\n| **The latest ad form** (`attribution.latest_submission`) | The newest ad form submission recorded for the lead, including a repeat from a contact Totem already had. | It never changes how the lead first arrived. Google Ads and LinkedIn submissions stop being readable after 90 days (`expires_at`). A LinkedIn submission the person later deleted is no longer shown. When a submission expires or is withdrawn, the changes feed delivers a new `lead_attribution` version without it, which can show an older submission instead; replace your copy with it. LinkedIn Lead Sync cannot be connected today, and only Totem can connect Google Ads lead forms, so most teams have no `google_ads` or `linkedin` submissions. |\n| **Campaign, ad and form details** from Google, LinkedIn and Meta | What the ad platform sent, field by field, each with its `provenance`. | Totem does not attribute leads after the fact, and does not look ids up in the platforms' APIs to fill gaps. |\n| **The ad that opened a conversation** (`original_capture.ad_referral`) | The first Meta ad referral of the conversation that created the lead. | Only from the day Totem started recording it, as the note above explains. Never the messages. |\n| **Activities, and the dates they set** (`converted_at`, `revived_at`) | Each change of stage, status or assigned members that Totem recorded. | Only from the day Totem started recording them, as the note above explains. Totem does not invent changes it did not record. |\n| **How the team has responded** (the lead's `response`) | The times of messages and calls across the lead's conversations. | Erased messages and web-chat visitor messages are not counted, and imported WhatsApp history does not count as a customer message or as a reply. A reply is a sent message recorded as a conversation reply or with no purpose. Outreach and transactional messages, such as reminders, are left out when they are recorded as such, but many automated sends carry no purpose and do count as replies. Totem reads at most :api-const{name=\"LEAD_RESPONSE_READ_BUDGET.conversations\"} conversations, :api-const{name=\"LEAD_RESPONSE_READ_BUDGET.messageReads\"} messages and :api-const{name=\"LEAD_RESPONSE_READ_BUDGET.calls\"} calls per lead; past that, `coverage.truncated` is `true`. |\n| **Calls, conversations and bookings** | The metadata Totem stores for each one. | A link to a lead that no longer exists is `null`. No recordings, transcripts, notes or payments. A booking rescheduled before Totem started recording reschedule links may lack its `rescheduled_from` or `rescheduled_to` link. |\n| **Contact permissions** | The refusals Totem stored, each with its `provenance`. | A `null` consent means unknown, never yes. Apply permissions before you contact anyone. |\n\n## Provenance and empty values\n\nMany fields tell you where their value came from:\n\n- `capture`, on `original_capture`: `at_creation` when it was recorded as the lead was created, or `at_activation` when it was copied once, as the team was first added to an integration, for a lead that had no capture record: one created before Totem started recording attribution, or whose creation was not recorded.\n- `provenance`, on each campaign, ad, form and UTM field: `provider` when the ad platform sent it, `team_alias` when someone on the team typed it, `stored_metadata` when it comes from lead data the team can edit, `stored_metadata_at_activation` when that data was copied once at activation, and `not_captured` exactly when `value` is `null`.\n- `source_provenance`, on a lead: `server_written` when Totem stamped the source itself from the ad platform, or `member_editable` when people on the team can change it.\n- `original_capture_missing_reason` and `latest_submission_missing_reason`: `not_captured` whenever the object next to them is `null`, whatever the reason: Totem did not record it, the lead never came from an ad form, or the submission expired or was withdrawn.\n\nAnd when a value is empty:\n\n- A `null` date is not proof that something never happened. It can mean Totem did not record it.\n- A `null` consent is unknown. It is never consent.\n- Check `coverage.truncated` before you treat a lead's response as complete.\n\n[All objects](\u002Fdevelopers\u002Fobjects) describes every field, and lists every value each of these fields can take today.\n","guides",{"title":6,"description":428},"developers\u002Fcoverage","coverage","GZHRJ4jJ5RT9U_BYLMAf-yfU_fVTnUbSw-PYqTuwHok",[443,458,481,528],{"section":444,"items":445},"start",[446,450,454],{"path":447,"title":448,"description":449},"\u002Fdevelopers","Overview","Read the leads, calls, conversations and bookings of your Totem teams from your own systems, and keep a copy in sync.",{"path":451,"title":452,"description":453},"\u002Fdevelopers\u002Fquickstart","Quickstart","Make your first requests to the Totem API in a few minutes. Check your key, find your team, list leads and start a sync.",{"path":455,"title":456,"description":457},"\u002Fdevelopers\u002Fauthentication","Authentication","Secret keys and where they may live, the Totem-Team header for keys with several teams, IP allowlists, and how to roll or revoke a key.",{"section":437,"items":459},[460,464,468,472,473,477],{"path":461,"title":462,"description":463},"\u002Fdevelopers\u002Ftypescript","TypeScript SDK","Use the official TypeScript client to read your Totem data, paginate lists and handle API errors from your server.",{"path":465,"title":466,"description":467},"\u002Fdevelopers\u002Fsync","Keep a copy in sync","Copy a team with the changes feed and keep the copy current. Apply pages safely, recover from errors, and start from a reference client that Totem tests.",{"path":469,"title":470,"description":471},"\u002Fdevelopers\u002Fpagination","Lists and pagination","How list endpoints return records a page at a time, how to read every page, and what order and filters a list supports.",{"path":435,"title":6,"description":428},{"path":474,"title":475,"description":476},"\u002Fdevelopers\u002Ftesting","Testing and go-live","How to build and test an integration safely while the API has no test environment, and what to check before you go live.",{"path":478,"title":479,"description":480},"\u002Fdevelopers\u002Fsecurity","Security and personal data","How Totem protects API keys and the data the API serves, what it records about each key, where the API runs, and what to do with the personal data you copy.",{"section":482,"items":483},"reference",[484,488,492,496,501,506,511,516,521,526],{"path":485,"title":486,"description":487},"\u002Fdevelopers\u002Fconventions","Conventions","The notation these docs use, and the rules every response follows: ids, timestamps, empty values, amounts, enums, versions, stability, errors and untrusted text.",{"path":489,"title":490,"description":491},"\u002Fdevelopers\u002Ferrors","Errors","The error format, how your integration should handle each kind of error, and every error code with when it happens and what to do.",{"path":493,"title":494,"description":495},"\u002Fdevelopers\u002Frate-limits","Rate limits","How much a key can read per minute and per day, what counts toward each limit, how to retry after a 429, and how long an initial sync takes.",{"path":497,"title":498,"description":499,"apiTag":500},"\u002Fdevelopers\u002Freference-account","Account, teams and members","Check that a key works and what it can read, list its teams with their time zones, list each team's members, and check that the API is up.","account",{"path":502,"title":503,"description":504,"apiTag":505},"\u002Fdevelopers\u002Freference-leads","Leads, boards and activities","List, fetch and search a team's leads and clients, read each lead's activities, and list the boards and stages they move through.","leads",{"path":507,"title":508,"description":509,"apiTag":510},"\u002Fdevelopers\u002Freference-calls","Calls","List and fetch a team's calls, with their direction, timing and a normalized outcome. No recordings or transcripts.","calls",{"path":512,"title":513,"description":514,"apiTag":515},"\u002Fdevelopers\u002Freference-conversations","Conversations","List and fetch a team's conversations on every channel, with their status, assignee, whether a person has taken them over and when the last messages came and went. Never message content.","conversations",{"path":517,"title":518,"description":519,"apiTag":520},"\u002Fdevelopers\u002Freference-bookings","Bookings and services","List and fetch a team's bookings, and list the services its customers can book.","bookings",{"path":522,"title":523,"description":524,"apiTag":525},"\u002Fdevelopers\u002Freference-sync","Changes feed","One endpoint that copies a team and then returns every change, page by page.","sync",{"path":118,"title":119,"description":527},"Every object the API returns, field by field, with an example of each.",{"section":529,"items":530},"resources",[531,535,538,542],{"path":532,"title":533,"description":534},"\u002Fdevelopers\u002Fchangelog","Changelog","Changes to the Totem API, newest first, each under the date it shipped.",{"path":42,"title":536,"description":537},"Support","How to get help with the Totem API, what to include in a request, and what to do if a key leaks.",{"path":539,"title":540,"description":541},"\u002Fdevelopers\u002Fglossary","Glossary","The terms these docs use, defined in one place, each with a link to the page that explains it.",{"path":543,"title":544,"description":545},"\u002Fdevelopers\u002Ffaq","FAQ","Short answers to the questions developers ask most about the Totem API, with links to the details.","\u002Fdevelopers\u002Fes\u002Fcoverage",{"ACTIVATION_MARGIN_MS":548,"ADMIN_ACCESS_DISCLOSURE_VERSION":549,"AUDIT_RETENTION_DAYS":550,"AUTH_FAILURE_LIMITS":551,"CAPTURE_LAG_FLOOR_MS":555,"CAPTURE_LAG_P99_MS":7,"CURSOR_MAX_AGE_DAYS":556,"DIRTY_TTL_DAYS":556,"FAMILY_TEAM_SCOPE":557,"FAMILY_TEAM_SCOPE_OPTIONS":558,"FEED_SETTLE_LAG_MS":560,"GATE_REFRESH_MS":548,"INTEGRATION_NAME_LENGTH":561,"INTEGRATION_PURPOSE_LENGTH":563,"KEY_CACHE_TTL_MS":566,"KEY_STATS_RETENTION_DAYS":567,"LEAD_RESPONSE_READ_BUDGET":568,"LIST_SCAN_MAX":571,"MAX_FAMILY_INTEGRATION_TEAMS":556,"MAX_INTEGRATIONS_PER_FAMILY":572,"MAX_IP_ALLOWLIST":553,"PAGE_LIMIT":573,"PLATFORM_CONFIG_TTL_MS":576,"REMOVAL_RETENTION_DAYS":577,"REQUEST_BODY_MAX_BYTES":578,"ROLL_GRACE_DEFAULT_HOURS":579,"ROLL_GRACE_HOURS":580,"SEARCH_MAX_RESULTS":572,"SENSITIVE_SECTOR_POLICY":583,"SENSITIVE_SECTOR_POLICY_OPTIONS":584,"SYNC_DAILY_BUDGET":586,"SYNC_VELOCITY":588,"TEAM_CACHE_TTL_MS":590},60000,"2026-10-17",365,{"perIpPerMinute":552,"perLookupIdPerMinute":553,"banMs":554},60,20,600000,300000,30,"explicit_list",[557,559],"all_family_teams",10000,{"min":426,"max":562},80,{"min":564,"max":565},1,280,5000,90,{"conversations":553,"messageReads":569,"calls":570},200,50,1000,10,{"default":574,"max":575},25,100,15000,45,16384,24,[581,564,579,582],0,168,"exclude",[583,585],"allow",{"floor":587,"recordsMultiplier":423},250000,{"perMinute":589,"burst":560},2000,30000,"1.0a","guide",[594,595],{"id":59,"text":60,"depth":426},{"id":312,"text":313,"depth":426},{"path":469,"title":470,"section":437},{"path":474,"title":475,"section":437},[],1792502788641]