EndpointsDocumentation Index
Fetch the complete documentation index at: https://docs.ryvo.so/llms.txt
Use this file to discover all available pages before exploring further.
POST que crean recursos (como /v1/calls) aceptan un header Idempotency-Key. Si tu sistema reintenta una petición por timeout o error de red, mandar la misma key garantiza que la operación se ejecute una sola vez.
Cómo funciona
- Buscamos en cache por la combinación
(client_id, endpoint, key). - Hit con mismo body → devolvemos la respuesta cacheada de la primera petición. No volvemos a disparar la llamada.
- Hit con body distinto → respondemos
409 idempotency_conflict. Es un bug en tu lado: estás reusando una key con datos diferentes. - Miss → procesamos la petición normal. Si es exitosa, guardamos
(key, body, response)en cache por 24h.
Cuándo usarla
Disparar llamadas desde un workflow
Tu n8n o GHL puede reintentar por timeout. Sin idempotency, cada reintento dispara una llamada nueva.
Mensajes en cola
Si tu cola entrega mensajes “at-least-once” (SQS, RabbitMQ), el mismo mensaje puede llegar 2 veces.
Webhooks de tu CRM
Tu CRM puede reintentar webhooks fallidos — usa el mismo ID del CRM como Idempotency-Key.
Cualquier código async
Donde reintenten reintentos, manda la key.
Formato de la key
- 1 a 255 caracteres.
- Solo ASCII imprimible (
!a~). - Recomendado: UUID v4 (
crypto.randomUUID()) o un identificador de tu sistema (ej.lead-{lead_id}-{deal_id}).
TTL del cache
Las keys expiran 24 horas después de la primera petición exitosa. Pasado ese plazo, la misma key puede usarse para una nueva operación distinta. Si necesitas garantía de duplicados más allá de 24h, usa identificadores estables del lado de tu sistema (ej.webhook_id único en tu CRM) y guarda tu propio mapping webhook_id → call_id.
Aislamiento por cliente
Las keys están aisladas por API key (cliente). Si tú usasIdempotency-Key: 12345 y otro cliente Ryvo usa la misma cadena, no hay colisión — son namespaces separados.
Ejemplo: integración con backoff
idempotencyKey, aunque el primer intento haya disparado la llamada exitosa pero el response se perdió en la red, el reintento devuelve la misma respuesta cacheada y NO dispara una segunda llamada.
Errores comunes
| Error | Causa |
|---|---|
400 invalid_idempotency_key | Caracteres no-ASCII o más de 255 chars. |
409 idempotency_conflict | Reusaste una key con un body distinto. Cambia uno o el otro. |

