Documentación API OptiRoad
Introducción
La API de OptiRoad le permite optimizar rutas de entrega, geocodificar direcciones y gestionar contactos mediante programación. El acceso requiere un plan Business y una clave API.
URL base:
https://optiroad.io/api/v1Todas las solicitudes deben incluir el encabezado Authorization . Las respuestas son JSON. Las fechas son cadenas ISO 8601. Las distancias están en kilómetros, las duraciones en minutos.
Autenticación
Autentíquese usando su clave API en el encabezado Authorization :
curl https://optiroad.io/api/v1/usage \
-H "Authorization: Bearer or_live_YOUR_KEY"Las claves API se crean en Ajustes → Claves API. Cada clave se muestra solo una vez en la creación. Máximo 5 claves por cuenta.
Ejemplo JavaScript
const BASE = "https://optiroad.io/api/v1";
const KEY = process.env.OPTIROAD_API_KEY;
const res = await fetch(`${BASE}/usage`, {
headers: { Authorization: `Bearer ${KEY}` },
});
const data = await res.json();Ejemplo Python
import os, requests
BASE = "https://optiroad.io/api/v1"
KEY = os.environ["OPTIROAD_API_KEY"]
resp = requests.get(
f"{BASE}/usage",
headers={"Authorization": f"Bearer {KEY}"}
)
data = resp.json()Optimizar una ruta
/api/v1/optimizeCalcula el orden de visita óptimo para un conjunto de direcciones.Cuerpo de la solicitud
{
"addresses": [
{ "label": "Dépôt", "lat": 48.8566, "lng": 2.3522 },
{ "label": "Client A", "lat": 48.8737, "lng": 2.2950 },
{ "label": "Client B", "lat": 48.8416, "lng": 2.3224 }
],
"options": {
"mode": "driving",
"startAddress": 0,
"roundTrip": true
}
}Parámetros
| Campo | Tipo | Descripción |
|---|---|---|
| addresses | array | Obligatorio. Lista de paradas (mín 2, máx 150). Cada elemento: { label, lat, lng }. |
| options.mode | string | Perfil de enrutamiento: driving (por defecto), walking, cycling. |
| options.startAddress | number | Índice de la dirección de inicio/depósito en el array (por defecto: 0). |
| options.roundTrip | boolean | Retorno al inicio después de la última parada (por defecto: true). |
Respuesta
{
"optimizedOrder": [0, 2, 1],
"totalDistanceKm": 12.4,
"totalDurationMin": 22,
"legs": [
{ "from": 0, "to": 2, "distanceKm": 5.1, "durationMin": 9 },
{ "from": 2, "to": 1, "distanceKm": 4.2, "durationMin": 8 },
{ "from": 1, "to": 0, "distanceKm": 3.1, "durationMin": 5 }
],
"googleMapsUrl": "https://www.google.com/maps/dir/...",
"usageRemaining": 487
}Geocodificar una dirección
/api/v1/geocodeConvierte una dirección en texto libre a coordenadas lat/lng.// Request
{ "address": "10 Downing Street, London" }
// Response
{
"lat": 51.5034,
"lng": -0.1276,
"label": "10 Downing Street, Westminster, London, UK"
}Contactos
Gestione su libreta de direcciones guardada. Todas las operaciones están limitadas a su cuenta.
/api/v1/contactsListar contactos (paginado).GET /api/v1/contacts?page=1&limit=20&search=Paris{
"contacts": [
{
"id": "clx...",
"name": "Entrepôt Paris",
"address": "12 rue de Rivoli, 75001 Paris",
"lat": 48.856,
"lng": 2.352,
"phone": "+33 1 23 45 67 89",
"createdAt": "2026-03-01T10:00:00.000Z"
}
],
"total": 1,
"page": 1,
"limit": 20
}/api/v1/contactsCrear un contacto.// Request
{
"name": "Entrepôt Paris",
"address": "12 rue de Rivoli, 75001 Paris",
"lat": 48.856,
"lng": 2.352,
"phone": "+33 1 23 45 67 89"
}
// Response — 201 Created
{ "id": "clx...", "name": "...", ... }/api/v1/contacts/:idActualizar un contacto./api/v1/contacts/:idEliminar un contacto.// Response — 204 No ContentVehículos
/api/v1/vehiclesListar vehículos.GET /api/v1/vehicles?status=active&type=van{
"vehicles": [
{
"id": "clx...",
"name": "Camion 1",
"type": "truck",
"status": "active",
"depotAddress": "ZI Nord, 59000 Lille",
"depotLat": 50.651,
"depotLng": 3.074
}
]
}Historial de optimizaciones
/api/v1/historyListar optimizaciones pasadas (paginado).GET /api/v1/history?page=1&limit=20&from=2026-01-01&to=2026-04-01{
"items": [
{
"id": "clx...",
"addressCount": 8,
"totalDistanceKm": 34.2,
"totalDurationMin": 61,
"createdAt": "2026-03-15T08:30:00.000Z"
}
],
"total": 42
}Uso de la API
/api/v1/usageContadores de solicitudes para la clave actual.{
"keyPrefix": "or_live_ab12",
"today": { "optimize": 3, "geocode": 12 },
"thisMonth": { "optimize": 47, "geocode": 203 },
"allTime": { "optimize": 312, "geocode": 1024 }
}Límites de velocidad
Los límites se aplican por clave API. Los encabezados de respuesta siempre incluyen el estado de la ventana actual.
| Tipo de endpoint | Por minuto | Por hora | Por día |
|---|---|---|---|
| Ligero (geocode, contacts, vehicles) | 100 | 1 000 | — |
| Pesado (optimize) | 10 | 100 | 500 |
Cuando se alcanza un límite, la API devuelve 429 Too Many Requests con un encabezado Retry-After (segundos).
Encabezados de límite de velocidad
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1744012800 # Unix timestamp (UTC)
Retry-After: 38 # Solo presente en 429Códigos de error
| HTTP | error | Significado |
|---|---|---|
| 401 | UNAUTHORIZED | Encabezado Authorization faltante o malformado. |
| 401 | INVALID_API_KEY | Clave no encontrada o revocada. |
| 402 | QUOTA_EXCEEDED | Cuota mensual de optimizaciones alcanzada. Actualice su plan. |
| 403 | PLAN_REQUIRED | Este endpoint requiere un plan Business. |
| 422 | VALIDATION_ERROR | El cuerpo de la solicitud no pasó la validación (detalles en message). |
| 422 | MAX_KEYS_REACHED | Ya tiene 5 claves API. Revoque una primero. |
| 429 | RATE_LIMIT_EXCEEDED | Demasiadas solicitudes. Compruebe Retry-After. |
| 500 | INTERNAL_ERROR | Error de servidor inesperado. Por favor, reintente. |
Formato de respuesta de error
{
"error": "QUOTA_EXCEEDED",
"message": "Monthly quota reached (5/5). Upgrade to Pro for unlimited optimizations.",
"statusCode": 402
}¿Preguntas? Contacte support@optiroad.io
OptiRoad API v1 · 2026