Inicio rápido
De cero a una petición real contra datos de TUSSAM en cinco pasos. Todo lo de aquí usa el plan gratis — no hace falta pagar nada para seguir esta guía completa.
-
Pide tu clave de API
No hay auto-registro todavía — escribe a
Pide tu clave →hola@busillo.appcontando qué quieres construir y te mandamos una clave (formatobsl_...) a mano. Suele ser rápido, pero es una persona la que la emite, no un formulario. -
Haz tu primera petición
Todo vive bajo
https://devsapi.busillo.app. Manda la clave en la cabeceraX-API-Key(o como?key=si estás probando algo rápido desde el navegador). Prueba con el catálogo de líneas:Terminal# sustituye bsl_... por tu clave real curl -H "X-API-Key: bsl_..." \ https://devsapi.busillo.app/v1/lineas
Respuesta{ "lineas": [ { "id": "1", "nombre": "01", "nombreLargo": "Plg. Norte H. Virgen del Rocio" }, { "id": "2", "nombre": "02", "nombreLargo": "Puerta Triana - Heliopolis" }, … ], "atribucion": "Datos GTFS de TUSSAM, distribuidos vía NAP — MITRAMS" } -
Consulta el horario de una línea real
:idacepta elrouteIdinterno o el nombre corto de la línea (el que va en el rótulo del bus, p.ej. "01"). Aquí, la línea 01 (Plaza de Armas / Polígono Norte ↔ Hospital Virgen del Rocío):Terminalcurl -H "X-API-Key: bsl_..." \ https://devsapi.busillo.app/v1/lineas/01/horarioDevuelve las salidas programadas por sentido, con la primera parada de cada uno — es el mismo dato que usa la propia app de Busillo, ya parseado del GTFS. Formato completo de la respuesta en el grupo de endpoints "Líneas".
-
Busca una parada y sus avisos
/v1/paradasda el catálogo completo (código, nombre, coordenadas, líneas que pasan);/v1/paradas/:codigoel detalle de una./v1/avisosda los cortes, desvíos e incidencias activos de TUSSAM ahora mismo — sin parámetros, es un único listado:Terminalcurl -H "X-API-Key: bsl_..." \ https://devsapi.busillo.app/v1/paradas/1092 curl -H "X-API-Key: bsl_..." \ https://devsapi.busillo.app/v1/avisos
-
Ejemplo mínimo funcionando
Un script de Node de menos de 15 líneas que pide el horario de una línea y muestra la próxima salida en día laborable — sin librerías, solo
fetch(Node 18+):proxima-salida.mjsconst API_KEY = "bsl_..."; const res = await fetch( "https://devsapi.busillo.app/v1/lineas/01/horario", { headers: { "X-API-Key": API_KEY } } ); if (!res.ok) { // 401 = clave inválida, 429 = límite de 60/min superado throw new Error(`${res.status}: ${(await res.json()).error}`); } const horario = await res.json(); const ahora = new Date().toTimeString().slice(0, 5); const siguiente = horario.salidas_laborable.find(h => h > ahora); console.log(`Línea ${horario.nombre} (${horario.sentido}): próxima salida ${siguiente ?? "no hay más hoy"}`);
Con eso ya tienes lo básico: catálogo, horario y avisos, todo en el plan gratis. El siguiente paso natural es mirar casos de uso reales para ver cómo se combina esto en un widget, un bot o una intranet completa.
Errores que te vas a encontrar
Todos devuelven JSON con un campo "error" — nunca una página HTML ni un 200 con datos vacíos disfrazando el fallo.
| Código | Motivo | Qué hacer |
|---|---|---|
401 | Falta la clave o no es válida | Revisa la cabecera X-API-Key o el parámetro ?key= |
404 | Línea o parada que no existe con ese id/código | Comprueba el id contra /v1/lineas o /v1/paradas |
429 | Más de 60 peticiones/minuto con esa clave | Espera un minuto o cachea la respuesta en tu lado — el GTFS estático no cambia cada segundo |
501 | /v1/paradas/:codigo/tiempos — pendiente de resolver | Lee el aviso completo en endpoints antes de depender de este |
¿Listo para construir algo?
Revisa casos de uso reales con los endpoints exactos de cada uno, o pide tu clave directamente si ya sabes lo que quieres montar.