[{"data":1,"prerenderedAt":867},["ShallowReactive",2],{"developers:\u002Fdevelopers\u002Fconventions":3},{"doc":4,"lang":693,"nav":704,"alternatePath":802,"policy":803,"specVersion":847,"reference":7,"layout":848,"toc":849,"prev":864,"next":865,"operations":866,"overview":7,"heroExample":7},{"id":5,"title":6,"apiTag":7,"body":8,"description":690,"draft":691,"extension":692,"lang":693,"meta":694,"navTitle":7,"navigation":695,"order":696,"path":697,"rawbody":698,"section":699,"seo":700,"stem":701,"translationKey":702,"version":7,"__hash__":703},"developers_en\u002Fdevelopers\u002Fconventions.md","Conventions",null,{"type":9,"value":10,"toc":671},"minimark",[11,16,50,54,135,139,143,280,283,289,293,304,308,315,347,351,379,383,396,399,403,417,420,424,430,446,451,466,470,490,493,500,510,580,618,622,631,635],[12,13,15],"h2",{"id":14},"notation","Notation",[17,18,19,31,37,43],"ul",{},[20,21,22,26,27,30],"li",{},[23,24,25],"code",{},"GET \u002Fv1\u002Fleads\u002F{id}"," is a method and a path under ",[23,28,29],{},"https:\u002F\u002Fapi.totemstudio.ai",". A word in braces is a placeholder.",[20,32,33,36],{},[23,34,35],{},"…"," stands for a value left out of an example.",[20,38,39,42],{},[23,40,41],{},"$TOTEM_API_KEY"," is an environment variable that holds your secret key.",[20,44,45,46,49],{},"Field names appear as they are in the JSON. A dot reaches into an object: ",[23,47,48],{},"contact_permissions.do_not_contact",".",[12,51,53],{"id":52},"requests-and-responses","Requests and responses",[17,55,56,62,83,107],{},[20,57,58,59,49],{},"HTTPS only. Request and response bodies are JSON in UTF-8, and field names are ",[23,60,61],{},"snake_case",[20,63,64,65,68,69,72,73,75,76,79,80,49],{},"Every resource, such as a lead, a call or a team, has an ",[23,66,67],{},"object"," field that names its type, and a ",[23,70,71],{},"livemode"," field. ",[23,74,71],{}," is ",[23,77,78],{},"true"," on everything the API returns; only the example data of these docs has ",[23,81,82],{},"livemode: false",[20,84,85,86,89,90,89,93,96,97,100,101,106],{},"A collection comes in a list envelope with ",[23,87,88],{},"object: \"list\"",", ",[23,91,92],{},"data",[23,94,95],{},"has_more"," and ",[23,98,99],{},"next_cursor",". ",[102,103,105],"a",{"href":104},"\u002Fdevelopers\u002Fpagination","Lists and pagination"," explains it.",[20,108,109,110,113,114,116,117,100,120,126,127,130,131,49],{},"A few bodies have shapes of their own. The items of the changes feed carry ",[23,111,112],{},"kind",", and the record sits inside them under ",[23,115,67],{},", or a removal under ",[23,118,119],{},"removed",[102,121,123],{"href":122},"\u002Fdevelopers\u002Freference-account#health",[23,124,125],{},"GET \u002Fv1\u002Fhealth"," answers ",[23,128,129],{},"{\"object\": \"health\", \"status\": \"ok\"}",". Errors follow the format described under ",[102,132,134],{"href":133},"#errors","Errors",[12,136,138],{"id":137},"ids","Ids",[140,141,142],"p",{},"Ids are strings with a prefix that names the type of record:",[144,145,146,159],"table",{},[147,148,149],"thead",{},[150,151,152,156],"tr",{},[153,154,155],"th",{},"Prefix",[153,157,158],{},"Record",[160,161,162,173,183,193,203,213,230,240,250,260,270],"tbody",{},[150,163,164,170],{},[165,166,167],"td",{},[23,168,169],{},"team_",[165,171,172],{},"Team",[150,174,175,180],{},[165,176,177],{},[23,178,179],{},"mem_",[165,181,182],{},"Team member",[150,184,185,190],{},[165,186,187],{},[23,188,189],{},"svc_",[165,191,192],{},"Bookable service",[150,194,195,200],{},[165,196,197],{},[23,198,199],{},"brd_",[165,201,202],{},"Board",[150,204,205,210],{},[165,206,207],{},[23,208,209],{},"stg_",[165,211,212],{},"Stage",[150,214,215,220],{},[165,216,217],{},[23,218,219],{},"lead_",[165,221,222,223,96,226,229],{},"Lead, and its ",[23,224,225],{},"lead_attribution",[23,227,228],{},"lead_response"," facets",[150,231,232,237],{},[165,233,234],{},[23,235,236],{},"act_",[165,238,239],{},"Lead activity",[150,241,242,247],{},[165,243,244],{},[23,245,246],{},"call_",[165,248,249],{},"Call",[150,251,252,257],{},[165,253,254],{},[23,255,256],{},"conv_",[165,258,259],{},"Conversation",[150,261,262,267],{},[165,263,264],{},[23,265,266],{},"bkg_",[165,268,269],{},"Booking",[150,271,272,277],{},[165,273,274],{},[23,275,276],{},"prn_",[165,278,279],{},"Integration",[140,281,282],{},"Treat an id as opaque: store it whole, compare it exactly and never parse it. An id stays the same while its record exists. A record that is removed and later created again can come back with a new id.",[140,284,285,286,288],{},"Member ids belong to one team: the same person has a different ",[23,287,179],{}," id in each team.",[12,290,292],{"id":291},"timestamps","Timestamps",[140,294,295,296,299,300,303],{},"Timestamps are ISO 8601 strings in UTC, such as ",[23,297,298],{},"2026-10-15T09:30:00Z",", and may carry fractional seconds. Each team's time zone comes with ",[23,301,302],{},"GET \u002Fv1\u002Fteams\u002F{id}","; use it to display times, never to store them.",[12,305,307],{"id":306},"empty-values","Empty values",[140,309,310,311,314],{},"In API objects, a field with no value is ",[23,312,313],{},"null",", never an empty string. Some fields say why they are empty:",[17,316,317,338],{},[20,318,319,320,75,323,325,326,329,330,333,334,337],{},"a lead's ",[23,321,322],{},"phone",[23,324,313],{}," with ",[23,327,328],{},"phone_status"," set to ",[23,331,332],{},"missing"," or ",[23,335,336],{},"invalid",";",[20,339,340,341,325,343,346],{},"a lead's pipeline fields are ",[23,342,313],{},[23,344,345],{},"pipeline_cleared: true"," when someone converted the lead and cleared its pipeline data.",[12,348,350],{"id":349},"phones-and-amounts","Phones and amounts",[17,352,353,359,376],{},[20,354,355,356,49],{},"Phones are E.164 strings, such as ",[23,357,358],{},"+12025550123",[20,360,361,362,96,365,368,369,372,373,375],{},"A lead's ",[23,363,364],{},"estimated_value",[23,366,367],{},"value_at_conversion"," are amounts as Totem stores them: in major units, such as euros or dollars rather than cents, possibly with decimals. ",[23,370,371],{},"estimated_value_currency"," is always ",[23,374,313],{},", because Totem stores no currency with these values.",[20,377,378],{},"No field of version 1.0a carries an amount in minor units.",[12,380,382],{"id":381},"enums-can-grow","Enums can grow",[140,384,385,386,333,389,392,393,395],{},"Fields with a fixed set of values, such as ",[23,387,388],{},"status",[23,390,391],{},"archive_reason",", can gain values in any version, and so can error codes. When you meet a value you do not know, keep the record, treat the value as \"other\", and carry on with the sync. New kinds of record can also appear in the changes feed: store or skip an item whose ",[23,394,112],{}," you do not know, and keep syncing.",[140,397,398],{},"The OpenAPI document lists the values known today. If you generate a client from it, make sure the client accepts a value it does not know instead of rejecting the whole object.",[12,400,402],{"id":401},"record-versions","Record versions",[140,404,405,406,409,410,413,414,416],{},"Every record the changes feed delivers carries ",[23,407,408],{},"version",", an integer that grows each time the record changes, and ",[23,411,412],{},"updated_at",", the time of that version. That covers leads and their two facets, activities, calls, conversations, bookings and boards. Apply a record only when its ",[23,415,408],{}," is greater than the one you hold. The feed can deliver a record more than once; its version tells you which copy is newer.",[140,418,419],{},"Teams, members and bookable services have no version. When you read them again, replace your copy as a whole.",[12,421,423],{"id":422},"api-versions-and-stability","API versions and stability",[140,425,426,429],{},[23,427,428],{},"\u002Fv1"," is the current API version. New fields, enum values, endpoints and error codes can appear, so ignore what you do not use.",[140,431,432,433,436,437,440,441,445],{},"Every operation states its stability in this reference and, in the OpenAPI document, as ",[23,434,435],{},"x-totem-stability",". In version 1.0a every operation is ",[23,438,439],{},"beta",". Read the ",[102,442,444],{"href":443},"\u002Fdevelopers\u002Fchangelog","changelog"," for updates.",[447,448,450],"h3",{"id":449},"what-beta-means","What Beta means",[140,452,453,454,456,457,461,462,49],{},"While the API is in Beta, Totem can change or remove fields, values and behavior, with no fixed notice period. The ",[102,455,444],{"href":443}," lists changes under the date they shipped, and an entry that asks you to change your integration or to run a full resync starts with ",[458,459,460],"strong",{},"Action required",". Additive changes, such as new fields, enum values, endpoints or error codes, can appear at any time, so build your integration to ",[102,463,465],{"href":464},"#enums-can-grow","ignore what it does not know",[12,467,469],{"id":468},"request-ids","Request ids",[140,471,472,473,476,477,480,481,484,485,489],{},"Every response from the API carries a ",[23,474,475],{},"Totem-Request-Id"," header, such as ",[23,478,479],{},"req_0f6b2c1e-8d4a-4b7e-9c3f-5a2d1e7b9c40",", and an error body repeats it as ",[23,482,483],{},"request_id",". Log it, and quote it when you ask ",[102,486,488],{"href":487},"\u002Fdevelopers\u002Fsupport","Support"," for help.",[12,491,134],{"id":492},"errors",[140,494,495,496,499],{},"Errors follow RFC 9457 and come as ",[23,497,498],{},"application\u002Fproblem+json",":",[501,502,508],"pre",{"className":503,"code":505,"language":506,"meta":507},[504],"language-json","{\n  \"type\": \"https:\u002F\u002Ftotemstudio.ai\u002Fdevelopers\u002Ferrors#team_required\",\n  \"title\": \"Team required\",\n  \"status\": 400,\n  \"code\": \"team_required\",\n  \"request_id\": \"req_0f6b2c1e-8d4a-4b7e-9c3f-5a2d1e7b9c40\",\n  \"param\": \"Totem-Team\",\n  \"doc_url\": \"https:\u002F\u002Ftotemstudio.ai\u002Fdevelopers\u002Ferrors#team_required\"\n}\n","json","",[23,509,505],{"__ignoreMap":507},[17,511,512,535,541,544,554],{},[20,513,514,516,517,519,520,523,524,96,527,530,531,534],{},[23,515,23],{}," says what went wrong. Branch on ",[23,518,23],{},", never on ",[23,521,522],{},"title",", which can change. ",[23,525,526],{},"type",[23,528,529],{},"doc_url"," both link to the code's entry on the ",[102,532,134],{"href":533},"\u002Fdevelopers\u002Ferrors"," page, which says when it happens and what to do.",[20,536,537,540],{},[23,538,539],{},"param",", when present, names the header, parameter or field at fault. It never repeats the value you sent.",[20,542,543],{},"New codes can appear. Handle a code you do not know by its HTTP status.",[20,545,546,547,550,551,49],{},"A ",[23,548,549],{},"401"," also carries the header ",[23,552,553],{},"WWW-Authenticate: Bearer realm=\"Totem API\"",[20,555,546,556,559,560,563,564,96,567,570,571,575,576,579],{},[23,557,558],{},"429"," carries ",[23,561,562],{},"Retry-After",", a whole number of seconds: wait at least that long. Two codes use it, ",[23,565,566],{},"rate_limited",[23,568,569],{},"quota_exceeded","; ",[102,572,574],{"href":573},"\u002Fdevelopers\u002Frate-limits","Rate limits"," explains both. Retry a ",[23,577,578],{},"5xx"," with exponential backoff.",[140,581,582,583,89,586,333,589,591,592,594,595,597,598,600,601,604,605,96,608,89,611,614,615,617],{},"During Beta, the firewall in front of the API answers some requests itself with a plain ",[23,584,585],{},"403",[23,587,588],{},"404",[23,590,558],{}," that is not in this format: no JSON error body, no ",[23,593,562],{}," and no ",[23,596,475],{},". It answers ",[23,599,588],{}," to any path outside ",[23,602,603],{},"\u002Fv1\u002F"," and to any method other than ",[23,606,607],{},"GET",[23,609,610],{},"POST",[23,612,613],{},"HEAD"," included. Handle its answer by its status; ",[102,616,134],{"href":533}," lists when each one happens.",[12,619,621],{"id":620},"personal-data-in-urls","Personal data in URLs",[140,623,624,625,49],{},"Never put a phone number, an email address or a name in a URL: URLs end up in logs on both sides. To find a lead by phone or email, send them in the JSON body of ",[102,626,628],{"href":627},"\u002Fdevelopers\u002Freference-leads#leads.search",[23,629,630],{},"POST \u002Fv1\u002Fleads\u002Fsearch",[12,632,634],{"id":633},"text-fields-are-untrusted-input","Text fields are untrusted input",[140,636,637,638,89,641,89,644,89,647,96,650,653,654,657,658,89,661,89,664,89,667,670],{},"Text fields such as a lead's ",[23,639,640],{},"name",[23,642,643],{},"surname",[23,645,646],{},"company",[23,648,649],{},"email",[23,651,652],{},"tags",", a member's ",[23,655,656],{},"display_name",", and attribution values such as UTM parameters and ad, campaign and form names come from web forms, the links visitors arrive from, ad platforms, messaging profiles and the team's own members, and Totem returns them as they were stored. Anyone who fills in a form or edits a link chooses what they contain. Escape them wherever you display them, and never interpret them as HTML, Markdown or a template. When you export them to CSV or a spreadsheet, put a single quote before any value that starts with ",[23,659,660],{},"=",[23,662,663],{},"+",[23,665,666],{},"-",[23,668,669],{},"@",", a tab or a carriage return, so that no cell runs as a formula.",{"title":507,"searchDepth":672,"depth":672,"links":673},3,[674,676,677,678,679,680,681,682,683,686,687,688,689],{"id":14,"depth":675,"text":15},2,{"id":52,"depth":675,"text":53},{"id":137,"depth":675,"text":138},{"id":291,"depth":675,"text":292},{"id":306,"depth":675,"text":307},{"id":349,"depth":675,"text":350},{"id":381,"depth":675,"text":382},{"id":401,"depth":675,"text":402},{"id":422,"depth":675,"text":423,"children":684},[685],{"id":449,"depth":672,"text":450},{"id":468,"depth":675,"text":469},{"id":492,"depth":675,"text":134},{"id":620,"depth":675,"text":621},{"id":633,"depth":675,"text":634},"The notation these docs use, and the rules every response follows: ids, timestamps, empty values, amounts, enums, versions, stability, errors and untrusted text.",false,"md","en",{},true,"10","\u002Fdevelopers\u002Fconventions","---\ntitle: Conventions\ndescription: \"The notation these docs use, and the rules every response follows: ids, timestamps, empty values, amounts, enums, versions, stability, errors and untrusted text.\"\nsection: reference\norder: 10\ntranslationKey: conventions\nlang: en\ndraft: false\n---\n\n## Notation\n\n- `GET \u002Fv1\u002Fleads\u002F{id}` is a method and a path under `https:\u002F\u002Fapi.totemstudio.ai`. A word in braces is a placeholder.\n- `…` stands for a value left out of an example.\n- `$TOTEM_API_KEY` is an environment variable that holds your secret key.\n- Field names appear as they are in the JSON. A dot reaches into an object: `contact_permissions.do_not_contact`.\n\n## Requests and responses\n\n- HTTPS only. Request and response bodies are JSON in UTF-8, and field names are `snake_case`.\n- Every resource, such as a lead, a call or a team, has an `object` field that names its type, and a `livemode` field. `livemode` is `true` on everything the API returns; only the example data of these docs has `livemode: false`.\n- A collection comes in a list envelope with `object: \"list\"`, `data`, `has_more` and `next_cursor`. [Lists and pagination](\u002Fdevelopers\u002Fpagination) explains it.\n- A few bodies have shapes of their own. The items of the changes feed carry `kind`, and the record sits inside them under `object`, or a removal under `removed`. [`GET \u002Fv1\u002Fhealth`](\u002Fdevelopers\u002Freference-account#health) answers `{\"object\": \"health\", \"status\": \"ok\"}`. Errors follow the format described under [Errors](#errors).\n\n## Ids\n\nIds are strings with a prefix that names the type of record:\n\n| Prefix | Record |\n|---|---|\n| `team_` | Team |\n| `mem_` | Team member |\n| `svc_` | Bookable service |\n| `brd_` | Board |\n| `stg_` | Stage |\n| `lead_` | Lead, and its `lead_attribution` and `lead_response` facets |\n| `act_` | Lead activity |\n| `call_` | Call |\n| `conv_` | Conversation |\n| `bkg_` | Booking |\n| `prn_` | Integration |\n\nTreat an id as opaque: store it whole, compare it exactly and never parse it. An id stays the same while its record exists. A record that is removed and later created again can come back with a new id.\n\nMember ids belong to one team: the same person has a different `mem_` id in each team.\n\n## Timestamps\n\nTimestamps are ISO 8601 strings in UTC, such as `2026-10-15T09:30:00Z`, and may carry fractional seconds. Each team's time zone comes with `GET \u002Fv1\u002Fteams\u002F{id}`; use it to display times, never to store them.\n\n## Empty values\n\nIn API objects, a field with no value is `null`, never an empty string. Some fields say why they are empty:\n\n- a lead's `phone` is `null` with `phone_status` set to `missing` or `invalid`;\n- a lead's pipeline fields are `null` with `pipeline_cleared: true` when someone converted the lead and cleared its pipeline data.\n\n## Phones and amounts\n\n- Phones are E.164 strings, such as `+12025550123`.\n- A lead's `estimated_value` and `value_at_conversion` are amounts as Totem stores them: in major units, such as euros or dollars rather than cents, possibly with decimals. `estimated_value_currency` is always `null`, because Totem stores no currency with these values.\n- No field of version 1.0a carries an amount in minor units.\n\n## Enums can grow\n\nFields with a fixed set of values, such as `status` or `archive_reason`, can gain values in any version, and so can error codes. When you meet a value you do not know, keep the record, treat the value as \"other\", and carry on with the sync. New kinds of record can also appear in the changes feed: store or skip an item whose `kind` you do not know, and keep syncing.\n\nThe OpenAPI document lists the values known today. If you generate a client from it, make sure the client accepts a value it does not know instead of rejecting the whole object.\n\n## Record versions\n\nEvery record the changes feed delivers carries `version`, an integer that grows each time the record changes, and `updated_at`, the time of that version. That covers leads and their two facets, activities, calls, conversations, bookings and boards. Apply a record only when its `version` is greater than the one you hold. The feed can deliver a record more than once; its version tells you which copy is newer.\n\nTeams, members and bookable services have no version. When you read them again, replace your copy as a whole.\n\n## API versions and stability\n\n`\u002Fv1` is the current API version. New fields, enum values, endpoints and error codes can appear, so ignore what you do not use.\n\nEvery operation states its stability in this reference and, in the OpenAPI document, as `x-totem-stability`. In version 1.0a every operation is `beta`. Read the [changelog](\u002Fdevelopers\u002Fchangelog) for updates.\n\n### What Beta means\n\nWhile the API is in Beta, Totem can change or remove fields, values and behavior, with no fixed notice period. The [changelog](\u002Fdevelopers\u002Fchangelog) lists changes under the date they shipped, and an entry that asks you to change your integration or to run a full resync starts with **Action required**. Additive changes, such as new fields, enum values, endpoints or error codes, can appear at any time, so build your integration to [ignore what it does not know](#enums-can-grow).\n\n## Request ids\n\nEvery response from the API carries a `Totem-Request-Id` header, such as `req_0f6b2c1e-8d4a-4b7e-9c3f-5a2d1e7b9c40`, and an error body repeats it as `request_id`. Log it, and quote it when you ask [Support](\u002Fdevelopers\u002Fsupport) for help.\n\n## Errors\n\nErrors follow RFC 9457 and come as `application\u002Fproblem+json`:\n\n```json\n{\n  \"type\": \"https:\u002F\u002Ftotemstudio.ai\u002Fdevelopers\u002Ferrors#team_required\",\n  \"title\": \"Team required\",\n  \"status\": 400,\n  \"code\": \"team_required\",\n  \"request_id\": \"req_0f6b2c1e-8d4a-4b7e-9c3f-5a2d1e7b9c40\",\n  \"param\": \"Totem-Team\",\n  \"doc_url\": \"https:\u002F\u002Ftotemstudio.ai\u002Fdevelopers\u002Ferrors#team_required\"\n}\n```\n\n- `code` says what went wrong. Branch on `code`, never on `title`, which can change. `type` and `doc_url` both link to the code's entry on the [Errors](\u002Fdevelopers\u002Ferrors) page, which says when it happens and what to do.\n- `param`, when present, names the header, parameter or field at fault. It never repeats the value you sent.\n- New codes can appear. Handle a code you do not know by its HTTP status.\n- A `401` also carries the header `WWW-Authenticate: Bearer realm=\"Totem API\"`.\n- A `429` carries `Retry-After`, a whole number of seconds: wait at least that long. Two codes use it, `rate_limited` and `quota_exceeded`; [Rate limits](\u002Fdevelopers\u002Frate-limits) explains both. Retry a `5xx` with exponential backoff.\n\nDuring Beta, the firewall in front of the API answers some requests itself with a plain `403`, `404` or `429` that is not in this format: no JSON error body, no `Retry-After` and no `Totem-Request-Id`. It answers `404` to any path outside `\u002Fv1\u002F` and to any method other than `GET` and `POST`, `HEAD` included. Handle its answer by its status; [Errors](\u002Fdevelopers\u002Ferrors) lists when each one happens.\n\n## Personal data in URLs\n\nNever put a phone number, an email address or a name in a URL: URLs end up in logs on both sides. To find a lead by phone or email, send them in the JSON body of [`POST \u002Fv1\u002Fleads\u002Fsearch`](\u002Fdevelopers\u002Freference-leads#leads.search).\n\n## Text fields are untrusted input\n\nText fields such as a lead's `name`, `surname`, `company`, `email` and `tags`, a member's `display_name`, and attribution values such as UTM parameters and ad, campaign and form names come from web forms, the links visitors arrive from, ad platforms, messaging profiles and the team's own members, and Totem returns them as they were stored. Anyone who fills in a form or edits a link chooses what they contain. Escape them wherever you display them, and never interpret them as HTML, Markdown or a template. When you export them to CSV or a spreadsheet, put a single quote before any value that starts with `=`, `+`, `-`, `@`, a tab or a carriage return, so that no cell runs as a formula.\n","reference",{"title":6,"description":690},"developers\u002Fconventions","conventions","SnbbfqS1m071n7q4QNlMsTjRegx2AQwZCH6VbO3da7M",[705,720,745,786],{"section":706,"items":707},"start",[708,712,716],{"path":709,"title":710,"description":711},"\u002Fdevelopers","Overview","Read the leads, calls, conversations and bookings of your Totem teams from your own systems, and keep a copy in sync.",{"path":713,"title":714,"description":715},"\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":717,"title":718,"description":719},"\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":721,"items":722},"guides",[723,727,731,733,737,741],{"path":724,"title":725,"description":726},"\u002Fdevelopers\u002Ftypescript","TypeScript SDK","Use the official TypeScript client to read your Totem data, paginate lists and handle API errors from your server.",{"path":728,"title":729,"description":730},"\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":104,"title":105,"description":732},"How list endpoints return records a page at a time, how to read every page, and what order and filters a list supports.",{"path":734,"title":735,"description":736},"\u002Fdevelopers\u002Fcoverage","Data coverage","What Totem records, since when, and how to tell an empty value from a fact that was never recorded.",{"path":738,"title":739,"description":740},"\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":742,"title":743,"description":744},"\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":699,"items":746},[747,748,750,752,757,762,767,772,777,782],{"path":697,"title":6,"description":690},{"path":533,"title":134,"description":749},"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":573,"title":574,"description":751},"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":753,"title":754,"description":755,"apiTag":756},"\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":758,"title":759,"description":760,"apiTag":761},"\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":763,"title":764,"description":765,"apiTag":766},"\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":768,"title":769,"description":770,"apiTag":771},"\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":773,"title":774,"description":775,"apiTag":776},"\u002Fdevelopers\u002Freference-bookings","Bookings and services","List and fetch a team's bookings, and list the services its customers can book.","bookings",{"path":778,"title":779,"description":780,"apiTag":781},"\u002Fdevelopers\u002Freference-sync","Changes feed","One endpoint that copies a team and then returns every change, page by page.","sync",{"path":783,"title":784,"description":785},"\u002Fdevelopers\u002Fobjects","All objects","Every object the API returns, field by field, with an example of each.",{"section":787,"items":788},"resources",[789,792,794,798],{"path":443,"title":790,"description":791},"Changelog","Changes to the Totem API, newest first, each under the date it shipped.",{"path":487,"title":488,"description":793},"How to get help with the Totem API, what to include in a request, and what to do if a key leaks.",{"path":795,"title":796,"description":797},"\u002Fdevelopers\u002Fglossary","Glossary","The terms these docs use, defined in one place, each with a link to the page that explains it.",{"path":799,"title":800,"description":801},"\u002Fdevelopers\u002Ffaq","FAQ","Short answers to the questions developers ask most about the Totem API, with links to the details.","\u002Fdevelopers\u002Fes\u002Fconventions",{"ACTIVATION_MARGIN_MS":804,"ADMIN_ACCESS_DISCLOSURE_VERSION":805,"AUDIT_RETENTION_DAYS":806,"AUTH_FAILURE_LIMITS":807,"CAPTURE_LAG_FLOOR_MS":811,"CAPTURE_LAG_P99_MS":7,"CURSOR_MAX_AGE_DAYS":812,"DIRTY_TTL_DAYS":812,"FAMILY_TEAM_SCOPE":813,"FAMILY_TEAM_SCOPE_OPTIONS":814,"FEED_SETTLE_LAG_MS":816,"GATE_REFRESH_MS":804,"INTEGRATION_NAME_LENGTH":817,"INTEGRATION_PURPOSE_LENGTH":819,"KEY_CACHE_TTL_MS":822,"KEY_STATS_RETENTION_DAYS":823,"LEAD_RESPONSE_READ_BUDGET":824,"LIST_SCAN_MAX":827,"MAX_FAMILY_INTEGRATION_TEAMS":812,"MAX_INTEGRATIONS_PER_FAMILY":828,"MAX_IP_ALLOWLIST":809,"PAGE_LIMIT":829,"PLATFORM_CONFIG_TTL_MS":832,"REMOVAL_RETENTION_DAYS":833,"REQUEST_BODY_MAX_BYTES":834,"ROLL_GRACE_DEFAULT_HOURS":835,"ROLL_GRACE_HOURS":836,"SEARCH_MAX_RESULTS":828,"SENSITIVE_SECTOR_POLICY":839,"SENSITIVE_SECTOR_POLICY_OPTIONS":840,"SYNC_DAILY_BUDGET":842,"SYNC_VELOCITY":844,"TEAM_CACHE_TTL_MS":846},60000,"2026-10-17",365,{"perIpPerMinute":808,"perLookupIdPerMinute":809,"banMs":810},60,20,600000,300000,30,"explicit_list",[813,815],"all_family_teams",10000,{"min":675,"max":818},80,{"min":820,"max":821},1,280,5000,90,{"conversations":809,"messageReads":825,"calls":826},200,50,1000,10,{"default":830,"max":831},25,100,15000,45,16384,24,[837,820,835,838],0,168,"exclude",[839,841],"allow",{"floor":843,"recordsMultiplier":672},250000,{"perMinute":845,"burst":816},2000,30000,"1.0a","guide",[850,851,852,853,854,855,856,857,858,859,860,861,862,863],{"id":14,"text":15,"depth":675},{"id":52,"text":53,"depth":675},{"id":137,"text":138,"depth":675},{"id":291,"text":292,"depth":675},{"id":306,"text":307,"depth":675},{"id":349,"text":350,"depth":675},{"id":381,"text":382,"depth":675},{"id":401,"text":402,"depth":675},{"id":422,"text":423,"depth":675},{"id":449,"text":450,"depth":672},{"id":468,"text":469,"depth":675},{"id":492,"text":134,"depth":675},{"id":620,"text":621,"depth":675},{"id":633,"text":634,"depth":675},{"path":742,"title":743,"section":721},{"path":533,"title":134,"section":699},[],1792502788584]