- Inicio
- Documentación de las APIs públicas
- Metodo de Autenticación
A partir del 13 de octubre de 2026 la API de la Sede Electrónica de la CNMC deja de aceptar peticiones firmadas con OAuth 1.0. Desde esa fecha solo se admitirá OAuth 2.0, o el certificado electrónico en los servicios que ya lo permiten hoy.
/api-oauth2/ (vea la sección "Autenticación de API con OAuth2").
Como método alternativo de identificación se proporciona la autenticación con certificado electrónico de cliente.
En estos enlaces se puede consultar su significado y algún detalle técnico:
Este sistema permite identificar a la persona que se conecta al servicio, a diferencia el método OAuth que es una identificación de empresa. La única excepción son los certificados "de sello" o "no personales" que sólo incluyen el identificador de la empresa para la que están emitidos, aunque lleven información de contacto.
El API utiliza la identificación de persona física del certificado (NIF) para comprobar en el registro de habilitación de la CNMC la capacidad de operar de esa persona en el procedimiento elegido. Si el certificado es de representante, igualmente, se verificará la habilitación del NIF del representante. Si el certificado está emitido a una persona jurídica debe estar relacionado también como habilitado en dicha entidad jurídica.
Por lo tanto los campos indicados como nifPresentador y nifEmpresa del resto de llamadas al API deben estar relacionados con el certificado electrónico empleado en la identificación o se devolverá un mensaje de error de acceso "403 Forbidden". De nuevo, los certificados de sello al sólo identificar a la empresa sólo añaden esa restricción y se podrá utilizar cualquiera de los nifPresentador de los contactos asociados a dicha empresa.
La aplicación web de carga Cargador incluye esta funcionalidad, como se puede ver en las siguientes pantallas:


