Versión 1.0 · POST / GET · Autenticación Bearer con una llave frk_live_…
Tu sistema llama a Frepi cuando su cliente hace algo (un depósito, un pedido, una cita). La llamada trae el teléfono, las variables y la lógica de una conversación corta: una plantilla aprobada, qué hace cada botón y, si quieres, un formulario de WhatsApp. Una persona aprueba cada lógica nueva una vez en Frepi. Después Frepi envía y sigue las respuestas.
automations:run
(enviar, cancelar) y automations:read (leer envíos). Vence a los 3, 6 o 12 meses.Authorization: Bearer frk_live_…
| Método | Ruta | Permiso | Respuesta |
|---|---|---|---|
POST | /api/automations/v1/runs | automations:run | 202 el envío |
GET | /api/automations/v1/runs/{id} | automations:read | 200 estado, línea de tiempo, respuestas |
GET | /api/automations/v1/runs?updated_since=&limit=&cursor= | automations:read | 200 página de envíos |
POST | /api/automations/v1/runs/{id}/cancel | automations:run | 200 el envío |
Ningún teléfono va en una URL. Todas las respuestas llevan Cache-Control: private, no-store.
curl -X POST https://ejemplo.frepi.ai/api/automations/v1/runs \ -H "Authorization: Bearer $FREPI_AUTOMATION_KEY" \ -H "Idempotency-Key: dep-8812" \ -H "Content-Type: application/json" \ -d @envio.json
{
"line": "+57 601 555 0100",
"to": { "phone": "+573001234567", "name": "Ana" },
"external_ref": "DEP-8812",
"variables": { "nombre": "Ana", "monto": "$250.000", "referencia": "DEP-8812" },
"logic": {
"declare": { "nombre": { "type": "text", "max": 40 } },
"start": { "type": "template", "template": "deposito_recibido",
"buttons": { "Sí, invertir": "invertir", "No, gracias": "gracias", "Hablar con asesor": "asesor" },
"wait": "24h" },
"steps": {
"invertir": { "type": "form", "form": "frm_invierte_deposito", "text": "Completa este formulario corto.",
"button": "Abrir formulario", "wait": "2h", "on_complete": "listo" },
"listo": { "type": "text", "text": "¡Gracias, {{answers.nombre|amigo}}! Un asesor te escribe hoy." },
"gracias": { "type": "text", "text": "Perfecto. Aquí estamos si nos necesitas." },
"asesor": { "type": "handoff", "to": "team", "text": "Te paso con un asesor.", "tag": "pide_asesor" }
}
}
}
En un paso form, form es la referencia de un formulario de «Formularios»
(frm_…) o un formulario nuevo escrito en la misma llamada. Frepi lo crea y lo publica en la cuenta de
WhatsApp de la línea cuando una persona aprueba la lógica; antes no se publica nada.
"invertir": {
"type": "form", "text": "Completa este formulario corto.", "button": "Abrir formulario", "wait": "2h",
"on_complete": "listo",
"form": {
"name": "Invierte tu depósito",
"submit": "Enviar",
"fields": [
{ "token": "nombre", "label": "Nombre", "type": "text", "required": false },
{ "token": "plazo", "label": "¿A qué plazo?", "type": "option",
"options": [ { "id": "tres", "title": "3 meses" }, { "id": "seis", "title": "6 meses" } ] },
{ "token": "fecha", "label": "¿Cuándo te llamamos?", "type": "date" }
]
}
}
text, option (2 a 20 opciones) o date.
required es true si no lo envías. El token es lo que trae la respuesta
({{answers.token}}); una opción responde su id, una fecha AAAA-MM-DD.422 validation_failed con form_unavailable hasta que una persona lo reintente en
«Formularios», y un envío que esperaba termina failed / line_ineligible.form_fields_unsupported, form_too_many_fields,
form_field_invalid, cada uno con el path del campo.409 logic_pending_approval con
logic_id y approve_url. No se envía nada.approve_url en Frepi y pulsa «Aprobar». Una llave nunca puede aprobar."automation_id": "aut_…" en vez de line + logic.Idempotency-Key es obligatorio. La misma llave con el mismo cuerpo responde 202 con
replayed: true y no envía nada otra vez; con otro cuerpo, 409 idempotency_conflict.429 trae Retry-After.Todo error es {"error": {"code", "message", …}}. Un 422 validation_failed trae
errors[] con cada problema, su code y su path. Lee el code, nunca el
message; un código que no conoces se trata por su estado HTTP.
¿Quieres enviar un formulario de una campaña que ya lanzaste en Frepi? Llama a la campaña por su id:
Enviar un formulario desde tu sistema (campaign_id, contrato 1.2).
contracts/automations_v1/. Cuando salga una v2, la v1 sigue funcionando al menos seis meses, con los
encabezados Deprecation y Sunset.