Acceso unificado a la API de UTE Mueve
Esta es la dashboard del puente público a movilidadelectrica.ute.com.uy/api/v2. Gestiona el ciclo de vida del JWT anónimo internamente, valida las cédulas uruguayas con el dígito verificador y expone una superficie REST tipada con docs interactivas.
Acceso rápido
Mapa interactivo
Vista previa con OpenStreetMap + Leaflet, filtros en vivo y snippet de código en TS/JS/cURL/Python.
Referencia de la API
Explorá los endpoints con ejemplos reales saneados, esquemas Zod y "Probar" inline. Renderizado con Scalar.
Especificación OpenAPI 3.1
JSON generado en vivo a partir de los esquemas Zod. Listo para generadores de código.
Verificación de estado
Hace un ida-y-vuelta real contra UTE (token + GET configuration). Devuelve OK, latencia y backend de caché.
Salud
Liveness simple, sin tocar upstream. Útil para health-checks de Vercel o balanceadores.
Informe de seguridad
12 hallazgos del análisis estático del APK, incluyendo el IDOR crítico F-05.
VR-001 — IDOR Crítico
Reporte formal de divulgación: con token anónimo y 8 dígitos de cédula uruguaya se exponen PII y datos parciales de tarjeta de crédito.
Parámetros de búsqueda de estaciones
Todos los parámetros son opcionales y aceptan arrays. Sin parámetros, la búsqueda devuelve todas las estaciones disponibles. La columna Valor muestra los códigos que acepta el SDK y los endpoints /stations/search y GET /stations?.... Las traducciones a las cadenas verbosas de UTE las maneja el bridge internamente.
connectorTypes — tipo de conector físico
Norma del enchufe del cargador. El vehículo determina cuál podés usar.
"Tipo 2" | AC trifásico europeo (Mennekes). Carga lenta/media en casa o estaciones públicas AC. |
"CCS2" | DC rápido combinado europeo. El estándar dominante para autos modernos en Uruguay. |
"CHAdeMO" | DC rápido japonés (Nissan Leaf, etc.). Compatibilidad limitada. |
"GB/T" | DC rápido chino. Presente sobre todo en flotas asiáticas (BYD, etc.). |
statuses — estado del conector ahora mismo
Estado reportado por la estación. Por defecto la búsqueda usa ['available'].
"available" | Disponible: libre para iniciar una carga. |
"charging" | Cargando: actualmente en uso. |
"no-comm" | Sin Comunicación: la estación no reporta al servidor. |
"unavailable" | No Disponible: fuera de servicio. |
paymentTypes — métodos de pago aceptados
Cómo se autentica el inicio de carga en la estación.
"rfid" | Tarjeta RFID UTE (tarjeta física aproximada al lector). |
"app" | App móvil (UTE Mueve / código QR / carga remota). |
cables — provisión de cable
Indica si la estación trae su propio cable o si hay que llevarlo.
"with" | Con cable: la estación lo provee (más rápido enchufar). |
"without" | Sin cable: hay que conectar uno propio (típico Tipo 2 AC). |
networks — operador de la red de carga
Operador o "red" a la que pertenece la estación. La tarifa y la app varían por red.
"PUBLIC" | Pública: red propia de UTE, accesible para todos. |
"TAXI" | Taxi: red dedicada a la flota de taxis eléctricos. |
"DMC" | DMC: operador externo (EMSP). Roaming. |
"ONE" | eOne: operador externo (EMSP). Roaming. |
powers — potencia en kW
Filtra por potencia del cargador. Pasá un array de números.
[0] | Cualquier potencia (default si no se especifica). |
[60] | Solo cargadores rápidos de 60 kW. |
[22, 50, 60] | Cualquiera entre 22, 50 o 60 kW. |
Defaults sin parámetros: todas las categorías marcadas excepto statuses, que se restringe a ['available']. Esto replica el comportamiento "Mostrar disponibles" de la app UTE Mueve.
Endpoints disponibles 18 rutas
| Método | Ruta | Descripción | Tags |
|---|---|---|---|
| GET | /configuration/appversion | Versión mínima soportada de la app | Configuration |
| POST | /stations/search | Búsqueda ergonómica con enums (CCS2, available, PUBLIC…) | Stations |
| GET | /stations?types=CCS2&statuses=available | Búsqueda via query string (URL compartible) | Stations |
| GET | /stations/available | Atajo: todas las estaciones disponibles ahora | Stations |
| POST | /station/statusFiltered | Body UTE verbatim (power-user) | Stations Advanced |
| POST | /station/renewEnergy | Energía renovable en un rango de fechas | Stations |
| GET | /customer/card/{userId} | Tarjetas registradas del cliente | Customer |
| POST | /customer/card/register | Registrar tarjeta (gated) | Customer Writes |
| POST | /customer/card/unregister | Desregistrar tarjeta (gated) | Customer Writes |
| GET | /card/{userId} | Lista de tarjetas UTE del cliente | Cards |
| POST | /card/accounts | Buscar cuenta por CI o documento | Accounts |
| GET | /network/{userId} | Redes habilitadas del cliente | Networks |
| GET | /remotecharge/user/{userId} | Historial de cargas del cliente | Remote Charge |
| GET | /remotecharge/transaction/{transactionId} | Detalle de una transacción de carga | Remote Charge |
| POST | /remotecharge/connector/status | Estado de un conector en vivo | Remote Charge |
| POST | /remotecharge/start | Iniciar carga remota (gated) | Remote Charge Writes |
| POST | /remotecharge/stop | Detener carga remota (gated) | Remote Charge Writes |
| POST | /notification/register | Registrar token FCM (gated) | Notifications Writes |
Los endpoints con etiqueta Writes requieren ENABLE_WRITE_ENDPOINTS=true en el deployment. Por defecto devuelven 503 WRITES_DISABLED.
Uso desde TypeScript
SDK @ute-mueve/sdk
Cliente isomorfo, cero dependencias en runtime, ESM + CJS.
import { UteMueveClient } from '@ute-mueve/sdk';
// Modo directo (Node.js) — SDK habla con UTE directamente,
// maneja el JWT anónimo y el uniquekeyuser por vos.
const client = new UteMueveClient();
// Browser? Usá el bridge para evitar CORS:
// const client = new UteMueveClient({ baseUrl: 'https://ute-mueve.vercel.app' });
// Todas las estaciones disponibles ahora
const open = await client.stations.available();
// Filtros ergonómicos
const ccs2 = await client.stations.search({
connectorTypes: ['CCS2', 'CHAdeMO'],
statuses: ['available'],
networks: ['PUBLIC'],
});
// A 5 km de Plaza Independencia (Haversine client-side)
const nearby = await client.stations.near({
lat: -34.9061, lng: -56.1990, radiusMeters: 5000,
});
cURL
El bridge inyecta el token; el cliente sólo manda JSON.
# Round-trip vivo a UTE
curl https://ute-mueve.vercel.app/status
# Búsqueda ergonómica
curl -X POST https://ute-mueve.vercel.app/stations/search \
-H 'content-type: application/json' \
-d '{"connectorTypes":["CCS2","CHAdeMO"],"statuses":["available"],"networks":["PUBLIC"]}'
# Búsqueda via GET (URL compartible)
curl 'https://ute-mueve.vercel.app/stations?types=CCS2,CHAdeMO&statuses=available&networks=PUBLIC'
# Lookup por CI uruguaya
curl -X POST https://ute-mueve.vercel.app/card/accounts \
-H 'content-type: application/json' \
-d '{"docType":"CI","docNumber":"12345672","onlyUte":false}'
Aviso de seguridad
⚠️ IDOR crítico en la API upstream
El JWT anónimo de UTE no está atado a un usuario. Un atacante con conexión a internet y una cédula uruguaya válida puede leer nombre, apellido, BIN + últimos 4 dígitos de la tarjeta de crédito vinculada, mes/año de vencimiento, marca y payerCardId de Mercado Pago. Detalle completo: Reporte VR-001. Aviso técnico ampliado: SEGURIDAD.md.