OAuth 1.0a define un protocolo que permite a los usuarios de aplicaciones autorizar a aplicaciones que consuman sus APIs sin necesidad de que las contraseñas viajen en las peticiones.
La implementación concreta que se utiliza es autenticación en un sólo paso, por lo que no es necesaria la obtención de claves adicionales (request_token o access_token), se puede seguir una explicación aquí:
En la consola de pruebas: https://apipre.cnmc.gob.es/. Se pueden ver todos los parámetros, puesto que utiliza autenticación OAuth.
Intentamos acceder al recurso securizado:
https://api.cnmc.gob.es/test/v1/echoseguro?m=EstoesunapruebacustomerKey=dpf43f3p2l4k3l03 customerSecret=kd94hf93k423kf44access token = null y token secret = nullHMAC-SHA1nonce string kllo9940pd9333jh y este timestamp 1191242096Los parámetros a enviar, incluyendo los utilizados por el propio servicio, quedan de la siguiente manera:
Name="Value",
oauth_consumer_key="dpf43f3p2l4k3l03",
oauth_token="vacío",
oauth_nonce="kllo9940pd9333jh",
oauth_timestamp="1191242096",
oauth_signature_method="HMAC-SHA1",
oauth_version="1.0",
m="Estoesunaprueba"Los parámetros OAuth se pueden enviar, esto es para la generación de la firma, como un authentication header (http://tools.ietf.org/html/rfc5849#section-3.5.1).
Codificar los parámetros siguiendo URL-Encoding (http://en.wikipedia.org/wiki/Percent-encoding http://tools.ietf.org/html/rfc5849#section-3.6).
Se ordenan basados en su codificación por URL-Encoding
Name="Value",
m="Estoesunaprueba",
oauth_consumer_key="dpf43f3p2l4k3l03",
oauth_nonce="kllo9940pd9333jh",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1191242096",
oauth_token="nnch734d00sl2jdk",
oauth_version="1.0"Una vez transformados se concatenan en una QueryString:
m=Estoesunaprueba&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0https://api.cnmc.gob.es/test/v1/echosegurohttps://api.cnmc.gob.es/test/v1/echoseguroPara crear la "Signature Base String" se concatenan todas estas partes precedidas del método HTTP solicitado, que es una parte muy importante en los servicios REST:
GET&http%3A%2F%2Fapi.sede.cnmc.gob.es%2Ftest%2Fecho&m%3DEstoesunaprueba%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0Para calcular la firma HMAC-SHA1 usamos dos claves: client secret y token secret para el key del algoritmo HMAC-SHA1. Cada clave se codifica con: UTF8-encoded, URL-encoded y se concatena en una única cadena usando '&' como separador, aunque estén vacíos (ver seccion 3.4.2).
kd94hf93k423kf44&pfkkdhi9sl3r4s00Con la "Signature Base String", el texto HMAC-SHA1 concatenamos las claves, el cliente deberá generar la firma (RFC seccion 3.4.2). El algoritmo HMAC-SHA1 genera una cadena de bytes. Debe estar codificada base64-encoded con '=' para asegurar el "padding" (ver RFC 2045 seccion 6.8):
tR3+Ty81lMeYAr/Fid0kMTYa/WM=La firma calculada es entonces añadida a la petición usando el parámetro 'oauth_signature'. Una vez esta firma haya sido verificada por el servidor ya no se debe incluir en el flujo de firma y no es parte de "Signature Base String". Cuando se incluya en la cabecera HTTP debe estar codificada del mismo modo que se transmiten el resto de parámetros.
Name="Value",
oauth_signature="tR3+Ty81lMeYAr/Fid0kMTYa/WM="
Aunque OAuth no especifica directamente cómo se deben incluir estos parámetros en la petición, al definirlos en la firma para su verificación por el "Service Provider" implícitamente indica cuáles deben incluirse en la petición.
Los parámetros OAuth pueden incluirse en uno de estos lugares:
Los parámetros firmados non-OAuth pueden incluirse de alguna de estas formas:
Se recomienda que cuando sea posible los parámetros OAuth se incluyan en OAuth 'Authorization' header y no se incluyan más parámetros en el header.
Usando URL query para los parámetros non-OAuth y OAuth 'Authorization' header para OAuth la petición OAuth-signed HTTP queda así:
GET /test/echo?m=Estoesunaprueba HTTP/1.1 Host: http://api.cnmc.gob.es:80/test/v1/echoseguro Authorization: OAuth realm="http://api.cnmc.gob.es/test/v1/echoseguro", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_token="nnch734d00sl2jdk", oauth_nonce="kllo9940pd9333jh", oauth_timestamp="1191242096", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D"El token se pide al servicio de autorización de la CNMC con el flujo client credentials de OAuth 2.0:
| Entorno | Dirección para pedir el token |
|---|---|
| Preproducción | https://apipre.cnmc.gob.es/oauth2/token |
| Producción | https://api.cnmc.gob.es/oauth2/token |
POST.application/x-www-form-urlencoded): grant_type=client_credentials y, opcionalmente, scope=read.Authorization: Basic con ConsumerKey:ConsumerSecret codificado en Base64. Solo se admite esta forma: no envíe la clave ni el secreto como parámetros del cuerpo.Ejemplo con curl (sustituya MI_CONSUMER_KEY y MI_CONSUMER_SECRET por los suyos):
curl -X POST "https://apipre.cnmc.gob.es/oauth2/token" \
-u "MI_CONSUMER_KEY:MI_CONSUMER_SECRET" \
-d "grant_type=client_credentials" \
-d "scope=read"Respuesta (ejemplo):
{
"access_token": "eyJraWQiOi...",
"scope": "read",
"token_type": "Bearer",
"expires_in": 299
}expires_in: 299 segundos).Añada a cada petición la cabecera:
Authorization: Bearer <access_token>Ejemplo (comprobar que la autenticación funciona y ver los datos de su credencial):
TOKEN="eyJraWQiOi..." # el access_token obtenido en el paso anterior
curl -H "Authorization: Bearer $TOKEN" \
"https://apipre.cnmc.gob.es/api-oauth2/test/perfil"La respuesta incluye el NIF de la empresa, el NIF del contacto, el procedimiento y los roles de la credencial.
Los parámetros, cuerpos y respuestas de cada servicio son los mismos que en OAuth 1.0, salvo lo indicado en "Diferencias a tener en cuenta". Las rutas son relativas a https://api.cnmc.gob.es (producción) o https://apipre.cnmc.gob.es (preproducción). Fíjese en que en carga y descarga desaparece el /v1 de la ruta.
| Hoy (OAuth 1.0) | Con OAuth 2.0 | Método |
|---|---|---|
/carga/v1/iniciar_carga | /api-oauth2/carga/iniciar_carga | POST o PUT |
/carga/v1/iniciar_subida_fichero | /api-oauth2/carga/iniciar_subida_fichero | POST o PUT |
/carga/v1/subir_chunk_fichero | /api-oauth2/carga/subir_chunk_fichero | POST o PUT |
/carga/v1/subir_chunk_fichero/{uuidUpload} | /api-oauth2/carga/subir_chunk_fichero/{uuidUpload} | POST o PUT |
/carga/v1/confirmar_subida_fichero/{uuidUpload} | /api-oauth2/carga/confirmar_subida_fichero/{uuidUpload} | GET |
/carga/v1/subir_fichero_completo | /api-oauth2/carga/subir_fichero_completo | POST o PUT |
/carga/v1/confirmar_carga/{uuidCarga} | /api-oauth2/carga/confirmar_carga/{uuidCarga} | GET |
/carga/v1/cargar_fichero_completo | /api-oauth2/carga/cargar_fichero_completo | POST |
/carga/v1/cancelar_carga/{uuidCarga} | /api-oauth2/carga/cancelar_carga/{uuidCarga} | GET o DELETE |
/carga/v1/cancelar_fichero/{uuidUpload} | /api-oauth2/carga/cancelar_fichero/{uuidUpload} | GET o DELETE |
/carga/v1/listar_chunks_fichero/{uuidUpload} | /api-oauth2/carga/listar_chunks_fichero/{uuidUpload} | GET |
/carga/v1/listar_cargas | /api-oauth2/carga/listar_cargas | POST o PUT |
/carga/v1/consultar_estado_carga/{uuidCarga} | /api-oauth2/carga/consultar_estado_carga/{uuidCarga} | GET |
/carga/v1/obtener_justificante/{uuidCarga} | /api-oauth2/carga/obtener_justificante/{uuidCarga} | GET |
| Hoy (OAuth 1.0) | Con OAuth 2.0 | Método |
|---|---|---|
/ficheros/v1/listar_pendientes/{idProcedimiento}/{nifEmpresa} | /api-oauth2/ficheros/listar_pendientes/{idProcedimiento}/{nifEmpresa} | POST |
/ficheros/v1/consultar | /api-oauth2/ficheros/consultar | POST |
/ficheros/v1/descarga/{id} | Sin cambios: use tal cual el enlace que devuelven listar_pendientes o consultar. No necesita token. | GET |
| Hoy (OAuth 1.0) | Con OAuth 2.0 | Método |
|---|---|---|
/test/v1/echoseguro?m=... | /api-oauth2/test/perfil (comprueba la autenticación; no devuelve el mensaje) | GET |
/test/v1/nif | /api-oauth2/test/perfil (la respuesta tiene otro formato, vea "Diferencias a tener en cuenta") | GET |
Se mantiene toda la ruta y solo se añade /api-oauth2 delante:
| Hoy (OAuth 1.0) | Con OAuth 2.0 | Método |
|---|---|---|
/verticales/v1/SIPS/consulta/v1/<TIPO_FICHERO>.csv?cups=... | /api-oauth2/verticales/v1/SIPS/consulta/v1/<TIPO_FICHERO>.csv?cups=... | GET |
/verticales/v1/{aplicación}/{servicio}/... (en general) | /api-oauth2/verticales/v1/{aplicación}/{servicio}/... | El mismo que hoy |
Ejemplo:
curl -H "Authorization: Bearer $TOKEN" \
"https://api.cnmc.gob.es/api-oauth2/verticales/v1/SIPS/consulta/v1/SIPS2026_CONSUMOS_ELECTRICIDAD.csv?cups=ES0000000000000000XX"(El valor de cups es ilustrativo. La extensión del tipo de fichero, .csv, .json…, es obligatoria, como en OAuth 1.0.)
Los servicios de consulta pública (/catalogo/v1/..., /maestras/v1/..., /anunciospublicos/v1/...) no cambian.
/seguridad/v1 y /seguridad/v2)Son los servicios con los que su aplicación consulta en qué procedimientos está autorizada la credencial o un presentador:
Versión OAuth 2.0: disponible en preproducción y producción. Se añade /api-oauth2 delante de la ruta actual, con el token en la cabecera Authorization: Bearer:
/api-oauth2/seguridad/v1/procedimientosAutorizados/api-oauth2/seguridad/v1/procedimientosAutorizados/{nifPresentador}/api-oauth2/seguridad/v1/autorizadoEnProcedimiento?nif=...&procedimiento=.../api-oauth2/seguridad/v1/procedimientos/permiso/{permiso}/api-oauth2/seguridad/v2/procedimientos/permiso/{permiso}/api-oauth2/seguridad/v2/procedimientos/permiso/{permiso}/roles/api-oauth2/seguridad/v2/procedimiento/{idProcedimiento}/permiso/{permiso}Tienen los mismos parámetros y respuestas que las actuales, con una diferencia: las consultas por NIF (procedimientosAutorizados/{nifPresentador} y autorizadoEnProcedimiento) solo responden para el NIF de la propia credencial o el de un contacto vigente de su empresa; para cualquier otro NIF devuelven un error 403.
/api-oauth2/. En carga y descarga desaparece el /v1; en verticales se mantiene.Fecha de efecto (fechaEfecto) en cargar_fichero_completo. Antes del 13 de octubre de 2026, con OAuth 2.0 se admitirán dos formatos:
AAAA-MM-DD (por ejemplo, 2026-10-01), opcionalmente con hora AAAA-MM-DD HH:mm o AAAA-MM-DD HH:mm:ss.MM/DD/AAAA, con el mes primero, como en OAuth 1.0 (por ejemplo, 10/01/2026 es el 1 de octubre de 2026).Siempre con dos cifras para el mes y el día y cuatro para el año. Cualquier otro formato, o una fecha que no existe (por ejemplo 02/30/2026 o 31/12/2026), se rechaza con un error 400. Con OAuth 1.0 algunas de esas fechas se aceptaban y se convertían en otra fecha distinta; con OAuth 2.0 ya no. Revise el formato que envía su aplicación.
/api-oauth2/carga/obtener_justificante/{uuidCarga}. Antes del 13 de octubre de 2026, el enlace que devuelve consultar_estado_carga vendrá ya con esa ruta./api-oauth2/test/perfil frente a /test/v1/nif. perfil devuelve nifEmpresa, nifContacto, procedimiento, roles y oauthConsumerKey; ya no devuelve la lista de NIF de empresas (empresa) que daba /test/v1/nif.cargar_fichero_completo, subir_fichero_completo, subir_chunk_fichero) deben enviarse como multipart/form-data. Los nombres de los campos son los mismos que en OAuth 1.0.| Código | Dónde | Qué significa | Qué hacer |
|---|---|---|---|
400 invalid_request / unsupported_grant_type | Al pedir el token | Falta grant_type=client_credentials o la petición está mal formada | Revise el cuerpo de la petición |
401 invalid_client | Al pedir el token | La Consumer Key o el Consumer Secret no son correctos, la credencial está dada de baja o no se envió la cabecera Authorization: Basic | Revise la clave y el secreto y que los envía en la cabecera Basic. Si son correctos, contacte con la CNMC |
| 401 | En cualquier servicio /api-oauth2/... | No se envió el token, está caducado (más de 5 minutos) o no es válido | Pida un token nuevo y repita la petición |
| 403 | En cualquier servicio /api-oauth2/... | El token es válido, pero la credencial no tiene permiso para esa operación: por ejemplo, otra empresa, otro procedimiento o un servicio vertical para el que no tiene rol | Compruebe el NIF de empresa y el procedimiento que envía. Puede ver los datos de su credencial con /api-oauth2/test/perfil |
| 400 | En cualquier servicio /api-oauth2/... | Algún parámetro no es válido (por ejemplo, el formato de fechaEfecto) o la ruta no existe | Revise la ruta y los parámetros |
Las respuestas de error de los servicios (400, 403) llegan en JSON (application/api-problem+json), con un título y una descripción del problema. Los 401 de un token caducado o no válido llegan sin cuerpo, con la cabecera WWW-Authenticate: Bearer ....
En este enlace están los ejemplos de los tipos de ficheros disponibles para la descarga.
Para utilizar los API de carga de ficheros de la CNMC es necesaria una autenticación con el el sistema que nos otorgue los privilegios necesarios para operar con el sistema.
Existen dos métodos diferentes:
Los permisos asociados para cada método dependerán del procedimiento al que se acceda por lo que es necesario estar dado de alta en dicho procedimiento y tener el rol adecuado.
Consulte el método de solicitud de credenciales correspondiente en: