# Tsuzuro — llms-full Generated at build time. Source: apps/docs. Site: https://docs.tsuzuro.com ## Index - Tsuzuro Docs: https://docs.tsuzuro.com/ - Página no encontrada: https://docs.tsuzuro.com/404/ - Changelog: https://docs.tsuzuro.com/changelog/ - Agents: https://docs.tsuzuro.com/concepts/agents/ - Channels: https://docs.tsuzuro.com/concepts/channels/ - Looms: https://docs.tsuzuro.com/concepts/looms/ - Stitches: https://docs.tsuzuro.com/concepts/stitches/ - Threads: https://docs.tsuzuro.com/concepts/threads/ - Errors: https://docs.tsuzuro.com/errors/ - Auth errors: https://docs.tsuzuro.com/errors/auth/ - Validation errors: https://docs.tsuzuro.com/errors/validation/ - Quickstart CLI: https://docs.tsuzuro.com/getting-started/quickstart-cli/ - Quickstart SDK: https://docs.tsuzuro.com/getting-started/quickstart-sdk/ - Sandbox: https://docs.tsuzuro.com/getting-started/sandbox/ - Agents: https://docs.tsuzuro.com/guides/agents/ - BYOA: https://docs.tsuzuro.com/guides/byoa/ - Webhook signatures: https://docs.tsuzuro.com/guides/webhook-signatures/ - WhatsApp: https://docs.tsuzuro.com/guides/whatsapp/ - Acuerdo de procesamiento de datos (DPA): https://docs.tsuzuro.com/legal/dpa/ - Política de privacidad: https://docs.tsuzuro.com/legal/privacy/ - Subprocesadores: https://docs.tsuzuro.com/legal/subprocessors/ - Términos de servicio: https://docs.tsuzuro.com/legal/terms/ - OpenAPI: https://docs.tsuzuro.com/openapi/ ## Boundaries - Not a CRM. - Not a marketing suite. - Not an SMB WhatsApp inbox SaaS. - Not a Meta-compatible proxy. --- # Tsuzuro Docs URL: https://docs.tsuzuro.com/ Tsuzuro es un **runtime conversacional programable**. Orquestas agentes IA, humanos, tools y canales (Sandbox primero, WhatsApp en producción) con SDK, CLI y Console. ## Qué vas a encontrar - [Quickstart SDK](/getting-started/quickstart-sdk/) y [CLI](/getting-started/quickstart-cli/) para time-to-first-event en minutos. - [Sandbox](/getting-started/sandbox/) sin Meta ni proveedores externos. - Conceptos: Threads, Channels, Stitches, Agents, Looms. - Guías de WhatsApp, BYOA, webhooks firmados y agentes. - [Catálogo de errores](/errors/) alineado con los `docsUrl` del API. - Contrato OpenAPI en [`/openapi.json`](/openapi.json) (mirror del API). ## Qué no es No es CRM, marketing suite ni inbox SaaS para PyMEs. Si buscas eso, estás en el producto equivocado. ## Para agentes IA - [`/llms.txt`](/llms.txt) — índice corto. - [`/llms-full.txt`](/llms-full.txt) — contenido inline generado en cada build. --- # Página no encontrada URL: https://docs.tsuzuro.com/404/ --- # Changelog URL: https://docs.tsuzuro.com/changelog/ Changelog público de la beta. Los change records internos del equipo viven aparte y no se publican aquí. ## 2026-07 — Beta pública (sin billing) ### Added - Runtime completo: Threads, Messages, Channels (sandbox/whatsapp/custom), Stitches firmados. - Studio + Console operando contra `api.tsuzuro.com` con CORS y refresh de sesión. - Signup público con verificación de email, password reset e invitaciones a workspace. - WhatsApp production-grade: Embedded Signup, BYOA, renovación de tokens, media en R2, rate limit distribuido. - Modo agent `suggest` con resolución desde Console. - Docs site en `docs.tsuzuro.com` (este sitio), `llms.txt` / `llms-full.txt`. ### Notes - Billing (Stripe) está diferido; la beta es gratuita. - Precios públicos se publicarán al activar cobro. --- # Agents URL: https://docs.tsuzuro.com/concepts/agents/ Un **Agent** es la configuración + ejecución del modelo IA que conversa con el participante. Incluye prompt, knowledge, tools, modos y reglas. ## Agent Run Una ejecución del agente sobre un thread. Tiene `input`, `output`, `tools_used`, `latency_ms`, `cost_usd` (si aplica), `status` y `traceId`. ## Agent Mode | Mode | Comportamiento | | --- | --- | | `auto` | Responde solo | | `suggest` | Humano aprueba/edita/descarta en Console | | `paused` | No responde | ## BYOK Bring Your Own Key: el cliente provee API keys de proveedores LLM por proyecto. Tsuzuro no marca tokens. ## Loom Definición versionable del agente como composición de pieces (prompt + reglas + tools allowlist + knowledge refs + modelo + parámetros). ## Qué sigue - [Guía de agentes](/guides/agents/) - [Console suggest](/guides/agents/#modo-suggest) - [Looms](/concepts/looms/) --- # Channels URL: https://docs.tsuzuro.com/concepts/channels/ Un **Channel** es un adapter que traduce un canal específico al modelo neutral de Tsuzuro. ## Kinds implementados | Kind | Uso | | --- | --- | | `sandbox` | Onboarding y tests sin Meta | | `whatsapp` | Producción vía Cloud API / Embedded Signup / BYOA | | `custom` | BYOC: el cliente envía/recibe por HTTP | ## Environment Cada channel pertenece a un environment (`sandbox` o `production`). No se mezclan. ## Qué sigue - [Sandbox](/getting-started/sandbox/) - [WhatsApp](/guides/whatsapp/) - [BYOA](/guides/byoa/) --- # Looms URL: https://docs.tsuzuro.com/concepts/looms/ Un **Loom** es la definición versionable de un agente: composición de pieces (prompt + reglas + tools allowlist + knowledge refs + modelo + parámetros). ## Pieces Unidad mínima versionable de configuración. Un prompt, una tool, una regla. ## Patterns Recipe/template reutilizable: conjunto coherente de pieces + loom + tools que resuelve un caso de uso. El marketplace de patterns es fase futura. ## Qué sigue - [Agents](/concepts/agents/) - [Guía de agentes](/guides/agents/) --- # Stitches URL: https://docs.tsuzuro.com/concepts/stitches/ Un **Stitch** es un webhook outbound firmado. Es cómo "coses" Tsuzuro a tus sistemas (n8n, backends, CRMs). ## Forma del evento Payload con `eventId`, `eventName`, `occurredAt`, `apiVersion`, `projectId` y `data`. Firma HMAC en el header `Tsuzuro-Signature`. Ver [Webhook signatures](/guides/webhook-signatures/). ## Delivery - Outbox durable con retries/backoff. - Deliveries auditables. - Replay posible hacia un endpoint nuevo. ## Qué sigue - [Webhook signatures](/guides/webhook-signatures/) - [Threads](/concepts/threads/) --- # Threads URL: https://docs.tsuzuro.com/concepts/threads/ Un **Thread** es una conversación persistente. Identidad: `(project, channel, externalParticipantRef)`. ## Qué contiene - Messages (inbound/outbound) con body, attachments y metadata. - Participants del canal. - Agent runs asociados (si hay agente activo). - Eventos emitidos vía Stitches. ## Reglas - Un thread vive dentro de un `project` y un `environment` (`sandbox` o `production`). - Tsuzuro nunca mezcla data entre environments. - Writes críticos (crear mensaje, crear thread) usan `Idempotency-Key`. ## Qué sigue - [Channels](/concepts/channels/) - [Agents](/concepts/agents/) - [Stitches](/concepts/stitches/) --- # Errors URL: https://docs.tsuzuro.com/errors/ Todos los errores públicos siguen esta forma: ```json { "error": "tsuzuro/validation/invalid_request", "message": "Request validation failed.", "requestId": "req_...", "docsUrl": "https://docs.tsuzuro.com/errors/validation", "details": {} } ``` ## Reglas - `requestId` siempre existe. - `error` usa namespace `tsuzuro//`. - No se exponen stack traces ni IDs internos. - `details` puede omitirse si no hay información accionable. - `docsUrl` apunta a esta sección o a una página dedicada (`/errors/auth`, `/errors/validation`). ## SDK El SDK mapea respuestas de error a: - `TsuzuroAuthError` - `TsuzuroValidationError` - `TsuzuroRateLimitError` - `TsuzuroApiError` ## Catálogo ### Auth Ver también [Errors / Auth](/errors/auth/). | Código | HTTP típico | Qué significa | | --- | --- | --- | | `tsuzuro/auth/missing_credentials` | 401 | Falta Bearer token o cookie de refresh. | | `tsuzuro/auth/insufficient_scope` | 403 | La API key o el token no tiene el scope requerido. | | `tsuzuro/auth/expired_token` | 401 | Access o refresh token expirado. | | `tsuzuro/auth/invalid_token` | 401 | Token inválido, revocado o mal formado. | | `tsuzuro/auth/invalid_api_key` | 401 | API key inválida o revocada. | | `tsuzuro/auth/signup_disabled` | 403 | Signup público deshabilitado en este entorno. | | `tsuzuro/auth/email_domain_not_allowed` | 422 | Dominio de email bloqueado (desechable u allowlist). | | `tsuzuro/auth/email_in_use` | 409 | Email ya registrado. | | `tsuzuro/auth/invalid_credentials` | 401 | Email o password incorrectos. | | `tsuzuro/auth/no_workspace` | 403 | Usuario sin membership de workspace. | | `tsuzuro/auth/email_not_verified` | 403 | Email sin verificar; recursos live bloqueados. | | `tsuzuro/auth/login_required` | 401 | La acción requiere sesión autenticada (p. ej. aceptar invitación). | ### Validation Ver también [Errors / Validation](/errors/validation/). | Código | HTTP típico | Qué significa | | --- | --- | --- | | `tsuzuro/validation/invalid_request` | 400/422 | Body/query/path no pasa el schema Zod. | ### Runtime | Código | HTTP típico | Qué significa | | --- | --- | --- | | `tsuzuro/runtime/not_found` | 404 | Recurso inexistente o fuera de tu tenant scope. | | `tsuzuro/runtime/internal_error` | 500 | Error inesperado. Reintenta con el `requestId`. | | `tsuzuro/runtime/invalid_request` | 400 | Request inválido fuera del schema de validación. | | `tsuzuro/runtime/idempotency_conflict` | 409 | Misma `Idempotency-Key` con payload distinto. | | `tsuzuro/runtime/missing_idempotency_key` | 400 | Falta `Idempotency-Key` en un write crítico. | | `tsuzuro/runtime/conflict` | 409 | Conflicto de estado (p. ej. invitación duplicada). | ### Rate limit | Código | HTTP típico | Qué significa | | --- | --- | --- | | `tsuzuro/rate_limit/exceeded` | 429 | Cuota excedida. Respeta `Retry-After`. | ### Console | Código | HTTP típico | Qué significa | | --- | --- | --- | | `tsuzuro/console/not_found` | 404 | Proyecto/recurso de Console no encontrado. | | `tsuzuro/console/forbidden` | 403 | Sin membership de Console en el proyecto. | ### WhatsApp | Código | HTTP típico | Qué significa | | --- | --- | --- | | `tsuzuro/whatsapp/invalid_verify_token` | 401 | `hub.verify_token` no coincide. | | `tsuzuro/whatsapp/invalid_signature` | 401 | Firma `x-hub-signature-256` inválida. | | `tsuzuro/whatsapp/connect_failed` | 422 | Falló el connect (token/WABA/phone). | | `tsuzuro/whatsapp/channel_not_connected` | 409 | El channel no tiene `whatsapp_channel_configs`; el POST webhook se rechaza (GET verify pre-connect sigue permitido). | | `tsuzuro/whatsapp/webhook_identity_mismatch` | 422 | `entry.id` (WABA) o `metadata.phone_number_id` no coinciden con el channel conectado. | | `tsuzuro/whatsapp/template_required` | 409 | Ventana de servicio de 24h cerrada; free-form outbound rechazado. Usa `POST /v1/channels/{channelId}/whatsapp/templates/send`. | ### Meta app | Código | HTTP típico | Qué significa | | --- | --- | --- | | `tsuzuro/meta_app/in_use` | 409 | No puedes revocar: hay channels WhatsApp usando la app. | ### Agent runs | Código | HTTP típico | Qué significa | | --- | --- | --- | | `tsuzuro/agent_runs/suggestion_already_resolved` | 409 | La sugerencia `suggest` ya fue aprobada/editada/descartada. | --- # Auth errors URL: https://docs.tsuzuro.com/errors/auth/ `docsUrl` emitido por el API: `https://docs.tsuzuro.com/errors/auth`. ## Códigos | Código | HTTP | Acción | | --- | --- | --- | | `tsuzuro/auth/missing_credentials` | 401 | Envía `Authorization: Bearer ...` o completa el login. | | `tsuzuro/auth/insufficient_scope` | 403 | Usa una API key con el scope requerido. | | `tsuzuro/auth/expired_token` | 401 | Refresca el access token; si el refresh falla, vuelve a login. | | `tsuzuro/auth/invalid_token` | 401 | Token inválido o revocado; vuelve a autenticarte. | | `tsuzuro/auth/invalid_api_key` | 401 | Regenera la API key en Studio. | | `tsuzuro/auth/signup_disabled` | 403 | Signup apagado en este entorno. | | `tsuzuro/auth/email_domain_not_allowed` | 422 | Usa un email corporativo / no desechable. | | `tsuzuro/auth/email_in_use` | 409 | Haz login o password reset. | | `tsuzuro/auth/invalid_credentials` | 401 | Revisa email/password. | | `tsuzuro/auth/no_workspace` | 403 | Pide una invitación o crea un workspace vía signup. | | `tsuzuro/auth/email_not_verified` | 403 | Abre el link de verificación o reenvía el email. | | `tsuzuro/auth/login_required` | 401 | Inicia sesión antes de aceptar la invitación. | Catálogo completo: [Errors](/errors/). --- # Validation errors URL: https://docs.tsuzuro.com/errors/validation/ `docsUrl` emitido por el API: `https://docs.tsuzuro.com/errors/validation`. ## Código | Código | HTTP | Acción | | --- | --- | --- | | `tsuzuro/validation/invalid_request` | 400/422 | Revisa `details` (issues Zod) y el schema en OpenAPI. | Ejemplo: ```json { "error": "tsuzuro/validation/invalid_request", "message": "Request validation failed.", "requestId": "req_...", "docsUrl": "https://docs.tsuzuro.com/errors/validation", "details": { "issues": [] } } ``` Catálogo completo: [Errors](/errors/). OpenAPI: [`/openapi.json`](/openapi.json). --- # Quickstart CLI URL: https://docs.tsuzuro.com/getting-started/quickstart-cli/ Qué vas a lograr: login, init local y un mensaje sandbox con `tsu compose`. ## Instalar ```bash npm i -g @tsuzuro/cli ``` ## Login ```bash tsu login --email dev@example.com --password "$TSUZURO_PASSWORD" --base-url https://api.tsuzuro.com ``` Para crear cuenta cuando el signup está habilitado: ```bash tsu login --signup --email dev@example.com --password "$TSUZURO_PASSWORD" --workspace-name "Acme" ``` ## Init y compose ```bash tsu init tsu compose --message "hola sandbox" ``` ## Leer un thread ```bash tsu thread tail thread_... ``` ## Escuchar Stitches en local ```bash tsu stitches listen --port 4000 ``` Con Cloudflare Tunnel opcional: ```bash tsu stitches listen --port 4000 --tunnel cloudflare ``` Todos los comandos soportan salida JSON: ```bash tsu init --output json ``` ## Qué sigue - [Sandbox](/getting-started/sandbox/) - [Webhook signatures](/guides/webhook-signatures/) - [WhatsApp](/guides/whatsapp/) --- # Quickstart SDK URL: https://docs.tsuzuro.com/getting-started/quickstart-sdk/ Qué vas a lograr: un Thread + Message inbound en sandbox con el SDK TypeScript. ## Instalar ```bash npm i @tsuzuro/sdk ``` ## Credenciales Configura sin hardcodear: ```bash export TSUZURO_API_KEY="tsu_test_..." export TSUZURO_BASE_URL="https://api.tsuzuro.com" ``` ## Primer mensaje sandbox ```ts import { TsuzuroClient } from "@tsuzuro/sdk"; const tsu = new TsuzuroClient({ apiKey: process.env.TSUZURO_API_KEY!, baseUrl: process.env.TSUZURO_BASE_URL }); const projectId = "prj_..."; const environmentId = "env_..."; const [channel] = await tsu.channels.list({ projectId, environmentId, kind: "sandbox" }); const sandbox = channel ?? (await tsu.channels.create({ projectId, environmentId, name: "Sandbox", kind: "sandbox" })); const thread = await tsu.threads.create({ projectId, environmentId, channelId: sandbox.channelId }); const message = await tsu.threads.createMessage(thread.threadId, { projectId, direction: "inbound", body: "hola sandbox" }); console.log({ threadId: thread.threadId, messageId: message.messageId }); ``` El SDK añade `Idempotency-Key` automáticamente en writes críticos si no pasas uno. ## Qué sigue - [Sandbox](/getting-started/sandbox/) — flujo de onboarding completo. - [Quickstart CLI](/getting-started/quickstart-cli/) — mismo happy path desde la terminal. - [Conceptos: Threads](/concepts/threads/) — modelo de conversación. --- # Sandbox URL: https://docs.tsuzuro.com/getting-started/sandbox/ Qué vas a lograr: construir Threads, Messages, Channels y Stitches sin depender de Meta. Sandbox es el canal de onboarding. Permite crear el happy path completo sin WABA, números ni tokens de clientes. ## Flujo mínimo 1. Crear cuenta o login en Studio (`studio.tsuzuro.com`). 2. Usar el project y environment `sandbox` creados por default. 3. Crear una API key `test`. 4. Crear o reutilizar un channel `sandbox`. 5. Enviar un message inbound (SDK o `tsu compose`). 6. Ver el evento en Stitches o en Studio. El happy path debe ser reproducible con DB desechable local o CI. No depende de staging compartido ni de tokens de clientes. ## Qué sigue - [Quickstart SDK](/getting-started/quickstart-sdk/) - [Channels](/concepts/channels/) - [WhatsApp](/guides/whatsapp/) cuando el cliente ya tenga WABA listo. --- # Agents URL: https://docs.tsuzuro.com/guides/agents/ Qué vas a lograr: correr un agente sobre un Thread con tu propia API key LLM y operar el modo `suggest` desde Console. ## BYOK Registra la API key del proveedor LLM en el proyecto (Studio). Tsuzuro no marca tokens: cobras runtime, no tokens. ## Modos | Mode | Comportamiento | | --- | --- | | `auto` | El agente responde solo | | `suggest` | Persiste la sugerencia en `agent_runs.trace`; un humano aprueba, edita o descarta en Console | | `paused` | No responde | ## Modo suggest 1. El agent run termina con una sugerencia pendiente. 2. Console muestra la sugerencia. 3. Acciones: aprobar-y-enviar, editar, o descartar. 4. Resolver dos veces la misma sugerencia falla con `tsuzuro/agent_runs/suggestion_already_resolved`. ## Tools y Looms Tools son capacidades ejecutables (HTTP, MCP, función registrada). Un Loom versiona prompt + reglas + allowlist de tools + knowledge + modelo. ## Qué sigue - [Agents (concepto)](/concepts/agents/) - [Looms](/concepts/looms/) - [Errors](/errors/#tsuzuroagent_runssuggestion_already_resolved) --- # BYOA URL: https://docs.tsuzuro.com/guides/byoa/ Qué vas a lograr: conectar channels WhatsApp con la app Meta de tu agencia, sin depender de la app global de Tsuzuro. ## Modelo recomendado Token handoff: la agencia ejecuta Embedded Signup en su producto, obtiene un token long-lived con Meta y entrega a Tsuzuro solo el resultado operativo. ## Permisos mínimos - `whatsapp_business_management` - `whatsapp_business_messaging` ## Registrar la app ```bash curl -X POST https://api.tsuzuro.com/v1/meta-apps \ -H "Authorization: Bearer $STUDIO_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "workspaceId": "ws_...", "name": "Agency Meta app", "appId": "1234567890", "appSecret": "app-secret-from-meta" }' ``` La respuesta incluye `verifyToken` una sola vez y un `webhookUrl` con `ch_REPLACE_WITH_CHANNEL_ID`. Para cada channel real, configura en Meta: ```text Callback URL: https://api.tsuzuro.com/v1/channels/ch_.../whatsapp/webhook Verify token: whv_... ``` ## Conectar por token handoff ```bash curl -X POST https://api.tsuzuro.com/v1/channels/ch_.../whatsapp/connect \ -H "Authorization: Bearer $STUDIO_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "projectId": "prj_...", "metaAppCredentialId": "map_...", "accessToken": "EAAB...", "wabaId": "1234567890", "phoneNumberId": "1234567890" }' ``` Tsuzuro valida el token con `debug_token`, suscribe la app al WABA, registra el número, cifra el token de acceso y firma/verifica webhooks con el secret de la app BYOA. También se acepta `code` en vez de `accessToken`; en ese caso Tsuzuro hace el exchange usando las credenciales de la app registrada por la agencia. ## Qué sigue - [WhatsApp](/guides/whatsapp/) - [Channels](/concepts/channels/) --- # Webhook signatures URL: https://docs.tsuzuro.com/guides/webhook-signatures/ Qué vas a lograr: validar que un Stitch viene de Tsuzuro y no es un replay. ## Header ```http Tsuzuro-Signature: t=1700000000,v1= ``` ## Payload firmado ```text ${timestamp}.${rawBody} ``` ## Verificación con SDK ```ts import { stitches } from "@tsuzuro/sdk"; const parsed = await stitches.parse(req, { secret: process.env.TSUZURO_WEBHOOK_SECRET! }); console.log(parsed.payload); ``` ## Verificación manual ```ts import { verifyWebhookSignature } from "@tsuzuro/sdk"; const ok = verifyWebhookSignature({ secret: process.env.TSUZURO_WEBHOOK_SECRET!, header: req.headers.get("Tsuzuro-Signature")!, payload: rawBody }); ``` La tolerancia default contra replay es 300 segundos. ## Qué sigue - [Stitches](/concepts/stitches/) - [Errors](/errors/) --- # WhatsApp URL: https://docs.tsuzuro.com/guides/whatsapp/ Qué vas a lograr: conectar un channel WhatsApp listo para inbound/outbound sin tratarlo como requisito de onboarding. WhatsApp es un deployment target de producción, no un requisito de onboarding. Construye primero en [Sandbox](/getting-started/sandbox/) y conecta WhatsApp cuando el cliente ya tenga WABA, método de pago y número listos. ## Flujo 1. Crea o selecciona un channel `whatsapp` en Studio. 2. Ejecuta Embedded Signup desde Studio. 3. Confirma `wabaId` y `phoneNumberId`. 4. Tsuzuro intercambia el code por token long-lived, valida el token, suscribe webhooks, registra el número y guarda el token cifrado. 5. Ejecuta readiness: ```bash tsu whatsapp check --channel-id ch_... ``` ## Webhooks Meta Configura en Meta la URL por channel: ```text https://api.tsuzuro.com/v1/channels/{channelId}/whatsapp/webhook ``` Tsuzuro valida: - `hub.verify_token` en el challenge GET. - `x-hub-signature-256` en POST usando el app secret de la app Meta vinculada al channel. ## Mensajes - Inbound Meta crea/actualiza Threads y Messages neutrales. - Outbound desde Console/API/agent se entrega con un outbox job durable. - `messages.externalMessageId` guarda el `wamid`. - Delivery/read receipts generan eventos `channel.message.sent`, `channel.message.delivered`, `channel.message.read` y `channel.message.delivery_failed`. ### Ventana de servicio (24h) y Free Entry Point - Cada inbound del usuario abre/refresca la customer service window (CSW) de 24 horas en `whatsapp_thread_states`. - Fuera de CSW, `POST /v1/threads/{threadId}/messages` free-form responde `409 tsuzuro/whatsapp/template_required`. - Templates vía `POST /v1/channels/{channelId}/whatsapp/templates/send` siguen permitidos fuera de CSW. - Un referral elegible (CTWA/Page CTA) deja FEP pendiente; FEP se abre al primer `delivered` del negocio dentro de 24h y dura 72h **solo para pricing**. FEP no autoriza free-form si la CSW ya cerró. ## Media Inbound/outbound persisten attachments. El pipeline descarga media de Meta a R2 (tenant-scoped) antes de que Meta lo expire, y usa URLs firmadas de TTL corto en el read path. ## Renovación de tokens Un worker renueva tokens long-lived cercanos a expirar. Si el token no es renovable (p. ej. handoff BYOA de agencia), se emite `channel.credential.expiring` para que el dueño actúe. `tsu whatsapp check` refleja el estado. ## CI Tests usan mocks/fixtures de Meta. Nunca uses tokens Meta reales ni números de cliente en CI. ## Qué sigue - [BYOA](/guides/byoa/) para agencias con app Meta propia. - [Webhook signatures](/guides/webhook-signatures/) para Stitches (distintos de la firma Meta). --- # Acuerdo de procesamiento de datos (DPA) URL: https://docs.tsuzuro.com/legal/dpa/ **Vigente desde:** 2026-07-09 **Estado:** published (plantilla base; acuerdos Enterprise firmados pueden complementar este texto) ## Partes - **Controlador:** el cliente de Tsuzuro (workspace). - **Procesador:** la entidad operativa de Tsuzuro. ## Objeto Procesamiento de datos personales de participantes y operadores necesarios para prestar el runtime (Threads, Messages, Agent Runs, webhooks, media). ## Instrucciones Tsuzuro procesa solo según instrucciones documentadas del Controlador (uso del API/Studio/Console) y este DPA. ## Seguridad Medidas técnicas y organizativas: cifrado de secretos, TLS, aislamiento tenant, control de acceso por scopes, logging con request IDs, backups del proveedor de DB. ## Subprocesadores Autorización general a los listados en [Subprocesadores](/legal/subprocessors/), con aviso de cambios materiales. ## Asistencia Tsuzuro asistirá al Controlador en solicitudes de derechos de titulares, en la medida razonable y técnica posible. ## Eliminación / devolución Al terminar el servicio, Tsuzuro eliminará o devolverá datos del Controlador según retención del plan, salvo obligación legal de conservación. ## Auditorías Enterprise puede acordar reportes o auditorías limitadas bajo NDA. ## Contacto support@tsuzuro.com --- # Política de privacidad URL: https://docs.tsuzuro.com/legal/privacy/ **Vigente desde:** 2026-07-09 **Estado:** published **Contacto de privacidad:** support@tsuzuro.com ## 1. Quiénes somos Tsuzuro opera el runtime conversacional en `tsuzuro.com`, `api.tsuzuro.com`, `studio.tsuzuro.com`, `console.tsuzuro.com` y `docs.tsuzuro.com`. ## 2. Roles - **Cliente Tsuzuro** = controlador de los datos de sus usuarios finales (participantes de Threads). - **Tsuzuro** = procesador de esos datos, y controlador de los datos de cuenta (email, memberships, billing futuro). ## 3. Datos que procesamos ### Datos de cuenta Email, hash de password, memberships de workspace/proyecto, tokens de sesión, logs de auth. ### Datos de runtime (por cuenta del cliente) Threads, Messages, Participants, Agent Runs/traces, webhook deliveries, channel configs, attachments de media (R2). ### Datos técnicos IPs de capa de confianza, request IDs, métricas de error (Sentry), analytics privacy-friendly del sitio (sin cookies de tracking). ## 4. Finalidades - Prestar el servicio (API, Studio, Console, adapters). - Seguridad, prevención de abuso y rate limiting. - Soporte y comunicación operativa (verificación de email, reset, invitaciones). - Cumplir obligaciones legales. ## 5. Base legal (borrador) Contrato / medidas precontractuales, interés legítimo en seguridad, y consentimiento donde aplique (p. ej. marketing futuro — no activo en beta). ## 6. Subprocesadores Lista pública: [Subprocesadores](/legal/subprocessors/). ## 7. Retención Retención por plan (events, traces, webhook deliveries). En beta se documentará la política operativa; el cliente puede solicitar export/deletion vía support@tsuzuro.com. ## 8. Derechos Según jurisdicción aplicable (LFPDPPP México, equivalentes LATAM, GDPR si hay clientes EU): acceso, rectificación, cancelación, oposición, portabilidad. Ejercicio: support@tsuzuro.com. ## 9. Transferencias internacionales Los subprocesadores pueden procesar en USA/UE/otras regiones. Se usarán cláusulas contractuales u otros mecanismos cuando aplique. ## 10. Seguridad Cifrado de secretos en reposo (SecretVault), TLS en tránsito, aislamiento multi-tenant, firmas de webhooks, least-privilege en API keys. ## 11. Cambios Aviso razonable (objetivo: 30 días) para cambios materiales, vía email o banner en Studio. --- # Subprocesadores URL: https://docs.tsuzuro.com/legal/subprocessors/ **Vigente desde:** 2026-07-09 **Estado:** published Updates materiales se avisarán con ~30 días de anticipación. | Subprocesador | Función | Región típica | | --- | --- | --- | | Railway | Hosting de API, workers, Studio, Console, docs, landing | USA | | Neon | Postgres managed | USA | | Upstash | Redis (rate limiting / señales) | Global / USA | | Cloudflare | DNS, TLS, WAF, R2 (media), Web Analytics | Global | | Sentry | Error tracking | USA / UE | | Meta Platforms | WhatsApp Cloud API (cuando el cliente conecta WhatsApp) | Global | | Resend | Email transaccional (verify, reset, invites) | USA | | BetterStack | Status page y monitors | USA / UE | | Proveedores LLM del cliente (BYOK) | Inferencia — el cliente aporta la key; no son subprocesadores de Tsuzuro en el sentido de Managed AI | Según el proveedor | Tsuzuro **no** marca tokens LLM en el modelo BYOK default. Managed AI (si se ofrece) se documentará aparte. --- # Términos de servicio URL: https://docs.tsuzuro.com/legal/terms/ **Vigente desde:** 2026-07-09 **Estado:** published **Contacto:** support@tsuzuro.com ## 1. Aceptación Al crear una cuenta en Tsuzuro Studio o usar el API, SDK, CLI o Console, aceptas estos Términos. Si no estás de acuerdo, no uses el servicio. ## 2. Descripción del servicio Tsuzuro es un runtime conversacional programable (API, Studio, Console, adapters de canal). No es un CRM, marketing suite ni inbox SaaS para PyMEs. ## 3. Cuentas y elegibilidad - Debes proporcionar información veraz y mantener tu email verificado. - Eres responsable de las API keys, tokens y credenciales de tu workspace. - El signup público puede estar sujeto a rate limits y bloqueo de dominios desechables. ## 4. Uso aceptable No puedes usar Tsuzuro para: - Spam, phishing o mensajería no solicitada ilegal. - Violar políticas de Meta/WhatsApp u otros proveedores de canal. - Intentar acceso cross-tenant o eludir rate limits / auth. - Almacenar o procesar datos ilegales. ## 5. Datos del cliente - Tú (el cliente) eres el **controlador** de los datos de tus usuarios finales. - Tsuzuro actúa como **procesador** según el [DPA](/legal/dpa/) aplicable. - Ver [Política de privacidad](/legal/privacy/). ## 6. Canales de terceros WhatsApp y otros canales están sujetos a los términos de Meta u otros proveedores. Tsuzuro no es BSP ni proxy Meta-compatible. ## 7. BYOK / BYOA Si aportas API keys LLM (BYOK) o apps Meta (BYOA), eres responsable de su uso, cuotas y cumplimiento. Tsuzuro cifra secretos en reposo pero no asume responsabilidad por mal uso de tus credenciales. ## 8. Disponibilidad y soporte El servicio se ofrece en beta. No hay SLA contractual salvo acuerdo Enterprise escrito. Status público: [status.tsuzuro.com](https://status.tsuzuro.com). Soporte: support@tsuzuro.com. ## 9. Facturación Durante la beta pública el uso puede ser gratuito. Al activar billing, aplicarán los precios publicados y los límites del plan. ## 10. Terminación Puedes cerrar tu cuenta solicitándolo a support@tsuzuro.com. Tsuzuro puede suspender cuentas por abuso o incumplimiento. ## 11. Limitación de responsabilidad En la máxima medida permitida por la ley, Tsuzuro no será responsable por daños indirectos, lucro cesante o pérdida de datos derivados del uso del servicio en beta. ## 12. Ley aplicable Pendiente de definición con asesor legal (jurisdicción de la entidad operativa). ## 13. Contacto support@tsuzuro.com --- # OpenAPI URL: https://docs.tsuzuro.com/openapi/ El contrato público vive en: ```http GET https://api.tsuzuro.com/v1/openapi.json ``` Este docs site publica un mirror en [`/openapi.json`](/openapi.json) generado en cada build. ## Reglas - No hay endpoint público sin OpenAPI. - SDK y CLI consumen el mismo contrato. - Cambios aditivos siguen en `/v1`. - Cambios incompatibles requieren `/v2` y guía de migración. ## Local ```bash curl http://localhost:8787/v1/openapi.json ```