Inicio rápido

Creá tu primera reserva por API en cinco minutos con una clave de prueba.

Esta guía usa una clave de prueba (wg_test_...). Las claves de prueba trabajan contra una copia sandbox de tu workspace: no se envían mensajes de WhatsApp ni se hacen pagos reales.

URL base: https://api.wagend.app/v1. Cada request necesita Authorization: Bearer <clave>.

1. Generá una clave de prueba

En el panel, andá a Desarrolladores → Claves de API → Nueva clave, elegí Prueba y marcá los scopes slots:read, bookings:write y config:read. La clave se muestra una sola vez.

export WAGEND_KEY="wg_test_xxxxxxxx_xxxxxxxxxxxxxxxxxxxx"

2. Verificá quién sos

curl https://api.wagend.app/v1/me -H "Authorization: Bearer $WAGEND_KEY"
{
  "workspace": { "id": "ws_9f2c", "name": "Barbería Centro", "timezone": "America/Sao_Paulo", "locale": "es", "currency": "BRL" },
  "scopes": ["slots:read", "bookings:write", "config:read"],
  "mode": "test"
}

El workspace siempre sale de la clave. Nunca enviás un id de workspace.

3. Listá los servicios

curl https://api.wagend.app/v1/services -H "Authorization: Bearer $WAGEND_KEY"
{
  "data": [
    { "id": "svc_corte", "name": "Corte", "duration_min": 30, "price_cents": 5000, "currency": "BRL",
      "requirements": [{ "resource_group_id": "grp_barbers", "units": 1 }] }
  ]
}

4. Buscá horarios disponibles

curl "https://api.wagend.app/v1/slots?service_id=svc_corte&from=2026-10-15T08:00:00-03:00&to=2026-10-15T13:00:00-03:00" \
  -H "Authorization: Bearer $WAGEND_KEY"
{
  "data": [
    { "start": "2026-10-15T09:00:00-03:00", "end": "2026-10-15T09:30:00-03:00", "resource_ids": ["res_juan"] },
    { "start": "2026-10-15T09:45:00-03:00", "end": "2026-10-15T10:15:00-03:00", "resource_ids": ["res_juan"] }
  ],
  "unavailable_reason": null
}

5. Pre-reservá el horario

La pre-reserva (hold) guarda el horario por 10 minutos mientras juntás los datos del cliente. Enviá siempre un Idempotency-Key para que los reintentos sean seguros.

curl -X POST https://api.wagend.app/v1/holds \
  -H "Authorization: Bearer $WAGEND_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "service_id": "svc_corte", "start": "2026-10-15T09:45:00-03:00", "resource_ids": ["res_juan"] }'
{ "id": "bkg_7Qx1", "status": "held", "expires_at": "2026-10-14T15:30:00-03:00", "start": "2026-10-15T09:45:00-03:00" }

6. Confirmá

curl -X POST https://api.wagend.app/v1/holds/bkg_7Qx1/confirm \
  -H "Authorization: Bearer $WAGEND_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "customer": { "name": "Carlos", "phone": "+5491155550000", "locale": "es" } }'
{ "id": "bkg_7Qx1", "status": "confirmed", "start": "2026-10-15T09:45:00-03:00", "source": "api" }

Si el servicio pide seña por Pix, el estado queda en pending_payment y la respuesta trae el código Pix. Pasa a confirmed cuando llega el pago.

El mismo flujo en JavaScript

const api = (path: string, init: RequestInit = {}) =>
  fetch(`https://api.wagend.app/v1${path}`, {
    ...init,
    headers: { Authorization: `Bearer ${process.env.WAGEND_KEY}`, 'Content-Type': 'application/json', ...init.headers },
  }).then((r) => r.json())

const { data: slots } = await api(`/slots?service_id=svc_corte&from=${from}&to=${to}`)
const hold = await api('/holds', {
  method: 'POST',
  headers: { 'Idempotency-Key': crypto.randomUUID() },
  body: JSON.stringify({ service_id: 'svc_corte', start: slots[0].start }),
})
const booking = await api(`/holds/${hold.id}/confirm`, {
  method: 'POST',
  headers: { 'Idempotency-Key': crypto.randomUUID() },
  body: JSON.stringify({ customer: { name: 'Carlos', phone: '+5491155550000' } }),
})

Siguientes pasos