Orders
Pedidos: consulta, historial de llamadas y estado logístico.
/ordersorders:readListar pedidos
Busca pedidos del shop. Requiere scope orders:read.
Parámetros
| phone | query | string | Teléfono del cliente (E.164). |
| externalId | query | string | |
| shopifyOrderId | query | string | |
| limit | query | integer | |
| offset | query | integer |
Respuestas
/orders/{id}orders:readObtener un pedido
Detalle del pedido + sus llamadas. El transcript y la grabación de cada llamada requieren además el scope calls:read:content. Requiere scope orders:read.
Parámetros
| idreq | path | string |
Respuestas
/orders/{id}/callscalls:readLlamadas de un pedido
Requiere scope calls:read (+ calls:read:content para transcript/grabación).
Parámetros
| idreq | path | string |
Respuestas
/orders/{id}/callscalls:triggerRe-llamar un pedido existente
Encola una llamada manual para un pedido EXISTENTE (equivalente al botón "Llamar" del dashboard). Corre los mismos billing guards + rate-limit (1 llamada por pedido cada 5 min) y marca la llamada como manual (bypassa dedup). Para ingerir un pedido NUEVO + llamarlo usa POST /calls/trigger. Requiere scope calls:trigger. Saldo: sin saldo ni minutos (y sin auto-recarga), responde 402. Sandbox: claves tk_test_ simulan sin telefonía ni cobro.
Parámetros
| idreq | path | string |
Respuestas
/orders/{id}/statusorders:writeActualizar estado logístico
Actualiza el estado logístico del pedido. Requiere scope orders:write. Sandbox: claves tk_test_ devuelven una respuesta simulada sin mutar.
Parámetros
| idreq | path | string |
Body (requerido)
| logisticStatus | "processing" | "shipped" | "in_transit" | "delivered" | "returned" | "failed_delivery" | |
| trackingNumber | string | |
| carrier | string |
Respuestas
/webhooks/external-confirmationorders:writeConfirmar/cancelar un pedido externamente
Marca un pedido como confirmed o cancelled desde un sistema externo (ej. una confirmación por WhatsApp), suspende los reintentos y etiqueta el pedido en Shopify si aplica. First-write-wins: un pedido ya confirmado no se sobrescribe. Requiere scope orders:write. Sandbox: las claves tk_test_ simulan sin mutar el pedido real.
Host: https://app.talkyria.com/api/v1
Body (requerido)
| statusreq | "confirmed" | "cancelled" | |
| orderId | string | id / externalId / chateaproOrderId del pedido |
| orderNumber | string | |
| shopifyOrderId | string | |
| source | string | |
| confirmedBy | string | |
| notes | string |
Respuestas
Calls
Disparar llamadas y leer su metadata/outcome.
/callscalls:readListar llamadas
Lista global de llamadas del shop, paginada + filtrable. Requiere scope calls:read (+ calls:read:content para transcript/grabación, offers:read para el resultado de oferta). Nunca expone costos internos ni el resumen crudo.
Parámetros
| outcome | query | string | Filtro por outcome (confirmed, no_answer, voicemail, ...). |
| status | query | string | |
| callType | query | string | confirmation / novelty / office / cart_recovery / sales / ... |
| phone | query | string | Teléfono del cliente (E.164). |
| from | query | string (date-time) | |
| to | query | string (date-time) | |
| limit | query | integer | |
| offset | query | integer |
Respuestas
/calls/{id}calls:readObtener una llamada
Metadata/outcome de una llamada. Requiere scope calls:read (+ calls:read:content para transcript/grabación). Nunca expone costos internos ni el resumen crudo.
Parámetros
| idreq | path | string |
Respuestas
/calls/triggercalls:triggerDisparar una llamada
Crea un pedido y encola una llamada. Requiere scope calls:trigger. Acepta el shape plano (canónico) y el anidado (order:{}) legacy — ambos equivalen. Saldo: sin saldo ni minutos (y sin auto-recarga), responde 402. Sandbox: claves tk_test_ simulan sin telefonía ni cobro.
Body (requerido)
Objeto TriggerRequest (ver Esquemas).
Respuestas
/calls/bulkcalls:readListar batches de llamadas
Los 20 batches más recientes del shop, con su progreso. Requiere scope calls:read.
Respuestas
/calls/bulkcalls:triggerIniciar un batch de llamadas
Crea + inicia un batch de llamadas. Requiere scope calls:trigger. Provee orderIds (array de ids del shop) o status (todos los pedidos con ese status, opcional limit). El bulkCallWorker procesa SECUENCIALMENTE y re-valida cada pedido antes de llamar (se salta los ya confirmados). Tope: 500 pedidos/batch. Sandbox: claves tk_test_ simulan sin telefonía ni cobro.
Body (requerido)
| orderIds | string[] | Pedidos explícitos (shop-scoped). |
| status | string | Alternativa: todos los pedidos con este status. |
| limit | integer | Límite para el filtro por status. |
| customMotif | string |
Respuestas
/calls/bulk/{id}calls:readEstado de un batch
Status + progreso (procesados/exitosos/fallidos) de un batch. Requiere scope calls:read. Shop-scoped.
Parámetros
| idreq | path | string |
Respuestas
/calls/bulk/{id}calls:triggerControlar un batch (pausar/reanudar/cancelar)
Pausa, reanuda o cancela un batch en curso. Requiere scope calls:trigger. Transiciones válidas: pause (in_progress), resume (paused), cancel (pending/in_progress/paused). Shop-scoped.
Parámetros
| idreq | path | string |
Body (requerido)
| actionreq | "pause" | "resume" | "cancel" |
Respuestas
/test-callcalls:triggerLlamada de prueba a un agente
Realiza una llamada de PRUEBA con un agente para validar tu configuración. Requiere scope calls:trigger. Body: agentTable (ShopifyAgent|ChateaProAgent|DropiAgent|SalesAgent), agentId (del shop), phoneNumber (E.164). La llamada se factura normal (wallet/minutos) y usa la misma resolución de número que las llamadas reales (verificado > dedicado). Sandbox: claves tk_test_ simulan sin telefonía ni cobro.
Body (requerido)
| agentTablereq | "ShopifyAgent" | "ChateaProAgent" | "DropiAgent" | "SalesAgent" | |
| agentIdreq | string | |
| phoneNumberreq | string | E.164 con código de país (+573001234567). |
Respuestas
Agents
Crear, editar, listar y borrar agentes de voz.
/agentsagents:readListar agentes
Lista los agentes del shop (todas las integraciones). Requiere scope agents:read. No expone el prompt.
Respuestas
/agentsagents:writeCrear un agente
Crea un agente de voz de cualquier integración (shopify | chateapro | dropi | sales, según integration, default shopify). Requiere scope agents:write. Reusa el core probado del dashboard (validación de voz/modelo, dedup por tipo/callType, creación del counterpart en el motor de voz + workflow canónico, con borrado del huérfano si el motor falla). Un agente sin número nace inactivo (Regla 87).
Host: https://app.talkyria.com/api/v1
Body (requerido)
Objeto CreateAgentRequest (ver Esquemas).
Respuestas
/agents/{id}agents:readObtener un agente
Configuración completa del agente. Requiere scope agents:read. El prompt personalizado solo aparece si el agente lo usa.
Parámetros
| idreq | path | string |
Respuestas
/agents/{id}agents:writeEditar un agente
Edita campos del agente (voz, idioma, reintentos, nombre, estado, número, horarios, cupón, y los específicos de cada integración). La integración se resuelve automáticamente por el id (across shopify/chateapro/dropi/sales). Requiere scope agents:write. Solo se aceptan campos editables — cualquier otro se ignora (allowlist per-integración). Activar un agente (isActive:true) requiere que tenga número (Regla 87). Reusa el core probado del dashboard.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Body (requerido)
Objeto UpdateAgentRequest (ver Esquemas).
Respuestas
/agents/{id}agents:writeBorrar un agente
Borra permanentemente el agente (hard-delete, Regla 323) de cualquier integración — la integración se resuelve por el id. Dropi/Sales cascadean sus dependientes (smart-offers / leads). Requiere scope agents:write.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Respuestas
/agents/{id}/advancedagents:readLeer la configuración avanzada del agente
Los knobs avanzados de comportamiento de llamada (timbrado/silencio/duración/backchannel), buzón de voz, diccionario de palabras clave (boost STT), campos de análisis post-llamada y handbook de personalidad. De cualquier integración (resuelto por el id). Requiere scope agents:read.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Respuestas
/agents/{id}/advancedagents:writeActualizar la configuración avanzada (parcial)
Actualiza SOLO los campos enviados; los omitidos se preservan. Persiste en el snapshot del agente y sincroniza el motor de voz best-effort (si el motor falla, el cambio queda guardado y se reintenta en la próxima llamada → respuesta con warning). voicemail.action siempre es hangup. Requiere scope agents:write.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Body (requerido)
Objeto AdvancedConfig (ver Esquemas).
Respuestas
Workflow
Flujo conversacional completo del agente (Nivel B).
/agents/{id}/workflowagents:readLeer el flujo del agente
Devuelve el workflow_definition (máquina de estados conversacional) del agente, de cualquier integración (resuelto por el id). Requiere scope agents:read.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Respuestas
/agents/{id}/workflowagents:writeReemplazar el flujo del agente (Nivel B)
Reemplaza el workflow_definition completo. Requiere scope agents:write. El motor valida invariantes (exactamente 1 nodo de inicio, 1 nodo global, aristas con etiqueta/condición, variables de contexto canónicas). Un flujo que viola una invariante irrecuperable devuelve 422 con la lista exacta de errores — las llamadas nunca quedan mudas por un flujo malformado.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Body (requerido)
| workflow_definitionreq | WorkflowDefinition | |
| template_context_variables | object |
Respuestas
Voices
Catálogo de voces.
/voicesvoices:readCatálogo de voces
Voces disponibles para los agentes. Requiere scope voices:read.
Parámetros
| language | query | string | Filtro por prefijo de idioma (ej. `es`). |
Respuestas
Leads
Leads de ventas (speed-to-lead).
/sales/agents/{id}/leadsleads:readListar leads de ventas
Lista los leads de un agente de ventas (estado, outcome, venta). Requiere scope leads:read. Filtro status, paginado. NUNCA el fee interno ni el metadata crudo.
Parámetros
| idreq | path | string | ID del agente de ventas. |
| status | query | string | Filtro por estado (queued, sold, not_interested, ...). |
| limit | query | integer | |
| offset | query | integer |
Respuestas
/sales/agents/{id}/leadsleads:writeCrear un lead de ventas
Encola un lead para que el agente de ventas lo llame (speed-to-lead). Requiere scope leads:write. Sandbox: claves tk_test_ simulan sin crear lead ni llamar. Rate-limit adicional de 60/min por shop.
Parámetros
| idreq | path | string | ID del agente de ventas. |
Body (requerido)
| namereq | string | |
| phonereq | string | E.164, mín 8 dígitos. |
| string (email) | ||
| source | string | |
| sourceLeadId | string | |
| metadata | object |
Respuestas
Offers
Resultados de upsell / smart-offers (revenue conversation intelligence).
/orders/{id}/offersoffers:readResultados de upsell del pedido
Si el upsell/smart-offer se mostró, si el cliente aceptó, qué producto/cantidad/variante, cuánto revenue generó y si el line-item se agregó a Shopify. Requiere scope offers:read.
Parámetros
| idreq | path | string |
Respuestas
/offersoffers:readListar smart-offers
Config + stats de las smart-offers del shop (upsell/quantity/bundle). Requiere scope offers:read. ?integration=shopify|dropi filtra por integración; ?agentId= filtra las de Dropi por agente. Los agregados (timesShown/timesAccepted/revenueGenerated) son SOLO LECTURA (los escribe el worker).
Parámetros
| integration | query | "shopify" | "dropi" | |
| agentId | query | string | Filtro Dropi por agente. |
Respuestas
/offersoffers:writeCrear una smart-offer
Crea una smart-offer. Requiere scope offers:write. El body DEBE incluir integration ("shopify" | "dropi"). Shopify: oferta shop-global (el precio con descuento se recomputa server-side). Dropi: requiere agentId y habilita enableSmartOffers del agente (LOCK provider/warehouse). Los agregados NUNCA se pueden escribir.
Body (requerido)
| integrationreq | "shopify" | "dropi" | |
| name | string | |
| offerType | "upsell" | "quantity" | "bundle" | |
| agentId | string | Requerido para Dropi. |
Respuestas
/offers/{id}offers:readObtener una smart-offer
Detalle de una smart-offer (resuelve Shopify y Dropi). Requiere scope offers:read. Shop-scoped.
Parámetros
| idreq | path | string |
Respuestas
/offers/{id}offers:writeEditar una smart-offer
Edita una smart-offer (incluye toggle vía isActive). Requiere scope offers:write. Dropi: agentId es inmutable. Shop-scoped.
Parámetros
| idreq | path | string |
Body (requerido)
object
Respuestas
/offers/{id}offers:writeBorrar una smart-offer
Borra una smart-offer (hard delete). Requiere scope offers:write. Dropi: si era la última oferta activa del agente, apaga enableSmartOffers. Shop-scoped.
Parámetros
| idreq | path | string |
Respuestas
Analytics
Métricas agregadas (tasas, outcomes, funnel, por-agente).
/analyticsanalytics:readAnalytics agregado
Métricas agregadas del shop (tasas de confirmación, breakdown de outcomes, serie temporal, heatmap por hora, por-producto/ciudad/agente, funnel, cart recovery, ofertas). Requiere scope analytics:read. NUNCA expone el costo interno de Talkyria — solo lo que se le cobra al merchant (Regla 387).
Host: https://app.talkyria.com/api/v1
Parámetros
| preset | query | "this_month" | "last_7d" | "last_30d" | "all" | |
| from | query | string (date) | |
| to | query | string (date) | |
| source | query | string | Filtro de canal (shopify/dropi/chateapro/sales). |
| agent | query | string | Filtro por id de agente. |
Respuestas
Webhooks
Webhooks salientes: recibe el resultado final de cada llamada en tiempo real (sin polling).
/webhookswebhooks:readListar webhooks salientes
Lista los webhooks salientes del shop. Requiere scope webhooks:read. NUNCA devuelve el secret.
Respuestas
/webhookswebhooks:writeRegistrar un webhook saliente
Registra una URL a la que Talkyria hace PUSH del resultado final de cada llamada (call.outcome_final), firmado con X-Talkyria-Signature: sha256=hmac(payloadRaw, secret), con reintentos (1/5/30 min) e idempotencia. Requiere scope webhooks:write. La URL se valida contra SSRF (bloquea IPs internas/metadata, resuelve DNS). El secret se genera server-side y se muestra UNA sola vez en la respuesta. Máximo 10 webhooks por shop.
Body (requerido)
| urlreq | string (uri) | URL pública HTTPS del receptor. |
| events | string | Suscripción a eventos, separados por coma (Regla 421). Por defecto `call.outcome_final` (recibe TODOS los resultados). Granulares: `call.confirmed`, `call.cancelled`, `call.no_answer`, `call.voicemail`, `call.novelty`, `call.needs_attention`, `call.failed`. Ej. `call.confirmed,call.no_answer` recibe solo esos. El payload lleva `event` (siempre el umbrella, compat) + `eventType` (el granular); el header `X-Talkyria-Event-Type` también trae el granular. |
| merchantExternalId | string |
Respuestas
/webhooks/{id}webhooks:readDetalle de un webhook
Detalle de un webhook del shop (sin secret). Requiere scope webhooks:read.
Parámetros
| idreq | path | string |
Respuestas
/webhooks/{id}webhooks:writeEditar un webhook
Edita url (revalidada anti-SSRF), events, isActive o merchantExternalId. Con regenerateSecret: true rota el secreto (se muestra una vez). Requiere scope webhooks:write.
Parámetros
| idreq | path | string |
Body (opcional)
| url | string (uri) | |
| events | string | |
| isActive | boolean | |
| merchantExternalId | string | |
| regenerateSecret | boolean |
Respuestas
/webhooks/{id}webhooks:writeBorrar un webhook
Borra un webhook del shop. Requiere scope webhooks:write.
Parámetros
| idreq | path | string |
Respuestas
/webhooks/{id}/deliverieswebhooks:readHistorial de entregas de un webhook
Historial de entregas de un webhook saliente (status code, éxito, intento, respuesta del destino) para depurar. Requiere scope webhooks:read. Paginado. El secreto NUNCA aparece; responseBody se trunca a 2000 chars.
Parámetros
| idreq | path | string | |
| limit | query | integer | |
| offset | query | integer |
Respuestas
Billing
Cuenta: saldo, tarifa, minutos gratis y contexto de la clave (solo lectura).
/walletbilling:readSaldo y tarifa (solo lectura)
Saldo del wallet + tarifa por minuto + minutos gratis restantes + config de auto-recarga. Requiere scope billing:read. SOLO LECTURA — la recarga/transferencia NUNCA se expone por API (Stripe/dashboard/2FA). Nunca expone el costo interno de Talkyria.
Respuestas
/mebilling:readContexto de la clave (who am I)
Shop, workspace, país/moneda, plan, scopes y modo prueba de la clave. Requiere scope billing:read. Nunca secretos ni costo interno.
Respuestas
Phones
/phonesphones:readListar teléfonos dedicados
Números dedicados activos del workspace. Requiere scope phones:read. Nunca expone el carrier (Regla 119).
Host: https://app.talkyria.com/api/v1
Respuestas
/phonesphones:writeComprar un teléfono dedicado (FACTURA el wallet)
Compra el número phoneNumber (de GET /phones/available) y lo importa al motor de voz. Cobra $2.00 USD/mes al wallet del workspace. Requiere scope phones:write. Divergencias vs dashboard (seguridad programática): verifica saldo ANTES (402 si insuficiente), cuota máx 25/workspace (409), y una clave tk_test_ NO compra (respuesta simulada). El número se compra NEUTRAL — asígnalo con PATCH /agents/:id { phoneNumberId }.
Host: https://app.talkyria.com/api/v1
Body (requerido)
| phoneNumberreq | string |
Respuestas
/phones/availablephones:readBuscar números disponibles
Números US comprables. areaCode opcional (3 dígitos). Requiere scope phones:read. Read-only (sin costo).
Host: https://app.talkyria.com/api/v1
Parámetros
| areaCode | query | string | Area code US (3 dígitos). |
Respuestas
/phones/{id}phones:writeRenombrar (alias) un teléfono
Cambia el alias nickname. Requiere scope phones:write.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Body (requerido)
| nicknamereq | string |
Respuestas
/phones/{id}phones:writeLiberar un teléfono dedicado
Lo desasigna de todos los agentes + lo libera en el motor/carrier. NO reembolsa. Requiere scope phones:write. Una clave tk_test_ no libera infra real.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Respuestas
Verified Caller IDs
/verified-caller-idsverified_caller_ids:readListar Verified Caller IDs
Los números propios del merchant verificados (+ estado). Requiere scope verified_caller_ids:read.
Host: https://app.talkyria.com/api/v1
Respuestas
/verified-caller-idsverified_caller_ids:writeSolicitar verificación de un número propio
Inicia la verificación del número propio phoneNumber (E.164). Telnyx lo llama (method:call) o textea (method:sms) con un código. Luego envíalo con POST .../:id/verify. Requiere scope verified_caller_ids:write. Sin costo. Una clave tk_test_ no dispara la verificación real.
Host: https://app.talkyria.com/api/v1
Body (requerido)
| phoneNumberreq | string | |
| method | "call" | "sms" |
Respuestas
/verified-caller-ids/{id}verified_caller_ids:writeEliminar un Verified Caller ID
Lo borra en el motor/carrier + limpia las asignaciones de agente. Requiere scope verified_caller_ids:write.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Respuestas
/verified-caller-ids/{id}/verifyverified_caller_ids:writeEnviar el código de verificación
Envía el código (4-10 dígitos) que Telnyx dictó/texteó. Síncrono: OK ⇒ status:verified. Requiere scope verified_caller_ids:write. Luego asigna con PATCH /agents/:id { verifiedCallerIdId }.
Host: https://app.talkyria.com/api/v1
Parámetros
| idreq | path | string |
Body (requerido)
| codereq | string |
Respuestas
Esquemas
Las formas de datos referenciadas arriba.
Error| errorreq | string | Mensaje de error legible por humanos. |
| code | "bad_request" | "unauthorized" | "payment_required" | "forbidden" | "not_found" | "conflict" | "unprocessable_entity" | "rate_limited" | "internal_error" | "error" | Código de error estable legible por máquina (Regla 422). Haz switch por este campo, no por el mensaje. |
| message | string | Mensaje adicional legible por humanos (presente en algunos endpoints). |
Order| id | string | |
| shopifyOrderId | string | |
| externalId | string | |
| externalSource | string | |
| orderNumber | string | |
| status | string | |
| customerName | string | |
| customerPhone | string | |
| customerCity | string | |
| totalPrice | number | |
| itemsSummary | string | |
| logisticStatus | string | |
| trackingNumber | string | |
| carrier | string | |
| callAttempts | integer | |
| cityFinal | string | |
| provinceFinal | string | |
| confirmationChannel | string | Quién confirmó: call | whatsapp | cross_integration. |
| attentionReason | string | |
| confirmedAt | string (date-time) | |
| createdAt | string (date-time) |
OrderDetailany
Call| id | string | |
| callType | string | |
| status | string | |
| outcome | string | |
| durationSeconds | integer | |
| summary | string | |
| notesForHuman | string | |
| cancelReason | string | |
| resolutionInstruction | string | Instrucción operativa generada por IA (novedades/logística). |
| analysis | object | Análisis post-llamada tipado (allowlisted, no-PII). |
| └ sentiment | string | |
| └ wrongNumber | boolean | |
| └ addressChanged | boolean | |
| └ productConfirmed | boolean | |
| └ priceConfirmed | boolean | |
| offer | object | Resultado de upsell — solo con scope `offers:read`. |
| └ shown | boolean | |
| └ accepted | boolean | |
| └ productTitle | string | |
| disconnectionReason | string | |
| fromNumber | string | |
| createdAt | string (date-time) | |
| transcript | string | Solo con scope `calls:read:content`. |
| recordingUrl | string | Enlace estable `/rec/<token>`. Solo con scope `calls:read:content`. |
OfferResult| id | string | |
| callId | string | |
| type | string | upsell | quantity | bundle |
| name | string | |
| shown | boolean | |
| accepted | boolean | |
| productTitle | string | |
| discountedPrice | number | |
| quantityAccepted | integer | |
| chosenVariantTitle | string | |
| revenueUsd | number | Revenue del upsell (GMV del merchant). |
| lineItemAddedToShopify | boolean | |
| shopifyError | string | |
| createdAt | string (date-time) |
BulkBatch| id | string | |
| status | string | pending | in_progress | paused | cancelled | completed |
| total | integer | |
| processed | integer | |
| succeeded | integer | |
| failed | integer | |
| customMotif | string | |
| createdAt | string (date-time) | |
| updatedAt | string (date-time) |
Agent| id | string | |
| integration | string | |
| type | string | |
| name | string | |
| triggerStatuses | string[] | |
| isActive | boolean | |
| voice | object | |
| └ id | string | |
| └ name | string | |
| └ language | string | |
| voiceReady | boolean | |
| hasCallerNumber | boolean | |
| createdAt | string (date-time) |
AgentDetailany
Voice| voiceId | string | |
| name | string | |
| language | string | |
| accent | string | |
| gender | string | |
| tier | string | |
| isMultilingual | boolean | |
| previewUrl | string |
PhoneNúmero dedicado (merchant-safe — nunca expone el carrier interno, Regla 119).
| id | string | |
| phoneNumber | string | |
| nickname | string | |
| country | string | |
| monthlyPriceUsd | number | |
| isActive | boolean | |
| purchasedAt | string (date-time) | |
| nextBillingAt | string (date-time) |
VerifiedCallerIdNúmero propio del merchant verificado (Camino 1). Nunca expone el detalle de fallo de Telnyx.
| id | string | |
| phoneNumber | string | |
| country | string | |
| status | "pending" | "verified" | "failed" | |
| verificationMethod | "call" | "sms" | |
| verifiedAt | string (date-time) | |
| lastTestCallAt | string (date-time) | |
| createdAt | string (date-time) |
TriggerRequestDispara una llamada. Shape CANÓNICO = PLANO (los campos de orden en la raíz). Por compatibilidad, el endpoint TAMBIÉN acepta el shape ANIDADO legacy (`order:{ externalId, products, totalPrice, currency }` + `address:{}`) — ambos producen el mismo resultado. Sólo `externalId` + `customer.phone` son obligatorios (agente-first): para un agente contraentrega manda producto/precio/dirección; para un agente API genérico manda tu propio contexto en `customVariables`.
| externalIdreq | string | ID del pedido en tu sistema (clave de idempotencia). |
| callType | "confirmation" | "novelty" | "office" | |
| source | string | De dónde viene la llamada (ej. tu CRM). Opcional; default `api`. También aceptado como `metadata.source`. |
| agentId | string | Agente exacto a marcar (custom trigger). Obligatorio para agentes API-native; opcional para integraciones (aplica ruteo por status cuando se omite). |
| merchantExternalId | string | Tu ID de merchant (opcional). |
| customerreq | object | |
| └ name | string | |
| └ phonereq | string | E.164, ej. +573001234567. |
| string | ||
| └ ns | string | Contact NS de ChateaPro (opcional). |
| products | object[] | Opcional. Productos del pedido. |
| └ name | string | |
| └ quantity | integer | |
| └ price | string | |
| totalPrice | string | Opcional. Valor total (string numérico). |
| currency | string | |
| shippingAddress | object | |
| └ address1 | string | |
| └ address2 | string | |
| └ city | string | |
| └ province | string | |
| └ countryCode | string | |
| metadata | object | Objeto libre. `metadata.source` es una alternativa a `source`. |
| customVariables | object | Variables custom del cliente que el agente puede hablar. La clave DEBE empezar por `cv_` (charset `[a-z0-9_]`, máx 40); máx 25 claves, valor string ≤200 chars (se recorta). Se sanitizan server-side. Para que se hablen, referéncialas en el workflow del agente (Nivel B) como `{{cv_xxx}}`. |
CreateAgentRequestCrear un agente. `integration` selecciona el tipo (default `shopify`). Campos requeridos adicionales por integración: **shopify** → `type`; **chateapro/dropi** → `triggerStatuses` (+ `triggerCallType` obligatorio en chateapro); **sales** → `productName`, `productPrice`, `currency`, `paymentType`. Campos no aplicables a la integración se ignoran.
| integration | "shopify" | "chateapro" | "dropi" | "sales" | |
| namereq | string | |
| type | "confirmation" | "cart_recovery" | "prepaid" | "dispatch_cod" | "dispatch_prepaid" | "custom" | Solo shopify. |
| triggerCallType | "confirmation" | "novelty" | "office" | "delivery" | "dispatched" | "delivered" | "devolucion" | chateapro (obligatorio) / dropi. |
| description | string | |
| triggerStatuses | string[] | shopify / chateapro / dropi. |
| voiceId | string | |
| language | string | |
| maxRetries | integer | |
| retryDelayMinutes | integer | |
| maxCallDuration | integer | |
| callDelaySeconds | integer | |
| phoneNumberId | string | |
| enableVoicemailDetection | boolean | |
| customPrompt | string | |
| useCustomPrompt | boolean | |
| workingHours | object | |
| └ respect | boolean | |
| └ start | string | |
| └ end | string | |
| └ days | integer[] | |
| └ timezone | string | |
| └ offHoursAction | string | |
| callMode | "AUTO" | "MANUAL" | Solo dropi. |
| duplicateMode | "WINDOW" | "OFF" | Solo dropi. |
| discountEnabled | boolean | |
| discountCode | string | |
| discountType | "percent" | "fixed" | |
| discountValue | number | |
| productName | string | Solo sales (requerido). |
| productPrice | string | Solo sales (requerido). |
| currency | string | Solo sales (requerido). |
| paymentType | string | Solo sales (requerido). |
| productDetails | string | |
| quantityOfferEnabled | boolean | |
| upsellEnabled | boolean | |
| objections | string |
UpdateAgentRequestTodos los campos son opcionales. Solo se aplican los presentes (allowlist per-integración). Además de los listados: **chateapro/dropi** aceptan `triggerCallType`; **dropi** acepta `callMode`/`duplicateMode`/`exclusionGroup`; **sales** acepta sus campos de producto/oferta (`productName`, `productPrice`, `currency`, `paymentType`, `objections`, `upsellEnabled`, `metaPixelId`, `metaCapiToken`, …).
| integration | string | Ignorado — la integración se resuelve por el id. |
| triggerCallType | "confirmation" | "novelty" | "office" | "delivery" | "dispatched" | "delivered" | "devolucion" | chateapro/dropi. |
| name | string | |
| description | string | |
| triggerStatuses | string[] | |
| voiceId | string | |
| language | string | |
| customPrompt | string | |
| useCustomPrompt | boolean | |
| maxRetries | integer | |
| retryDelayMinutes | integer | |
| retryScheduleJson | string | |
| maxCallDuration | integer | |
| callMode | string | |
| callDelaySeconds | integer | |
| phoneNumberId | string | |
| verifiedCallerIdId | string | |
| isActive | boolean | |
| enableVoicemailDetection | boolean | |
| duplicateMode | string | |
| duplicateCallWindowHours | integer | |
| discountEnabled | boolean | |
| discountCode | string | |
| discountType | string | |
| discountValue | number | |
| workingHours | object | |
| └ respect | boolean | |
| └ start | string | |
| └ end | string | |
| └ days | integer[] | |
| └ timezone | string | |
| └ offHoursAction | string | |
| retryHours | object | |
| └ respect | boolean | |
| └ start | string | |
| └ end | string | |
| └ days | any | CSV o array de días. |
WorkflowDefinitionGrafo del flujo conversacional. El motor valida invariantes al guardar.
| nodesreq | object[] | |
| └ id | string | |
| └ type | string | |
| └ position | object | |
| └ data | object | |
| edges | object[] | |
| └ id | string | |
| └ source | string | |
| └ target | string | |
| └ data | object | |
| global_node_id | string |
AdvancedConfigConfiguración avanzada del agente. En PATCH todos los campos son opcionales (los omitidos se preservan).
| ring_duration_ms | integer | Duración del timbrado (ms). |
| max_call_duration_ms | integer | Duración máxima de la llamada (ms). |
| end_call_after_silence_ms | integer | Colgar tras silencio total (ms). |
| enable_backchannel | boolean | Acks naturales (ajá/mhm) mientras el cliente habla. |
| voicemail | object | |
| └ enabled | boolean | Detección de buzón de voz. |
| └ action | "hangup" | Siempre `hangup` (el motor cuelga al detectar buzón). |
| └ speech_cutoff_seconds | integer | |
| └ system_prompt | string | |
| dictionary | object[] | Palabras clave (boost STT). PATCH reemplaza la lista completa. |
| └ phrasereq | string | |
| └ boost | integer | |
| └ phonetic | string | |
| analysis_fields | object[] | Campos de análisis post-llamada. PATCH reemplaza la lista completa. |
| └ typereq | "boolean" | "string" | "enum" | "number" | |
| └ namereq | string | |
| └ description | string | |
| └ choices | string[] | Solo type=enum. |
| handbook | object | Toggles de personalidad. |
| └ default_personality | boolean | |
| └ natural_filler_words | boolean | |
| └ high_empathy | boolean | |
| └ echo_verification | boolean | |
| └ nato_phonetic_alphabet | boolean | |
| └ speech_normalization | boolean | |
| └ smart_matching | boolean | |
| └ ai_disclosure | boolean | |
| └ scope_boundaries | boolean |
WebhookEndpointUn webhook saliente registrado. El `secret` NUNCA se incluye aquí.
| id | string | |
| url | string (uri) | |
| events | string | Eventos suscritos, separados por coma (Regla 421). `call.outcome_final` = todos; o granulares `call.confirmed`/`call.cancelled`/`call.no_answer`/`call.voicemail`/`call.novelty`/`call.needs_attention`/`call.failed`. |
| isActive | boolean | |
| merchantExternalId | string | |
| createdAt | string (date-time) |
WebhookEndpointWithSecretWebhook con el `secret` incluido — devuelto SOLO al crearlo o al regenerarlo (una vez).
| secret | string | Secreto HMAC (`whsec_…`). Verifica cada entrega con `X-Talkyria-Signature`. No se vuelve a mostrar. |
| message | string |