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
- Publicá un endpoint HTTPS
Una URL pública que aceptePOSTcon cuerpo JSON y responda200.
Los requisitos completos están más abajo. - 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. - 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. - 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 unclient_hook_id, que es el identificador con el que después el cliente puede consultar y modificar su configuración por sí mismo. - Probamos en el ambiente de desarrollo — en conjunto
Generamos una operación de prueba y el cliente verifica de su lado que llegó elPOST, 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. - 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
| Ítem | Requisito |
|---|---|
| Método | POST — siempre, para todos los eventos. |
| Esquema | https obligatorio. No aceptamos URLs sin TLS. |
| Content-Type | application/json, UTF-8. |
| Respuesta | Exclusivamente 200. Un 201, 202 o 204 se interpreta como error y dispara un reintento. |
| Cuerpo de respuesta | No lo leemos. Puede ser vacío. |
| Tiempo de respuesta | Menos de 5 segundos. Si tarda más, la entrega se considera fallida. |
| Redirecciones | Ninguna. El endpoint tiene que atender directamente en la URL registrada. |
La causa número uno de problemas: redireccionesSi el path registrado responde
301,302o303, la entrega se rompe: por el estándar HTTP, una redirección sobre unPOSTse reemite comoGETy el cuerpo del mensaje se descarta. Va a llegar una request sin datos.Los casos típicos son la barra final (se registra
/webhooky el framework redirige a/webhook/— en Django esAPPEND_SLASH), el redirectwww↔ dominio raíz, y diferencias de mayúsculas en el path.
Respondé 200 primero y procesá despuésCon 5 segundos de margen, encolar el mensaje y devolver la respuesta enseguida evita cortes por procesamiento lento.
El handler tiene que ser idempotenteSi 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 llegadaEl orden de las notificaciones no está garantizado: un
…_updatepuede 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.
| Evento | Se dispara cuando | Identificador |
|---|---|---|
market_order_create | Se crea una orden de mercado | market_order_id |
market_order_update | Cambia el estado de una orden de mercado | market_order_id |
fund_request_create | Se crea una solicitud de FCI | fund_request_id |
fund_request_update | Cambia el estado de una solicitud de FCI | fund_request_id |
withdraw_request_update | Cambia el estado de una extracción | withdraw_request_id |
deposit_create | Se registra un depósito | deposit_id |
account_statements_update | Se actualiza el estado de cuenta | investment_account_id |
mutual_fund_confirmations_create | Se crea una confirmación de FCI | mutual_fund_confirmation_id |
mutual_fund_confirmations_update | Cambia una confirmación de FCI | mutual_fund_confirmation_id |
stock_market_confirmations_create | Se crea un boleto de mercado | stock_market_confirmation_id |
stock_market_confirmations_update | Cambia un boleto de mercado | stock_market_confirmation_id |
mep_order_create | Se crea una orden MEP | mep_market_order_id |
mep_order_update | Cambia el estado de una orden MEP | mep_market_order_id |
scheduled_market_order_create | Se crea una orden programada | scheduled_market_order_id |
scheduled_market_order_update | Cambia una orden programada | scheduled_market_order_id |
investment_account_update | Cambia la cuenta comitente | investment_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.
| Esquema | Qué recibe | Qué nos tiene que dar |
|---|---|---|
bearer | Authorization: Bearer <token> — el prefijo lo agregamos nosotros. | {"token": "…"} |
basic | Authorization: Basic <base64> | {"username": "…", "password": "…"} |
header_token | Uno o dos headers propios con el valor que se defina. | [{"header": "X-Api-Key", "token": "…"}] — máximo 2. |
Rotación de credencialesSi el endpoint responde
401o403, 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étodo | Ruta | Para qué |
|---|---|---|
GET | /topics | Listar los eventos disponibles con su topic_id. |
GET | /client-hooks | Ver 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}/credentials | Rotar las credenciales. |
Updated 2 months ago
