Integra servicios de transporte VIAZU en tus sistemas: hoteles, aeropuertos, call centers, ERPs y más.
Base URL: https://us-central1-viazu-596b0.cloudfunctions.net
Descripción general
La API B2B de VIAZU permite que sistemas empresariales externos creen, monitoreen y cancelen viajes en nombre de sus clientes, sin necesidad de una cuenta de usuario de VIAZU por cada petición.
- Todas las peticiones usan HTTPS.
- El cuerpo de las peticiones y respuestas es JSON.
- La moneda es siempre DOP (Peso dominicano).
- Los precios incluyen ITBIS 18%.
Autenticación
Cada petición debe incluir tu API key en el header Authorization como Bearer token:
Authorization: Bearer vz_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Formato de la API key
vz_live_<40 caracteres hexadecimales>
Las claves se almacenan como hash SHA-256 en nuestros servidores. La clave en texto plano se muestra solo una vez al momento de generarse.
Errores
Los errores se devuelven con el HTTP status code correspondiente y un body JSON:
{
"error": {
"code": "invalid_params",
"message": "Descripción del error"
}
}
| HTTP | Código | Descripción |
|---|---|---|
| 400 | invalid_params | Parámetro faltante o inválido |
| 400 | invalid_service | Servicio no reconocido |
| 401 | unauthenticated | API key ausente, inválida o expirada |
| 403 | permission_denied | Scope insuficiente o cliente suspendido |
| 404 | not_found | Viaje no encontrado |
| 405 | method_not_allowed | Método HTTP incorrecto |
| 409 | invalid_state | Operación inválida para el estado actual |
| 429 | rate_limited | Límite de peticiones por minuto excedido |
| 500 | internal | Error interno del servidor |
Rate limiting
El límite de peticiones se aplica por cliente y por minuto. El límite estándar es 60 req/min. Al superarlo recibirás un 429 rate_limited.
POST /apiEstimateFare
Calcula el precio estimado de un viaje incluyendo el factor surge actual y el ITBIS.
Request body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| servicio | string | Sí | Tipo de servicio (ver Servicios) |
| distanciaKm | number | Sí | Distancia estimada en kilómetros |
| duracionMin | number | Sí | Duración estimada en minutos |
Ejemplo — curl
curl -X POST https://us-central1-viazu-596b0.cloudfunctions.net/apiEstimateFare \
-H "Authorization: Bearer vz_live_..." \
-H "Content-Type: application/json" \
-d '{
"servicio": "carro",
"distanciaKm": 8.5,
"duracionMin": 18
}'
Respuesta exitosa 200
{
"servicio": "carro",
"distanciaKm": 8.5,
"duracionMin": 18,
"surgeFactor": 1.0,
"precioEstimado": 432,
"moneda": "DOP",
"itbis": 0.18
}
POST /apiCreateRide
Crea un nuevo viaje. El sistema de matching asignará un conductor disponible automáticamente.
Request body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| servicio | string | Sí | Tipo de servicio |
| origen.address | string | No | Dirección legible del origen |
| origen.lat | number | Sí | Latitud del origen |
| origen.lng | number | Sí | Longitud del origen |
| destino.address | string | No | Dirección legible del destino |
| destino.lat | number | Sí | Latitud del destino |
| destino.lng | number | Sí | Longitud del destino |
| distanciaKm | number | No | Distancia en km (default: 5) |
| duracionMin | number | No | Duración en minutos (default: 10) |
| metodoPago | string | No | efectivo | card | wallet (default: efectivo) |
| pasajeroId | string | No | UID del pasajero VIAZU si existe |
Ejemplo — curl
curl -X POST https://us-central1-viazu-596b0.cloudfunctions.net/apiCreateRide \
-H "Authorization: Bearer vz_live_..." \
-H "Content-Type: application/json" \
-d '{
"servicio": "ejecutivo",
"origen": { "address": "Hotel Barceló Bávaro", "lat": 18.5680, "lng": -68.3733 },
"destino": { "address": "Aeropuerto Internacional de Punta Cana", "lat": 18.5674, "lng": -68.3633 },
"distanciaKm": 3.8,
"duracionMin": 12,
"metodoPago": "card"
}'
Respuesta exitosa 201
{
"tripId": "abc123xyz",
"estado": "pendiente",
"precio": 1475,
"moneda": "DOP",
"success": true
}
tripId para hacer polling del estado con /apiGetRideStatus.GET /apiGetRideStatus
Devuelve el estado actual de un viaje creado por tu cliente API.
Query params
| Param | Tipo | Requerido | Descripción |
|---|---|---|---|
| tripId | string | Sí | ID del viaje (devuelto por /apiCreateRide) |
Ejemplo — curl
curl "https://us-central1-viazu-596b0.cloudfunctions.net/apiGetRideStatus?tripId=abc123xyz" \ -H "Authorization: Bearer vz_live_..."
Respuesta exitosa 200
{
"tripId": "abc123xyz",
"estado": "aceptado",
"servicio": "ejecutivo",
"precio": 1475,
"moneda": "DOP",
"origen": { "address": "Hotel Barceló Bávaro", "latitude": 18.568, "longitude": -68.3733 },
"destino": { "address": "Aeropuerto PUJ", "latitude": 18.5674, "longitude": -68.3633 },
"conductorId": "uid_del_conductor"
}
POST /apiCancelRide
Cancela un viaje en estado pendiente o aceptado. No se puede cancelar un viaje ya en_curso o finalizado.
Request body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| tripId | string | Sí | ID del viaje a cancelar |
| motivo | string | No | Razón de la cancelación |
Ejemplo — curl
curl -X POST https://us-central1-viazu-596b0.cloudfunctions.net/apiCancelRide \
-H "Authorization: Bearer vz_live_..." \
-H "Content-Type: application/json" \
-d '{ "tripId": "abc123xyz", "motivo": "Cliente cambió de planes" }'
Respuesta exitosa 200
{
"tripId": "abc123xyz",
"estado": "cancelado",
"success": true
}
GET /apiEnterpriseHistory
Devuelve el historial de viajes creados por tu cliente API, con filtros opcionales.
Query params
| Param | Tipo | Requerido | Descripción |
|---|---|---|---|
| limit | number | No | Máx resultados (default: 50, máx: 200) |
| estado | string | No | Filtrar por estado: pendiente | aceptado | en_curso | finalizado | cancelado |
| desde | ISO 8601 | No | Fecha de inicio: 2026-01-01T00:00:00Z |
| hasta | ISO 8601 | No | Fecha de fin |
Ejemplo — curl
curl "https://us-central1-viazu-596b0.cloudfunctions.net/apiEnterpriseHistory?limit=10&estado=finalizado&desde=2026-06-01T00:00:00Z" \ -H "Authorization: Bearer vz_live_..."
Respuesta exitosa 200
{
"total": 2,
"clientId": "mi_cliente_id",
"viajes": [
{
"tripId": "abc123xyz",
"estado": "finalizado",
"servicio": "ejecutivo",
"precio": 1475,
"moneda": "DOP",
"origen": { "address": "Hotel Barceló", "latitude": 18.568, "longitude": -68.373 },
"destino": { "address": "Aeropuerto PUJ", "latitude": 18.567, "longitude": -68.363 },
"timestamp": "2026-06-25T14:30:00.000Z"
}
]
}
Scopes disponibles
Cada API key tiene uno o más scopes que definen qué endpoints puede usar.
| Scope | Endpoints permitidos |
|---|---|
| fare:estimate | /apiEstimateFare |
| ride:create | /apiCreateRide |
| ride:read | /apiGetRideStatus |
| ride:cancel | /apiCancelRide |
| enterprise:history | /apiEnterpriseHistory |
| * | Todos los endpoints |
Tipos de servicio
| servicio | Base (RD$) | Por km | Por min | Descripción |
|---|---|---|---|---|
| carro | 80 | 25 | 4 | Vehículo estándar |
| comfort | 120 | 35 | 5 | Vehículo confort |
| ejecutivo | 250 | 60 | 9 | Ejecutivo de lujo |
| premium | 400 | 85 | 12 | Premium de alto nivel |
| popular | 70 | 22 | 3 | Económico |
| moto | 40 | 18 | 2 | Motocicleta |
| mensajeria | 50 | 15 | 2 | Envío de documentos |
| paqueteria | 80 | 20 | 3 | Paquetes y encomiendas |
| acarreos | 250 | 50 | 8 | Mudanzas pequeñas |
| minibus | 350 | 55 | 7 | Minibús grupal |
* Los precios mostrados son tarifas base. El precio final incluye ITBIS 18% y el surge factor vigente al momento del viaje.
Estados de un viaje
| Estado | Descripción |
|---|---|
| pendiente | Viaje creado, buscando conductor |
| aceptado | Conductor asignado, en camino al origen |
| en_curso | Viaje en progreso |
| finalizado | Viaje completado exitosamente |
| cancelado | Viaje cancelado (por pasajero, conductor o API) |