6.9 KiB
6.9 KiB
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: <token>
X-CanalMovil-deviceID: <device_id>
X-CanalMovil-pushID: <push_id>
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: <username>
- password: <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íasAVLDMD- Alta Velocidad, Larga y Media DistanciaOTHERS- Otros tipos de tráficoTRAVELERS- ViajerosGOODS- MercancíasALL- Todos los tipos
State (Estados para comercialService y comercialStopType)
YES- SíNOT- NoBOTH- Ambos
PageInfoDTO
{
"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-74bf7102651bestá 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.TrafficCirculationPathRequestcom.adif.elcanomovil.serviceNetworking.circulations.model.request.OneOrSeveralPathsRequestcom.adif.elcanomovil.serviceNetworking.stationObservations.model.StationObservationsRequestcom.adif.elcanomovil.serviceNetworking.circulations.model.request.CirculationPathRequest(interface)com.adif.elcanomovil.serviceNetworking.circulations.model.request.TrafficType(enum)