← Frepi Developers

Mensajes por evento — API de automatizaciones v1

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.

1 · La llave

Authorization: Bearer frk_live_…

2 · Rutas

MétodoRutaPermisoRespuesta
POST/api/automations/v1/runsautomations:run202 el envío
GET/api/automations/v1/runs/{id}automations:read200 estado, línea de tiempo, respuestas
GET/api/automations/v1/runs?updated_since=&limit=&cursor=automations:read200 página de envíos
POST/api/automations/v1/runs/{id}/cancelautomations:run200 el envío

Ningún teléfono va en una URL. Todas las respuestas llevan Cache-Control: private, no-store.

3 · Un envío

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" }
    }
  }
}

Un formulario en línea (contrato 1.1)

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" }
    ]
  }
}

4 · Aprobar una vez

  1. La primera llamada con una lógica nueva responde 409 logic_pending_approval con logic_id y approve_url. No se envía nada.
  2. Una persona abre approve_url en Frepi y pulsa «Aprobar». Una llave nunca puede aprobar.
  3. Desde ahí, cada llamada con la misma lógica se envía de inmediato. Puedes mandar "automation_id": "aut_…" en vez de line + logic.
  4. Cambiar la línea, el modo del agente o la lógica pide otra aprobación.
  5. Aprobar una lógica con un formulario en línea muestra sus campos y lo publica en la cuenta de WhatsApp de la línea.

5 · Idempotencia y límites

6 · Errores

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).

El contrato completo (esquemas, catálogos, ejemplos) está en contracts/automations_v1/. Cuando salga una v2, la v1 sigue funcionando al menos seis meses, con los encabezados Deprecation y Sunset.