Primeros pasos con la API
De la clave al primer webhook en cinco llamadas. Todo son peticiones reales: cópialas, cambia la clave y ejecuta.
1 · Consigue una clave
Las claves las emite We Are Transfers para una integración de tu organización (tu ERP, tu PMS, tu CRM…), con los scopes que esa integración necesita y en un entorno (live o test). El secreto completo se enseña una sola vez al crearla: guárdalo en tu gestor de secretos. Después solo se ve el prefijo (wat_live_Ab3dEf7h).
wat_live_ o wat_test_ seguido de 40 caracteres alfanuméricos. Va en Authorization: Bearer. Nunca en la URL.
2 · Comprueba quién eres
curl https://wearetransfers.com/api/v1/integrations/me \
-H "Authorization: Bearer $WAT_API_KEY"{
"integration": {
"id": "3f1c2a9e-8d6b-4a1f-9c2e-5b7d8e9f0a11",
"name": "ERP Volcano",
"kind": "erp"
},
"organization": {
"id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"code": "1003",
"name": "Transfers Levante SL"
},
"key": {
"prefix": "wat_live_Ab3dEf7h",
"name": "Producción ERP"
},
"environment": "live",
"scopes": [
"bookings:read",
"customers:read",
"events:read",
"webhooks:read",
"webhooks:write",
"links:read",
"links:write"
],
"rate_limits": {
"per_minute": {
"key": 600,
"organization": 1200,
"endpoint": 300
}
},
"api_version": "v1"
}scopes son los scopes efectivos: los de la clave que también tiene la integración. Si falta uno que esperabas, no llames a nada más: pídelo.
3 · Lee las reservas
curl "https://wearetransfers.com/api/v1/bookings?status=confirmed&pickup_from=2026-09-18T00:00:00Z&limit=2" \
-H "Authorization: Bearer $WAT_API_KEY"{
"data": [
{
"id": "0c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"reference": "10031234",
"external_id": "VLC-2026-000123",
"status": "confirmed",
"service_type": "transfer",
"hours": null,
"pickup_at": "2026-09-18T08:30:00+00:00",
"end_at": null,
"pickup": {
"address": "Aeropuerto de Valencia (VLC)",
"lat": 39.4893,
"lng": -0.4816
},
"destination": {
"address": "Hotel Las Arenas, Valencia",
"lat": 39.4735,
"lng": -0.3245
},
"distance_km": 12.4,
"flight": {
"number": "VY1234",
"pending": false
},
"passengers": {
"count": 2,
"luggage": 2,
"luggage_big": 2,
"luggage_small": 0,
"baby_seats": 0,
"child_seats": 0,
"booster_seats": 0,
"wheelchair": false
},
"vehicle_category": "sedan",
"customer": {
"id": "7e6d5c4b-3a2b-4c1d-9e8f-7a6b5c4d3e2f",
"name": "Hotel Las Arenas"
},
"assignment": {
"external": false,
"driver": {
"id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"name": "Marta Gil",
"nickname": "Marta"
},
"vehicle": {
"id": "5f4e3d2c-1b0a-4f9e-8d7c-6b5a4f3e2d1c",
"plate": "1234 KLM",
"model": "Mercedes Clase E"
}
},
"role": "originator_and_executor",
"channel": "customer_engine",
"confirmation": {
"mode": "auto",
"confirmed_at": "2026-09-17T18:02:11+00:00"
},
"event_reference": null,
"created_at": "2026-09-17T18:02:11.204Z"
},
{
"id": "4d5e6f70-8a9b-4c0d-9e1f-2a3b4c5d6e7f",
"reference": "10031235",
"external_id": null,
"status": "confirmed",
"service_type": "transfer",
"hours": null,
"pickup_at": "2026-09-18T08:30:00+00:00",
"end_at": null,
"pickup": {
"address": "Aeropuerto de Valencia (VLC)",
"lat": 39.4893,
"lng": -0.4816
},
"destination": {
"address": "Hotel Las Arenas, Valencia",
"lat": 39.4735,
"lng": -0.3245
},
"distance_km": 12.4,
"flight": {
"number": "VY1234",
"pending": false
},
"passengers": {
"count": 2,
"luggage": 2,
"luggage_big": 2,
"luggage_small": 0,
"baby_seats": 0,
"child_seats": 0,
"booster_seats": 0,
"wheelchair": false
},
"vehicle_category": "sedan",
"customer": {
"id": "7e6d5c4b-3a2b-4c1d-9e8f-7a6b5c4d3e2f",
"name": "Hotel Las Arenas"
},
"assignment": {
"external": true,
"driver": null,
"vehicle": null
},
"role": "originator",
"channel": "customer_engine",
"confirmation": {
"mode": "auto",
"confirmed_at": "2026-09-17T18:02:11+00:00"
},
"event_reference": null,
"created_at": "2026-09-17T18:02:11.204Z"
}
],
"next_cursor": "WyJib29raW5ncyIsIjIwMjYtMDktMTdUMTg6MDI6MTEuMjA0WiIsIjBjMWQyZTNmLTRhNWItNGM2ZC04ZTdmLTlhMGIxYzJkM2U0ZiJd.q1Zw8N3kPf2LgT7c",
"has_more": true
}La segunda reserva la ejecuta otra empresa (ha salido a la bolsa): assignment.external es true y su conductor y su vehículo no se exponen. Fíjate también en que no hay passenger ni pricing: esta clave no tienepassengers:read ni pricing:read.
4 · Página siguiente
curl "https://wearetransfers.com/api/v1/bookings?status=confirmed&pickup_from=2026-09-18T00:00:00Z&limit=2&cursor=WyJib29raW5ncyIsIjIwMjYtMDktMTdUMTg6MDI6MTEuMjA0WiIsIjBjMWQyZTNmLTRhNWItNGM2ZC04ZTdmLTlhMGIxYzJkM2U0ZiJd.q1Zw8N3kPf2LgT7c" \
-H "Authorization: Bearer $WAT_API_KEY"Repite los mismos filtros y añade cursor con el next_cursor anterior, hasta que has_more sea false. Detalle en Paginación.
5 · Deja de sondear: un webhook
Con webhooks:write, dos llamadas y ya recibes cada cambio. El secret vuelve una sola vez: es con lo que verificarás la firma de cada entrega.
curl -X POST https://wearetransfers.com/api/v1/webhooks \
-H "Authorization: Bearer $WAT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://tu-servidor.com/wat","events":["booking.created","booking.updated","booking.cancelled"]}'{
"id": "9f1c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
"url": "https://tu-servidor.com/wat",
"events": [
"booking.created",
"booking.updated",
"booking.cancelled"
],
"active": true,
"secret": "whsec_…"
}curl -X POST https://wearetransfers.com/api/v1/webhooks/9f1c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f/test \
-H "Authorization: Bearer $WAT_API_KEY"Responde 202 y en unos segundos llega un webhook.test a tu servidor. Comprueba siempre la cabecera X-WAT-Signature antes de leer el cuerpo: Firmas.
6 · Lo que viene después
- Guardar tu id para cada reserva y no volver a cruzar por nombre: Identificadores externos.
- Manejar los errores por
code, nunca por el texto: Errores. - Qué pasa cuando tu servidor se cae: Reintentos.