# Adif Elcano API - Ingeniería Reversa Documentación de la API de Adif (Elcano) obtenida mediante ingeniería reversa de la aplicación móvil. ## URLs Base ``` BASE_URL_STATIONS = https://estaciones.api.adif.es BASE_URL_CIRCULATION = https://circulacion.api.adif.es BASE_URL_ELCANOWEB = https://elcanoweb.adif.es/api/ BASE_URL_AVISA = https://avisa.adif.es/avisa-ws/api/ ``` ## Headers de Autenticación ### Para API de Circulaciones y Composiciones ``` Content-Type: application/json;charset=utf-8 User-key: f4ce9fbfa9d721e39b8984805901b5df ``` ### Para API de Estaciones ``` Content-Type: application/json;charset=utf-8 User-key: 0d021447a2fd2ac64553674d5a0c1a6f ``` ### Para Avisa Login ``` Authorization: Basic YXZpc3RhX2NsaWVudF9hbmRyb2lkOjh5WzZKNyFmSjwhXypmYXE1NyNnOSohNElwa2MjWC1BTg== ``` ### Para Suscripciones ``` Authorization: Basic ZGVpbW9zOmRlaW1vc3R0 X-CanalMovil-Authentication: X-CanalMovil-deviceID: X-CanalMovil-pushID: ``` ## Tokens ``` REGISTRATION_TOKEN = Bearer b9034774-c6e4-4663-a1a8-74bf7102651b ``` ## Endpoints ### Estaciones #### Obtener todas las estaciones ``` GET /portroyalmanager/secure/stations/allstations/reducedinfo/{token}/ Base: https://estaciones.api.adif.es Headers: User-key para estaciones ``` #### Obtener detalles de una estación ``` POST /portroyalmanager/secure/stations/onestation/ Base: https://estaciones.api.adif.es Headers: User-key para estaciones Body: { "stationCode": "string" } ``` #### Observaciones de estación ``` POST /portroyalmanager/secure/stationsobservations/ Base: https://estaciones.api.adif.es Headers: User-key para estaciones Body: { "stationCodes": ["string"] // Array de códigos de estación (requerido) } Ejemplo: { "stationCodes": ["60000", "71801"] } ``` ### Circulaciones (Trenes) #### Salidas (Departures) ``` POST /portroyalmanager/secure/circulationpaths/departures/traffictype/ Base: https://circulacion.api.adif.es Headers: User-key para circulaciones Body: { "commercialService": "YES|NOT|BOTH", // Estado del servicio comercial "commercialStopType": "YES|NOT|BOTH", // Tipo de parada comercial "destinationStationCode": "string|null", // Código estación destino (opcional) "originStationCode": "string|null", // Código estación origen (opcional) "page": { "pageNumber": number // Número de página }, "stationCode": "string|null", // Código estación (opcional) "trafficType": "CERCANIAS|AVLDMD|OTHERS|TRAVELERS|GOODS|ALL" // Tipo de tráfico } Ejemplo: { "commercialService": "BOTH", "commercialStopType": "BOTH", "destinationStationCode": null, "originStationCode": null, "page": { "pageNumber": 0 }, "stationCode": "60000", "trafficType": "ALL" } ``` #### Llegadas (Arrivals) ``` POST /portroyalmanager/secure/circulationpaths/arrivals/traffictype/ Base: https://circulacion.api.adif.es Headers: User-key para circulaciones Body: Mismo formato que departures (TrafficCirculationPathRequest) ``` #### Entre estaciones ``` POST /portroyalmanager/secure/circulationpaths/betweenstations/traffictype/ Base: https://circulacion.api.adif.es Headers: User-key para circulaciones Body: Mismo formato que departures (TrafficCirculationPathRequest) ``` #### Una ruta específica ``` POST /portroyalmanager/secure/circulationpathdetails/onepaths/ Base: https://circulacion.api.adif.es Headers: User-key para circulaciones Body: { "allControlPoints": boolean|null, // Todos los puntos de control (opcional) "commercialNumber": "string|null", // Número comercial del tren (opcional) "destinationStationCode": "string|null", // Código estación destino (opcional) "launchingDate": number|null, // Fecha de lanzamiento en timestamp (Long) (opcional) "originStationCode": "string|null" // Código estación origen (opcional) } Ejemplo: { "allControlPoints": true, "commercialNumber": "04138", "destinationStationCode": "60000", "launchingDate": 1733356800000, "originStationCode": "71801" } ``` #### Varias rutas ``` POST /portroyalmanager/secure/circulationpathdetails/severalpaths/ Base: https://circulacion.api.adif.es Headers: User-key para circulaciones Body: Mismo formato que onepaths (OneOrSeveralPathsRequest) ``` ### Composiciones #### Composición de tren ``` POST /portroyalmanager/secure/circulationpaths/compositions/path/ Base: https://circulacion.api.adif.es Headers: User-key para circulaciones Body: Same as onepaths request ``` ### Avisa (Sistema de incidencias) #### Login ``` POST /avisa-ws/api/token Base: https://avisa.adif.es Headers: Basic auth token para Avisa Query params: - grant_type: "password" - username: - password: ``` #### Registrar cliente ``` POST /avisa-ws/api/v1/client Base: https://avisa.adif.es ``` #### Estaciones Avisa ``` GET /avisa-ws/api/v1/station Base: https://avisa.adif.es ``` #### Categorías de estación ``` GET /avisa-ws/api/v1/category Base: https://avisa.adif.es ``` #### Incidencias ``` GET /avisa-ws/api/v1/incidence POST /avisa-ws/api/v1/incidence GET /avisa-ws/api/v1/incidence/{incidenceId} Base: https://avisa.adif.es ``` ### Suscripciones #### Listar suscripciones ``` GET /api/subscriptions?platform=300 Base: https://elcanoweb.adif.es Headers: Basic auth + X-CanalMovil headers ``` #### Crear suscripción ``` POST /api/subscriptions Base: https://elcanoweb.adif.es Headers: Basic auth + X-CanalMovil headers ``` #### Silenciar suscripción ``` PUT /api/subscriptions/{id}/mute Base: https://elcanoweb.adif.es Headers: Basic auth + X-CanalMovil headers ``` ## Tipos de Datos ### TrafficType (Tipos de tráfico) - `CERCANIAS` - Trenes de cercanías - `AVLDMD` - Alta Velocidad, Larga y Media Distancia - `OTHERS` - Otros tipos de tráfico - `TRAVELERS` - Viajeros - `GOODS` - Mercancías - `ALL` - Todos los tipos ### State (Estados para comercialService y comercialStopType) - `YES` - Sí - `NOT` - No - `BOTH` - Ambos ### PageInfoDTO ```json { "pageNumber": 0 } ``` ## Notas de Seguridad - La app usa certificate pinning con claves públicas específicas - Los tokens están hardcodeados en la aplicación - Las User-keys son diferentes para cada servicio (estaciones vs circulaciones) - El token de registro `b9034774-c6e4-4663-a1a8-74bf7102651b` está en el código ## Notas de Implementación Esta documentación se ha obtenido mediante ingeniería reversa del código decompilado de la aplicación Android de ADIF Elcano. Clases principales analizadas: - `com.adif.elcanomovil.serviceNetworking.circulations.model.request.TrafficCirculationPathRequest` - `com.adif.elcanomovil.serviceNetworking.circulations.model.request.OneOrSeveralPathsRequest` - `com.adif.elcanomovil.serviceNetworking.stationObservations.model.StationObservationsRequest` - `com.adif.elcanomovil.serviceNetworking.circulations.model.request.CirculationPathRequest` (interface) - `com.adif.elcanomovil.serviceNetworking.circulations.model.request.TrafficType` (enum)