[{"data":1,"prerenderedAt":871},["ShallowReactive",2],{"developers:\u002Fdevelopers\u002Fes\u002Fconventions":3},{"doc":4,"lang":697,"nav":708,"alternatePath":806,"policy":807,"specVersion":851,"reference":7,"layout":852,"toc":853,"prev":868,"next":869,"operations":870,"overview":7,"heroExample":7},{"id":5,"title":6,"apiTag":7,"body":8,"description":694,"draft":695,"extension":696,"lang":697,"meta":698,"navTitle":7,"navigation":699,"order":700,"path":701,"rawbody":702,"section":703,"seo":704,"stem":705,"translationKey":706,"version":7,"__hash__":707},"developers_es\u002Fdevelopers\u002Fes\u002Fconventions.md","Convenciones",null,{"type":9,"value":10,"toc":675},"minimark",[11,16,50,54,134,138,142,278,281,287,291,302,306,313,346,350,379,383,396,399,403,417,420,424,430,445,450,465,469,488,491,498,508,581,622,626,635,639],[12,13,15],"h2",{"id":14},"notación","Notación",[17,18,19,31,37,43],"ul",{},[20,21,22,26,27,30],"li",{},[23,24,25],"code",{},"GET \u002Fv1\u002Fleads\u002F{id}"," es un método y una ruta bajo ",[23,28,29],{},"https:\u002F\u002Fapi.totemstudio.ai",". Una palabra entre llaves es un marcador que sustituyes por un valor.",[20,32,33,36],{},[23,34,35],{},"…"," sustituye a un valor que se omite en un ejemplo.",[20,38,39,42],{},[23,40,41],{},"$TOTEM_API_KEY"," es una variable de entorno que contiene tu clave secreta.",[20,44,45,46,49],{},"Los campos se escriben tal como aparecen en el JSON. Un punto entra en un objeto: ",[23,47,48],{},"contact_permissions.do_not_contact",".",[12,51,53],{"id":52},"peticiones-y-respuestas","Peticiones y respuestas",[17,55,56,62,83,106],{},[20,57,58,59,49],{},"Solo HTTPS. Los cuerpos de las peticiones y las respuestas son JSON en UTF-8, y los nombres de los campos van en ",[23,60,61],{},"snake_case",[20,63,64,65,68,69,72,73,75,76,79,80,49],{},"Todo recurso, como un lead, una llamada o un equipo, tiene un campo ",[23,66,67],{},"object"," con su tipo y un campo ",[23,70,71],{},"livemode",". ",[23,74,71],{}," es ",[23,77,78],{},"true"," en todo lo que devuelve la API; solo los datos de ejemplo de esta documentación llevan ",[23,81,82],{},"livemode: false",[20,84,85,86,89,90,89,93,96,97,100,101,49],{},"Una colección llega en un envoltorio de lista con ",[23,87,88],{},"object: \"list\"",", ",[23,91,92],{},"data",[23,94,95],{},"has_more"," y ",[23,98,99],{},"next_cursor",". Se explica en ",[102,103,105],"a",{"href":104},"\u002Fdevelopers\u002Fes\u002Fpagination","Listas y paginación",[20,107,108,109,112,113,115,116,72,119,125,126,129,130,49],{},"Algunos cuerpos tienen una forma propia. Los elementos del feed de cambios llevan ",[23,110,111],{},"kind",", y el registro va dentro de ellos, en ",[23,114,67],{},", o una eliminación, en ",[23,117,118],{},"removed",[102,120,122],{"href":121},"\u002Fdevelopers\u002Fes\u002Freference-account#health",[23,123,124],{},"GET \u002Fv1\u002Fhealth"," responde ",[23,127,128],{},"{\"object\": \"health\", \"status\": \"ok\"}",". Los errores siguen el formato que se describe en ",[102,131,133],{"href":132},"#errores","Errores",[12,135,137],{"id":136},"identificadores","Identificadores",[139,140,141],"p",{},"Los identificadores son cadenas con un prefijo que indica el tipo de registro:",[143,144,145,158],"table",{},[146,147,148],"thead",{},[149,150,151,155],"tr",{},[152,153,154],"th",{},"Prefijo",[152,156,157],{},"Registro",[159,160,161,172,182,192,202,212,228,238,248,258,268],"tbody",{},[149,162,163,169],{},[164,165,166],"td",{},[23,167,168],{},"team_",[164,170,171],{},"Equipo",[149,173,174,179],{},[164,175,176],{},[23,177,178],{},"mem_",[164,180,181],{},"Miembro del equipo",[149,183,184,189],{},[164,185,186],{},[23,187,188],{},"svc_",[164,190,191],{},"Servicio reservable",[149,193,194,199],{},[164,195,196],{},[23,197,198],{},"brd_",[164,200,201],{},"Tablero",[149,203,204,209],{},[164,205,206],{},[23,207,208],{},"stg_",[164,210,211],{},"Etapa",[149,213,214,219],{},[164,215,216],{},[23,217,218],{},"lead_",[164,220,221,222,96,225],{},"Lead, y sus facetas ",[23,223,224],{},"lead_attribution",[23,226,227],{},"lead_response",[149,229,230,235],{},[164,231,232],{},[23,233,234],{},"act_",[164,236,237],{},"Actividad de un lead",[149,239,240,245],{},[164,241,242],{},[23,243,244],{},"call_",[164,246,247],{},"Llamada",[149,249,250,255],{},[164,251,252],{},[23,253,254],{},"conv_",[164,256,257],{},"Conversación",[149,259,260,265],{},[164,261,262],{},[23,263,264],{},"bkg_",[164,266,267],{},"Cita",[149,269,270,275],{},[164,271,272],{},[23,273,274],{},"prn_",[164,276,277],{},"Integración",[139,279,280],{},"Trata cada identificador como un valor opaco: guárdalo entero, compáralo de forma exacta y no lo analices nunca. Un identificador no cambia mientras su registro existe. Un registro que se elimina y después se vuelve a crear puede volver con un identificador nuevo.",[139,282,283,284,286],{},"Los identificadores de miembro son de cada equipo: la misma persona tiene un ",[23,285,178],{}," distinto en cada equipo.",[12,288,290],{"id":289},"fechas-y-horas","Fechas y horas",[139,292,293,294,297,298,301],{},"Las fechas y horas son cadenas ISO 8601 en UTC, como ",[23,295,296],{},"2026-10-15T09:30:00Z",", y pueden llevar fracciones de segundo. La zona horaria de cada equipo llega con ",[23,299,300],{},"GET \u002Fv1\u002Fteams\u002F{id}","; úsala para mostrar horas, nunca para guardarlas.",[12,303,305],{"id":304},"valores-vacíos","Valores vacíos",[139,307,308,309,312],{},"En los objetos de la API, un campo sin valor es ",[23,310,311],{},"null",", nunca una cadena vacía. Algunos campos explican por qué están vacíos:",[17,314,315,337],{},[20,316,317,318,321,322,324,325,328,329,332,333,336],{},"el ",[23,319,320],{},"phone"," de un lead es ",[23,323,311],{}," con ",[23,326,327],{},"phone_status"," en ",[23,330,331],{},"missing"," o ",[23,334,335],{},"invalid",";",[20,338,339,340,324,342,345],{},"los campos del embudo de un lead son ",[23,341,311],{},[23,343,344],{},"pipeline_cleared: true"," cuando alguien convirtió el lead y borró sus datos del embudo.",[12,347,349],{"id":348},"teléfonos-e-importes","Teléfonos e importes",[17,351,352,358,376],{},[20,353,354,355,49],{},"Los teléfonos son cadenas E.164, como ",[23,356,357],{},"+12025550123",[20,359,360,361,364,365,368,369,372,373,375],{},"El ",[23,362,363],{},"estimated_value"," y el ",[23,366,367],{},"value_at_conversion"," de un lead son importes tal como los guarda Totem: en unidades principales, como euros o dólares y no céntimos, con decimales si los hay. ",[23,370,371],{},"estimated_value_currency"," es siempre ",[23,374,311],{},", porque Totem no guarda la divisa de estos valores.",[20,377,378],{},"Ningún campo de la versión 1.0a lleva un importe en la unidad mínima de la divisa.",[12,380,382],{"id":381},"las-enumeraciones-pueden-crecer","Las enumeraciones pueden crecer",[139,384,385,386,332,389,392,393,395],{},"Los campos con un conjunto fijo de valores, como ",[23,387,388],{},"status",[23,390,391],{},"archive_reason",", pueden ganar valores en cualquier versión, igual que los códigos de error. Cuando encuentres un valor que no conoces, conserva el registro, trata el valor como «otro» y sigue con la sincronización. En el feed de cambios también pueden aparecer nuevos tipos de registro: guarda u omite un elemento cuyo ",[23,394,111],{}," no conozcas y sigue sincronizando.",[139,397,398],{},"El documento OpenAPI enumera los valores conocidos hoy. Si generas un cliente a partir de él, asegúrate de que el cliente acepta un valor que no conoce en lugar de rechazar el objeto entero.",[12,400,402],{"id":401},"versiones-de-los-registros","Versiones de los registros",[139,404,405,406,409,410,413,414,416],{},"Cada registro que entrega el feed de cambios lleva ",[23,407,408],{},"version",", un entero que crece cada vez que el registro cambia, y ",[23,411,412],{},"updated_at",", el momento de esa versión. Eso incluye los leads y sus dos facetas, las actividades, las llamadas, las conversaciones, las citas y los tableros. Aplica un registro solo si su ",[23,415,408],{}," es mayor que la que tienes. El feed puede entregar un registro más de una vez; su versión indica qué copia es más reciente.",[139,418,419],{},"Los equipos, los miembros y los servicios reservables no tienen versión. Cuando vuelvas a leerlos, sustituye tu copia entera.",[12,421,423],{"id":422},"versiones-de-la-api-y-estabilidad","Versiones de la API y estabilidad",[139,425,426,429],{},[23,427,428],{},"\u002Fv1"," es la versión actual de la API. Pueden aparecer nuevos campos, valores de enumeración, endpoints y códigos de error, así que ignora lo que no uses.",[139,431,432,433,436,437,440,441,49],{},"Cada operación indica su estabilidad en esta referencia y, en el documento OpenAPI, como ",[23,434,435],{},"x-totem-stability",". En la versión 1.0a todas las operaciones son ",[23,438,439],{},"beta",". Consulta las novedades en el ",[102,442,444],{"href":443},"\u002Fdevelopers\u002Fes\u002Fchangelog","registro de cambios",[446,447,449],"h3",{"id":448},"qué-significa-beta","Qué significa Beta",[139,451,452,453,455,456,460,461,49],{},"Mientras la API está en Beta, Totem puede cambiar o retirar campos, valores y comportamientos, sin un plazo fijo de aviso. El ",[102,454,444],{"href":443}," recoge los cambios bajo la fecha en que se publicaron, y una entrada que te pide cambiar tu integración o hacer una resincronización completa empieza por ",[457,458,459],"strong",{},"Acción necesaria",". Los cambios que solo añaden, como campos, valores de enumeración, endpoints o códigos de error nuevos, pueden aparecer en cualquier momento, así que construye tu integración para que ",[102,462,464],{"href":463},"#las-enumeraciones-pueden-crecer","ignore lo que no conoce",[12,466,468],{"id":467},"identificadores-de-petición","Identificadores de petición",[139,470,471,472,475,476,479,480,483,484,49],{},"Cada respuesta de la API lleva una cabecera ",[23,473,474],{},"Totem-Request-Id",", como ",[23,477,478],{},"req_0f6b2c1e-8d4a-4b7e-9c3f-5a2d1e7b9c40",", y el cuerpo de un error la repite en ",[23,481,482],{},"request_id",". Regístrala y cítala cuando pidas ayuda a ",[102,485,487],{"href":486},"\u002Fdevelopers\u002Fes\u002Fsupport","Soporte",[12,489,133],{"id":490},"errores",[139,492,493,494,497],{},"Los errores siguen la RFC 9457 y llegan como ",[23,495,496],{},"application\u002Fproblem+json",":",[499,500,506],"pre",{"className":501,"code":503,"language":504,"meta":505},[502],"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,507,503],{"__ignoreMap":505},[17,509,510,536,542,545,555],{},[20,511,512,514,515,517,518,521,522,96,525,528,529,532,533,49],{},[23,513,23],{}," indica qué ha fallado. Decide según ",[23,516,23],{},", nunca según ",[23,519,520],{},"title",", que está en inglés y puede cambiar. ",[23,523,524],{},"type",[23,526,527],{},"doc_url"," enlazan con la entrada del código en la página de ",[102,530,133],{"href":531},"\u002Fdevelopers\u002Fes\u002Ferrors",", que explica cuándo ocurre y qué hacer. Ambos enlazan con la edición en inglés; en la edición en español, la misma entrada lleva el mismo fragmento, por ejemplo ",[23,534,535],{},"\u002Fdevelopers\u002Fes\u002Ferrors#team_required",[20,537,538,541],{},[23,539,540],{},"param",", cuando aparece, nombra la cabecera, el parámetro o el campo que ha fallado. Nunca repite el valor que enviaste.",[20,543,544],{},"Pueden aparecer códigos nuevos. Trata un código que no conoces según su estado HTTP.",[20,546,547,548,551,552,49],{},"Un ",[23,549,550],{},"401"," lleva además la cabecera ",[23,553,554],{},"WWW-Authenticate: Bearer realm=\"Totem API\"",[20,556,547,557,560,561,564,565,96,568,571,572,576,577,580],{},[23,558,559],{},"429"," lleva ",[23,562,563],{},"Retry-After",", un número entero de segundos: espera al menos ese tiempo. Lo usan dos códigos, ",[23,566,567],{},"rate_limited",[23,569,570],{},"quota_exceeded","; los dos se explican en ",[102,573,575],{"href":574},"\u002Fdevelopers\u002Fes\u002Frate-limits","Límites de frecuencia y cuota",". Reintenta un ",[23,578,579],{},"5xx"," con espera exponencial.",[139,582,583,584,587,588,591,592,594,595,597,598,600,601,603,604,607,608,611,612,89,615,618,619,621],{},"Durante la Beta, el cortafuegos situado delante de la API responde él mismo a algunas peticiones con un ",[23,585,586],{},"403",", un ",[23,589,590],{},"404"," o un ",[23,593,559],{}," simple, sin este formato: sin cuerpo de error JSON, sin ",[23,596,563],{}," y sin ",[23,599,474],{},". Responde ",[23,602,590],{}," a cualquier ruta fuera de ",[23,605,606],{},"\u002Fv1\u002F"," y a cualquier método que no sea ",[23,609,610],{},"GET"," ni ",[23,613,614],{},"POST",[23,616,617],{},"HEAD"," incluido. Trata su respuesta según su estado; ",[102,620,133],{"href":531}," indica cuándo ocurre cada una.",[12,623,625],{"id":624},"datos-personales-en-las-url","Datos personales en las URL",[139,627,628,629,49],{},"No pongas nunca un teléfono, una dirección de correo electrónico ni un nombre en una URL: las URL acaban en los registros de ambos lados. Para buscar un lead por teléfono o correo electrónico, envíalos en el cuerpo JSON de ",[102,630,632],{"href":631},"\u002Fdevelopers\u002Fes\u002Freference-leads#leads.search",[23,633,634],{},"POST \u002Fv1\u002Fleads\u002Fsearch",[12,636,638],{"id":637},"los-campos-de-texto-no-son-de-fiar","Los campos de texto no son de fiar",[139,640,641,642,89,645,89,648,89,651,96,654,657,658,661,662,89,665,89,668,89,671,674],{},"Los campos de texto, como ",[23,643,644],{},"name",[23,646,647],{},"surname",[23,649,650],{},"company",[23,652,653],{},"email",[23,655,656],{},"tags"," de un lead, ",[23,659,660],{},"display_name"," de un miembro o los valores de atribución, como los parámetros UTM y los nombres de anuncios, campañas y formularios, proceden de formularios web, de los enlaces por los que llegan los visitantes, de plataformas de anuncios, de perfiles de mensajería y de los propios miembros del equipo, y Totem los devuelve tal como se guardaron. Quien rellena un formulario o modifica un enlace elige lo que contienen. Escápalos allí donde los muestres y no los interpretes nunca como HTML, Markdown ni plantillas. Al exportarlos a CSV o a una hoja de cálculo, antepón una comilla simple a cualquier valor que empiece por ",[23,663,664],{},"=",[23,666,667],{},"+",[23,669,670],{},"-",[23,672,673],{},"@",", un tabulador o un retorno de carro, para que ninguna celda se ejecute como fórmula.",{"title":505,"searchDepth":676,"depth":676,"links":677},3,[678,680,681,682,683,684,685,686,687,690,691,692,693],{"id":14,"depth":679,"text":15},2,{"id":52,"depth":679,"text":53},{"id":136,"depth":679,"text":137},{"id":289,"depth":679,"text":290},{"id":304,"depth":679,"text":305},{"id":348,"depth":679,"text":349},{"id":381,"depth":679,"text":382},{"id":401,"depth":679,"text":402},{"id":422,"depth":679,"text":423,"children":688},[689],{"id":448,"depth":676,"text":449},{"id":467,"depth":679,"text":468},{"id":490,"depth":679,"text":133},{"id":624,"depth":679,"text":625},{"id":637,"depth":679,"text":638},"La notación de esta documentación y las reglas que siguen todas las respuestas: identificadores, fechas, valores vacíos, importes, enumeraciones, versiones, estabilidad, errores y textos no fiables.",false,"md","es",{},true,"10","\u002Fdevelopers\u002Fes\u002Fconventions","---\ntitle: Convenciones\ndescription: \"La notación de esta documentación y las reglas que siguen todas las respuestas: identificadores, fechas, valores vacíos, importes, enumeraciones, versiones, estabilidad, errores y textos no fiables.\"\nsection: reference\norder: 10\ntranslationKey: conventions\nlang: es\ndraft: false\n---\n\n## Notación\n\n- `GET \u002Fv1\u002Fleads\u002F{id}` es un método y una ruta bajo `https:\u002F\u002Fapi.totemstudio.ai`. Una palabra entre llaves es un marcador que sustituyes por un valor.\n- `…` sustituye a un valor que se omite en un ejemplo.\n- `$TOTEM_API_KEY` es una variable de entorno que contiene tu clave secreta.\n- Los campos se escriben tal como aparecen en el JSON. Un punto entra en un objeto: `contact_permissions.do_not_contact`.\n\n## Peticiones y respuestas\n\n- Solo HTTPS. Los cuerpos de las peticiones y las respuestas son JSON en UTF-8, y los nombres de los campos van en `snake_case`.\n- Todo recurso, como un lead, una llamada o un equipo, tiene un campo `object` con su tipo y un campo `livemode`. `livemode` es `true` en todo lo que devuelve la API; solo los datos de ejemplo de esta documentación llevan `livemode: false`.\n- Una colección llega en un envoltorio de lista con `object: \"list\"`, `data`, `has_more` y `next_cursor`. Se explica en [Listas y paginación](\u002Fdevelopers\u002Fes\u002Fpagination).\n- Algunos cuerpos tienen una forma propia. Los elementos del feed de cambios llevan `kind`, y el registro va dentro de ellos, en `object`, o una eliminación, en `removed`. [`GET \u002Fv1\u002Fhealth`](\u002Fdevelopers\u002Fes\u002Freference-account#health) responde `{\"object\": \"health\", \"status\": \"ok\"}`. Los errores siguen el formato que se describe en [Errores](#errores).\n\n## Identificadores\n\nLos identificadores son cadenas con un prefijo que indica el tipo de registro:\n\n| Prefijo | Registro |\n|---|---|\n| `team_` | Equipo |\n| `mem_` | Miembro del equipo |\n| `svc_` | Servicio reservable |\n| `brd_` | Tablero |\n| `stg_` | Etapa |\n| `lead_` | Lead, y sus facetas `lead_attribution` y `lead_response` |\n| `act_` | Actividad de un lead |\n| `call_` | Llamada |\n| `conv_` | Conversación |\n| `bkg_` | Cita |\n| `prn_` | Integración |\n\nTrata cada identificador como un valor opaco: guárdalo entero, compáralo de forma exacta y no lo analices nunca. Un identificador no cambia mientras su registro existe. Un registro que se elimina y después se vuelve a crear puede volver con un identificador nuevo.\n\nLos identificadores de miembro son de cada equipo: la misma persona tiene un `mem_` distinto en cada equipo.\n\n## Fechas y horas\n\nLas fechas y horas son cadenas ISO 8601 en UTC, como `2026-10-15T09:30:00Z`, y pueden llevar fracciones de segundo. La zona horaria de cada equipo llega con `GET \u002Fv1\u002Fteams\u002F{id}`; úsala para mostrar horas, nunca para guardarlas.\n\n## Valores vacíos\n\nEn los objetos de la API, un campo sin valor es `null`, nunca una cadena vacía. Algunos campos explican por qué están vacíos:\n\n- el `phone` de un lead es `null` con `phone_status` en `missing` o `invalid`;\n- los campos del embudo de un lead son `null` con `pipeline_cleared: true` cuando alguien convirtió el lead y borró sus datos del embudo.\n\n## Teléfonos e importes\n\n- Los teléfonos son cadenas E.164, como `+12025550123`.\n- El `estimated_value` y el `value_at_conversion` de un lead son importes tal como los guarda Totem: en unidades principales, como euros o dólares y no céntimos, con decimales si los hay. `estimated_value_currency` es siempre `null`, porque Totem no guarda la divisa de estos valores.\n- Ningún campo de la versión 1.0a lleva un importe en la unidad mínima de la divisa.\n\n## Las enumeraciones pueden crecer\n\nLos campos con un conjunto fijo de valores, como `status` o `archive_reason`, pueden ganar valores en cualquier versión, igual que los códigos de error. Cuando encuentres un valor que no conoces, conserva el registro, trata el valor como «otro» y sigue con la sincronización. En el feed de cambios también pueden aparecer nuevos tipos de registro: guarda u omite un elemento cuyo `kind` no conozcas y sigue sincronizando.\n\nEl documento OpenAPI enumera los valores conocidos hoy. Si generas un cliente a partir de él, asegúrate de que el cliente acepta un valor que no conoce en lugar de rechazar el objeto entero.\n\n## Versiones de los registros\n\nCada registro que entrega el feed de cambios lleva `version`, un entero que crece cada vez que el registro cambia, y `updated_at`, el momento de esa versión. Eso incluye los leads y sus dos facetas, las actividades, las llamadas, las conversaciones, las citas y los tableros. Aplica un registro solo si su `version` es mayor que la que tienes. El feed puede entregar un registro más de una vez; su versión indica qué copia es más reciente.\n\nLos equipos, los miembros y los servicios reservables no tienen versión. Cuando vuelvas a leerlos, sustituye tu copia entera.\n\n## Versiones de la API y estabilidad\n\n`\u002Fv1` es la versión actual de la API. Pueden aparecer nuevos campos, valores de enumeración, endpoints y códigos de error, así que ignora lo que no uses.\n\nCada operación indica su estabilidad en esta referencia y, en el documento OpenAPI, como `x-totem-stability`. En la versión 1.0a todas las operaciones son `beta`. Consulta las novedades en el [registro de cambios](\u002Fdevelopers\u002Fes\u002Fchangelog).\n\n### Qué significa Beta\n\nMientras la API está en Beta, Totem puede cambiar o retirar campos, valores y comportamientos, sin un plazo fijo de aviso. El [registro de cambios](\u002Fdevelopers\u002Fes\u002Fchangelog) recoge los cambios bajo la fecha en que se publicaron, y una entrada que te pide cambiar tu integración o hacer una resincronización completa empieza por **Acción necesaria**. Los cambios que solo añaden, como campos, valores de enumeración, endpoints o códigos de error nuevos, pueden aparecer en cualquier momento, así que construye tu integración para que [ignore lo que no conoce](#las-enumeraciones-pueden-crecer).\n\n## Identificadores de petición\n\nCada respuesta de la API lleva una cabecera `Totem-Request-Id`, como `req_0f6b2c1e-8d4a-4b7e-9c3f-5a2d1e7b9c40`, y el cuerpo de un error la repite en `request_id`. Regístrala y cítala cuando pidas ayuda a [Soporte](\u002Fdevelopers\u002Fes\u002Fsupport).\n\n## Errores\n\nLos errores siguen la RFC 9457 y llegan como `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` indica qué ha fallado. Decide según `code`, nunca según `title`, que está en inglés y puede cambiar. `type` y `doc_url` enlazan con la entrada del código en la página de [Errores](\u002Fdevelopers\u002Fes\u002Ferrors), que explica cuándo ocurre y qué hacer. Ambos enlazan con la edición en inglés; en la edición en español, la misma entrada lleva el mismo fragmento, por ejemplo `\u002Fdevelopers\u002Fes\u002Ferrors#team_required`.\n- `param`, cuando aparece, nombra la cabecera, el parámetro o el campo que ha fallado. Nunca repite el valor que enviaste.\n- Pueden aparecer códigos nuevos. Trata un código que no conoces según su estado HTTP.\n- Un `401` lleva además la cabecera `WWW-Authenticate: Bearer realm=\"Totem API\"`.\n- Un `429` lleva `Retry-After`, un número entero de segundos: espera al menos ese tiempo. Lo usan dos códigos, `rate_limited` y `quota_exceeded`; los dos se explican en [Límites de frecuencia y cuota](\u002Fdevelopers\u002Fes\u002Frate-limits). Reintenta un `5xx` con espera exponencial.\n\nDurante la Beta, el cortafuegos situado delante de la API responde él mismo a algunas peticiones con un `403`, un `404` o un `429` simple, sin este formato: sin cuerpo de error JSON, sin `Retry-After` y sin `Totem-Request-Id`. Responde `404` a cualquier ruta fuera de `\u002Fv1\u002F` y a cualquier método que no sea `GET` ni `POST`, `HEAD` incluido. Trata su respuesta según su estado; [Errores](\u002Fdevelopers\u002Fes\u002Ferrors) indica cuándo ocurre cada una.\n\n## Datos personales en las URL\n\nNo pongas nunca un teléfono, una dirección de correo electrónico ni un nombre en una URL: las URL acaban en los registros de ambos lados. Para buscar un lead por teléfono o correo electrónico, envíalos en el cuerpo JSON de [`POST \u002Fv1\u002Fleads\u002Fsearch`](\u002Fdevelopers\u002Fes\u002Freference-leads#leads.search).\n\n## Los campos de texto no son de fiar\n\nLos campos de texto, como `name`, `surname`, `company`, `email` y `tags` de un lead, `display_name` de un miembro o los valores de atribución, como los parámetros UTM y los nombres de anuncios, campañas y formularios, proceden de formularios web, de los enlaces por los que llegan los visitantes, de plataformas de anuncios, de perfiles de mensajería y de los propios miembros del equipo, y Totem los devuelve tal como se guardaron. Quien rellena un formulario o modifica un enlace elige lo que contienen. Escápalos allí donde los muestres y no los interpretes nunca como HTML, Markdown ni plantillas. Al exportarlos a CSV o a una hoja de cálculo, antepón una comilla simple a cualquier valor que empiece por `=`, `+`, `-`, `@`, un tabulador o un retorno de carro, para que ninguna celda se ejecute como fórmula.\n","reference",{"title":6,"description":694},"developers\u002Fes\u002Fconventions","conventions","7Ptk2JH00niulAPVP-1q82E5599mTmSD9L8SPefXHnY",[709,724,749,790],{"section":710,"items":711},"start",[712,716,720],{"path":713,"title":714,"description":715},"\u002Fdevelopers\u002Fes","Introducción","Lee desde tus propios sistemas los leads, las llamadas, las conversaciones y las citas de tus equipos de Totem, y mantén una copia sincronizada.",{"path":717,"title":718,"description":719},"\u002Fdevelopers\u002Fes\u002Fquickstart","Inicio rápido","Haz tus primeras peticiones a la API de Totem en unos minutos. Comprueba tu clave, busca tu equipo, lista leads e inicia una sincronización.",{"path":721,"title":722,"description":723},"\u002Fdevelopers\u002Fes\u002Fauthentication","Autenticación","Las claves secretas y dónde pueden guardarse, la cabecera Totem-Team de las claves con varios equipos, la lista de IP permitidas y cómo rotar o revocar una clave.",{"section":725,"items":726},"guides",[727,731,735,737,741,745],{"path":728,"title":729,"description":730},"\u002Fdevelopers\u002Fes\u002Ftypescript","SDK de TypeScript","Usa el cliente oficial de TypeScript para leer tus datos de Totem, paginar listas y gestionar errores de la API desde tu servidor.",{"path":732,"title":733,"description":734},"\u002Fdevelopers\u002Fes\u002Fsync","Sincroniza una copia","Copia un equipo con el feed de cambios y mantén la copia al día. Aplica las páginas sin riesgos, recupérate de los errores y parte de un cliente de referencia que Totem prueba.",{"path":104,"title":105,"description":736},"Cómo devuelven los endpoints de lista los registros página a página, cómo leer todas las páginas y qué orden y qué filtros admite una lista.",{"path":738,"title":739,"description":740},"\u002Fdevelopers\u002Fes\u002Fcoverage","Cobertura de los datos","Qué registra Totem, desde cuándo y cómo distinguir un valor vacío de un dato que nunca se registró.",{"path":742,"title":743,"description":744},"\u002Fdevelopers\u002Fes\u002Ftesting","Pruebas y puesta en producción","Cómo construir y probar una integración con seguridad mientras la API no tiene entorno de pruebas, y qué comprobar antes de pasar a producción.",{"path":746,"title":747,"description":748},"\u002Fdevelopers\u002Fes\u002Fsecurity","Seguridad y datos personales","Cómo protege Totem las claves de la API y los datos que sirve, qué registra de cada clave, dónde funciona la API y qué hacer con los datos personales que copias.",{"section":703,"items":750},[751,752,754,756,761,766,771,776,781,786],{"path":701,"title":6,"description":694},{"path":531,"title":133,"description":753},"El formato de los errores, cómo debe tratar tu integración cada tipo de error y todos los códigos de error, con cuándo ocurren y qué hacer.",{"path":574,"title":575,"description":755},"Cuánto puede leer una clave por minuto y por día, qué cuenta para cada límite, cómo reintentar tras un 429 y cuánto tarda una carga inicial.",{"path":757,"title":758,"description":759,"apiTag":760},"\u002Fdevelopers\u002Fes\u002Freference-account","Cuenta, equipos y miembros","Comprueba que una clave funciona y qué puede leer, lista sus equipos con su zona horaria, lista los miembros de cada equipo y comprueba que la API está funcionando.","account",{"path":762,"title":763,"description":764,"apiTag":765},"\u002Fdevelopers\u002Fes\u002Freference-leads","Leads, tableros y actividades","Lista, obtén y busca los leads y los clientes de un equipo, lee las actividades de cada lead y lista los tableros y las etapas por los que pasan.","leads",{"path":767,"title":768,"description":769,"apiTag":770},"\u002Fdevelopers\u002Fes\u002Freference-calls","Llamadas","Lista y obtén las llamadas de un equipo, con su dirección, su horario y un resultado normalizado. Sin grabaciones ni transcripciones.","calls",{"path":772,"title":773,"description":774,"apiTag":775},"\u002Fdevelopers\u002Fes\u002Freference-conversations","Conversaciones","Lista y obtén las conversaciones de un equipo en todos los canales, con su estado, la persona asignada, si una persona ha tomado el control y cuándo llegaron y salieron los últimos mensajes. Nunca el contenido de los mensajes.","conversations",{"path":777,"title":778,"description":779,"apiTag":780},"\u002Fdevelopers\u002Fes\u002Freference-bookings","Citas y servicios","Lista y obtén las citas de un equipo, y lista los servicios que pueden reservar sus clientes.","bookings",{"path":782,"title":783,"description":784,"apiTag":785},"\u002Fdevelopers\u002Fes\u002Freference-sync","Feed de cambios","Un único endpoint que copia un equipo y, después, devuelve cada cambio, página a página.","sync",{"path":787,"title":788,"description":789},"\u002Fdevelopers\u002Fes\u002Fobjects","Todos los objetos","Todos los objetos que devuelve la API, campo a campo, con un ejemplo de cada uno.",{"section":791,"items":792},"resources",[793,796,798,802],{"path":443,"title":794,"description":795},"Registro de cambios","Los cambios de la API de Totem, del más reciente al más antiguo, cada uno bajo la fecha en que se publicó.",{"path":486,"title":487,"description":797},"Cómo pedir ayuda con la API de Totem, qué incluir en una solicitud y qué hacer si se filtra una clave.",{"path":799,"title":800,"description":801},"\u002Fdevelopers\u002Fes\u002Fglossary","Glosario","Los términos de esta documentación, definidos en un solo lugar, cada uno con un enlace a la página que lo explica.",{"path":803,"title":804,"description":805},"\u002Fdevelopers\u002Fes\u002Ffaq","Preguntas frecuentes","Respuestas breves a las preguntas más habituales sobre la API de Totem, con enlaces a los detalles.","\u002Fdevelopers\u002Fconventions",{"ACTIVATION_MARGIN_MS":808,"ADMIN_ACCESS_DISCLOSURE_VERSION":809,"AUDIT_RETENTION_DAYS":810,"AUTH_FAILURE_LIMITS":811,"CAPTURE_LAG_FLOOR_MS":815,"CAPTURE_LAG_P99_MS":7,"CURSOR_MAX_AGE_DAYS":816,"DIRTY_TTL_DAYS":816,"FAMILY_TEAM_SCOPE":817,"FAMILY_TEAM_SCOPE_OPTIONS":818,"FEED_SETTLE_LAG_MS":820,"GATE_REFRESH_MS":808,"INTEGRATION_NAME_LENGTH":821,"INTEGRATION_PURPOSE_LENGTH":823,"KEY_CACHE_TTL_MS":826,"KEY_STATS_RETENTION_DAYS":827,"LEAD_RESPONSE_READ_BUDGET":828,"LIST_SCAN_MAX":831,"MAX_FAMILY_INTEGRATION_TEAMS":816,"MAX_INTEGRATIONS_PER_FAMILY":832,"MAX_IP_ALLOWLIST":813,"PAGE_LIMIT":833,"PLATFORM_CONFIG_TTL_MS":836,"REMOVAL_RETENTION_DAYS":837,"REQUEST_BODY_MAX_BYTES":838,"ROLL_GRACE_DEFAULT_HOURS":839,"ROLL_GRACE_HOURS":840,"SEARCH_MAX_RESULTS":832,"SENSITIVE_SECTOR_POLICY":843,"SENSITIVE_SECTOR_POLICY_OPTIONS":844,"SYNC_DAILY_BUDGET":846,"SYNC_VELOCITY":848,"TEAM_CACHE_TTL_MS":850},60000,"2026-10-17",365,{"perIpPerMinute":812,"perLookupIdPerMinute":813,"banMs":814},60,20,600000,300000,30,"explicit_list",[817,819],"all_family_teams",10000,{"min":679,"max":822},80,{"min":824,"max":825},1,280,5000,90,{"conversations":813,"messageReads":829,"calls":830},200,50,1000,10,{"default":834,"max":835},25,100,15000,45,16384,24,[841,824,839,842],0,168,"exclude",[843,845],"allow",{"floor":847,"recordsMultiplier":676},250000,{"perMinute":849,"burst":820},2000,30000,"1.0a","guide",[854,855,856,857,858,859,860,861,862,863,864,865,866,867],{"id":14,"text":15,"depth":679},{"id":52,"text":53,"depth":679},{"id":136,"text":137,"depth":679},{"id":289,"text":290,"depth":679},{"id":304,"text":305,"depth":679},{"id":348,"text":349,"depth":679},{"id":381,"text":382,"depth":679},{"id":401,"text":402,"depth":679},{"id":422,"text":423,"depth":679},{"id":448,"text":449,"depth":676},{"id":467,"text":468,"depth":679},{"id":490,"text":133,"depth":679},{"id":624,"text":625,"depth":679},{"id":637,"text":638,"depth":679},{"path":746,"title":747,"section":725},{"path":531,"title":133,"section":703},[],1792502790240]