[{"data":1,"prerenderedAt":529},["ShallowReactive",2],{"developers:\u002Fdevelopers\u002Fes\u002Ftesting":3},{"doc":4,"lang":355,"nav":366,"alternatePath":469,"policy":470,"specVersion":514,"reference":7,"layout":515,"toc":516,"prev":526,"next":527,"operations":528,"overview":7,"heroExample":7},{"id":5,"title":6,"apiTag":7,"body":8,"description":352,"draft":353,"extension":354,"lang":355,"meta":356,"navTitle":7,"navigation":357,"order":358,"path":359,"rawbody":360,"section":361,"seo":362,"stem":363,"translationKey":364,"version":7,"__hash__":365},"developers_es\u002Fdevelopers\u002Fes\u002Ftesting.md","Pruebas y puesta en producción",null,{"type":9,"value":10,"toc":337},"minimark",[11,16,25,29,32,55,59,62,86,89,108,111,115,123,128,175,179,232,236,257,261,264,291,298,302],[12,13,15],"h2",{"id":14},"todavía-no-hay-entorno-de-pruebas","Todavía no hay entorno de pruebas",[17,18,19,20,24],"p",{},"La versión 1.0a no tiene entorno de pruebas ni claves de prueba. Cada clave lee un equipo real, y todo lo que devuelve lleva ",[21,22,23],"code",{},"livemode: true",". La API es de solo lectura, así que ninguna petición puede cambiar datos en Totem: probar es seguro siempre que trates lo que lees como datos personales reales.",[12,26,28],{"id":27},"dónde-probar","Dónde probar",[17,30,31],{},"Empieza con un equipo que solo contenga datos ficticios, y usa datos reales solo cuando estés listo para pasar a producción.",[33,34,35,49],"ul",{},[36,37,38,42,43,48],"li",{},[39,40,41],"strong",{},"Un equipo dedicado con datos ficticios."," Usa un equipo de Totem separado que solo contenga contactos ficticios y crea una integración para él. Su clave sigue siendo una clave real, y el equipo necesita lo mismo que uno de producción: una organización cuyo plan incluya la API, la configuración legal completada, un sector de actividad que no sea sensible y un administrador que cree la integración (el ",[44,45,47],"a",{"href":46},"\u002Fdevelopers\u002Fes\u002Fquickstart#antes-de-empezar","Inicio rápido"," los enumera). La API es de solo lectura, así que los datos de prueba se crean en el propio Totem: añade a mano algunos leads con nombres ficticios y con teléfonos y direcciones de correo de los rangos de más abajo, y después llama, escribe o pide una cita al equipo de pruebas tú mismo para generar llamadas, conversaciones y citas.",[36,50,51,54],{},[39,52,53],{},"Tu propio equipo."," También puedes desarrollar con los datos reales de tu equipo y tu propia clave. Guarda esos datos solo en sistemas cubiertos por tus acuerdos de tratamiento de datos y borra las copias de prueba al terminar.",[12,56,58],{"id":57},"datos-de-ejemplo","Datos de ejemplo",[17,60,61],{},"El kit del integrador incluye la descripción de la API y objetos de ejemplo:",[33,63,64,73],{},[36,65,66,72],{},[44,67,69],{"href":68},"\u002Fdevelopers\u002Fkit\u002Fopenapi.json",[21,70,71],{},"openapi.json"," describe todos los endpoints y campos;",[36,74,75,81,82,85],{},[44,76,78],{"href":77},"\u002Fdevelopers\u002Fkit\u002Ffixtures.json",[21,79,80],{},"fixtures.json"," contiene objetos de ejemplo de cada tipo, todos con ",[21,83,84],{},"livemode: false",".",[17,87,88],{},"Carga esos datos de ejemplo en tus pruebas unitarias antes de llamar a la API. Los ejemplos de esta documentación y del kit solo usan contactos ficticios:",[33,90,91,102],{},[36,92,93,94,97,98,101],{},"teléfonos del ",[21,95,96],{},"+1 202-555-0100"," al ",[21,99,100],{},"+1 202-555-0199",";",[36,103,104,105,85],{},"direcciones de correo electrónico del dominio ",[21,106,107],{},"example.com",[17,109,110],{},"Usa los mismos rangos en tus propios datos de prueba, para que ninguna prueba pueda llegar nunca a una persona real.",[12,112,114],{"id":113},"qué-probar-antes-de-pasar-a-producción","Qué probar antes de pasar a producción",[17,116,117,118,122],{},"Haz cada comprobación sobre tu propio código, con los datos de ejemplo o con un equipo de pruebas. ",[44,119,121],{"href":120},"\u002Fdevelopers\u002Fes\u002Fsync","Sincroniza una copia"," explica el comportamiento que demuestra cada una.",[124,125,127],"h3",{"id":126},"aplicar-el-feed","Aplicar el feed",[33,129,130,136,146,152,158,169],{},[36,131,132,135],{},[39,133,134],{},"Idempotencia."," Aplica dos veces la misma página del feed: la segunda vez no debe cambiar nada.",[36,137,138,141,142,145],{},[39,139,140],{},"Versiones antiguas."," Entrega un elemento con una ",[21,143,144],{},"version"," menor que la que tienes: debe ignorarse.",[36,147,148,151],{},[39,149,150],{},"Recuperación tras un fallo."," Detén la sincronización después de guardar una página y antes de guardar su cursor, y vuelve a arrancarla: la página repetida no debe cambiar nada.",[36,153,154,157],{},[39,155,156],{},"Eliminaciones."," Una eliminación debe borrar el registro y, si es un lead, su atribución, su respuesta y sus actividades. Después, entrega una versión anterior del mismo registro: debe seguir borrado.",[36,159,160,163,164,168],{},[39,161,162],{},"Resincronización completa."," Tira el cursor y haz la ",[44,165,167],{"href":166},"\u002Fdevelopers\u002Fes\u002Fsync#resincronizaci%C3%B3n-completa","resincronización completa",": los registros que falten en la nueva copia deben desaparecer.",[36,170,171,174],{},[39,172,173],{},"Valores desconocidos."," Un valor de enumeración o un código de error que no conoces no debe detener la sincronización.",[124,176,178],{"id":177},"errores-y-límites","Errores y límites",[33,180,181,191,209,223],{},[36,182,183,186,187,190],{},[39,184,185],{},"Un equipo que no está listo."," Con una clave que lee dos equipos, haz que uno responda ",[21,188,189],{},"409 capture_not_ready",": el otro debe seguir sincronizándose en la misma ejecución, y el primero debe conservar su cursor.",[36,192,193,196,197,200,201,204,205,208],{},[39,194,195],{},"Equipos que entran y salen."," ",[21,198,199],{},"404 team_not_accessible"," debe borrar los datos del equipo solo cuando ",[21,202,203],{},"GET \u002Fv1\u002Fteams"," confirme que el equipo ya no está. Un ",[21,206,207],{},"403"," debe conservar los datos y el cursor.",[36,210,211,214,215,218,219,222],{},[39,212,213],{},"Límite de frecuencia."," Un ",[21,216,217],{},"429 rate_limited"," debe esperar lo que indique ",[21,220,221],{},"Retry-After"," y después continuar con el mismo cursor.",[36,224,225,214,228,231],{},[39,226,227],{},"Cuota diaria.",[21,229,230],{},"429 quota_exceeded"," debe detener la sincronización hasta las 00:00 UTC y reanudarla entonces con el mismo cursor. Asegúrate de que el proceso que espera no pueda solaparse con la siguiente ejecución programada.",[124,233,235],{"id":234},"contactos","Contactos",[33,237,238,247],{},[36,239,240,243,244,85],{},[39,241,242],{},"Permisos de contacto."," Ningún sistema al que envíes datos debe contactar con un lead que tenga ",[21,245,246],{},"contact_permissions.do_not_contact: true",[36,248,249,252,253,256],{},[39,250,251],{},"Consentimiento desconocido."," Un lead con ",[21,254,255],{},"whatsapp_consent: null"," no debe recibir mensajes de WhatsApp como si hubiera aceptado.",[12,258,260],{"id":259},"ensaya-la-rotación-de-una-clave","Ensaya la rotación de una clave",[17,262,263],{},"Rota una clave una vez antes de depender de ella, para que la primera rotación real sea rutina:",[265,266,267,278,281,284],"ol",{},[36,268,269,270,273,274,277],{},"En ",[39,271,272],{},"Ajustes → Desarrolladores",", elige ",[39,275,276],{},"Rotar clave"," y mantén la clave anterior durante 1 hora.",[36,279,280],{},"Despliega la clave nueva en tu servidor, igual que lo harás en producción.",[36,282,283],{},"Comprueba que tu sincronización sigue funcionando con la clave nueva.",[36,285,286,287,290],{},"Cuando haya pasado esa hora, comprueba que la clave antigua responde ",[21,288,289],{},"401 key_expired"," y que ya no la usa ninguno de tus sistemas.",[17,292,293,297],{},[44,294,296],{"href":295},"\u002Fdevelopers\u002Fes\u002Fauthentication#rotar-y-revocar","Autenticación"," explica cómo rotar y revocar claves.",[12,299,301],{"id":300},"comprobar-la-disponibilidad","Comprobar la disponibilidad",[17,303,304,310,311,314,315,318,319,322,323,326,327,330,331,85],{},[44,305,307],{"href":306},"\u002Fdevelopers\u002Fes\u002Freference-account#health",[21,308,309],{},"GET \u002Fv1\u002Fhealth"," indica si la API está funcionando. No necesita clave ni devuelve datos, así que úsalo para la monitorización. Compruébalo con ",[21,312,313],{},"GET",": el cortafuegos situado delante de la API responde a ",[21,316,317],{},"HEAD"," con un ",[21,320,321],{},"404"," simple. Llámalo sin cadena de consulta: cualquier parámetro, aunque sea para evitar la caché, recibe ",[21,324,325],{},"400 invalid_request",". Su cabecera de respuesta ",[21,328,329],{},"Totem-Release"," indica la versión del servicio que respondió; inclúyela cuando nos avises de una incidencia. Para comprobar una clave, llama a ",[44,332,334],{"href":333},"\u002Fdevelopers\u002Fes\u002Freference-account#me.get",[21,335,336],{},"GET \u002Fv1\u002Fme",{"title":338,"searchDepth":339,"depth":339,"links":340},"",3,[341,343,344,345,350,351],{"id":14,"depth":342,"text":15},2,{"id":27,"depth":342,"text":28},{"id":57,"depth":342,"text":58},{"id":113,"depth":342,"text":114,"children":346},[347,348,349],{"id":126,"depth":339,"text":127},{"id":177,"depth":339,"text":178},{"id":234,"depth":339,"text":235},{"id":259,"depth":342,"text":260},{"id":300,"depth":342,"text":301},"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.",false,"md","es",{},true,"40","\u002Fdevelopers\u002Fes\u002Ftesting","---\ntitle: Pruebas y puesta en producción\ndescription: 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.\nsection: guides\norder: 40\ntranslationKey: testing\nlang: es\ndraft: false\n---\n\n## Todavía no hay entorno de pruebas\n\nLa versión 1.0a no tiene entorno de pruebas ni claves de prueba. Cada clave lee un equipo real, y todo lo que devuelve lleva `livemode: true`. La API es de solo lectura, así que ninguna petición puede cambiar datos en Totem: probar es seguro siempre que trates lo que lees como datos personales reales.\n\n## Dónde probar\n\nEmpieza con un equipo que solo contenga datos ficticios, y usa datos reales solo cuando estés listo para pasar a producción.\n\n- **Un equipo dedicado con datos ficticios.** Usa un equipo de Totem separado que solo contenga contactos ficticios y crea una integración para él. Su clave sigue siendo una clave real, y el equipo necesita lo mismo que uno de producción: una organización cuyo plan incluya la API, la configuración legal completada, un sector de actividad que no sea sensible y un administrador que cree la integración (el [Inicio rápido](\u002Fdevelopers\u002Fes\u002Fquickstart#antes-de-empezar) los enumera). La API es de solo lectura, así que los datos de prueba se crean en el propio Totem: añade a mano algunos leads con nombres ficticios y con teléfonos y direcciones de correo de los rangos de más abajo, y después llama, escribe o pide una cita al equipo de pruebas tú mismo para generar llamadas, conversaciones y citas.\n- **Tu propio equipo.** También puedes desarrollar con los datos reales de tu equipo y tu propia clave. Guarda esos datos solo en sistemas cubiertos por tus acuerdos de tratamiento de datos y borra las copias de prueba al terminar.\n\n## Datos de ejemplo\n\nEl kit del integrador incluye la descripción de la API y objetos de ejemplo:\n\n- [`openapi.json`](\u002Fdevelopers\u002Fkit\u002Fopenapi.json) describe todos los endpoints y campos;\n- [`fixtures.json`](\u002Fdevelopers\u002Fkit\u002Ffixtures.json) contiene objetos de ejemplo de cada tipo, todos con `livemode: false`.\n\nCarga esos datos de ejemplo en tus pruebas unitarias antes de llamar a la API. Los ejemplos de esta documentación y del kit solo usan contactos ficticios:\n\n- teléfonos del `+1 202-555-0100` al `+1 202-555-0199`;\n- direcciones de correo electrónico del dominio `example.com`.\n\nUsa los mismos rangos en tus propios datos de prueba, para que ninguna prueba pueda llegar nunca a una persona real.\n\n## Qué probar antes de pasar a producción\n\nHaz cada comprobación sobre tu propio código, con los datos de ejemplo o con un equipo de pruebas. [Sincroniza una copia](\u002Fdevelopers\u002Fes\u002Fsync) explica el comportamiento que demuestra cada una.\n\n### Aplicar el feed\n\n- **Idempotencia.** Aplica dos veces la misma página del feed: la segunda vez no debe cambiar nada.\n- **Versiones antiguas.** Entrega un elemento con una `version` menor que la que tienes: debe ignorarse.\n- **Recuperación tras un fallo.** Detén la sincronización después de guardar una página y antes de guardar su cursor, y vuelve a arrancarla: la página repetida no debe cambiar nada.\n- **Eliminaciones.** Una eliminación debe borrar el registro y, si es un lead, su atribución, su respuesta y sus actividades. Después, entrega una versión anterior del mismo registro: debe seguir borrado.\n- **Resincronización completa.** Tira el cursor y haz la [resincronización completa](\u002Fdevelopers\u002Fes\u002Fsync#resincronización-completa): los registros que falten en la nueva copia deben desaparecer.\n- **Valores desconocidos.** Un valor de enumeración o un código de error que no conoces no debe detener la sincronización.\n\n### Errores y límites\n\n- **Un equipo que no está listo.** Con una clave que lee dos equipos, haz que uno responda `409 capture_not_ready`: el otro debe seguir sincronizándose en la misma ejecución, y el primero debe conservar su cursor.\n- **Equipos que entran y salen.** `404 team_not_accessible` debe borrar los datos del equipo solo cuando `GET \u002Fv1\u002Fteams` confirme que el equipo ya no está. Un `403` debe conservar los datos y el cursor.\n- **Límite de frecuencia.** Un `429 rate_limited` debe esperar lo que indique `Retry-After` y después continuar con el mismo cursor.\n- **Cuota diaria.** Un `429 quota_exceeded` debe detener la sincronización hasta las 00:00 UTC y reanudarla entonces con el mismo cursor. Asegúrate de que el proceso que espera no pueda solaparse con la siguiente ejecución programada.\n\n### Contactos\n\n- **Permisos de contacto.** Ningún sistema al que envíes datos debe contactar con un lead que tenga `contact_permissions.do_not_contact: true`.\n- **Consentimiento desconocido.** Un lead con `whatsapp_consent: null` no debe recibir mensajes de WhatsApp como si hubiera aceptado.\n\n## Ensaya la rotación de una clave\n\nRota una clave una vez antes de depender de ella, para que la primera rotación real sea rutina:\n\n1. En **Ajustes → Desarrolladores**, elige **Rotar clave** y mantén la clave anterior durante 1 hora.\n2. Despliega la clave nueva en tu servidor, igual que lo harás en producción.\n3. Comprueba que tu sincronización sigue funcionando con la clave nueva.\n4. Cuando haya pasado esa hora, comprueba que la clave antigua responde `401 key_expired` y que ya no la usa ninguno de tus sistemas.\n\n[Autenticación](\u002Fdevelopers\u002Fes\u002Fauthentication#rotar-y-revocar) explica cómo rotar y revocar claves.\n\n## Comprobar la disponibilidad\n\n[`GET \u002Fv1\u002Fhealth`](\u002Fdevelopers\u002Fes\u002Freference-account#health) indica si la API está funcionando. No necesita clave ni devuelve datos, así que úsalo para la monitorización. Compruébalo con `GET`: el cortafuegos situado delante de la API responde a `HEAD` con un `404` simple. Llámalo sin cadena de consulta: cualquier parámetro, aunque sea para evitar la caché, recibe `400 invalid_request`. Su cabecera de respuesta `Totem-Release` indica la versión del servicio que respondió; inclúyela cuando nos avises de una incidencia. Para comprobar una clave, llama a [`GET \u002Fv1\u002Fme`](\u002Fdevelopers\u002Fes\u002Freference-account#me.get).\n","guides",{"title":6,"description":352},"developers\u002Fes\u002Ftesting","testing","St8rIEmYbI4lXhHdDXcLydkw2Q3X-MmCNcwVjJVS82c",[367,380,401,450],{"section":368,"items":369},"start",[370,374,377],{"path":371,"title":372,"description":373},"\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":375,"title":47,"description":376},"\u002Fdevelopers\u002Fes\u002Fquickstart","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":378,"title":296,"description":379},"\u002Fdevelopers\u002Fes\u002Fauthentication","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":361,"items":381},[382,386,388,392,396,397],{"path":383,"title":384,"description":385},"\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":120,"title":121,"description":387},"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":389,"title":390,"description":391},"\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":393,"title":394,"description":395},"\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":359,"title":6,"description":352},{"path":398,"title":399,"description":400},"\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":402,"items":403},"reference",[404,408,412,416,421,426,431,436,441,446],{"path":405,"title":406,"description":407},"\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":409,"title":410,"description":411},"\u002Fdevelopers\u002Fes\u002Ferrors","Errores","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":413,"title":414,"description":415},"\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":417,"title":418,"description":419,"apiTag":420},"\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":422,"title":423,"description":424,"apiTag":425},"\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":427,"title":428,"description":429,"apiTag":430},"\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":432,"title":433,"description":434,"apiTag":435},"\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":437,"title":438,"description":439,"apiTag":440},"\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":442,"title":443,"description":444,"apiTag":445},"\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":447,"title":448,"description":449},"\u002Fdevelopers\u002Fes\u002Fobjects","Todos los objetos","Todos los objetos que devuelve la API, campo a campo, con un ejemplo de cada uno.",{"section":451,"items":452},"resources",[453,457,461,465],{"path":454,"title":455,"description":456},"\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":458,"title":459,"description":460},"\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":462,"title":463,"description":464},"\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":466,"title":467,"description":468},"\u002Fdevelopers\u002Fes\u002Ffaq","Preguntas frecuentes","Respuestas breves a las preguntas más habituales sobre la API de Totem, con enlaces a los detalles.","\u002Fdevelopers\u002Ftesting",{"ACTIVATION_MARGIN_MS":471,"ADMIN_ACCESS_DISCLOSURE_VERSION":472,"AUDIT_RETENTION_DAYS":473,"AUTH_FAILURE_LIMITS":474,"CAPTURE_LAG_FLOOR_MS":478,"CAPTURE_LAG_P99_MS":7,"CURSOR_MAX_AGE_DAYS":479,"DIRTY_TTL_DAYS":479,"FAMILY_TEAM_SCOPE":480,"FAMILY_TEAM_SCOPE_OPTIONS":481,"FEED_SETTLE_LAG_MS":483,"GATE_REFRESH_MS":471,"INTEGRATION_NAME_LENGTH":484,"INTEGRATION_PURPOSE_LENGTH":486,"KEY_CACHE_TTL_MS":489,"KEY_STATS_RETENTION_DAYS":490,"LEAD_RESPONSE_READ_BUDGET":491,"LIST_SCAN_MAX":494,"MAX_FAMILY_INTEGRATION_TEAMS":479,"MAX_INTEGRATIONS_PER_FAMILY":495,"MAX_IP_ALLOWLIST":476,"PAGE_LIMIT":496,"PLATFORM_CONFIG_TTL_MS":499,"REMOVAL_RETENTION_DAYS":500,"REQUEST_BODY_MAX_BYTES":501,"ROLL_GRACE_DEFAULT_HOURS":502,"ROLL_GRACE_HOURS":503,"SEARCH_MAX_RESULTS":495,"SENSITIVE_SECTOR_POLICY":506,"SENSITIVE_SECTOR_POLICY_OPTIONS":507,"SYNC_DAILY_BUDGET":509,"SYNC_VELOCITY":511,"TEAM_CACHE_TTL_MS":513},60000,"2026-10-17",365,{"perIpPerMinute":475,"perLookupIdPerMinute":476,"banMs":477},60,20,600000,300000,30,"explicit_list",[480,482],"all_family_teams",10000,{"min":342,"max":485},80,{"min":487,"max":488},1,280,5000,90,{"conversations":476,"messageReads":492,"calls":493},200,50,1000,10,{"default":497,"max":498},25,100,15000,45,16384,24,[504,487,502,505],0,168,"exclude",[506,508],"allow",{"floor":510,"recordsMultiplier":339},250000,{"perMinute":512,"burst":483},2000,30000,"1.0a","guide",[517,518,519,520,521,522,523,524,525],{"id":14,"text":15,"depth":342},{"id":27,"text":28,"depth":342},{"id":57,"text":58,"depth":342},{"id":113,"text":114,"depth":342},{"id":126,"text":127,"depth":339},{"id":177,"text":178,"depth":339},{"id":234,"text":235,"depth":339},{"id":259,"text":260,"depth":342},{"id":300,"text":301,"depth":342},{"path":393,"title":394,"section":361},{"path":398,"title":399,"section":361},[],1792502791308]