VIAZU API — B2B

v1.0

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.

Para obtener credenciales de API contáctanos en api@viazu.app. El equipo VIAZU creará tu cliente y generará tu primera API key desde el panel de administración.

Autenticación

Cada petición debe incluir tu API key en el header Authorization como Bearer token:

Authorization: Bearer vz_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
⚠️ Nunca expongas tu API key en código cliente (JavaScript del navegador, apps móviles). Úsala exclusivamente en tu backend.

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"
  }
}
HTTPCódigoDescripción
400invalid_paramsParámetro faltante o inválido
400invalid_serviceServicio no reconocido
401unauthenticatedAPI key ausente, inválida o expirada
403permission_deniedScope insuficiente o cliente suspendido
404not_foundViaje no encontrado
405method_not_allowedMétodo HTTP incorrecto
409invalid_stateOperación inválida para el estado actual
429rate_limitedLímite de peticiones por minuto excedido
500internalError 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.

Para límites más altos contacta a nuestro equipo B2B.

POST /apiEstimateFare

POST /apiEstimateFare Scope: fare:estimate

Calcula el precio estimado de un viaje incluyendo el factor surge actual y el ITBIS.

Request body

CampoTipoRequeridoDescripción
serviciostringTipo de servicio (ver Servicios)
distanciaKmnumberDistancia estimada en kilómetros
duracionMinnumberDuració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

POST /apiCreateRide Scope: ride:create

Crea un nuevo viaje. El sistema de matching asignará un conductor disponible automáticamente.

Request body

CampoTipoRequeridoDescripción
serviciostringTipo de servicio
origen.addressstringNoDirección legible del origen
origen.latnumberLatitud del origen
origen.lngnumberLongitud del origen
destino.addressstringNoDirección legible del destino
destino.latnumberLatitud del destino
destino.lngnumberLongitud del destino
distanciaKmnumberNoDistancia en km (default: 5)
duracionMinnumberNoDuración en minutos (default: 10)
metodoPagostringNoefectivo | card | wallet (default: efectivo)
pasajeroIdstringNoUID 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
}
Guarda el tripId para hacer polling del estado con /apiGetRideStatus.

GET /apiGetRideStatus

GET /apiGetRideStatus?tripId={id} Scope: ride:read

Devuelve el estado actual de un viaje creado por tu cliente API.

Query params

ParamTipoRequeridoDescripción
tripIdstringID 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

POST /apiCancelRide Scope: ride:cancel

Cancela un viaje en estado pendiente o aceptado. No se puede cancelar un viaje ya en_curso o finalizado.

Request body

CampoTipoRequeridoDescripción
tripIdstringID del viaje a cancelar
motivostringNoRazó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

GET /apiEnterpriseHistory Scope: enterprise:history

Devuelve el historial de viajes creados por tu cliente API, con filtros opcionales.

Query params

ParamTipoRequeridoDescripción
limitnumberNoMáx resultados (default: 50, máx: 200)
estadostringNoFiltrar por estado: pendiente | aceptado | en_curso | finalizado | cancelado
desdeISO 8601NoFecha de inicio: 2026-01-01T00:00:00Z
hastaISO 8601NoFecha 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.

ScopeEndpoints permitidos
fare:estimate/apiEstimateFare
ride:create/apiCreateRide
ride:read/apiGetRideStatus
ride:cancel/apiCancelRide
enterprise:history/apiEnterpriseHistory
*Todos los endpoints

Tipos de servicio

servicioBase (RD$)Por kmPor minDescripción
carro80254Vehículo estándar
comfort120355Vehículo confort
ejecutivo250609Ejecutivo de lujo
premium4008512Premium de alto nivel
popular70223Económico
moto40182Motocicleta
mensajeria50152Envío de documentos
paqueteria80203Paquetes y encomiendas
acarreos250508Mudanzas pequeñas
minibus350557Minibú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

EstadoDescripción
pendienteViaje creado, buscando conductor
aceptadoConductor asignado, en camino al origen
en_cursoViaje en progreso
finalizadoViaje completado exitosamente
canceladoViaje cancelado (por pasajero, conductor o API)
VIAZU — API B2B v1.0 · República Dominicana · api@viazu.app

SDK, Webhooks y Sandbox