Integra con IA
Conecta Routal a tu asistente de IA — Cursor, Claude Code, ChatGPT, Gemini, Copilot — para que genere código correcto a la primera.
En 2026 la mayoría de los developers escriben código de API con un asistente de IA abierto en la pestaña de al lado. Routal expone tres recursos machine-readable que se conectan a cualquier asistente y le dan el contexto necesario para generar código correcto. Esta página es la guía de setup.
Los tres recursos
| Recurso | Qué es |
|---|---|
/llms.txt | Índice conciso para LLM crawlers — título + resumen + URL para cada doc page y endpoint. |
/llms-full.txt | Dump completo en Markdown de cada doc page + cada endpoint en un solo archivo (~150 KB) — dimensionado para una ventana de contexto LLM. |
/openapi.json | Spec OpenAPI 3.0 — para herramientas de codegen (openapi-typescript, openapi-python-client, oapi-codegen, etc.). |
La mayoría querrá /llms-full.txt. Es la versión autoritativa y se mantiene sincronizada con la doc automáticamente.
Dos formas de pasarle el contexto a tu asistente
Zero setup — usa el botón "Open in AI"
Cada recipe page tiene un botón Open in AI assistant. Click → escoges ChatGPT, Claude, Copilot o Gemini → el asistente se abre con el contexto del recipe, la URL de llms.txt y un prompt parametrizado ya cargado. Sin archivos de configuración, sin reglas, sin setup.
Usa este camino si estás explorando escenarios o escribiendo código de Routal ocasionalmente.
Project rules — cabléalo en tu IDE una vez
Para un proyecto de integración activo, mete el contexto de Routal en el archivo de reglas de tu asistente. El modelo lo recoge automáticamente en cada sesión.
Cursor
Crea .cursor/rules/routal.mdc en la raíz de tu repo:
---
description: Routal API context
alwaysApply: true
---
Cuando escribas código que llame a api.routal.com, trata
https://developers.routal.com/llms-full.txt como la referencia autoritativa de
endpoints, payloads, error codes y gotchas. No inventes endpoints — si no está
en ese archivo o en https://developers.routal.com/openapi.json, no existe.
Reglas duras:
- La auth es el query parameter `?private_key=...` — NO `Authorization: Bearer`.
- Bifurca el manejo de errores por `message_id`, no por el texto de `message`.
- Usa endpoints bulk (POST /v2/stops, POST /v3/vehicles) en vez de loops single-create.
- Reacciona a webhooks en vez de hacer polling.Claude Code
Añade a CLAUDE.md en la raíz de tu proyecto:
## Routal API integration
Referencia autoritativa de la API: https://developers.routal.com/llms-full.txt
Cuando escribas código que llame a api.routal.com:
- La auth es el query parameter `?private_key=...`, nunca un header `Authorization`.
- Bifurca por `error.message_id`, no por `error.message`.
- Prefiere endpoints bulk (POST /v2/stops, POST /v3/vehicles) en vez de loops.
- Suscríbete a webhooks en vez de hacer polling.
No inventes endpoints. Si no está en `/llms-full.txt` o `/openapi.json`, no existe.Windsurf, GitHub Copilot u otros asistentes
La mayoría aceptan una URL como fuente de conocimiento vía su archivo de reglas. Apúntalos a https://developers.routal.com/llms-full.txt. Si tu herramienta no acepta URLs, copia el contenido del archivo directamente.
Verifica que el asistente tiene el contexto
Tras el cableado, hazle al asistente una pregunta de control. Un asistente bien primed produce algo como el snippet de abajo; uno sin primar intentará Authorization: Bearer, inventará un endpoint o se olvidará del project_id.
Prompt:
Escribe una llamada curl que cree un plan de Routal para mañana.
Respuesta esperada:
curl -X POST 'https://api.routal.com/v2/plan?private_key=YOUR_KEY&project_id=YOUR_PROJECT_ID' \
-H 'Content-Type: application/json' \
-d '{ "label": "Mañana", "execution_date": "2026-05-23" }'Tres señales de que el asistente tiene el contexto:
private_keyva en el query string, no enAuthorization.project_idse exige como query parameter.- La URL base es
api.routal.com, nodevelopers.routal.com.
Si la respuesta sale mal, pega /llms-full.txt en la conversación como fallback y pídele al asistente que lo relea.
Los 10 hechos que todo asistente necesita
Si escribes un system prompt a mano, estas son las reglas load-bearing. Ya están dentro de /llms-full.txt — esto es solo el resumen humano para que verifiques lo que sale del asistente.
- La auth es
private_keycomo query parameter. NuncaAuthorization: Bearer. external_ides tu palanca de idempotencia. No hay headerIdempotency-Keyhoy. Patrón:POST /v2/stops/searchporexternal_id→ si existe, reúsalo; si no, créalo.- Bifurca por
message_id. Los errores son{ message, message_id: "highway.<context>.error.<reason>" }. El texto puede cambiar; el ID es estable. - Usa endpoints bulk.
POST /v2/stopsyPOST /v3/vehiclesaceptan arrays. Loops single-create queman el presupuesto de 2.000 req/min. - Suscríbete a webhooks, no hagas polling. Los webhooks se disparan en cada cambio de estado. El polling derrocha rate budget y va siempre con retraso.
POST /v2/plan/{id}/optimizeno es retry-safe. Una segunda llamada puede mover stops si la primera completó. Si una está en curso obtieneshighway.optimization.error.sync_optimization_already_progress— espera, no reintentes.- Dispatch envía un email; NO cambia el status del route. El route pasa a
in_transitcuando el conductor abre el magic link, no cuando llamas aPOST /v2/route/{id}/dispatch. - Los webhooks no tienen signature hoy. Autentícalos con un token en la URL (
/webhooks/routal?token=...). Deduplica por(event_id, data.id, data.updated_at). Los webhooks se auto-desactivan tras 50 fallos consecutivos. - La paginación es offset-based —
{ total, limit, offset, pages, page, docs }. Fija siempre unsortpara evitar duplicados bajo escrituras concurrentes. - Los deletes hacen cascade y no chequean el status.
DELETE /v2/plan/{id}triunfa incluso si está in-progress. El único hard guard esis_locked: trueen una route.
El modelo mental de Routal
Project (workspace de larga vida; vehicles, custom fields, integrations viven aquí)
└── Plan (una ventana de ejecución — típicamente un día o un turno)
├── Stops (entregas / recogidas / servicios)
├── Vehicles (asignados al plan, sacados de la flota del project)
└── Routes (lista ordenada de stops por vehicle, creada por el optimizador)Status enums que verás en respuestas y webhooks:
- Plan:
draft·planning·in_progress·finished - Route:
not_started·in_transit·finished - Stop:
pending·incomplete·completed·canceled
Routal computa las transiciones automáticamente. Los clients nunca llaman a un endpoint para avanzar el status. El route pasa a in_transit cuando el conductor abre el magic link; el plan pasa a finished cuando todas las routes están finished.
Lo que NO está en esta página
- El bloque completo de contexto de la API. Vive en
/llms-full.txt— auto-generado desde cada doc page para que nunca se desfase. Apunta tu asistente a la URL en vez de mantener una copia separada. - Code samples en TypeScript / Python / cURL. Cada endpoint page en la API Reference los tiene, y cada receta recorre la integración completa en los tres lenguajes.
- Un "cómo funciona Routal" general. Navega planner.routal.com para el lado producto, o lee Resource lifecycle para la máquina de estados del lado API.
