Borrador

Convenciones

Formatos, idempotencia, paginación, errores y límites de uso.

Lo básico

  • URL base https://api.wagend.app/v1. Los cambios incompatibles salen como una nueva versión.
  • JSON de entrada y de salida (Content-Type: application/json).
  • Fechas en ISO 8601 con offset (2026-10-15T09:45:00-03:00). Se guardan en UTC.
  • Montos en centavos enteros más currency (BRL, ARS, PYG, USD).
  • Los IDs son strings opacos con prefijo (bkg_, svc_, res_, grp_, cus_).

Idempotencia

POST /holds, POST /holds/{id}/confirm, POST /bookings y POST /bookings/{id}/reschedule exigen el header Idempotency-Key (por ejemplo un UUID). Repetir un request con la misma clave dentro de 24 horas devuelve la respuesta original. Reusar la clave con otro body devuelve 422.

Paginación

Los endpoints de listado usan cursores:

curl "https://api.wagend.app/v1/bookings?limit=50" -H "Authorization: Bearer $WAGEND_KEY"
# → { "data": [...], "next_cursor": "eyJpZCI6..." }
curl "https://api.wagend.app/v1/bookings?limit=50&cursor=eyJpZCI6..." -H "Authorization: Bearer $WAGEND_KEY"

Errores

Los errores siguen la RFC 9457 (application/problem+json):

{
  "type": "https://wagend.app/docs/api/conventions#errors",
  "title": "Slot no longer available",
  "status": 409,
  "code": "slot_taken",
  "alternatives": [{ "start": "2026-10-15T10:15:00-03:00", "end": "2026-10-15T10:45:00-03:00" }]
}
codeEstadoCuándo
invalid_request400 / 422Falló la validación
unauthorized401Clave ausente, inválida o revocada
insufficient_scope403La clave no tiene el scope
not_found404Id desconocido (o de otro workspace)
slot_taken409Otra persona tomó el horario
invalid_transition409Por ejemplo confirmar una reserva cancelada
hold_expired410La pre-reserva venció antes de confirmar
idempotency_mismatch422Misma clave, distinto body
rate_limited429Demasiados requests

Límites de uso

Los límites aplican por clave y por workspace. Cada respuesta trae RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset. Ante un 429, esperá Retry-After segundos.