Referencia de la API
Todas las rutas de la API pública de Orkestal con el permiso que exigen, sus parámetros y ejemplos de uso.
Todas las rutas cuelgan de la URL base https://orkestal-backend-production.up.railway.app/api/public/v1 y requieren Authorization: Bearer ork_live_…. Antes de empezar, lee Autenticación y permisos.
Identidad#
GET /me#
Comprueba que la key funciona. No requiere permisos especiales.
{
"business_id": "…",
"business_name": "Mi Negocio",
"api_key_name": "n8n producción",
"scopes": ["contacts:read", "messages:write"]
}Contactos#
| Método y ruta | Permiso | Qué hace |
|---|---|---|
GET /contacts | contacts:read | Lista contactos |
POST /contacts | contacts:write | Crea un contacto, o lo actualiza si el teléfono ya existe |
GET /contacts/{id} | contacts:read | Un contacto |
PATCH /contacts/{id} | contacts:write | Edita nombre, correo, etiquetas o metadata |
POST /contacts/{id}/tags | tags:write | Suma etiquetas |
DELETE /contacts/{id}/tags/{etiqueta} | tags:write | Quita una etiqueta |
Filtros de GET /contacts: search (busca en nombre, teléfono o correo), tag (una etiqueta), limit (1 a 100, por defecto 25) y cursor.
Objeto contacto:
{
"id": "…",
"phone": "+5215550001111",
"name": "María López",
"email": "maria@ejemplo.com",
"tags": ["nuevo_lead"],
"metadata": {},
"created_at": "2026-11-04T18:22:04Z"
}POST /contacts: el único campo obligatorio es phone. Es un upsert: si ya existe un contacto con ese teléfono, se actualiza. Las etiquetas se suman, nunca reemplazan las existentes, para que dos automatizaciones distintas no se pisen.
POST /contacts
{ "phone": "+5215550001111", "name": "María López", "tags": ["colegios"] }Conversaciones#
| Método y ruta | Permiso | Qué hace |
|---|---|---|
GET /conversations | conversations:read | Lista conversaciones |
GET /conversations/{id}/messages | messages:read | Historial de una conversación |
PATCH /conversations/{id} | conversations:write | Cambia estado, etapa o asignación |
POST /conversations/{id}/pause-agent | conversations:write | Pausa la IA en ese chat |
POST /conversations/{id}/resume-agent | conversations:write | Reactiva la IA en ese chat |
Filtros de GET /conversations: status, contact_id, limit y cursor.
Objeto conversación:
{
"id": "…",
"contact_id": "…",
"channel": "whatsapp",
"status": "active",
"sale_stage": "interesado",
"assigned_to": "…",
"created_at": "…"
}GET /conversations/{id}/messages: hasta 100 mensajes (limit, por defecto 50), en orden cronológico (del más viejo al más nuevo), cada uno con id, sender_type, content, message_type y created_at.
PATCH /conversations/{id}: campos opcionales status, sale_stage (una etapa como interesado, negociacion o vendido) y assigned_to (el id de una persona de tu equipo).
pause-agent y resume-agent son el equivalente a los botones Pausar IA / Activar IA del chat. Mira Relevo humano.
Mensajes#
POST /messages#
Permiso: messages:write. Envía un mensaje de WhatsApp, de texto o de plantilla.
| Campo | Qué es |
|---|---|
to | Teléfono del destinatario con código de país (si no das conversation_id) |
conversation_id | La conversación a la que se envía (alternativa a to) |
text | El texto libre |
template | La plantilla: { "name": "…", "variables": { "1": "…" } } (o id en lugar de name) |
channel | whatsapp (por defecto) |
Envía text o template, no ambos. Manda siempre Idempotency-Key.
POST /messages
Idempotency-Key: pedido-1234-recordatorio
{
"to": "+5215550001111",
"template": { "name": "recordatorio_pago", "variables": { "1": "María", "2": "$1,500" } }
}Respuesta:
{
"sent": true,
"conversation_id": "…",
"contact_id": "…",
"message_id": "…",
"mode": "template",
"content": "…"
}Reglas:
- Antes de enviar texto libre, Orkestal valida la ventana de 24 horas. Si está cerrada responde
409con instrucciones, en vez de dejar que Meta lo rechace con el error 131047. - La cuenta debe estar al corriente: con una suspensión por pago, responde
402. - El mensaje queda registrado en la conversación del contacto.
GET /templates#
Permiso: templates:read. Lista tus plantillas con id, name, language, status, category, las variables que espera y el body. Úsala para saber qué plantillas puedes enviar con POST /messages.
WhatsApp Cloud API (producto WhatsApp API)#
Estas rutas están disponibles para quien usa el producto WhatsApp API. Reciben y devuelven el formato de la Cloud API de Meta.
| Método y ruta | Permiso | Qué hace |
|---|---|---|
POST /whatsapp/messages | messages:write | Envía un mensaje (texto, plantilla, multimedia) o marca como leído |
POST /whatsapp/media | messages:write | Sube un archivo (multipart, campo file) |
GET /whatsapp/media/{id} | messages:read | Descarga un archivo recibido |
GET /whatsapp/phone-number | Calidad, límite y estado de Coexistencia del número | |
GET /whatsapp/templates | templates:read | Lista las plantillas de Meta con todos sus estados |
POST /whatsapp/templates | templates:write | Crea una plantilla y la manda a revisión |
DELETE /whatsapp/templates?name=… | templates:write | Borra una plantilla |
Suscripciones a webhooks#
Todas requieren webhooks:write.
| Método y ruta | Qué hace |
|---|---|
GET /webhook-subscriptions | Lista tus suscripciones |
POST /webhook-subscriptions | Crea una (solo URL https://) |
PATCH /webhook-subscriptions/{id} | Edita |
DELETE /webhook-subscriptions/{id} | Elimina |
POST /webhook-subscriptions/{id}/rotate-secret | Genera un secreto nuevo |
POST /webhook-subscriptions/{id}/test | Manda un evento test.ping firmado |
GET /webhook-subscriptions/deliveries | Bitácora de entregas |
POST /webhook-subscriptions/deliveries/{id}/retry | Reintenta una entrega |
Límites y verificación de firma en Webhooks.
Agente externo#
| Método y ruta | Permiso | Qué hace |
|---|---|---|
POST /external-agent/events/{event_id}/reply | messages:write | Devuelve la respuesta de tu agente para un evento |
GET /external-agent/events/{event_id} | Consulta el estado del envío |
Mira Agente externo.
Lo que la API no hace#
- No expone credenciales ni tokens de tus canales o integraciones.
- Con estas rutas no se crean ni editan flujos, reglas de escalamiento, la base de conocimiento ni el perfil del agente. Eso se hace desde el panel.
- No lee datos de otros negocios.