Inicio rápido

Creá tu primera reserva por API en cinco minutos con una clave de un negocio de prueba: servicios, horarios, pre-reserva y confirmación.

Actualizado:

Esta guía crea una reserva real, así que usá una clave de producción (wg_live_...) de un negocio que armaste para probar. Las claves wg_test_ son de solo lectura: permiten listar y leer, no crear ni modificar nada. Un sandbox para escrituras es Próximamente. Para probar el bot sin WhatsApp, usá el simulador del panel.

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

1. Generá una clave

En el panel, andá a Configuración → Desarrolladores, creá una clave de Producción y marcá los scopes slots:read, bookings:write y config:read. La clave se muestra una sola vez.

export WAGEND_KEY="wg_live_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": "live"
}

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, el estado queda en pending_payment. El cobro en línea de la seña es próximamente.

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