[{"data":1,"prerenderedAt":949},["ShallowReactive",2],{"developers:\u002Fdevelopers\u002Fes\u002Fauthentication":3},{"doc":4,"lang":776,"nav":787,"alternatePath":889,"policy":890,"specVersion":934,"reference":7,"layout":935,"toc":936,"prev":946,"next":947,"operations":948,"overview":7,"heroExample":7},{"id":5,"title":6,"apiTag":7,"body":8,"description":773,"draft":774,"extension":775,"lang":776,"meta":777,"navTitle":7,"navigation":778,"order":779,"path":780,"rawbody":781,"section":782,"seo":783,"stem":784,"translationKey":785,"version":7,"__hash__":786},"developers_es\u002Fdevelopers\u002Fes\u002Fauthentication.md","Autenticación",null,{"type":9,"value":10,"toc":759},"minimark",[11,16,25,35,53,64,69,91,101,128,143,147,150,161,180,184,219,222,225,235,238,252,264,303,311,322,325,372,376,397,422,428,431,445,457,469,489,499,503,526,532,546,550,555],[12,13,15],"h2",{"id":14},"claves-secretas","Claves secretas",[17,18,19,20,24],"p",{},"Cada petición lleva una clave secreta en la cabecera ",[21,22,23],"code",{},"Authorization",":",[26,27,33],"pre",{"className":28,"code":30,"language":31,"meta":32},[29],"language-http","GET \u002Fv1\u002Fme HTTP\u002F1.1\nHost: api.totemstudio.ai\nAuthorization: Bearer tsk_live_…\n","http","",[21,34,30],{"__ignoreMap":32},[17,36,37,38,41,42,52],{},"Una clave secreta empieza por ",[21,39,40],{},"tsk_live_",", seguida de un identificador de búsqueda y del secreto propiamente dicho. Totem la muestra una sola vez, al crearla, y solo conserva un resumen irreversible, así que una clave perdida no se puede recuperar: rótala. En ",[43,44,48],"a",{"href":45,"rel":46},"https:\u002F\u002Fapp.totemstudio.ai\u002Fsettings?tab=developers",[47],"nofollow",[49,50,51],"strong",{},"Ajustes → Desarrolladores"," se ven los cuatro últimos caracteres de cada clave para distinguirlas. Una clave no caduca por sí sola: funciona hasta que la rotas o la revocas.",[17,54,55,56,59,60,63],{},"Las claves que empiezan por ",[21,57,58],{},"tsk_test_"," están reservadas para futuros entornos de pruebas. Hoy la API las rechaza con ",[21,61,62],{},"401 invalid_credentials",".",[65,66,68],"h3",{"id":67},"crear-una-clave","Crear una clave",[17,70,71,72,77,78,81,82,85,86,90],{},"Un administrador del equipo abre ",[43,73,75],{"href":45,"rel":74},[47],[49,76,51],{},", elige ",[49,79,80],{},"Crear clave API",", da un nombre a la integración y confirma el acceso de lectura al equipo actual. En ",[49,83,84],{},"Opciones avanzadas"," están la descripción opcional, las restricciones por IP y, para un administrador de la familia, más equipos de la organización (en ",[43,87,89],{"href":88},"#equipos-y-la-cabecera-totem-team","Equipos y la cabecera Totem-Team"," se explica quién puede gestionar qué). Si el administrador no ha iniciado sesión hace poco, Totem le pide antes que vuelva a hacerlo. Totem muestra entonces la clave secreta de la integración una sola vez. Cópiala directamente en el almacén de secretos de tu servidor.",[17,92,93,94,97,98,100],{},"La API está en ",[49,95,96],{},"Beta"," y disponible sin invitación. ",[49,99,80],{}," funciona cuando:",[102,103,104,108,111,114,125],"ul",{},[105,106,107],"li",{},"quien crea la clave tiene el rol de administrador del equipo y una dirección de correo electrónico verificada;",[105,109,110],{},"la organización tiene el plan Pro o uno superior, o acceso a la API acordado con Totem;",[105,112,113],{},"el equipo tiene datos (una cuenta solo de facturación no los tiene) y no está desactivado ni archivado;",[105,115,116,117,124],{},"el equipo ha completado su configuración legal: un administrador del equipo guarda su política de privacidad, sus finalidades de tratamiento y su sector de actividad en ",[43,118,121],{"href":119,"rel":120},"https:\u002F\u002Fapp.totemstudio.ai\u002Fprivacy-setup",[47],[49,122,123],{},"Privacidad y acuerdos",";",[105,126,127],{},"por ahora, el equipo no pertenece a un sector de actividad sensible, como el sanitario.",[17,129,130,131,133,134,138,139,63],{},"Si no ves ",[49,132,80],{},", comprueba el rol, la dirección de correo y que el equipo no sea una cuenta solo de facturación; cuando el motivo es el plan, Ajustes lo indica. El botón se desactiva cuando la organización ya tiene ",[135,136],"api-const",{"name":137},"MAX_INTEGRATIONS_PER_FAMILY"," integraciones activas. Si Totem rechaza un equipo, Ajustes lo nombra y explica por qué. Si no, ",[43,140,142],{"href":141},"\u002Fdevelopers\u002Fes\u002Fsupport","contacta con soporte",[65,144,146],{"id":145},"dónde-puede-guardarse-una-clave","Dónde puede guardarse una clave",[17,148,149],{},"Una clave lee datos con nivel de administrador, así que guárdala en un servidor que controles:",[102,151,152,155,158],{},[105,153,154],{},"en un gestor de secretos o en una variable de entorno que solo pueda leer el proceso que llama a la API;",[105,156,157],{},"nunca en un navegador, en una app móvil, en JavaScript del lado del cliente ni en un repositorio público;",[105,159,160],{},"nunca en una URL, en una línea de registro, en un comando que escribas en una shell ni en una solicitud de soporte.",[17,162,163,164,167,168,171,172,175,176,63],{},"La API no envía cabeceras CORS y responde ",[21,165,166],{},"400 secret_key_in_browser"," a una petición que lleve a la vez una clave secreta y una cabecera ",[21,169,170],{},"Origin",". Si una clave ha estado alguna vez en una página web, una app móvil o una extensión del navegador, dala por filtrada: rótala y marca ",[49,173,174],{},"Esta clave puede estar comprometida",", como se explica en ",[43,177,179],{"href":178},"#rotar-y-revocar","Rotar y revocar",[65,181,183],{"id":182},"qué-puede-leer-una-clave","Qué puede leer una clave",[17,185,186,187,193,194,197,198,201,202,201,205,201,208,211,212,215,216,218],{},"Todas las claves de la versión 1.0a son de solo lectura y llevan el mismo conjunto fijo de permisos de lectura: no hay nada que elegir. ",[43,188,190],{"href":189},"\u002Fdevelopers\u002Fes\u002Freference-account#me.get",[21,191,192],{},"GET \u002Fv1\u002Fme"," los enumera en ",[21,195,196],{},"scopes",": ",[21,199,200],{},"teams:read",", ",[21,203,204],{},"crm:read",[21,206,207],{},"calls:read",[21,209,210],{},"messages:read"," y ",[21,213,214],{},"calendar:read",". ",[21,217,210],{}," solo cubre los metadatos de las conversaciones; ningún endpoint devuelve el texto de un mensaje.",[17,220,221],{},"Una clave lee todo lo que puede leer un administrador de sus equipos, incluidos los canales y los registros marcados como privados. El administrador que crea la integración lo confirma antes de que se emita la clave. Da a cada integración solo los equipos que necesita.",[12,223,89],{"id":224},"equipos-y-la-cabecera-totem-team",[17,226,227,228,230,231,234],{},"Una integración cubre un equipo o una lista de equipos de la misma organización (una cuenta de facturación y sus subequipos; en ",[49,229,51],{},", el ámbito del acceso ",[49,232,233],{},"Equipos elegidos de la familia","). La lista es explícita: un equipo nuevo nunca se añade solo. Lo añade un administrador, y se avisa a los administradores que gestionan la integración y a los de cada equipo que cubre.",[17,236,237],{},"Quién puede gestionar una integración depende de lo que cubre:",[102,239,240,243,246],{},[105,241,242],{},"Un administrador de equipo crea y gestiona una integración para su propio equipo.",[105,244,245],{},"Solo un administrador de la familia puede crear o modificar una integración que cubra varios equipos: un administrador de la cuenta de facturación que figura en ella como administrador de la familia. Los administradores de cada equipo cubierto la ven en Ajustes, en modo de solo lectura.",[105,247,248,249,251],{},"Una organización, o un equipo que no pertenece a ninguna, puede tener hasta ",[135,250],{"name":137}," integraciones activas, contando todos sus equipos. Revoca las que ya no uses para liberar una plaza.",[17,253,254,260,261,63],{},[43,255,257],{"href":256},"\u002Fdevelopers\u002Fes\u002Freference-account#teams.list",[21,258,259],{},"GET \u002Fv1\u002Fteams"," lista los equipos que puede leer una clave, cada uno con un identificador que empieza por ",[21,262,263],{},"team_",[102,265,266,273,280],{},[105,267,268,211,270,272],{},[21,269,192],{},[21,271,259],{}," describen la clave y nunca llevan la cabecera.",[105,274,275,276,279],{},"Las peticiones sobre un registro concreto, como ",[21,277,278],{},"GET \u002Fv1\u002Fleads\u002F{id}",", no la necesitan: el identificador del registro ya indica su equipo.",[105,281,282,283,201,286,289,290,201,293,211,296,299,300,24],{},"Las peticiones que leen una colección de un equipo (listas como ",[21,284,285],{},"GET \u002Fv1\u002Fleads",[21,287,288],{},"GET \u002Fv1\u002Fboards"," o ",[21,291,292],{},"GET \u002Fv1\u002Fmembers",[21,294,295],{},"POST \u002Fv1\u002Fleads\u002Fsearch",[21,297,298],{},"GET \u002Fv1\u002Fsync\u002Fchanges",") usan el único equipo de la clave. Si la clave cubre varios, indica uno en la cabecera ",[21,301,302],{},"Totem-Team",[26,304,309],{"className":305,"code":307,"language":308,"meta":32},[306],"language-bash","curl \"https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fleads?limit=50\" \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\" \\\n  -H \"Totem-Team: team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR\"\n","bash",[21,310,307],{"__ignoreMap":32},[17,312,313,314,317,318,321],{},"Los ejemplos de la referencia de la API envían ",[21,315,316],{},"Totem-Team: $TOTEM_TEAM_ID"," en estas peticiones. Con una clave de un solo equipo, deja ",[21,319,320],{},"TOTEM_TEAM_ID"," sin definir y no envían la cabecera: cURL descarta una cabecera con el valor vacío, y los ejemplos de Node.js y Python comprueban la variable.",[17,323,324],{},"Una clave con un solo equipo también puede enviar la cabecera, siempre que indique ese equipo. Qué significa cada respuesta para tu copia del equipo:",[102,326,327,337,347,358,365],{},[105,328,329,330,333,334,63],{},"Sin la cabecera, una clave con varios equipos recibe ",[21,331,332],{},"400 team_required",". Una cabecera que no es un identificador de equipo, o que aparece dos veces, recibe ",[21,335,336],{},"400 invalid_request",[105,338,339,340,343,344,346],{},"Un equipo que la clave no cubre, o que ya no existe, recibe ",[21,341,342],{},"404 team_not_accessible",". Consulta ",[21,345,259],{},": si el equipo ya no aparece, borra sus datos y su cursor.",[105,348,349,350,211,352,354,355,357],{},"Una clave de un solo equipo cubre su equipo solo mientras el equipo siga donde estaba al crearse la clave: en la misma organización o fuera de cualquier organización. Si el equipo entra en una organización, sale de ella o pasa a otra, la clave recibe ",[21,351,342],{},[21,353,259],{}," deja de mostrar el equipo. Revoca la clave en ",[49,356,51],{}," y crea una nueva.",[105,359,360,361,364],{},"Un equipo desactivado o archivado, o cuyo acceso a la API ha pausado Totem, recibe ",[21,362,363],{},"403 team_state_restricted",". Conserva los datos del equipo y su cursor, omítelo en esta ejecución y vuelve a intentarlo más tarde. Un equipo desactivado o un acceso pausado pueden volver; un equipo archivado sigue restringido salvo que Totem lo restaure. Mientras un equipo está restringido, el feed de cambios no entrega nada de él, tampoco eliminaciones, así que, si la restricción dura más de lo que permite tu política de conservación, borra tu copia.",[105,366,367,368,371],{},"Por ahora, Totem no exporta los equipos de un sector de actividad sensible, como el sanitario. Un equipo así no se puede añadir a una integración, y una clave que ya lo cubre recibe ",[21,369,370],{},"403 sector_restricted"," para él. Omite el equipo: esperar no lo cambia. El feed de cambios no entrega nada de él, tampoco eliminaciones, así que conserva lo que ya tengas solo mientras lo permita tu política de conservación y después borra tu copia.",[12,373,375],{"id":374},"lista-de-ip-permitidas","Lista de IP permitidas",[17,377,378,379,382,383,386,387,389,390,392,393,396],{},"Una integración puede limitarse a un máximo de ",[135,380],{"name":381},"MAX_IP_ALLOWLIST"," direcciones IP o rangos en notación CIDR. Una petición desde cualquier otra dirección recibe ",[21,384,385],{},"403 ip_not_allowed",". La lista se configura en ",[49,388,51],{},", en ",[49,391,84],{}," al crear la clave o con ",[49,394,395],{},"Editar integración"," más tarde; cambiarla exige un inicio de sesión reciente.",[102,398,399,402,413,416],{},[105,400,401],{},"La API solo es accesible por IPv4, así que indica las direcciones IPv4 públicas desde las que salen tus peticiones. Hoy una entrada IPv6 nunca coincide.",[105,403,404,405,408,409,412],{},"Escribe una dirección o un rango por línea. Un rango debe empezar en su dirección de red, como ",[21,406,407],{},"203.0.113.0\u002F24",", y ",[21,410,411],{},"\u002F0"," no se admite. Una lista vacía permite cualquier dirección.",[105,414,415],{},"Si tu plataforma no tiene una dirección de salida fija, como muchas plataformas serverless, haz que su tráfico salga antes por una IP estática.",[105,417,418,419,421],{},"Después de guardar la lista, llama a ",[21,420,192],{}," desde el servidor desplegado para comprobarla.",[17,423,424,425,427],{},"Totem comprueba la dirección después de la clave, así que una clave incorrecta recibe ",[21,426,62],{}," venga de donde venga.",[12,429,179],{"id":430},"rotar-y-revocar",[17,432,433,436,437,440,441,444],{},[49,434,435],{},"Rota"," una clave con ",[49,438,439],{},"Rotar clave"," para sustituirla. Totem emite una clave nueva y mantiene la antigua en funcionamiento durante el tiempo que elijas en el diálogo: 1 hora, 24 horas (por defecto) o 7 días. Despliega la clave nueva dentro de ese plazo y nada se detiene. Cuando termina ese tiempo, la clave antigua recibe ",[21,442,443],{},"401 key_expired",". Volver a rotar revoca cualquier clave antigua que siga en su periodo de gracia, y el diálogo te pide que lo confirmes.",[17,446,447,448,450,451,454,455,63],{},"Para desactivar la clave antigua al instante, marca ",[49,449,174],{}," al rotarla, o elige más tarde ",[49,452,453],{},"Desactivar ya la clave anterior",". La clave antigua recibe entonces ",[21,456,62],{},[17,458,459,462,463,465,466,63],{},[49,460,461],{},"Si una clave puede haberse filtrado",", rótala y marca ",[49,464,174],{},": la clave antigua se revoca al instante, sin periodo de gracia. Después avísanos, como se explica en ",[43,467,468],{"href":141},"Soporte",[17,470,471,474,475,478,479,483,484,488],{},[49,472,473],{},"Revoca"," una integración con ",[49,476,477],{},"Revocar acceso"," para detener todas sus claves. Una clave revocada deja de funcionar en un máximo de ",[135,480],{"name":481,"divide":482},"KEY_CACHE_TTL_MS","1000"," segundos, y revocar no se puede deshacer. Los datos que ya copiaste siguen en tus sistemas y dejan de recibir eliminaciones de Totem: bórralos, o consérvalos solo mientras lo permitan las normas del propio cliente. En ",[43,485,487],{"href":486},"\u002Fdevelopers\u002Fes\u002Fsecurity#datos-personales-que-recibes","Seguridad y datos personales"," se explica qué hacer con ellos.",[17,490,491,492,495,496,498],{},"Crear o rotar una clave, añadir un equipo y cambiar la lista de IP permitidas piden al administrador que vuelva a iniciar sesión si no lo ha hecho hace poco. Cada cambio aparece en la ",[49,493,494],{},"Actividad reciente"," de la integración, y se avisa de cada uno a los administradores que gestionan la integración y a los de cada equipo que cubre, en Totem y por correo electrónico. Revocar y ",[49,497,453],{}," nunca exigen iniciar sesión: quien puede gestionar la integración puede detenerla al momento.",[12,500,502],{"id":501},"intentos-fallidos","Intentos fallidos",[17,504,505,506,509,510,513,514,517,518,521,522,525],{},"Totem cuenta los intentos fallidos: las peticiones con una clave que falta, está mal formada, no existe o es incorrecta. A partir de tan solo ",[135,507],{"name":508},"AUTH_FAILURE_LIMITS.perIpPerMinute"," fallos desde una dirección IP en un minuto, o ",[135,511],{"name":512},"AUTH_FAILURE_LIMITS.perLookupIdPerMinute"," con una misma clave, Totem puede bloquear esa dirección o esa clave durante ",[135,515],{"name":516,"divide":482},"AUTH_FAILURE_LIMITS.banMs"," segundos. Mientras dura el bloqueo, las peticiones reciben ",[21,519,520],{},"429 rate_limited"," con ",[21,523,524],{},"Retry-After"," igual a la duración completa del bloqueo; el bloqueo puede terminar antes.",[17,527,528,529,531],{},"Una clave revocada o caducada, una integración que ya no está activa y una petición desde fuera de la lista de IP permitidas no cuentan. Mientras una clave está bloqueada, las peticiones con su secreto real siguen funcionando: solo se rechazan los intentos de adivinarla. Mientras una dirección está bloqueada, se rechazan todas sus peticiones. Si te quedas bloqueado, corrige primero la clave y después espera lo que indica ",[21,530,524],{}," antes de volver a intentarlo.",[17,533,534,535,538,539,541,542,63],{},"Muchas peticiones sin una clave bien formada desde una misma dirección también pueden hacer que el cortafuegos situado delante de la API responda ",[21,536,537],{},"429"," por sí mismo, sin ",[21,540,524],{}," ni cuerpo JSON, durante un máximo de 10 minutos. Detén el bucle, corrige la cabecera y reintenta con espera exponencial, como se explica en ",[43,543,545],{"href":544},"\u002Fdevelopers\u002Fes\u002Ferrors","Errores",[12,547,549],{"id":548},"errores-de-autenticación","Errores de autenticación",[17,551,552,553,63],{},"Cada código enlaza con su explicación completa en la página de ",[43,554,545],{"href":544},[556,557,558,575],"table",{},[559,560,561],"thead",{},[562,563,564,568,572],"tr",{},[565,566,567],"th",{},"Estado",[565,569,570],{},[21,571,21],{},[565,573,574],{},"Qué hacer",[576,577,578,595,612,628,643,659,674,689,704,719,738],"tbody",{},[562,579,580,584,592],{},[581,582,583],"td",{},"400",[581,585,586],{},[43,587,589],{"href":588},"\u002Fdevelopers\u002Fes\u002Ferrors#secret_key_in_browser",[21,590,591],{},"secret_key_in_browser",[581,593,594],{},"La petición salió de un navegador. Llama a la API desde tu servidor y, si la clave estuvo alguna vez en una página web o una app, rótala y márcala como comprometida.",[562,596,597,599,607],{},[581,598,583],{},[581,600,601],{},[43,602,604],{"href":603},"\u002Fdevelopers\u002Fes\u002Ferrors#team_required",[21,605,606],{},"team_required",[581,608,609,610,63],{},"La clave cubre varios equipos. Envía ",[21,611,302],{},[562,613,614,617,625],{},[581,615,616],{},"401",[581,618,619],{},[43,620,622],{"href":621},"\u002Fdevelopers\u002Fes\u002Ferrors#invalid_credentials",[21,623,624],{},"invalid_credentials",[581,626,627],{},"Falta la clave, está mal formada, no existe, es incorrecta o se ha revocado. Revisa la cabecera y la clave.",[562,629,630,632,640],{},[581,631,616],{},[581,633,634],{},[43,635,637],{"href":636},"\u002Fdevelopers\u002Fes\u002Ferrors#key_expired",[21,638,639],{},"key_expired",[581,641,642],{},"La clave se rotó y su periodo de gracia ha terminado. Usa la clave nueva.",[562,644,645,648,656],{},[581,646,647],{},"403",[581,649,650],{},[43,651,653],{"href":652},"\u002Fdevelopers\u002Fes\u002Ferrors#ip_not_allowed",[21,654,655],{},"ip_not_allowed",[581,657,658],{},"La petición salió de una dirección que no está en la lista de IP permitidas de la integración. La API solo es accesible por IPv4.",[562,660,661,663,671],{},[581,662,647],{},[581,664,665],{},[43,666,668],{"href":667},"\u002Fdevelopers\u002Fes\u002Ferrors#plan_not_entitled",[21,669,670],{},"plan_not_entitled",[581,672,673],{},"El plan de la organización no incluye la API. Conserva tus datos y habla con el cliente; el feed no entrega eliminaciones hasta que vuelva el acceso, así que, si eso dura más de lo que permite tu política de conservación, borra tu copia.",[562,675,676,678,686],{},[581,677,647],{},[581,679,680],{},[43,681,683],{"href":682},"\u002Fdevelopers\u002Fes\u002Ferrors#insufficient_scope",[21,684,685],{},"insufficient_scope",[581,687,688],{},"A la clave le falta un permiso que este endpoint necesita. Todas las claves de la versión 1.0a tienen los mismos permisos, así que avísanos con el identificador de la petición.",[562,690,691,693,701],{},[581,692,647],{},[581,694,695],{},[43,696,698],{"href":697},"\u002Fdevelopers\u002Fes\u002Ferrors#team_state_restricted",[21,699,700],{},"team_state_restricted",[581,702,703],{},"El equipo está desactivado, archivado o en pausa. Conserva sus datos y su cursor, omítelo en esta ejecución y vuelve a intentarlo más tarde; si la restricción dura más de lo que permite tu política de conservación, borra tu copia.",[562,705,706,708,716],{},[581,707,647],{},[581,709,710],{},[43,711,713],{"href":712},"\u002Fdevelopers\u002Fes\u002Ferrors#sector_restricted",[21,714,715],{},"sector_restricted",[581,717,718],{},"Por ahora, Totem no exporta los equipos de un sector sensible, como el sanitario. Omite el equipo: esperar no lo cambia. El feed no entrega eliminaciones de él, así que conserva lo que tengas solo mientras lo permita tu política de conservación y después borra tu copia.",[562,720,721,724,732],{},[581,722,723],{},"404",[581,725,726],{},[43,727,729],{"href":728},"\u002Fdevelopers\u002Fes\u002Ferrors#team_not_accessible",[21,730,731],{},"team_not_accessible",[581,733,734,735,737],{},"La clave no cubre este equipo. Si ",[21,736,259],{}," ya no lo incluye, borra sus datos y su cursor.",[562,739,740,742,750],{},[581,741,537],{},[581,743,744],{},[43,745,747],{"href":746},"\u002Fdevelopers\u002Fes\u002Ferrors#rate_limited",[21,748,749],{},"rate_limited",[581,751,752,753,755,756,758],{},"Demasiados intentos fallidos o demasiadas peticiones. Espera los segundos que indica ",[21,754,524],{},". Un ",[21,757,537],{}," sin cuerpo JSON viene del cortafuegos: reintenta con espera exponencial.",{"title":32,"searchDepth":760,"depth":760,"links":761},3,[762,768,769,770,771,772],{"id":14,"depth":763,"text":15,"children":764},2,[765,766,767],{"id":67,"depth":760,"text":68},{"id":145,"depth":760,"text":146},{"id":182,"depth":760,"text":183},{"id":224,"depth":763,"text":89},{"id":374,"depth":763,"text":375},{"id":430,"depth":763,"text":179},{"id":501,"depth":763,"text":502},{"id":548,"depth":763,"text":549},"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.",false,"md","es",{},true,"3","\u002Fdevelopers\u002Fes\u002Fauthentication","---\ntitle: Autenticación\ndescription: 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.\nsection: start\norder: 3\ntranslationKey: authentication\nlang: es\ndraft: false\n---\n\n## Claves secretas\n\nCada petición lleva una clave secreta en la cabecera `Authorization`:\n\n```http\nGET \u002Fv1\u002Fme HTTP\u002F1.1\nHost: api.totemstudio.ai\nAuthorization: Bearer tsk_live_…\n```\n\nUna clave secreta empieza por `tsk_live_`, seguida de un identificador de búsqueda y del secreto propiamente dicho. Totem la muestra una sola vez, al crearla, y solo conserva un resumen irreversible, así que una clave perdida no se puede recuperar: rótala. En [**Ajustes → Desarrolladores**](https:\u002F\u002Fapp.totemstudio.ai\u002Fsettings?tab=developers) se ven los cuatro últimos caracteres de cada clave para distinguirlas. Una clave no caduca por sí sola: funciona hasta que la rotas o la revocas.\n\nLas claves que empiezan por `tsk_test_` están reservadas para futuros entornos de pruebas. Hoy la API las rechaza con `401 invalid_credentials`.\n\n### Crear una clave\n\nUn administrador del equipo abre [**Ajustes → Desarrolladores**](https:\u002F\u002Fapp.totemstudio.ai\u002Fsettings?tab=developers), elige **Crear clave API**, da un nombre a la integración y confirma el acceso de lectura al equipo actual. En **Opciones avanzadas** están la descripción opcional, las restricciones por IP y, para un administrador de la familia, más equipos de la organización (en [Equipos y la cabecera Totem-Team](#equipos-y-la-cabecera-totem-team) se explica quién puede gestionar qué). Si el administrador no ha iniciado sesión hace poco, Totem le pide antes que vuelva a hacerlo. Totem muestra entonces la clave secreta de la integración una sola vez. Cópiala directamente en el almacén de secretos de tu servidor.\n\nLa API está en **Beta** y disponible sin invitación. **Crear clave API** funciona cuando:\n\n- quien crea la clave tiene el rol de administrador del equipo y una dirección de correo electrónico verificada;\n- la organización tiene el plan Pro o uno superior, o acceso a la API acordado con Totem;\n- el equipo tiene datos (una cuenta solo de facturación no los tiene) y no está desactivado ni archivado;\n- el equipo ha completado su configuración legal: un administrador del equipo guarda su política de privacidad, sus finalidades de tratamiento y su sector de actividad en [**Privacidad y acuerdos**](https:\u002F\u002Fapp.totemstudio.ai\u002Fprivacy-setup);\n- por ahora, el equipo no pertenece a un sector de actividad sensible, como el sanitario.\n\nSi no ves **Crear clave API**, comprueba el rol, la dirección de correo y que el equipo no sea una cuenta solo de facturación; cuando el motivo es el plan, Ajustes lo indica. El botón se desactiva cuando la organización ya tiene :api-const{name=\"MAX_INTEGRATIONS_PER_FAMILY\"} integraciones activas. Si Totem rechaza un equipo, Ajustes lo nombra y explica por qué. Si no, [contacta con soporte](\u002Fdevelopers\u002Fes\u002Fsupport).\n\n### Dónde puede guardarse una clave\n\nUna clave lee datos con nivel de administrador, así que guárdala en un servidor que controles:\n\n- en un gestor de secretos o en una variable de entorno que solo pueda leer el proceso que llama a la API;\n- nunca en un navegador, en una app móvil, en JavaScript del lado del cliente ni en un repositorio público;\n- nunca en una URL, en una línea de registro, en un comando que escribas en una shell ni en una solicitud de soporte.\n\nLa API no envía cabeceras CORS y responde `400 secret_key_in_browser` a una petición que lleve a la vez una clave secreta y una cabecera `Origin`. Si una clave ha estado alguna vez en una página web, una app móvil o una extensión del navegador, dala por filtrada: rótala y marca **Esta clave puede estar comprometida**, como se explica en [Rotar y revocar](#rotar-y-revocar).\n\n### Qué puede leer una clave\n\nTodas las claves de la versión 1.0a son de solo lectura y llevan el mismo conjunto fijo de permisos de lectura: no hay nada que elegir. [`GET \u002Fv1\u002Fme`](\u002Fdevelopers\u002Fes\u002Freference-account#me.get) los enumera en `scopes`: `teams:read`, `crm:read`, `calls:read`, `messages:read` y `calendar:read`. `messages:read` solo cubre los metadatos de las conversaciones; ningún endpoint devuelve el texto de un mensaje.\n\nUna clave lee todo lo que puede leer un administrador de sus equipos, incluidos los canales y los registros marcados como privados. El administrador que crea la integración lo confirma antes de que se emita la clave. Da a cada integración solo los equipos que necesita.\n\n## Equipos y la cabecera Totem-Team\n\nUna integración cubre un equipo o una lista de equipos de la misma organización (una cuenta de facturación y sus subequipos; en **Ajustes → Desarrolladores**, el ámbito del acceso **Equipos elegidos de la familia**). La lista es explícita: un equipo nuevo nunca se añade solo. Lo añade un administrador, y se avisa a los administradores que gestionan la integración y a los de cada equipo que cubre.\n\nQuién puede gestionar una integración depende de lo que cubre:\n\n- Un administrador de equipo crea y gestiona una integración para su propio equipo.\n- Solo un administrador de la familia puede crear o modificar una integración que cubra varios equipos: un administrador de la cuenta de facturación que figura en ella como administrador de la familia. Los administradores de cada equipo cubierto la ven en Ajustes, en modo de solo lectura.\n- Una organización, o un equipo que no pertenece a ninguna, puede tener hasta :api-const{name=\"MAX_INTEGRATIONS_PER_FAMILY\"} integraciones activas, contando todos sus equipos. Revoca las que ya no uses para liberar una plaza.\n\n[`GET \u002Fv1\u002Fteams`](\u002Fdevelopers\u002Fes\u002Freference-account#teams.list) lista los equipos que puede leer una clave, cada uno con un identificador que empieza por `team_`.\n\n- `GET \u002Fv1\u002Fme` y `GET \u002Fv1\u002Fteams` describen la clave y nunca llevan la cabecera.\n- Las peticiones sobre un registro concreto, como `GET \u002Fv1\u002Fleads\u002F{id}`, no la necesitan: el identificador del registro ya indica su equipo.\n- Las peticiones que leen una colección de un equipo (listas como `GET \u002Fv1\u002Fleads`, `GET \u002Fv1\u002Fboards` o `GET \u002Fv1\u002Fmembers`, `POST \u002Fv1\u002Fleads\u002Fsearch` y `GET \u002Fv1\u002Fsync\u002Fchanges`) usan el único equipo de la clave. Si la clave cubre varios, indica uno en la cabecera `Totem-Team`:\n\n```bash\ncurl \"https:\u002F\u002Fapi.totemstudio.ai\u002Fv1\u002Fleads?limit=50\" \\\n  -H \"Authorization: Bearer $TOTEM_API_KEY\" \\\n  -H \"Totem-Team: team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR\"\n```\n\nLos ejemplos de la referencia de la API envían `Totem-Team: $TOTEM_TEAM_ID` en estas peticiones. Con una clave de un solo equipo, deja `TOTEM_TEAM_ID` sin definir y no envían la cabecera: cURL descarta una cabecera con el valor vacío, y los ejemplos de Node.js y Python comprueban la variable.\n\nUna clave con un solo equipo también puede enviar la cabecera, siempre que indique ese equipo. Qué significa cada respuesta para tu copia del equipo:\n\n- Sin la cabecera, una clave con varios equipos recibe `400 team_required`. Una cabecera que no es un identificador de equipo, o que aparece dos veces, recibe `400 invalid_request`.\n- Un equipo que la clave no cubre, o que ya no existe, recibe `404 team_not_accessible`. Consulta `GET \u002Fv1\u002Fteams`: si el equipo ya no aparece, borra sus datos y su cursor.\n- Una clave de un solo equipo cubre su equipo solo mientras el equipo siga donde estaba al crearse la clave: en la misma organización o fuera de cualquier organización. Si el equipo entra en una organización, sale de ella o pasa a otra, la clave recibe `404 team_not_accessible` y `GET \u002Fv1\u002Fteams` deja de mostrar el equipo. Revoca la clave en **Ajustes → Desarrolladores** y crea una nueva.\n- Un equipo desactivado o archivado, o cuyo acceso a la API ha pausado Totem, recibe `403 team_state_restricted`. Conserva los datos del equipo y su cursor, omítelo en esta ejecución y vuelve a intentarlo más tarde. Un equipo desactivado o un acceso pausado pueden volver; un equipo archivado sigue restringido salvo que Totem lo restaure. Mientras un equipo está restringido, el feed de cambios no entrega nada de él, tampoco eliminaciones, así que, si la restricción dura más de lo que permite tu política de conservación, borra tu copia.\n- Por ahora, Totem no exporta los equipos de un sector de actividad sensible, como el sanitario. Un equipo así no se puede añadir a una integración, y una clave que ya lo cubre recibe `403 sector_restricted` para él. Omite el equipo: esperar no lo cambia. El feed de cambios no entrega nada de él, tampoco eliminaciones, así que conserva lo que ya tengas solo mientras lo permita tu política de conservación y después borra tu copia.\n\n## Lista de IP permitidas\n\nUna integración puede limitarse a un máximo de :api-const{name=\"MAX_IP_ALLOWLIST\"} direcciones IP o rangos en notación CIDR. Una petición desde cualquier otra dirección recibe `403 ip_not_allowed`. La lista se configura en **Ajustes → Desarrolladores**, en **Opciones avanzadas** al crear la clave o con **Editar integración** más tarde; cambiarla exige un inicio de sesión reciente.\n\n- La API solo es accesible por IPv4, así que indica las direcciones IPv4 públicas desde las que salen tus peticiones. Hoy una entrada IPv6 nunca coincide.\n- Escribe una dirección o un rango por línea. Un rango debe empezar en su dirección de red, como `203.0.113.0\u002F24`, y `\u002F0` no se admite. Una lista vacía permite cualquier dirección.\n- Si tu plataforma no tiene una dirección de salida fija, como muchas plataformas serverless, haz que su tráfico salga antes por una IP estática.\n- Después de guardar la lista, llama a `GET \u002Fv1\u002Fme` desde el servidor desplegado para comprobarla.\n\nTotem comprueba la dirección después de la clave, así que una clave incorrecta recibe `401 invalid_credentials` venga de donde venga.\n\n## Rotar y revocar\n\n**Rota** una clave con **Rotar clave** para sustituirla. Totem emite una clave nueva y mantiene la antigua en funcionamiento durante el tiempo que elijas en el diálogo: 1 hora, 24 horas (por defecto) o 7 días. Despliega la clave nueva dentro de ese plazo y nada se detiene. Cuando termina ese tiempo, la clave antigua recibe `401 key_expired`. Volver a rotar revoca cualquier clave antigua que siga en su periodo de gracia, y el diálogo te pide que lo confirmes.\n\nPara desactivar la clave antigua al instante, marca **Esta clave puede estar comprometida** al rotarla, o elige más tarde **Desactivar ya la clave anterior**. La clave antigua recibe entonces `401 invalid_credentials`.\n\n**Si una clave puede haberse filtrado**, rótala y marca **Esta clave puede estar comprometida**: la clave antigua se revoca al instante, sin periodo de gracia. Después avísanos, como se explica en [Soporte](\u002Fdevelopers\u002Fes\u002Fsupport).\n\n**Revoca** una integración con **Revocar acceso** para detener todas sus claves. Una clave revocada deja de funcionar en un máximo de :api-const{name=\"KEY_CACHE_TTL_MS\" divide=\"1000\"} segundos, y revocar no se puede deshacer. Los datos que ya copiaste siguen en tus sistemas y dejan de recibir eliminaciones de Totem: bórralos, o consérvalos solo mientras lo permitan las normas del propio cliente. En [Seguridad y datos personales](\u002Fdevelopers\u002Fes\u002Fsecurity#datos-personales-que-recibes) se explica qué hacer con ellos.\n\nCrear o rotar una clave, añadir un equipo y cambiar la lista de IP permitidas piden al administrador que vuelva a iniciar sesión si no lo ha hecho hace poco. Cada cambio aparece en la **Actividad reciente** de la integración, y se avisa de cada uno a los administradores que gestionan la integración y a los de cada equipo que cubre, en Totem y por correo electrónico. Revocar y **Desactivar ya la clave anterior** nunca exigen iniciar sesión: quien puede gestionar la integración puede detenerla al momento.\n\n## Intentos fallidos\n\nTotem cuenta los intentos fallidos: las peticiones con una clave que falta, está mal formada, no existe o es incorrecta. A partir de tan solo :api-const{name=\"AUTH_FAILURE_LIMITS.perIpPerMinute\"} fallos desde una dirección IP en un minuto, o :api-const{name=\"AUTH_FAILURE_LIMITS.perLookupIdPerMinute\"} con una misma clave, Totem puede bloquear esa dirección o esa clave durante :api-const{name=\"AUTH_FAILURE_LIMITS.banMs\" divide=\"1000\"} segundos. Mientras dura el bloqueo, las peticiones reciben `429 rate_limited` con `Retry-After` igual a la duración completa del bloqueo; el bloqueo puede terminar antes.\n\nUna clave revocada o caducada, una integración que ya no está activa y una petición desde fuera de la lista de IP permitidas no cuentan. Mientras una clave está bloqueada, las peticiones con su secreto real siguen funcionando: solo se rechazan los intentos de adivinarla. Mientras una dirección está bloqueada, se rechazan todas sus peticiones. Si te quedas bloqueado, corrige primero la clave y después espera lo que indica `Retry-After` antes de volver a intentarlo.\n\nMuchas peticiones sin una clave bien formada desde una misma dirección también pueden hacer que el cortafuegos situado delante de la API responda `429` por sí mismo, sin `Retry-After` ni cuerpo JSON, durante un máximo de 10 minutos. Detén el bucle, corrige la cabecera y reintenta con espera exponencial, como se explica en [Errores](\u002Fdevelopers\u002Fes\u002Ferrors).\n\n## Errores de autenticación\n\nCada código enlaza con su explicación completa en la página de [Errores](\u002Fdevelopers\u002Fes\u002Ferrors).\n\n| Estado | `code` | Qué hacer |\n|---|---|---|\n| 400 | [`secret_key_in_browser`](\u002Fdevelopers\u002Fes\u002Ferrors#secret_key_in_browser) | La petición salió de un navegador. Llama a la API desde tu servidor y, si la clave estuvo alguna vez en una página web o una app, rótala y márcala como comprometida. |\n| 400 | [`team_required`](\u002Fdevelopers\u002Fes\u002Ferrors#team_required) | La clave cubre varios equipos. Envía `Totem-Team`. |\n| 401 | [`invalid_credentials`](\u002Fdevelopers\u002Fes\u002Ferrors#invalid_credentials) | Falta la clave, está mal formada, no existe, es incorrecta o se ha revocado. Revisa la cabecera y la clave. |\n| 401 | [`key_expired`](\u002Fdevelopers\u002Fes\u002Ferrors#key_expired) | La clave se rotó y su periodo de gracia ha terminado. Usa la clave nueva. |\n| 403 | [`ip_not_allowed`](\u002Fdevelopers\u002Fes\u002Ferrors#ip_not_allowed) | La petición salió de una dirección que no está en la lista de IP permitidas de la integración. La API solo es accesible por IPv4. |\n| 403 | [`plan_not_entitled`](\u002Fdevelopers\u002Fes\u002Ferrors#plan_not_entitled) | El plan de la organización no incluye la API. Conserva tus datos y habla con el cliente; el feed no entrega eliminaciones hasta que vuelva el acceso, así que, si eso dura más de lo que permite tu política de conservación, borra tu copia. |\n| 403 | [`insufficient_scope`](\u002Fdevelopers\u002Fes\u002Ferrors#insufficient_scope) | A la clave le falta un permiso que este endpoint necesita. Todas las claves de la versión 1.0a tienen los mismos permisos, así que avísanos con el identificador de la petición. |\n| 403 | [`team_state_restricted`](\u002Fdevelopers\u002Fes\u002Ferrors#team_state_restricted) | El equipo está desactivado, archivado o en pausa. Conserva sus datos y su cursor, omítelo en esta ejecución y vuelve a intentarlo más tarde; si la restricción dura más de lo que permite tu política de conservación, borra tu copia. |\n| 403 | [`sector_restricted`](\u002Fdevelopers\u002Fes\u002Ferrors#sector_restricted) | Por ahora, Totem no exporta los equipos de un sector sensible, como el sanitario. Omite el equipo: esperar no lo cambia. El feed no entrega eliminaciones de él, así que conserva lo que tengas solo mientras lo permita tu política de conservación y después borra tu copia. |\n| 404 | [`team_not_accessible`](\u002Fdevelopers\u002Fes\u002Ferrors#team_not_accessible) | La clave no cubre este equipo. Si `GET \u002Fv1\u002Fteams` ya no lo incluye, borra sus datos y su cursor. |\n| 429 | [`rate_limited`](\u002Fdevelopers\u002Fes\u002Ferrors#rate_limited) | Demasiados intentos fallidos o demasiadas peticiones. Espera los segundos que indica `Retry-After`. Un `429` sin cuerpo JSON viene del cortafuegos: reintenta con espera exponencial. |\n","start",{"title":6,"description":773},"developers\u002Fes\u002Fauthentication","authentication","VnUbE2DQK7nfxy0WYibv90-VZUzUceapHOIJvAFSAho",[788,799,825,872],{"section":782,"items":789},[790,794,798],{"path":791,"title":792,"description":793},"\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":795,"title":796,"description":797},"\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":780,"title":6,"description":773},{"section":800,"items":801},"guides",[802,806,810,814,818,822],{"path":803,"title":804,"description":805},"\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":807,"title":808,"description":809},"\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":811,"title":812,"description":813},"\u002Fdevelopers\u002Fes\u002Fpagination","Listas y paginación","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":815,"title":816,"description":817},"\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":819,"title":820,"description":821},"\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":823,"title":487,"description":824},"\u002Fdevelopers\u002Fes\u002Fsecurity","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":826,"items":827},"reference",[828,832,834,838,843,848,853,858,863,868],{"path":829,"title":830,"description":831},"\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":544,"title":545,"description":833},"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":835,"title":836,"description":837},"\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":839,"title":840,"description":841,"apiTag":842},"\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":844,"title":845,"description":846,"apiTag":847},"\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":849,"title":850,"description":851,"apiTag":852},"\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":854,"title":855,"description":856,"apiTag":857},"\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":859,"title":860,"description":861,"apiTag":862},"\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":864,"title":865,"description":866,"apiTag":867},"\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":869,"title":870,"description":871},"\u002Fdevelopers\u002Fes\u002Fobjects","Todos los objetos","Todos los objetos que devuelve la API, campo a campo, con un ejemplo de cada uno.",{"section":873,"items":874},"resources",[875,879,881,885],{"path":876,"title":877,"description":878},"\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":141,"title":468,"description":880},"Cómo pedir ayuda con la API de Totem, qué incluir en una solicitud y qué hacer si se filtra una clave.",{"path":882,"title":883,"description":884},"\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":886,"title":887,"description":888},"\u002Fdevelopers\u002Fes\u002Ffaq","Preguntas frecuentes","Respuestas breves a las preguntas más habituales sobre la API de Totem, con enlaces a los detalles.","\u002Fdevelopers\u002Fauthentication",{"ACTIVATION_MARGIN_MS":891,"ADMIN_ACCESS_DISCLOSURE_VERSION":892,"AUDIT_RETENTION_DAYS":893,"AUTH_FAILURE_LIMITS":894,"CAPTURE_LAG_FLOOR_MS":898,"CAPTURE_LAG_P99_MS":7,"CURSOR_MAX_AGE_DAYS":899,"DIRTY_TTL_DAYS":899,"FAMILY_TEAM_SCOPE":900,"FAMILY_TEAM_SCOPE_OPTIONS":901,"FEED_SETTLE_LAG_MS":903,"GATE_REFRESH_MS":891,"INTEGRATION_NAME_LENGTH":904,"INTEGRATION_PURPOSE_LENGTH":906,"KEY_CACHE_TTL_MS":909,"KEY_STATS_RETENTION_DAYS":910,"LEAD_RESPONSE_READ_BUDGET":911,"LIST_SCAN_MAX":914,"MAX_FAMILY_INTEGRATION_TEAMS":899,"MAX_INTEGRATIONS_PER_FAMILY":915,"MAX_IP_ALLOWLIST":896,"PAGE_LIMIT":916,"PLATFORM_CONFIG_TTL_MS":919,"REMOVAL_RETENTION_DAYS":920,"REQUEST_BODY_MAX_BYTES":921,"ROLL_GRACE_DEFAULT_HOURS":922,"ROLL_GRACE_HOURS":923,"SEARCH_MAX_RESULTS":915,"SENSITIVE_SECTOR_POLICY":926,"SENSITIVE_SECTOR_POLICY_OPTIONS":927,"SYNC_DAILY_BUDGET":929,"SYNC_VELOCITY":931,"TEAM_CACHE_TTL_MS":933},60000,"2026-10-17",365,{"perIpPerMinute":895,"perLookupIdPerMinute":896,"banMs":897},60,20,600000,300000,30,"explicit_list",[900,902],"all_family_teams",10000,{"min":763,"max":905},80,{"min":907,"max":908},1,280,5000,90,{"conversations":896,"messageReads":912,"calls":913},200,50,1000,10,{"default":917,"max":918},25,100,15000,45,16384,24,[924,907,922,925],0,168,"exclude",[926,928],"allow",{"floor":930,"recordsMultiplier":760},250000,{"perMinute":932,"burst":903},2000,30000,"1.0a","guide",[937,938,939,940,941,942,943,944,945],{"id":14,"text":15,"depth":763},{"id":67,"text":68,"depth":760},{"id":145,"text":146,"depth":760},{"id":182,"text":183,"depth":760},{"id":224,"text":89,"depth":763},{"id":374,"text":375,"depth":763},{"id":430,"text":179,"depth":763},{"id":501,"text":502,"depth":763},{"id":548,"text":549,"depth":763},{"path":795,"title":796,"section":782},{"path":803,"title":804,"section":800},[],1792502790176]