AskaCharge es una plataforma SaaS multi-tenant de gestión de cargadores de vehículos eléctricos (CSMS — Charging Station Management System). Backend en FastAPI (Python, async) con WebSocket nativo para OCPP, base de datos PostgreSQL, y frontend en React. Cada marca (brand) gestiona su propia flota de cargadores, tarifas, clientes y facturación de forma aislada, bajo un mismo despliegue.
Soporta OCPP 1.6J y OCPP 2.0.1 en el mismo servidor, testado con el OCTT (OCPP Compliance Testing Tool) de la Open Charge Alliance. La URL base de la API y el WebSocket es:
https://askacharge.com/askacharge
Autenticación por JWT (Bearer token), obtenido vía POST /api/auth/login
(OAuth2 password flow: username + password en form-data).
El access token expira a los 30 minutos; hay refresh token (cookie httpOnly) para renovarlo sin volver a hacer login.
| Rol | Alcance |
|---|---|
superadmin | Gestión global de marcas y del Hub |
brand_admin | Control total de su marca, incluida facturación y equipo |
brand_technician | Operación de la marca (cargadores, tarifas, incidencias) sin acceso a facturación ni equipo |
brand_viewer | Solo lectura: dashboard, tarifas y clientes, sin importes |
| conductor del portal | Cliente final autenticado en /portal/{slug}/ |
| conductor anónimo | Pago por QR sin cuenta, en /qr/{charge_point_id} |
Resumen de los grupos de endpoints principales (no exhaustivo):
| Prefijo | Qué cubre |
|---|---|
/api/auth | Login, registro, 2FA (TOTP) |
/api/brand | Cargadores, tarifas, clientes, RFID, dashboard, incidencias, OCPI, webhooks, comandos OCPP avanzados |
/api/brand/team | Gestión de equipo: invitar, listar, cambiar rol, eliminar |
/api/admin | Superadmin: marcas, facturas, Hub |
/api/portal | Portal del conductor: login, sesiones, wallet, suscripciones, tarjeta guardada |
/api/public | Endpoints públicos: pago QR, info de cargador, mapa |
/api/hub | Estadísticas y gestión del Hub de roaming |
/api/ext | API pública para integraciones externas, autenticada con API key |
/ocpi/{brand_slug} | OCPI 2.2 — CPO por marca |
/ocpi/emsp/{brand_slug} | OCPI 2.2 — eMSP por marca |
/ocpi/hub | OCPI 2.2 del Hub como partido único ES*ACH |
Conexión por WebSocket, un cargador por conexión. El charge point debe estar pre-registrado en la marca antes de conectar.
wss://askacharge.com/ocpp/{brand_slug}/{charge_point_id}
Subprotocolo negociado vía cabecera Sec-WebSocket-Protocol: ocpp1.6 o ocpp2.0.1.
Opcionalmente, cada cargador puede tener una credencial Basic Auth asociada
(usuario = charge_point_id, contraseña generada por el operador desde el
panel — sección "Seguridad OCPP" de cada cargador). Si está activada, el handshake
exige cabecera Authorization: Basic base64(charge_point_id:password) y se
rechaza la conexión sin ella o con credenciales incorrectas. Si no está activada, se
acepta la conexión solo por el charge_point_id de la URL — recomendamos
activarla en todo cargador expuesto a internet.
Plug & Charge permite que un vehículo eléctrico se autentique y autorice una sesión de carga automáticamente al enchufar el cable, sin RFID, app ni QR. La autenticación se negocia entre el cargador y el vehículo por la propia línea de potencia (PLC) mediante el estándar ISO 15118-2.
Requiere cargadores con OCPP 2.0.1 y soporte ISO 15118 en el hardware. Los cargadores OCPP 1.6J no pueden participar en este flujo.
Cada marca genera su propia Root CA EC P-256 (V2G Root CA simplificada, válida 10 años) desde el panel o vía API. Esta CA firma los certificados de contrato de los vehículos de flota, y debe instalarse en los cargadores para que puedan validarlos.
| Endpoint | Acción |
|---|---|
POST /api/brand/pnc/ca/generate | Genera la CA de la marca (reemplaza la anterior si existe) |
GET /api/brand/pnc/ca | Consulta la CA activa: fingerprint, validez, PEM |
POST /api/brand/pnc/commands/install-ca | Envía InstallCertificate OCPP 2.0.1 al cargador indicado |
Para cada vehículo de flota se emite un certificado de contrato ligado a su
eMAID (Electric Mobility Account ID, formato ES-ACH-XXXXXXXXXX-C). El
vehículo lo almacena y lo presenta al cargador en cada sesión. AskaCharge lo entrega
automáticamente vía Get15118EVCertificate OCPP si el cargador lo solicita.
| Endpoint | Acción |
|---|---|
GET /api/brand/pnc/contracts | Lista todos los contratos activos y revocados |
POST /api/brand/pnc/contracts | Emite un contrato nuevo: emaid, owner_name, valid_days, client_id (opcional) |
POST /api/brand/pnc/contracts/{id}/renew | Renueva un contrato (revoca el anterior, emite nuevo) |
DELETE /api/brand/pnc/contracts/{id} | Revoca un contrato |
Cuando un vehículo compatible se enchufa, el cargador abre una sesión ISO 15118 y
envía un mensaje Authorize con id_token.type = "ISO15118" y
el campo iso15118CertificateHashData. AskaCharge verifica el eMAID en la
tabla de contratos activos y valida el hash del certificado para prevenir suplantación.
Si el vehículo no tiene aún el certificado descargado, el cargador solicita
Get15118EVCertificate y AskaCharge responde con la cadena (contrato + CA)
en formato EXI/DER.
https://askacharge.com/askacharge/api/ocsp/{brand_slug}. Los
cargadores que implementen OCSP pueden verificar en tiempo real si un certificado ha sido
revocado. La revocación vía API (DELETE /pnc/contracts/{id}) es efectiva
inmediatamente: el OCSP responde REVOKED y el próximo Authorize
devolverá Invalid.
Los coches de consumidor (IONIQ 6, BMW iX, etc.) vienen de fábrica con un certificado de contrato firmado por una CA raíz reconocida por los fabricantes — principalmente Hubject eMobility PKI en Europa. Para autorizar a esos conductores, AskaCharge tendría que conectarse a esa PKI externa, lo que requiere contrato con Hubject y está en hoja de ruta pero no activo aún.
Hoy, Plug & Charge en AskaCharge funciona para flota propia: vehículos cuyos eMAID hayas emitido tú como operador. Para el resto de conductores se recomienda combinar con RFID, pago QR o portal del conductor.
AskaCharge gestiona la potencia de carga de forma dinámica en tres niveles independientes que se pueden combinar: reparto de potencia por ubicación, reglas condicionales basadas en producción solar o precio de la energía, y perfiles de carga OCPP por cargador. Todo se aplica en tiempo real sin intervención del operador.
Cada ubicación puede tener un límite de potencia máxima (kW). AskaCharge reparte
ese techo entre los cargadores activos enviando SetChargingProfile
(OCPP 1.6J y 2.0.1) automáticamente cuando arranca o para una sesión. Estrategias
disponibles: even (igual para todos) y priority (prioridad
por cargador). Esto permite instalar cargadores sin ampliar la acometida eléctrica.
| Endpoint | Acción |
|---|---|
GET /api/brand/location-limits | Lista límites activos |
PUT /api/brand/location-limits | Crea o actualiza un límite (location_name, max_power_kw, strategy) |
DELETE /api/brand/location-limits/{id} | Elimina un límite |
El operador configura su instalación fotovoltaica (potencia pico, batería opcional, excedente mínimo para activar carga) y publica lecturas en tiempo real desde su inversor o contador. AskaCharge calcula el excedente disponible y lo usa en el motor de reglas.
| Endpoint | Acción |
|---|---|
GET /api/brand/solar/config | Configuración solar de la marca |
PUT /api/brand/solar/config | Actualiza: peak_kw, has_battery, battery_capacity_kwh, min_surplus_w |
POST /api/brand/solar/reading | Publica lectura: production_w, consumption_w, grid_w |
GET /api/brand/solar/readings | Histórico de lecturas (últimas N horas) |
El operador define reglas priorizadas que se evalúan cada 5 minutos contra el estado
actual (excedente solar, hora, precio de energía). La primera regla que cumple su
condición aplica su acción vía ChangeConfiguration OCPP a todos los
cargadores activos de la marca.
| Condición | Descripción |
|---|---|
surplus_min | Actúa si el excedente solar supera N vatios |
pvpc_max | Actúa si el precio PVPC/OMIE es ≤ X €/kWh |
time_range | Actúa en una franja horaria (admite cruce de medianoche) |
always | Regla de fallback incondicional |
| Acción | Descripción |
|---|---|
charge_solar_only | Limita cada cargador al excedente disponible dividido entre sesiones activas |
charge_watts | Reparte un total de vatios fijos entre las sesiones activas |
charge_max | Carga al máximo (32 A) |
charge_min | Carga al mínimo OCPP (6 A) |
pause | Suspende la carga (MaxCurrentOffered = 0) |
POST /api/brand/solar/rules
{
"name": "Solo excedente solar",
"priority": 10,
"condition_type": "surplus_min",
"condition_value": { "watts": 1500 },
"action": "charge_solar_only"
}
El motor de reglas puede operar con tres fuentes de precio de la red:
GET /api/brand/pvpc/today.
La condición pvpc_max en las reglas de carga permite, por ejemplo,
cargar solo cuando la energía cuesta menos de 0,10 €/kWh y pausar en horas punta —
sin ninguna intervención manual.
La plataforma ofrece dashboards en tiempo real, analítica histórica con comparativa de periodos, previsión financiera mensual, ranking de rendimiento por cargador, informes ESG exportables en PDF y detección automática de anomalías mediante IA. Todos los datos son accesibles vía API para integración con BI externos.
| Endpoint | Qué devuelve |
|---|---|
GET /api/brand/dashboard/summary | KPIs del periodo seleccionado (energía, ingresos, margen, sesiones, CO₂) con delta % vs periodo anterior |
GET /api/brand/dashboard/live | Estado en vivo: sesiones activas, potencia actual, cargadores por estado |
GET /api/brand/dashboard/stream | Server-Sent Events — actualización en tiempo real sin polling |
| Endpoint | Qué devuelve |
|---|---|
GET /api/brand/analytics/usage | Uso diario/semanal/mensual: sesiones, kWh, ingresos por periodo |
GET /api/brand/analytics/financials | Desglose financiero: revenue, coste de energía, comisiones Stripe, margen neto, revenue shares |
GET /api/brand/analytics/forecast | Previsión del mes en curso basada en datos reales: revenue, margen, sesiones y kWh proyectados hasta fin de mes |
GET /api/brand/chargers/performance | Ranking de cargadores: disponibilidad, sesiones, energía entregada, ingresos, tasa de fallos |
GET /api/brand/pvpc/today | Precios PVPC hora a hora del día actual (€/kWh) |
GET /api/brand/esg-report genera un PDF descargable con el impacto
ambiental del periodo: kWh entregados, CO₂ evitado (factor 130 g/kWh vs combustión),
equivalencia en árboles plantados y desglose por cliente fleet. Listo para incluir
en memorias de sostenibilidad corporativa o reporting CSRD.
Un motor de detección ejecuta cuatro analizadores independientes cada 30 minutos
sobre todas las transacciones recientes. Las alertas se almacenan en la tabla
anomaly_alerts con severidad y descripción, y se notifican al operador
por email.
| Detector | Qué busca |
|---|---|
| Energía imposible | Sesiones con kWh entregados superior a la potencia física del cargador × duración (indica manipulación de medidor) |
| Outliers estadísticos | Sesiones cuyo coste o energía se desvía más de 3σ de la media histórica de ese cargador |
| Tampering físico | Patrones de paradas y reinicios anormales que sugieren desconexión deliberada del cargador |
| Replay attack | Transacciones con el mismo transaction_id OCPP enviadas más de una vez desde el mismo punto de carga |
read) para integración con herramientas BI externas
como Power BI, Tableau o Metabase.
El Hub AskaCharge es una red de roaming interna entre marcas/operadores que comparten
plataforma: una sola integración OCPI da acceso a todos los cargadores de la red, sin
necesidad de acuerdos bilaterales individuales. De cara a socios externos (Hubject,
GIREVE, ocpi.io...), el Hub se presenta como un único partido OCPI 2.2:
ES*ACH.
https://askacharge.com/askacharge/ocpi/hub/versions
Modelo de comisión: 1% por sesión cross-brand, liquidado el día 1 de cada mes. El
eMSP cobra al conductor con su tarjeta guardada y AskaCharge transfiere al CPO — sin
riesgo de impago entre marcas, porque ambas cuentas de cobro están en la misma
plataforma. Solicitudes de membresía externa: POST /api/public/hub/apply,
ver también la página del Hub.
AskaCharge genera y registra facturas en los sistemas tributarios españoles de forma automática, sin configuración adicional por parte del operador más allá de introducir sus datos fiscales en el onboarding. La plataforma detecta el territorio de la marca y aplica el sistema correspondiente.
Cada transacción completada genera un registro de factura en formato Verifactu
(Real Decreto 1007/2023): XML firmado con la cadena de huellas SHA-256 encadenadas,
código QR de validación y envío automático al webservice SOAP de la AEAT. Los
registros quedan almacenados con el estado de respuesta de hacienda (aeat_ok,
código de error, timestamp). Las facturas rechazadas entran en cola de reintento
automático.
Para operadores de Bizkaia, Gipuzkoa o Araba, la plataforma emite facturas TicketBAI con firma XAdES-EPES usando el certificado digital de la marca. Se envían al endpoint correcto de cada hacienda foral. Bizkaia también soporta el envío mensual agregado vía LROE (Lote de Registros de Operaciones Económicas). El QR TicketBAI se incluye en el PDF de la factura.
| Evento | Sistema |
|---|---|
| Sesión de carga QR (conductor anónimo) | Ticket independiente por transacción |
| Factura mensual a cliente fleet | Factura agregada con desglose de sesiones |
| Factura de AskaCharge a la marca (SaaS) | Factura del operador de la plataforma |
Las facturas emitidas se sincronizan opcionalmente con Holded vía API (PUT /api/brand/erp/config).
El operador proporciona su API key de Holded y la plataforma envía cada factura en
el momento de su generación.
La plataforma implementa seguridad en capas: autenticación robusta con rotación de tokens, 2FA por software, seguridad a nivel de protocolo OCPP, firma de eventos salientes y controles de privacidad GDPR.
El access token JWT tiene vida de 30 minutos. El refresh token se emite como cookie
httpOnly; SameSite=Lax; Secure (nunca accesible desde JavaScript) y
se rota en cada uso: al renovar el access token se invalida el refresh anterior y
se emite uno nuevo. Si un token ya usado vuelve a presentarse, la plataforma detecta
posible robo de sesión y revoca todos los refresh tokens del usuario inmediatamente.
Las cookies de la app principal (/app) y del portal de conductores
(/portal) son independientes para evitar escalada de privilegios entre
capas.
Los usuarios brand_admin pueden activar autenticación de dos factores
con cualquier app compatible (Google Authenticator, Aegis, 1Password…). El flujo:
setup → URI de aprovisionamiento + QR → verificación del primer código → activación
con entrega de 8 códigos de respaldo de un solo uso (SHA-256 en BD, valor en claro
mostrado una vez). El 2FA se exige en el login si está activo.
| Endpoint | Acción |
|---|---|
GET /api/auth/2fa/status | Estado actual del 2FA |
POST /api/auth/2fa/setup | Genera secreto TOTP y URI de aprovisionamiento |
POST /api/auth/2fa/enable | Activa el 2FA y devuelve los códigos de respaldo |
POST /api/auth/2fa/disable | Desactiva el 2FA (requiere código TOTP vigente) |
Cada cargador puede tener una credencial independiente: usuario =
charge_point_id, contraseña generada y rotable desde el panel
(hash SHA-256 almacenado, valor en claro mostrado una vez). Si está activada,
el handshake WebSocket exige la cabecera Authorization: Basic … y
rechaza la conexión sin ella. El endpoint POST /api/brand/chargers/{id}/rotate-password
permite rotar la credencial sin tocar la configuración del resto de la flota.
Las API keys para integraciones externas se almacenan exclusivamente como hash
SHA-256 — el valor en claro solo se muestra en el momento de creación y nunca
se puede recuperar. Cada key tiene un conjunto de scopes (actualmente
read) que limitan las operaciones permitidas.
Cada evento saliente incluye la cabecera
X-AskaCharge-Signature: sha256=<hex>, calculada con el secreto
propio del endpoint (distinto por endpoint, nunca compartido). El receptor puede
verificar la autenticidad del evento antes de procesarlo.
Para cada cliente fleet el operador puede ejecutar:
| Endpoint | Acción |
|---|---|
GET /api/brand/clients/{id}/gdpr-export | Exporta todos los datos del cliente en JSON (sesiones, pagos, datos personales) |
DELETE /api/brand/clients/{id}/gdpr-delete | Anonimiza y elimina los datos personales del cliente, manteniendo los registros fiscales con referencias neutras |
Vehicle-to-Grid (V2G) permite que los vehículos eléctricos devuelvan energía a la red en momentos de alta demanda o precio elevado, convirtiéndose en baterías distribuidas gestionables. AskaCharge está diseñado para operar como plataforma de agregación V2G en cuanto el hardware lo permita — los estándares, los protocolos y la lógica de despacho ya están en la arquitectura.
| Estándar | Qué aporta a V2G | Estado |
|---|---|---|
| ISO 15118-2 | Plug & Charge — autenticación automática por cable (base de la pila V2G) | Implementado (PKI propia, eMAID, OCSP) |
| ISO 15118-20 | Extensión bidireccional — define el protocolo de descarga V2G/V2H sobre el mismo cable | En hoja de ruta (requiere hardware CHAdeMO V2H o CCS2 V2G compatible) |
| OCPP 2.0.1 | Device Model, SetChargingProfile con potencia negativa (descarga), Get15118EVCertificate |
Implementado — el servidor acepta perfiles de carga con límites negativos en cuanto el hardware los reporte |
El motor de reglas de Smart Charging (ver sección anterior)
está diseñado para despacho bidireccional: las condiciones pvpc_max y
time_range ya permiten definir ventanas de descarga ("descarga cuando
PVPC > 0,18 €/kWh"), y la acción charge_watts con valor negativo
se mapeará a un perfil de descarga OCPP cuando el cargador lo soporte.
Los precios PVPC y OMIE spot se actualizan hora a hora desde REE ESIOS — la señal
de precio para el despacho ya está disponible en tiempo real.
El marco regulatorio español (Real Decreto 88/2026) habilita la figura del Sistema de Respuesta Activa de la Demanda (SRAD): un agregador que agrupa capacidad de flexibilidad distribuida (baterías de VE, solar, bombas de calor) y la ofrece a Red Eléctrica como servicio de balance. AskaCharge está posicionado para operar como SRAD en cuanto:
La plataforma ya agrega métricas de potencia en tiempo real por ubicación
(location_limits), conoce el estado de cada cargador y sesión activa,
y tiene el canal OCPP para modificar perfiles de carga en segundos — los tres
ingredientes del despacho de respuesta de demanda.
El Real Decreto 88/2026 crea en España la figura del agregador independiente: una entidad que agrega capacidad de flexibilidad distribuida (baterías de VE, solar, bombas de calor) y la ofrece a Red Eléctrica en los mercados de balance y servicios de ajuste, sin necesidad de ser comercializadora.
AskaCharge está posicionado para registrarse como agregador independiente con una ventaja estructural única: ya controla en tiempo real los cargadores de todas las marcas de la red. Cada operador que se adhiera aporta su capacidad instalada al pool agregado. El umbral regulatorio es de 1 MW — alcanzable agregando varias marcas de la red antes de que cualquier operador individual lo lograra por sí solo.
| Concepto | Detalle |
|---|---|
| Figura legal | Agregador independiente — RD 88/2026, art. 23 |
| Umbral mínimo | 1 MW de capacidad gestionable agregada |
| Referencia de ingresos | ~246.000 €/MW/año en subastas de disponibilidad (REE, 2025) |
| Señal de despacho | OpenADR 2.0 o API directa REE → AskaCharge → OCPP a los cargadores |
| Reparto a operadores | Modelo settlement idéntico al Hub: liquidación mensual proporcional a capacidad aportada |
Para los operadores cliente de AskaCharge, adherirse al pool de agregación supone una nueva línea de ingresos pasivos: sus cargadores siguen funcionando con normalidad, y cuando REE activa una señal de curtailment (reducción de carga), AskaCharge gestiona el despacho automáticamente y les transfiere su parte de la compensación.
Con hardware bidireccional, la flota de VEs aparcados puede devolver energía a la red en momentos de demanda pico — un servicio adicional que REE remunera por encima de la disponibilidad. Combinado con el arbitraje de precio, el VE se convierte en un activo financiero para el operador:
| Modo | Cuándo | Remuneración |
|---|---|---|
| Curtailment | REE activa señal de reducción de carga | Disponibilidad + activación |
| V2G inyección | REE necesita energía en pico de demanda | Energía en mercado de balance + regulación |
| Arbitraje PVPC | Carga en valle de precio, inyecta en pico | Diferencial de precio (hasta ×15) |
Importante: con la alta penetración solar en España, el modelo tradicional "noche barato / día caro" ya no es válido. Los precios PVPC pueden estar en mínimos históricos al mediodía por sobreproducción fotovoltaica (valores por debajo de 2 ct€/kWh son habituales), mientras el pico real de precio se produce en la tarde-noche (19-22h), cuando el sol cae pero la demanda permanece alta. El arbitraje óptimo es valle solar de mediodía → pico de tarde, con spreads que pueden superar el factor 15×.
AskaCharge resuelve esto de forma nativa: los precios PVPC y OMIE spot se
actualizan hora a hora desde REE ESIOS y ya están disponibles en el dashboard
de cada operador en tiempo real. La condición pvpc_max del motor
de reglas evalúa el precio actual en cada decisión de carga — sin asumir
patrones fijos de hora, adaptándose automáticamente a la estacionalidad solar.
AskaCharge incluye una experiencia de conductor en tres capas complementarias, sin necesidad de app nativa: mapa público de acceso libre, flujo de carga por QR sin registro, y portal de conductor completo instalable como PWA.
Disponible en /mapa sin login. Muestra cargadores AskaCharge y la
red nacional REVE/REE en tiempo real. Al hacer clic en un cargador AskaCharge se
abre un modal con:
El conductor escanea el QR físico del cargador o el del mapa. El flujo completo:
Compatible con todos los modos de tarifa: por kWh, por hora, por sesión, combinado, PVPC dinámico y gratuito. La estimación de coste se muestra antes de confirmar el pago.
Cada operador puede ofrecer un portal de conductor en /portal/{slug}/,
instalable como PWA en iOS y Android (sin pasar por App Store). Incluye:
| Feature | Detalle |
|---|---|
| Token eMSP | Tarjeta visual con UID y QR para carga RFID sin tarjeta física |
| Historial de sesiones | Sesiones propias + CDRs de roaming externo unificadas, con kWh y coste |
| Tarjeta guardada | Stripe SetupIntent (PSD2/SCA) para cobro automático en sesiones de roaming |
| Mapa de red | Cargadores propios del operador + red Hub AskaCharge |
| Push notifications | Aviso al finalizar la carga (Web Push / VAPID, gestionado por el conductor) |
| Install prompt | Banner nativo para añadir a pantalla de inicio (Android/Chrome/Safari) |
Cada marca puede registrar endpoints HTTP propios para recibir eventos en tiempo real
(firmados con HMAC, secreto propio por endpoint) desde
/api/brand/webhooks. Evento incluido: session.stopped (entre
otros), con energía, importe, CO₂ ahorrado y motivo de parada.
Alternativa a JWT para integraciones servidor-a-servidor: claves con alcance
(scopes) por marca, gestionadas desde /api/brand/api-keys
(hash SHA-256 en BD, el valor en claro solo se muestra una vez al crearla). Endpoints
públicos disponibles con API key:
| Endpoint | Qué devuelve |
|---|---|
GET /api/ext/chargers | Cargadores de la marca y su estado |
GET /api/ext/sessions | Sesiones de carga |
| Mapa público de cargadores | Cobertura en tiempo real, sin login |
| Hub AskaCharge | Red de roaming entre operadores, estadísticas en vivo |
| Crear cuenta | 30 días de prueba gratuita |