Files
adif-api-reverse-engineering/API_DOCUMENTATION.md

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í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

{
  "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)