Rascunho

Convenções

Formatos, idempotência, paginação, erros e limites de requisição.

Básico

  • URL base https://api.wagend.app/v1. Mudanças incompatíveis saem como nova versão.
  • JSON na entrada e na saída (Content-Type: application/json).
  • Datas em ISO 8601 com offset (2026-10-15T09:45:00-03:00). Guardadas em UTC.
  • Valores em centavos inteiros mais currency (BRL, ARS, PYG, USD).
  • IDs são strings opacas com prefixo (bkg_, svc_, res_, grp_, cus_).

Idempotência

POST /holds, POST /holds/{id}/confirm, POST /bookings e POST /bookings/{id}/reschedule exigem o header Idempotency-Key (por exemplo um UUID). Repetir uma requisição com a mesma chave em até 24 horas devolve a resposta original. Reutilizar a chave com outro corpo devolve 422.

Paginação

Os endpoints de lista usam 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"

Erros

Os erros seguem a 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" }]
}
codeStatusQuando
invalid_request400 / 422Falha de validação
unauthorized401Chave ausente, inválida ou revogada
insufficient_scope403A chave não tem o escopo
not_found404Id desconhecido (ou de outro workspace)
slot_taken409Outra pessoa pegou o horário
invalid_transition409Por exemplo confirmar um agendamento cancelado
hold_expired410A pré-reserva expirou antes de confirmar
idempotency_mismatch422Mesma chave, corpo diferente
rate_limited429Requisições demais

Limites de requisição

Os limites valem por chave e por workspace. Toda resposta traz RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset. Em 429, espere Retry-After segundos.