[{"data":1,"prerenderedAt":433},["ShallowReactive",2],{"developers:\u002Fdevelopers\u002Fchangelog":3},{"doc":4,"lang":267,"nav":279,"alternatePath":381,"policy":382,"specVersion":277,"reference":7,"layout":426,"toc":427,"prev":430,"next":431,"operations":432,"overview":7,"heroExample":7},{"id":5,"title":6,"apiTag":7,"body":8,"description":264,"draft":265,"extension":266,"lang":267,"meta":268,"navTitle":7,"navigation":269,"order":270,"path":271,"rawbody":272,"section":273,"seo":274,"stem":275,"translationKey":276,"version":277,"__hash__":278},"developers_en\u002Fdevelopers\u002Fchangelog.md","Changelog",null,{"type":9,"value":10,"toc":257},"minimark",[11,26,31,221,225,232],[12,13,14,15,19,20,25],"p",{},"Each entry is dated, and an entry that asks you to change your integration or to run a full resync starts with ",[16,17,18],"strong",{},"Action required",". ",[21,22,24],"a",{"href":23},"\u002Fdevelopers\u002Fconventions#what-beta-means","Conventions"," explains what can change during the Beta.",[27,28,30],"h2",{"id":29},"_10a-beta-updates-2026-10-18","1.0a: Beta updates (2026-10-18)",[32,33,34,54,74,81,88,91,101,104,122,135,158,168,179,197,200,214],"ul",{},[35,36,37,41,42,45,46,49,50,53],"li",{},[38,39,40],"code",{},"GET \u002Fv1\u002Fcalls",", ",[38,43,44],{},"GET \u002Fv1\u002Fconversations"," and ",[38,47,48],{},"GET \u002Fv1\u002Fbookings"," take an optional ",[38,51,52],{},"lead"," filter: one lead's calls, conversations or bookings, without paging the whole list.",[35,55,56,59,60,63,64,41,67,45,70,73],{},[38,57,58],{},"POST \u002Fv1\u002Fleads\u002Fsearch"," by ",[38,61,62],{},"phone"," also finds the number stored in the layouts phone libraries write (",[38,65,66],{},"+1 202-555-0123",[38,68,69],{},"(202) 555-0123",[38,71,72],{},"2025550123","), as older imports stored it.",[35,75,76,77,80],{},"The Spanish docs show each error's title in Spanish. The ",[38,78,79],{},"title"," of a problem body stays in English.",[35,82,83,84,87],{},"Totem stops exporting teams in a sensitive business sector, such as health care, until it changes its sector policy. Such a team can no longer be added to an integration, and a key that covers one gets ",[38,85,86],{},"403 sector_restricted"," for it. Skip the team. The changes feed delivers nothing for it, removals included, so keep what you already have only as long as your retention policy allows, then delete your copy.",[35,89,90],{},"Activities whose first capture failed are now captured later, so a lead can receive activities older than ones you already hold.",[35,92,93,96,97,100],{},[38,94,95],{},"transferred_to.lead"," now documents that it is also ",[38,98,99],{},"null"," when the transfer landed on an existing lead-ads lead or another lead with a fixed id.",[35,102,103],{},"The docs now say that the API is reachable over IPv4 only, so an IPv6 entry in an IP allowlist never matches.",[35,105,106,107,110,111,114,115,118,119,121],{},"Calls that Totem reconciled or imported from its AI voice provider now report their real ",[38,108,109],{},"outcome",", instead of ",[38,112,113],{},"unknown",". A call still in progress reports ",[38,116,117],{},"duration_seconds"," as ",[38,120,99],{},".",[35,123,124,125,128,129,110,132,121],{},"A lead whose status this version does not know now reads ",[38,126,127],{},"record_kind: \"lead\""," with ",[38,130,131],{},"status: null",[38,133,134],{},"client",[35,136,137,138,141,142,145,146,149,150,153,154,157],{},"A lead's ",[38,139,140],{},"attribution.original_capture.origin.kind"," is always ",[38,143,144],{},"conversation"," or ",[38,147,148],{},"call",", and ",[38,151,152],{},"original_capture.source"," uses the same values as the lead's ",[38,155,156],{},"source",". A LinkedIn submission the person withdrew is no longer reported as the latest submission.",[35,159,160,163,164,167],{},[16,161,162],{},"Action required."," A one-team key stops reading its team, with ",[38,165,166],{},"404 team_not_accessible",", once the team joins, leaves or changes organization. Revoke it and create a new one.",[35,169,170,171,19,174,178],{},"The per-key rate limit charges every request it counts at least one item, including a search with no match and a ",[38,172,173],{},"404",[21,175,177],{"href":176},"\u002Fdevelopers\u002Frate-limits","Rate limits"," lists what is not charged.",[35,180,181,182,185,186,189,190,193,194,121],{},"A tampered ",[38,183,184],{},"cursor"," on ",[38,187,188],{},"GET \u002Fv1\u002Fsync\u002Fchanges"," gets ",[38,191,192],{},"400 invalid_request",", instead of a ",[38,195,196],{},"500",[35,198,199],{},"Failed attempts with a revoked or expired key no longer count toward a lockout, and a locked key keeps working for the holder of its real secret.",[35,201,202,205,206,210,211,121],{},[38,203,204],{},"limit"," documents its default of ",[207,208],"api-const",{"name":209},"PAGE_LIMIT.default",". The docs now explain what deleting a lead, call or conversation in Totem sends through the changes feed, and what the firewall answers outside ",[38,212,213],{},"\u002Fv1\u002F",[35,215,216,220],{},[21,217,219],{"href":218},"\u002Fdevelopers\u002Ftypescript","TypeScript SDK"," 0.1.0-beta.2: typed error actions and codes, deadline-aware retries, open enum types and Node.js 22.12 support.",[27,222,224],{"id":223},"_10a-beta-2026-10-18","1.0a: Beta (2026-10-18)",[12,226,227,228,231],{},"Public Beta. Eligible team and organization administrators can create integrations in ",[16,229,230],{},"Settings → Developers"," without an invitation.",[32,233,234,237,240,249,254],{},[35,235,236],{},"The first version of the API: read-only, and in beta.",[35,238,239],{},"Endpoints for the integration and its teams, boards, members, bookable services, leads (with their attribution, response and activities), calls, conversations and bookings.",[35,241,242,243,248],{},"The changes feed, ",[21,244,246],{"href":245},"\u002Fdevelopers\u002Freference-sync#sync.changes",[38,247,188],{},", with removals and full resync.",[35,250,251,252,121],{},"Secret keys with roll, revoke and an optional IP allowlist, managed in ",[16,253,230],{},[35,255,256],{},"No webhooks: poll the changes feed every 1 to 5 minutes.",{"title":258,"searchDepth":259,"depth":259,"links":260},"",3,[261,263],{"id":29,"depth":262,"text":30},2,{"id":223,"depth":262,"text":224},"Changes to the Totem API, newest first, each under the date it shipped.",false,"md","en",{},true,"1","\u002Fdevelopers\u002Fchangelog","---\ntitle: Changelog\ndescription: Changes to the Totem API, newest first, each under the date it shipped.\nsection: resources\norder: 1\ntranslationKey: changelog\nlang: en\ndraft: false\nversion: \"1.0a\"\n---\n\nEach entry is dated, and an entry that asks you to change your integration or to run a full resync starts with **Action required**. [Conventions](\u002Fdevelopers\u002Fconventions#what-beta-means) explains what can change during the Beta.\n\n## 1.0a: Beta updates (2026-10-18)\n\n- `GET \u002Fv1\u002Fcalls`, `GET \u002Fv1\u002Fconversations` and `GET \u002Fv1\u002Fbookings` take an optional `lead` filter: one lead's calls, conversations or bookings, without paging the whole list.\n- `POST \u002Fv1\u002Fleads\u002Fsearch` by `phone` also finds the number stored in the layouts phone libraries write (`+1 202-555-0123`, `(202) 555-0123` and `2025550123`), as older imports stored it.\n- The Spanish docs show each error's title in Spanish. The `title` of a problem body stays in English.\n- Totem stops exporting teams in a sensitive business sector, such as health care, until it changes its sector policy. Such a team can no longer be added to an integration, and a key that covers one gets `403 sector_restricted` for it. Skip the team. The changes feed delivers nothing for it, removals included, so keep what you already have only as long as your retention policy allows, then delete your copy.\n- Activities whose first capture failed are now captured later, so a lead can receive activities older than ones you already hold.\n- `transferred_to.lead` now documents that it is also `null` when the transfer landed on an existing lead-ads lead or another lead with a fixed id.\n- The docs now say that the API is reachable over IPv4 only, so an IPv6 entry in an IP allowlist never matches.\n- Calls that Totem reconciled or imported from its AI voice provider now report their real `outcome`, instead of `unknown`. A call still in progress reports `duration_seconds` as `null`.\n- A lead whose status this version does not know now reads `record_kind: \"lead\"` with `status: null`, instead of `client`.\n- A lead's `attribution.original_capture.origin.kind` is always `conversation` or `call`, and `original_capture.source` uses the same values as the lead's `source`. A LinkedIn submission the person withdrew is no longer reported as the latest submission.\n- **Action required.** A one-team key stops reading its team, with `404 team_not_accessible`, once the team joins, leaves or changes organization. Revoke it and create a new one.\n- The per-key rate limit charges every request it counts at least one item, including a search with no match and a `404`. [Rate limits](\u002Fdevelopers\u002Frate-limits) lists what is not charged.\n- A tampered `cursor` on `GET \u002Fv1\u002Fsync\u002Fchanges` gets `400 invalid_request`, instead of a `500`.\n- Failed attempts with a revoked or expired key no longer count toward a lockout, and a locked key keeps working for the holder of its real secret.\n- `limit` documents its default of :api-const{name=\"PAGE_LIMIT.default\"}. The docs now explain what deleting a lead, call or conversation in Totem sends through the changes feed, and what the firewall answers outside `\u002Fv1\u002F`.\n- [TypeScript SDK](\u002Fdevelopers\u002Ftypescript) 0.1.0-beta.2: typed error actions and codes, deadline-aware retries, open enum types and Node.js 22.12 support.\n\n## 1.0a: Beta (2026-10-18)\n\nPublic Beta. Eligible team and organization administrators can create integrations in **Settings → Developers** without an invitation.\n\n- The first version of the API: read-only, and in beta.\n- Endpoints for the integration and its teams, boards, members, bookable services, leads (with their attribution, response and activities), calls, conversations and bookings.\n- The changes feed, [`GET \u002Fv1\u002Fsync\u002Fchanges`](\u002Fdevelopers\u002Freference-sync#sync.changes), with removals and full resync.\n- Secret keys with roll, revoke and an optional IP allowlist, managed in **Settings → Developers**.\n- No webhooks: poll the changes feed every 1 to 5 minutes.\n","resources",{"title":6,"description":264},"developers\u002Fchangelog","changelog","1.0a","WpjNZdABeAjkoDdqjE2GX8dPyPaIWtpZ6_YZjb_uahQ",[280,295,320,366],{"section":281,"items":282},"start",[283,287,291],{"path":284,"title":285,"description":286},"\u002Fdevelopers","Overview","Read the leads, calls, conversations and bookings of your Totem teams from your own systems, and keep a copy in sync.",{"path":288,"title":289,"description":290},"\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":292,"title":293,"description":294},"\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":296,"items":297},"guides",[298,300,304,308,312,316],{"path":218,"title":219,"description":299},"Use the official TypeScript client to read your Totem data, paginate lists and handle API errors from your server.",{"path":301,"title":302,"description":303},"\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":305,"title":306,"description":307},"\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":309,"title":310,"description":311},"\u002Fdevelopers\u002Fcoverage","Data coverage","What Totem records, since when, and how to tell an empty value from a fact that was never recorded.",{"path":313,"title":314,"description":315},"\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":317,"title":318,"description":319},"\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":321,"items":322},"reference",[323,326,330,332,337,342,347,352,357,362],{"path":324,"title":24,"description":325},"\u002Fdevelopers\u002Fconventions","The notation these docs use, and the rules every response follows: ids, timestamps, empty values, amounts, enums, versions, stability, errors and untrusted text.",{"path":327,"title":328,"description":329},"\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":176,"title":177,"description":331},"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":333,"title":334,"description":335,"apiTag":336},"\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":338,"title":339,"description":340,"apiTag":341},"\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":343,"title":344,"description":345,"apiTag":346},"\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":348,"title":349,"description":350,"apiTag":351},"\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":353,"title":354,"description":355,"apiTag":356},"\u002Fdevelopers\u002Freference-bookings","Bookings and services","List and fetch a team's bookings, and list the services its customers can book.","bookings",{"path":358,"title":359,"description":360,"apiTag":361},"\u002Fdevelopers\u002Freference-sync","Changes feed","One endpoint that copies a team and then returns every change, page by page.","sync",{"path":363,"title":364,"description":365},"\u002Fdevelopers\u002Fobjects","All objects","Every object the API returns, field by field, with an example of each.",{"section":273,"items":367},[368,369,373,377],{"path":271,"title":6,"description":264},{"path":370,"title":371,"description":372},"\u002Fdevelopers\u002Fsupport","Support","How to get help with the Totem API, what to include in a request, and what to do if a key leaks.",{"path":374,"title":375,"description":376},"\u002Fdevelopers\u002Fglossary","Glossary","The terms these docs use, defined in one place, each with a link to the page that explains it.",{"path":378,"title":379,"description":380},"\u002Fdevelopers\u002Ffaq","FAQ","Short answers to the questions developers ask most about the Totem API, with links to the details.","\u002Fdevelopers\u002Fes\u002Fchangelog",{"ACTIVATION_MARGIN_MS":383,"ADMIN_ACCESS_DISCLOSURE_VERSION":384,"AUDIT_RETENTION_DAYS":385,"AUTH_FAILURE_LIMITS":386,"CAPTURE_LAG_FLOOR_MS":390,"CAPTURE_LAG_P99_MS":7,"CURSOR_MAX_AGE_DAYS":391,"DIRTY_TTL_DAYS":391,"FAMILY_TEAM_SCOPE":392,"FAMILY_TEAM_SCOPE_OPTIONS":393,"FEED_SETTLE_LAG_MS":395,"GATE_REFRESH_MS":383,"INTEGRATION_NAME_LENGTH":396,"INTEGRATION_PURPOSE_LENGTH":398,"KEY_CACHE_TTL_MS":401,"KEY_STATS_RETENTION_DAYS":402,"LEAD_RESPONSE_READ_BUDGET":403,"LIST_SCAN_MAX":406,"MAX_FAMILY_INTEGRATION_TEAMS":391,"MAX_INTEGRATIONS_PER_FAMILY":407,"MAX_IP_ALLOWLIST":388,"PAGE_LIMIT":408,"PLATFORM_CONFIG_TTL_MS":411,"REMOVAL_RETENTION_DAYS":412,"REQUEST_BODY_MAX_BYTES":413,"ROLL_GRACE_DEFAULT_HOURS":414,"ROLL_GRACE_HOURS":415,"SEARCH_MAX_RESULTS":407,"SENSITIVE_SECTOR_POLICY":418,"SENSITIVE_SECTOR_POLICY_OPTIONS":419,"SYNC_DAILY_BUDGET":421,"SYNC_VELOCITY":423,"TEAM_CACHE_TTL_MS":425},60000,"2026-10-17",365,{"perIpPerMinute":387,"perLookupIdPerMinute":388,"banMs":389},60,20,600000,300000,30,"explicit_list",[392,394],"all_family_teams",10000,{"min":262,"max":397},80,{"min":399,"max":400},1,280,5000,90,{"conversations":388,"messageReads":404,"calls":405},200,50,1000,10,{"default":409,"max":410},25,100,15000,45,16384,24,[416,399,414,417],0,168,"exclude",[418,420],"allow",{"floor":422,"recordsMultiplier":259},250000,{"perMinute":424,"burst":395},2000,30000,"guide",[428,429],{"id":29,"text":30,"depth":262},{"id":223,"text":224,"depth":262},{"path":363,"title":364,"section":321},{"path":370,"title":371,"section":273},[],1792502788496]