[{"data":1,"prerenderedAt":631},["ShallowReactive",2],{"developers:\u002Fdevelopers\u002Fes\u002Fquickstart":3},{"doc":4,"lang":471,"nav":482,"alternatePath":574,"policy":575,"specVersion":619,"reference":7,"layout":620,"toc":621,"prev":628,"next":629,"operations":630,"overview":7,"heroExample":7},{"id":5,"title":6,"apiTag":7,"body":8,"description":468,"draft":469,"extension":470,"lang":471,"meta":472,"navTitle":7,"navigation":473,"order":474,"path":475,"rawbody":476,"section":477,"seo":478,"stem":479,"translationKey":480,"version":7,"__hash__":481},"developers_es\u002Fdevelopers\u002Fes\u002Fquickstart.md","Inicio rápido",null,{"type":9,"value":10,"toc":458},"minimark",[11,15,20,23,78,89,92,102,109,116,120,130,136,139,147,157,168,177,186,198,202,211,217,223,226,232,243,265,269,279,285,296,302,324,328,338,344,354,394,407,411],[12,13,14],"p",{},"Esta guía te lleva de una clave nueva a tus primeros leads en cuatro pasos.",[16,17,19],"h2",{"id":18},"antes-de-empezar","Antes de empezar",[12,21,22],{},"Necesitas:",[24,25,26,44,62],"ul",{},[27,28,29,33,34,43],"li",{},[30,31,32],"strong",{},"Un equipo de Totem con el plan Pro o uno superior",", o con acceso a la API acordado con Totem, que haya guardado su configuración legal en ",[35,36,40],"a",{"href":37,"rel":38},"https:\u002F\u002Fapp.totemstudio.ai\u002Fprivacy-setup",[39],"nofollow",[30,41,42],{},"Privacidad y acuerdos",".",[27,45,46,49,50,57,58,61],{},[30,47,48],{},"Una clave secreta."," Un administrador del equipo abre ",[35,51,54],{"href":52,"rel":53},"https:\u002F\u002Fapp.totemstudio.ai\u002Fsettings?tab=developers",[39],[30,55,56],{},"Ajustes → Desarrolladores",", elige ",[30,59,60],{},"Crear clave API"," y confirma el acceso de lectura al equipo. Totem muestra la clave una sola vez: cópiala directamente en el almacén de secretos de tu servidor.",[27,63,64,70,71,43],{},[30,65,66],{},[67,68,69],"code",{},"curl"," y, para el paso 2, ",[35,72,75],{"href":73,"rel":74},"https:\u002F\u002Fjqlang.org",[39],[67,76,77],{},"jq",[12,79,80,81,83,84,88],{},"Si ",[30,82,60],{}," no aparece o está desactivado, ",[35,85,87],{"href":86},"\u002Fdevelopers\u002Fes\u002Fauthentication#crear-una-clave","Crear una clave"," enumera todos los requisitos y lo que indica Ajustes en cada caso.",[12,90,91],{},"Para seguir esta guía, carga la clave en una variable de entorno sin escribirla en la línea de comandos, para que no quede en el historial de la shell. Ejecuta esto, pega la clave y pulsa Intro; no se muestra nada:",[93,94,100],"pre",{"className":95,"code":97,"language":98,"meta":99},[96],"language-bash","read -rs TOTEM_API_KEY && export TOTEM_API_KEY\n","bash","",[67,101,97],{"__ignoreMap":99},[12,103,104,105,108],{},"En un servidor, haz que tu almacén de secretos proporcione ",[67,106,107],{},"TOTEM_API_KEY"," al proceso.",[110,111,113],"dev-callout",{"type":112},"warning",[12,114,115],{},"La clave lee datos con nivel de administrador. Guárdala en tu servidor: nunca en un navegador, en una app móvil, en una URL ni en un repositorio público.",[16,117,119],{"id":118},"_1-comprueba-tu-clave","1. Comprueba tu clave",[12,121,122,123,129],{},"Llama a ",[35,124,126],{"href":125},"\u002Fdevelopers\u002Fes\u002Freference-account#me.get",[67,127,128],{},"GET \u002Fv1\u002Fme",":",[93,131,134],{"className":132,"code":133,"language":98,"meta":99},[96],"curl https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fme \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\"\n",[67,135,133],{"__ignoreMap":99},[12,137,138],{},"La respuesta describe tu clave: la integración a la que pertenece, los cuatro últimos caracteres de la clave, los equipos que lee y sus permisos.",[93,140,145],{"className":141,"code":143,"language":144,"meta":99},[142],"language-json","{\n  \"object\": \"integration\",\n  \"id\": \"prn_m1NFIcoIU8smXfqR4ymgt6j07TfRF\",\n  \"livemode\": false,\n  \"name\": \"Example CRM sync\",\n  \"key\": {\n    \"last4\": \"Q7xZ\"\n  },\n  \"teams\": [\n    \"team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR\"\n  ],\n  \"scopes\": [\n    \"teams:read\",\n    \"crm:read\",\n    \"calls:read\",\n    \"messages:read\",\n    \"calendar:read\"\n  ]\n}\n","json",[67,146,143],{"__ignoreMap":99},[12,148,149,150,153,154,43],{},"Tu respuesta lleva tus propios valores y ",[67,151,152],{},"\"livemode\": true",". Los ejemplos de esta documentación son ficticios, por eso dicen ",[67,155,156],{},"\"livemode\": false",[12,158,159,160,163,164,167],{},"La misma petición desde Node.js 22 o posterior, como módulo ES, y desde Python 3 con la biblioteca ",[67,161,162],{},"requests"," (",[67,165,166],{},"pip install requests","), que también usan los ejemplos de la referencia:",[93,169,175],{"className":170,"code":172,"filename":173,"language":174,"meta":99},[171],"language-js","const response = await fetch('https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fme', {\n  headers: { Authorization: `Bearer ${process.env.TOTEM_API_KEY}` },\n  signal: AbortSignal.timeout(30_000),\n})\n\u002F\u002F Lee el cuerpo como texto: un rechazo del cortafuegos situado delante de la API no es JSON.\nconsole.log(response.status, await response.text())\n","me.mjs","js",[67,176,172],{"__ignoreMap":99},[93,178,184],{"className":179,"code":181,"filename":182,"language":183,"meta":99},[180],"language-python","import os\n\nimport requests\n\nresponse = requests.get(\n    \"https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fme\",\n    headers={\"Authorization\": f\"Bearer {os.environ['TOTEM_API_KEY']}\"},\n    timeout=30,\n)\n# Muestra el cuerpo como texto: un rechazo del cortafuegos situado delante de la API no es JSON.\nprint(response.status_code, response.text)\n","me.py","python",[67,185,181],{"__ignoreMap":99},[12,187,188,189,192,193,197],{},"Un ",[67,190,191],{},"401"," significa que falta la clave, que está mal copiada o que ya no es válida. En ",[35,194,196],{"href":195},"\u002Fdevelopers\u002Fes\u002Fauthentication","Autenticación"," se enumeran todos los casos.",[16,199,201],{"id":200},"_2-busca-tu-equipo","2. Busca tu equipo",[12,203,204,210],{},[35,205,207],{"href":206},"\u002Fdevelopers\u002Fes\u002Freference-account#teams.list",[67,208,209],{},"GET \u002Fv1\u002Fteams"," lista los equipos que lee tu clave:",[93,212,215],{"className":213,"code":214,"language":98,"meta":99},[96],"curl https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fteams \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\"\n",[67,216,214],{"__ignoreMap":99},[93,218,221],{"className":219,"code":220,"language":144,"meta":99},[142],"{\n  \"object\": \"list\",\n  \"data\": [\n    {\n      \"id\": \"team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR\",\n      \"object\": \"team\",\n      \"livemode\": false,\n      \"name\": \"Example Dental\",\n      \"timezone\": \"America\u002FNew_York\",\n      \"default_country\": \"US\"\n    }\n  ],\n  \"has_more\": false,\n  \"next_cursor\": null\n}\n",[67,222,220],{"__ignoreMap":99},[12,224,225],{},"Guarda el identificador del primer equipo para los pasos siguientes. Si la petición falla, el comando lo dice en lugar de guardar un valor erróneo:",[93,227,230],{"className":228,"code":229,"language":98,"meta":99},[96],"TOTEM_TEAM_ID=$(curl -sS https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fteams \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\" | jq -er '.data[0].id') \\\n  && export TOTEM_TEAM_ID \\\n  || { unset TOTEM_TEAM_ID; echo 'El paso 2 falló: ejecuta el curl de arriba para ver el error.' >&2; }\n",[67,231,229],{"__ignoreMap":99},[12,233,234,235,238,239,242],{},"Las peticiones que leen datos de un equipo, como las listas y el feed de cambios, indican el equipo en la cabecera ",[67,236,237],{},"Totem-Team",". Solo importa cuando una clave lee varios equipos: una clave con un solo equipo puede omitirla, y una clave con varios recibe ",[67,240,241],{},"400 team_required"," si no la envía. Los pasos siguientes la envían siempre, así que sirven en los dos casos.",[110,244,247],{"type":245,"title":246},"note","¿Acabas de añadir el equipo?",[12,248,249,250,253,254,256,257,260,261,264],{},"Totem prepara los datos de un equipo para la API cuando el equipo se añade a una integración. Hasta que termina, las peticiones de ese equipo responden ",[67,251,252],{},"409 capture_not_ready",", y ",[30,255,56],{}," muestra el equipo como ",[30,258,259],{},"Preparando datos"," en lugar de ",[30,262,263],{},"Listo",". Espera unos minutos y vuelve a intentarlo; un equipo con muchos registros tarda más.",[16,266,268],{"id":267},"_3-lista-leads","3. Lista leads",[12,270,271,272,278],{},"Pide a ",[35,273,275],{"href":274},"\u002Fdevelopers\u002Fes\u002Freference-leads#leads.list",[67,276,277],{},"GET \u002Fv1\u002Fleads"," los cinco primeros leads:",[93,280,283],{"className":281,"code":282,"language":98,"meta":99},[96],"curl \"https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fleads?limit=5\" \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\" \\\n  -H \"Totem-Team: $TOTEM_TEAM_ID\"\n",[67,284,282],{"__ignoreMap":99},[12,286,287,288,291,292,295],{},"La respuesta es una lista: los leads están en ",[67,289,290],{},"data",". Un lead tiene muchos más campos de los que muestra este ejemplo; la ",[35,293,294],{"href":274},"referencia"," los enumera todos.",[93,297,300],{"className":298,"code":299,"language":144,"meta":99},[142],"{\n  \"object\": \"list\",\n  \"data\": [\n    {\n      \"id\": \"lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG\",\n      \"object\": \"lead\",\n      \"livemode\": false,\n      \"team\": \"team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR\",\n      \"record_kind\": \"lead\",\n      \"name\": \"Alex\",\n      \"surname\": \"Rivera\",\n      \"email\": \"alex.rivera@example.com\",\n      \"phone\": \"+12025550123\",\n      \"status\": \"contacted\",\n      \"contact_permissions\": {\n        \"do_not_contact\": false,\n        \"email_opt_out\": false,\n        \"email_opt_out_at\": null,\n        \"whatsapp_consent\": null,\n        \"provenance\": {\n          \"do_not_contact\": null,\n          \"email_opt_out\": null,\n          \"whatsapp_consent\": null\n        }\n      },\n      \"board\": \"brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst\",\n      \"stage\": \"stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0\",\n      \"created_at\": \"2026-09-28T10:15:00.000Z\",\n      \"version\": 3,\n      \"updated_at\": \"2026-09-28T10:20:01.250Z\"\n    }\n  ],\n  \"has_more\": true,\n  \"next_cursor\": \"eyJ2IjoxLCJrIjoibGVhZCIsImEiOiJsZWFkX3I3MkVmYlJOVXp1cU9SRkpSME84SHhBd0VYZDkzakdVVFlNYU1NWEtTRjBRYkxTOENpVUtKcEVQMzRMRlFHIiwicyI6ImYzNTI3NzI2MTkwYiJ93iHyRg\"\n}\n",[67,301,299],{"__ignoreMap":99},[12,303,304,307,308,311,312,315,316,318,319,323],{},[67,305,306],{},"has_more: true"," significa que hay más leads. Envía ",[67,309,310],{},"next_cursor"," en el parámetro ",[67,313,314],{},"cursor",", con los mismos filtros y el mismo ",[67,317,237],{},", para leer la página siguiente. En ",[35,320,322],{"href":321},"\u002Fdevelopers\u002Fes\u002Fpagination","Listas y paginación"," se explican la paginación y los filtros.",[16,325,327],{"id":326},"_4-inicia-una-sincronización","4. Inicia una sincronización",[12,329,330,331,337],{},"Una lista es una foto fija. Para mantener una copia de un equipo siempre al día, lee el feed de cambios, ",[35,332,334],{"href":333},"\u002Fdevelopers\u002Fes\u002Freference-sync#sync.changes",[67,335,336],{},"GET \u002Fv1\u002Fsync\u002Fchanges",". La primera petición va sin cursor e inicia la carga inicial de todo el equipo:",[93,339,342],{"className":340,"code":341,"language":98,"meta":99},[96],"curl https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fsync\u002Fchanges \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\" \\\n  -H \"Totem-Team: $TOTEM_TEAM_ID\"\n",[67,343,341],{"__ignoreMap":99},[12,345,346,347,349,350,353],{},"Cada elemento de ",[67,348,290],{}," es un registro de un ",[67,351,352],{},"kind",", como un lead, una llamada o una cita, o una eliminación que te indica que borres un registro. A partir de ahí, tu sincronización repite un ciclo sencillo:",[355,356,357,364,369,382],"ol",{},[27,358,359,360,363],{},"Aplica a tu copia todos los elementos de la página. Omite los elementos cuya ",[67,361,362],{},"version"," no sea mayor que la que ya tienes.",[27,365,366,367,43],{},"Cuando la página entera esté guardada, guarda ",[67,368,310],{},[27,370,371,372,375,376,379,380,43],{},"Mientras ",[67,373,374],{},"has_more"," sea ",[67,377,378],{},"true",", vuelve a pedir enviando el cursor guardado en ",[67,381,314],{},[27,383,384,385,375,387,390,391,393],{},"Cuando ",[67,386,374],{},[67,388,389],{},"false",", tu copia está al día. Sigue pidiendo con el cursor guardado cada 1 a 5 minutos, y guarda el ",[67,392,310],{}," de cada página, aunque esté vacía.",[12,395,396,397,401,402,406],{},"En ",[35,398,400],{"href":399},"\u002Fdevelopers\u002Fes\u002Fsync","Sincroniza una copia"," se explica el resto: las eliminaciones, las fusiones y los traspasos, la recuperación tras un fallo y la resincronización completa. También incluye un ",[35,403,405],{"href":404},"\u002Fdevelopers\u002Fes\u002Fsync#cliente-de-referencia-probado","cliente de referencia probado",", en TypeScript, que puedes copiar en tu servidor.",[16,408,410],{"id":409},"siguientes-pasos","Siguientes pasos",[24,412,413,420,425,430,437,444,451],{},[27,414,415,419],{},[35,416,418],{"href":417},"\u002Fdevelopers\u002Fes\u002Ftypescript","SDK de TypeScript",": usa métodos tipados y paginación automática desde Node.js.",[27,421,422,424],{},[35,423,400],{"href":399},": construye una sincronización que resista los reinicios.",[27,426,427,429],{},[35,428,196],{"href":195},": rota y revoca claves, y limítalas a las direcciones IP de tus servidores.",[27,431,432,436],{},[35,433,435],{"href":434},"\u002Fdevelopers\u002Fes\u002Fsecurity","Seguridad y datos personales",": qué protege Totem y qué hacer con los datos que copias.",[27,438,439,443],{},[35,440,442],{"href":441},"\u002Fdevelopers\u002Fes\u002Ferrors","Errores",": qué significa cada código de error y qué hacer.",[27,445,446,450],{},[35,447,449],{"href":448},"\u002Fdevelopers\u002Fes\u002Ftesting","Pruebas y puesta en producción",": qué comprobar antes de poner tu integración en producción.",[27,452,453,457],{},[35,454,456],{"href":455},"\u002Fdevelopers\u002Fes\u002Freference-leads","Referencia de leads",": todos los campos de un lead, y cómo buscarlo por teléfono o correo electrónico.",{"title":99,"searchDepth":459,"depth":459,"links":460},3,[461,463,464,465,466,467],{"id":18,"depth":462,"text":19},2,{"id":118,"depth":462,"text":119},{"id":200,"depth":462,"text":201},{"id":267,"depth":462,"text":268},{"id":326,"depth":462,"text":327},{"id":409,"depth":462,"text":410},"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.",false,"md","es",{},true,"2","\u002Fdevelopers\u002Fes\u002Fquickstart","---\ntitle: Inicio rápido\ndescription: 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.\nsection: start\norder: 2\ntranslationKey: quickstart\nlang: es\ndraft: false\n---\n\nEsta guía te lleva de una clave nueva a tus primeros leads en cuatro pasos.\n\n## Antes de empezar\n\nNecesitas:\n\n- **Un equipo de Totem con el plan Pro o uno superior**, o con acceso a la API acordado con Totem, que haya guardado su configuración legal en [**Privacidad y acuerdos**](https:\u002F\u002Fapp.totemstudio.ai\u002Fprivacy-setup).\n- **Una clave secreta.** Un administrador del equipo abre [**Ajustes → Desarrolladores**](https:\u002F\u002Fapp.totemstudio.ai\u002Fsettings?tab=developers), elige **Crear clave API** y confirma el acceso de lectura al equipo. Totem muestra la clave una sola vez: cópiala directamente en el almacén de secretos de tu servidor.\n- **`curl`** y, para el paso 2, [`jq`](https:\u002F\u002Fjqlang.org).\n\nSi **Crear clave API** no aparece o está desactivado, [Crear una clave](\u002Fdevelopers\u002Fes\u002Fauthentication#crear-una-clave) enumera todos los requisitos y lo que indica Ajustes en cada caso.\n\nPara seguir esta guía, carga la clave en una variable de entorno sin escribirla en la línea de comandos, para que no quede en el historial de la shell. Ejecuta esto, pega la clave y pulsa Intro; no se muestra nada:\n\n```bash\nread -rs TOTEM_API_KEY && export TOTEM_API_KEY\n```\n\nEn un servidor, haz que tu almacén de secretos proporcione `TOTEM_API_KEY` al proceso.\n\n::dev-callout{type=\"warning\"}\nLa clave lee datos con nivel de administrador. Guárdala en tu servidor: nunca en un navegador, en una app móvil, en una URL ni en un repositorio público.\n::\n\n## 1. Comprueba tu clave\n\nLlama a [`GET \u002Fv1\u002Fme`](\u002Fdevelopers\u002Fes\u002Freference-account#me.get):\n\n```bash\ncurl https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fme \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\"\n```\n\nLa respuesta describe tu clave: la integración a la que pertenece, los cuatro últimos caracteres de la clave, los equipos que lee y sus permisos.\n\n```json\n{\n  \"object\": \"integration\",\n  \"id\": \"prn_m1NFIcoIU8smXfqR4ymgt6j07TfRF\",\n  \"livemode\": false,\n  \"name\": \"Example CRM sync\",\n  \"key\": {\n    \"last4\": \"Q7xZ\"\n  },\n  \"teams\": [\n    \"team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR\"\n  ],\n  \"scopes\": [\n    \"teams:read\",\n    \"crm:read\",\n    \"calls:read\",\n    \"messages:read\",\n    \"calendar:read\"\n  ]\n}\n```\n\nTu respuesta lleva tus propios valores y `\"livemode\": true`. Los ejemplos de esta documentación son ficticios, por eso dicen `\"livemode\": false`.\n\nLa misma petición desde Node.js 22 o posterior, como módulo ES, y desde Python 3 con la biblioteca `requests` (`pip install requests`), que también usan los ejemplos de la referencia:\n\n```js [me.mjs]\nconst response = await fetch('https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fme', {\n  headers: { Authorization: `Bearer ${process.env.TOTEM_API_KEY}` },\n  signal: AbortSignal.timeout(30_000),\n})\n\u002F\u002F Lee el cuerpo como texto: un rechazo del cortafuegos situado delante de la API no es JSON.\nconsole.log(response.status, await response.text())\n```\n\n```python [me.py]\nimport os\n\nimport requests\n\nresponse = requests.get(\n    \"https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fme\",\n    headers={\"Authorization\": f\"Bearer {os.environ['TOTEM_API_KEY']}\"},\n    timeout=30,\n)\n# Muestra el cuerpo como texto: un rechazo del cortafuegos situado delante de la API no es JSON.\nprint(response.status_code, response.text)\n```\n\nUn `401` significa que falta la clave, que está mal copiada o que ya no es válida. En [Autenticación](\u002Fdevelopers\u002Fes\u002Fauthentication) se enumeran todos los casos.\n\n## 2. Busca tu equipo\n\n[`GET \u002Fv1\u002Fteams`](\u002Fdevelopers\u002Fes\u002Freference-account#teams.list) lista los equipos que lee tu clave:\n\n```bash\ncurl https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fteams \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\"\n```\n\n```json\n{\n  \"object\": \"list\",\n  \"data\": [\n    {\n      \"id\": \"team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR\",\n      \"object\": \"team\",\n      \"livemode\": false,\n      \"name\": \"Example Dental\",\n      \"timezone\": \"America\u002FNew_York\",\n      \"default_country\": \"US\"\n    }\n  ],\n  \"has_more\": false,\n  \"next_cursor\": null\n}\n```\n\nGuarda el identificador del primer equipo para los pasos siguientes. Si la petición falla, el comando lo dice en lugar de guardar un valor erróneo:\n\n```bash\nTOTEM_TEAM_ID=$(curl -sS https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fteams \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\" | jq -er '.data[0].id') \\\n  && export TOTEM_TEAM_ID \\\n  || { unset TOTEM_TEAM_ID; echo 'El paso 2 falló: ejecuta el curl de arriba para ver el error.' >&2; }\n```\n\nLas peticiones que leen datos de un equipo, como las listas y el feed de cambios, indican el equipo en la cabecera `Totem-Team`. Solo importa cuando una clave lee varios equipos: una clave con un solo equipo puede omitirla, y una clave con varios recibe `400 team_required` si no la envía. Los pasos siguientes la envían siempre, así que sirven en los dos casos.\n\n::dev-callout{type=\"note\" title=\"¿Acabas de añadir el equipo?\"}\nTotem prepara los datos de un equipo para la API cuando el equipo se añade a una integración. Hasta que termina, las peticiones de ese equipo responden `409 capture_not_ready`, y **Ajustes → Desarrolladores** muestra el equipo como **Preparando datos** en lugar de **Listo**. Espera unos minutos y vuelve a intentarlo; un equipo con muchos registros tarda más.\n::\n\n## 3. Lista leads\n\nPide a [`GET \u002Fv1\u002Fleads`](\u002Fdevelopers\u002Fes\u002Freference-leads#leads.list) los cinco primeros leads:\n\n```bash\ncurl \"https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fleads?limit=5\" \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\" \\\n  -H \"Totem-Team: $TOTEM_TEAM_ID\"\n```\n\nLa respuesta es una lista: los leads están en `data`. Un lead tiene muchos más campos de los que muestra este ejemplo; la [referencia](\u002Fdevelopers\u002Fes\u002Freference-leads#leads.list) los enumera todos.\n\n```json\n{\n  \"object\": \"list\",\n  \"data\": [\n    {\n      \"id\": \"lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG\",\n      \"object\": \"lead\",\n      \"livemode\": false,\n      \"team\": \"team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR\",\n      \"record_kind\": \"lead\",\n      \"name\": \"Alex\",\n      \"surname\": \"Rivera\",\n      \"email\": \"alex.rivera@example.com\",\n      \"phone\": \"+12025550123\",\n      \"status\": \"contacted\",\n      \"contact_permissions\": {\n        \"do_not_contact\": false,\n        \"email_opt_out\": false,\n        \"email_opt_out_at\": null,\n        \"whatsapp_consent\": null,\n        \"provenance\": {\n          \"do_not_contact\": null,\n          \"email_opt_out\": null,\n          \"whatsapp_consent\": null\n        }\n      },\n      \"board\": \"brd_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMX3trzsVUZQuHcMSuDh1aRIst\",\n      \"stage\": \"stg_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXWBYWcKwVTY3CRZlVS3oYvs0\",\n      \"created_at\": \"2026-09-28T10:15:00.000Z\",\n      \"version\": 3,\n      \"updated_at\": \"2026-09-28T10:20:01.250Z\"\n    }\n  ],\n  \"has_more\": true,\n  \"next_cursor\": \"eyJ2IjoxLCJrIjoibGVhZCIsImEiOiJsZWFkX3I3MkVmYlJOVXp1cU9SRkpSME84SHhBd0VYZDkzakdVVFlNYU1NWEtTRjBRYkxTOENpVUtKcEVQMzRMRlFHIiwicyI6ImYzNTI3NzI2MTkwYiJ93iHyRg\"\n}\n```\n\n`has_more: true` significa que hay más leads. Envía `next_cursor` en el parámetro `cursor`, con los mismos filtros y el mismo `Totem-Team`, para leer la página siguiente. En [Listas y paginación](\u002Fdevelopers\u002Fes\u002Fpagination) se explican la paginación y los filtros.\n\n## 4. Inicia una sincronización\n\nUna lista es una foto fija. Para mantener una copia de un equipo siempre al día, lee el feed de cambios, [`GET \u002Fv1\u002Fsync\u002Fchanges`](\u002Fdevelopers\u002Fes\u002Freference-sync#sync.changes). La primera petición va sin cursor e inicia la carga inicial de todo el equipo:\n\n```bash\ncurl https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fsync\u002Fchanges \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\" \\\n  -H \"Totem-Team: $TOTEM_TEAM_ID\"\n```\n\nCada elemento de `data` es un registro de un `kind`, como un lead, una llamada o una cita, o una eliminación que te indica que borres un registro. A partir de ahí, tu sincronización repite un ciclo sencillo:\n\n1. Aplica a tu copia todos los elementos de la página. Omite los elementos cuya `version` no sea mayor que la que ya tienes.\n2. Cuando la página entera esté guardada, guarda `next_cursor`.\n3. Mientras `has_more` sea `true`, vuelve a pedir enviando el cursor guardado en `cursor`.\n4. Cuando `has_more` sea `false`, tu copia está al día. Sigue pidiendo con el cursor guardado cada 1 a 5 minutos, y guarda el `next_cursor` de cada página, aunque esté vacía.\n\nEn [Sincroniza una copia](\u002Fdevelopers\u002Fes\u002Fsync) se explica el resto: las eliminaciones, las fusiones y los traspasos, la recuperación tras un fallo y la resincronización completa. También incluye un [cliente de referencia probado](\u002Fdevelopers\u002Fes\u002Fsync#cliente-de-referencia-probado), en TypeScript, que puedes copiar en tu servidor.\n\n## Siguientes pasos\n\n- [SDK de TypeScript](\u002Fdevelopers\u002Fes\u002Ftypescript): usa métodos tipados y paginación automática desde Node.js.\n- [Sincroniza una copia](\u002Fdevelopers\u002Fes\u002Fsync): construye una sincronización que resista los reinicios.\n- [Autenticación](\u002Fdevelopers\u002Fes\u002Fauthentication): rota y revoca claves, y limítalas a las direcciones IP de tus servidores.\n- [Seguridad y datos personales](\u002Fdevelopers\u002Fes\u002Fsecurity): qué protege Totem y qué hacer con los datos que copias.\n- [Errores](\u002Fdevelopers\u002Fes\u002Ferrors): qué significa cada código de error y qué hacer.\n- [Pruebas y puesta en producción](\u002Fdevelopers\u002Fes\u002Ftesting): qué comprobar antes de poner tu integración en producción.\n- [Referencia de leads](\u002Fdevelopers\u002Fes\u002Freference-leads): todos los campos de un lead, y cómo buscarlo por teléfono o correo electrónico.\n","start",{"title":6,"description":468},"developers\u002Fes\u002Fquickstart","quickstart","DQ7rSOkHLFa0EcUF2I5WAAdxOBIGW4WszHf6c-UzSZk",[483,492,509,555],{"section":477,"items":484},[485,489,490],{"path":486,"title":487,"description":488},"\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":475,"title":6,"description":468},{"path":195,"title":196,"description":491},"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":493,"items":494},"guides",[495,497,499,501,505,507],{"path":417,"title":418,"description":496},"Usa el cliente oficial de TypeScript para leer tus datos de Totem, paginar listas y gestionar errores de la API desde tu servidor.",{"path":399,"title":400,"description":498},"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":321,"title":322,"description":500},"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":502,"title":503,"description":504},"\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":448,"title":449,"description":506},"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":434,"title":435,"description":508},"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":510,"items":511},"reference",[512,516,518,522,527,531,536,541,546,551],{"path":513,"title":514,"description":515},"\u002Fdevelopers\u002Fes\u002Fconventions","Convenciones","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.",{"path":441,"title":442,"description":517},"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":519,"title":520,"description":521},"\u002Fdevelopers\u002Fes\u002Frate-limits","Límites de frecuencia y cuota","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":523,"title":524,"description":525,"apiTag":526},"\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":455,"title":528,"description":529,"apiTag":530},"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":532,"title":533,"description":534,"apiTag":535},"\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":537,"title":538,"description":539,"apiTag":540},"\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":542,"title":543,"description":544,"apiTag":545},"\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":547,"title":548,"description":549,"apiTag":550},"\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":552,"title":553,"description":554},"\u002Fdevelopers\u002Fes\u002Fobjects","Todos los objetos","Todos los objetos que devuelve la API, campo a campo, con un ejemplo de cada uno.",{"section":556,"items":557},"resources",[558,562,566,570],{"path":559,"title":560,"description":561},"\u002Fdevelopers\u002Fes\u002Fchangelog","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":563,"title":564,"description":565},"\u002Fdevelopers\u002Fes\u002Fsupport","Soporte","Cómo pedir ayuda con la API de Totem, qué incluir en una solicitud y qué hacer si se filtra una clave.",{"path":567,"title":568,"description":569},"\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":571,"title":572,"description":573},"\u002Fdevelopers\u002Fes\u002Ffaq","Preguntas frecuentes","Respuestas breves a las preguntas más habituales sobre la API de Totem, con enlaces a los detalles.","\u002Fdevelopers\u002Fquickstart",{"ACTIVATION_MARGIN_MS":576,"ADMIN_ACCESS_DISCLOSURE_VERSION":577,"AUDIT_RETENTION_DAYS":578,"AUTH_FAILURE_LIMITS":579,"CAPTURE_LAG_FLOOR_MS":583,"CAPTURE_LAG_P99_MS":7,"CURSOR_MAX_AGE_DAYS":584,"DIRTY_TTL_DAYS":584,"FAMILY_TEAM_SCOPE":585,"FAMILY_TEAM_SCOPE_OPTIONS":586,"FEED_SETTLE_LAG_MS":588,"GATE_REFRESH_MS":576,"INTEGRATION_NAME_LENGTH":589,"INTEGRATION_PURPOSE_LENGTH":591,"KEY_CACHE_TTL_MS":594,"KEY_STATS_RETENTION_DAYS":595,"LEAD_RESPONSE_READ_BUDGET":596,"LIST_SCAN_MAX":599,"MAX_FAMILY_INTEGRATION_TEAMS":584,"MAX_INTEGRATIONS_PER_FAMILY":600,"MAX_IP_ALLOWLIST":581,"PAGE_LIMIT":601,"PLATFORM_CONFIG_TTL_MS":604,"REMOVAL_RETENTION_DAYS":605,"REQUEST_BODY_MAX_BYTES":606,"ROLL_GRACE_DEFAULT_HOURS":607,"ROLL_GRACE_HOURS":608,"SEARCH_MAX_RESULTS":600,"SENSITIVE_SECTOR_POLICY":611,"SENSITIVE_SECTOR_POLICY_OPTIONS":612,"SYNC_DAILY_BUDGET":614,"SYNC_VELOCITY":616,"TEAM_CACHE_TTL_MS":618},60000,"2026-10-17",365,{"perIpPerMinute":580,"perLookupIdPerMinute":581,"banMs":582},60,20,600000,300000,30,"explicit_list",[585,587],"all_family_teams",10000,{"min":462,"max":590},80,{"min":592,"max":593},1,280,5000,90,{"conversations":581,"messageReads":597,"calls":598},200,50,1000,10,{"default":602,"max":603},25,100,15000,45,16384,24,[609,592,607,610],0,168,"exclude",[611,613],"allow",{"floor":615,"recordsMultiplier":459},250000,{"perMinute":617,"burst":588},2000,30000,"1.0a","guide",[622,623,624,625,626,627],{"id":18,"text":19,"depth":462},{"id":118,"text":119,"depth":462},{"id":200,"text":201,"depth":462},{"id":267,"text":268,"depth":462},{"id":326,"text":327,"depth":462},{"id":409,"text":410,"depth":462},{"path":486,"title":487,"section":477},{"path":195,"title":196,"section":477},[],1792502790597]