Webhooks

Cuando ocurre un evento en alguna cuenta comitente — ejemplo: se crea una orden, cambia el estado de una solicitud, se acredita un depósito— le enviamos una llamada HTTP a la dirección que configuremos para notificarlos sobre dicho evento.

Pasos para integrarte

  1. Publicá un endpoint HTTPS
    Una URL pública que acepte POST con cuerpo JSON y responda 200.
    Los requisitos completos están más abajo.
  2. Elegí cómo querés que nos autentiquemos
    Bearer token, Basic o headers propios. Las credenciales se pasan por canal seguro y quedan guardadas cifradas.
  3. Elegí los eventos que querés recibir
    De la lista de eventos disponibles. La suscripción es explícita: solo llega lo que se pide.
  4. Registramos la configuración
    Nos deben compartir la url para recibir los webhook, el mecanismo de autenticación elegido y las credenciales.

    Desde API Broker, damos de alta la URL con la autenticación y los eventos elegidos.

    Devolvemos un client_hook_id, que es el identificador con el que después el cliente puede consultar y modificar su configuración por sí mismo.
  5. Probamos en el ambiente de desarrollo — en conjunto
    Generamos una operación de prueba y el cliente verifica de su lado que llegó el POST, que la autenticación validó y que su servicio respondió 200. Este paso es el que detecta problemas de ruteo antes de que lleguen a producción.
  6. Habilitamos producción — en conjunto
    Repetimos el alta en el ambiente productivo y hacemos una verificación final con una operación controlada.

Requisitos del endpoint

ÍtemRequisito
MétodoPOST — siempre, para todos los eventos.
Esquemahttps obligatorio. No aceptamos URLs sin TLS.
Content-Typeapplication/json, UTF-8.
RespuestaExclusivamente 200. Un 201, 202 o 204 se interpreta como error y dispara un reintento.
Cuerpo de respuestaNo lo leemos. Puede ser vacío.
Tiempo de respuestaMenos de 5 segundos. Si tarda más, la entrega se considera fallida.
RedireccionesNinguna. El endpoint tiene que atender directamente en la URL registrada.
🚧

La causa número uno de problemas: redirecciones

Si el path registrado responde 301, 302 o 303, la entrega se rompe: por el estándar HTTP, una redirección sobre un POST se reemite como GET y el cuerpo del mensaje se descarta. Va a llegar una request sin datos.

Los casos típicos son la barra final (se registra /webhook y el framework redirige a /webhook/ — en Django es APPEND_SLASH), el redirect www ↔ dominio raíz, y diferencias de mayúsculas en el path.

Respondé 200 primero y procesá después

Con 5 segundos de margen, encolar el mensaje y devolver la respuesta enseguida evita cortes por procesamiento lento.

📘

El handler tiene que ser idempotente

Si una entrega falla, la reintentamos. Eso significa que el mismo evento puede llegar más de una vez. Hay que usar el identificador de la entidad —market_order_id, deposit_id, etc.— para reconocer un mensaje ya procesado en lugar de aplicarlo dos veces.

📘

No apoyarse en el orden de llegada

El orden de las notificaciones no está garantizado: un …_update puede llegar antes que su …_create, y dos actualizaciones de la misma entidad pueden llegar invertidas. Hay que guiarse siempre por el estado que viene en el mensaje, no por la secuencia en que se recibe.

Como es el body del webhook

El body del mensaje siempre tiene dos claves:

  • topic — identifica el evento. Es el valor de la tabla de eventos disponibles.
  • items — array con la entidad afectada.

El objeto dentro de items es el mismo que devuelve la API REST para ese recurso. La representación de una orden en la notificación es idéntica a la que se obtiene consultando la orden por la API, así que no hay un formato paralelo que mantener.

POST /tu/path/de/webhook HTTP/1.1
Host: tu-dominio
Content-Type: application/json
Authorization: Bearer <el token acordado>

{
  "topic": "market_order_update",
  "items": [
    {
      "market_order_id": 1048576,
      "status": "EXECUTED"
    }
  ]
}

El resto de los campos del recurso vienen igual que en la API REST.

Eventos disponibles

La columna Identificador es el campo que identifica unívocamente la entidad dentro de items: sirve para relacionar la notificación con los registros propios del cliente.

EventoSe dispara cuandoIdentificador
market_order_createSe crea una orden de mercadomarket_order_id
market_order_updateCambia el estado de una orden de mercadomarket_order_id
fund_request_createSe crea una solicitud de FCIfund_request_id
fund_request_updateCambia el estado de una solicitud de FCIfund_request_id
withdraw_request_updateCambia el estado de una extracciónwithdraw_request_id
deposit_createSe registra un depósitodeposit_id
account_statements_updateSe actualiza el estado de cuentainvestment_account_id
mutual_fund_confirmations_createSe crea una confirmación de FCImutual_fund_confirmation_id
mutual_fund_confirmations_updateCambia una confirmación de FCImutual_fund_confirmation_id
stock_market_confirmations_createSe crea un boleto de mercadostock_market_confirmation_id
stock_market_confirmations_updateCambia un boleto de mercadostock_market_confirmation_id
mep_order_createSe crea una orden MEPmep_market_order_id
mep_order_updateCambia el estado de una orden MEPmep_market_order_id
scheduled_market_order_createSe crea una orden programadascheduled_market_order_id
scheduled_market_order_updateCambia una orden programadascheduled_market_order_id
investment_account_updateCambia la cuenta comitenteinvestment_account_id

La lista habilitada en cada ambiente, con el topic_id que se usa para suscribirse, se consulta en GET /api/notifications/topics.

Autenticación

El partner elige un esquema de autenticación
Vamos a mandar esas credenciales en cada llamada para que pueda verificar que la notificación viene de nosotros.

EsquemaQué recibeQué nos tiene que dar
bearerAuthorization: Bearer <token> — el prefijo lo agregamos nosotros.{"token": "…"}
basicAuthorization: Basic <base64>{"username": "…", "password": "…"}
header_tokenUno o dos headers propios con el valor que se defina.[{"header": "X-Api-Key", "token": "…"}] — máximo 2.
🚧

Rotación de credenciales

Si el endpoint responde 401 o 403, dejamos de enviar notificaciones hasta que se resuelva. Para rotar un token hay que actualizar primero la credencial con nosotros y recién después invalidar el token viejo.

Consultar y modificar la configuración

Con el token habitual de la API (Authorization: Bearer). Base: /api/notifications.

MétodoRutaPara qué
GET/topicsListar los eventos disponibles con su topic_id.
GET/client-hooksVer la configuración: URL, tipo de autenticación y eventos suscriptos.
PATCH/client-hooks/{client_hook_id}Cambiar la URL de destino.
PATCH/client-hooks/{client_hook_id}/credentialsRotar las credenciales.


Did this page help you?