elmapadelagua
API

API pública de la dureza del agua en España

Una petición GET, sin clave y sin registro. Devuelve los grados franceses del agua de un municipio, con la fuente y la fecha del análisis para que se pueda comprobar.

Empezar

Un solo endpoint, GET /api/dureza, y exactamente un parámetro: ine o cp. Sin cabeceras, sin autenticación y sin cuerpo.

Petición

curl "https://elmapadelagua.com/api/dureza?ine=28079"

Respuesta

{
  "ok": true,
  "data": {
    "estado": "encontrado",
    "ine": "28079",
    "cp": "28001",
    "registro": {
      "municipioIne": "28079",
      "municipioNombre": "Madrid",
      "provincia": "Madrid",
      "fh": 3.5,
      "fuente": "SINAC — Ministerio de Sanidad (volcado anual)",
      "urlFuente": "https://www.sanidad.gob.es/areas/sanidadAmbiental/calidadAguas/aguasConsumoHumano/publicaciones/home.htm",
      "fechaDato": "2024-12-18",
      "confianza": "medido-operadora"
    }
  }
}

Las respuestas de esta página son literales: salieron de esas mismas peticiones contra este servidor. Si alguna no cuadra con lo que te devuelve a ti, es un fallo nuestro y conviene avisarnos.

Los dos parámetros

Se manda uno de los dos, nunca los dos a la vez. Mandarlos juntos responde 400 a propósito: si apuntaran a municipios distintos, elegir uno en silencio publicaría la dureza de otro sitio.

Parámetros de consulta de GET /api/dureza.
ParámetroQué es
ineCódigo INE del municipio: cinco dígitos, dos de provincia y tres de municipio. Los ceros a la izquierda cuentan (Abades es 40001, no 4001). Es el acceso preciso: identifica un municipio y solo uno.
cpCódigo postal de cinco dígitos. Es lo que tiene a mano una persona, pero no siempre resuelve: un código postal puede cubrir varios municipios con aguas distintas, y en ese caso la respuesta lo dice en vez de elegir uno.

Por código postal

curl "https://elmapadelagua.com/api/dureza?cp=46001"

Respuesta

{
  "ok": true,
  "data": {
    "estado": "encontrado",
    "cp": "46001",
    "registro": {
      "municipioIne": "46250",
      "municipioNombre": "València",
      "provincia": "Valencia/València",
      "fh": 50,
      "fuente": "SINAC — Ministerio de Sanidad (volcado anual)",
      "urlFuente": "https://www.sanidad.gob.es/areas/sanidadAmbiental/calidadAguas/aguasConsumoHumano/publicaciones/home.htm",
      "fechaDato": "2024-06-06",
      "confianza": "agregado-zona"
    }
  }
}

Desde el navegador

La API se sirve con Access-Control-Allow-Origin: * en todas sus respuestas, incluidas las de error, así que este código funciona desde cualquier dominio sin proxy de por medio.

const r = await fetch(
  "https://elmapadelagua.com/api/dureza?cp=46001"
);
const { ok, data, error } = await r.json();

if (!ok) throw new Error(error.message);

if (data.estado === "encontrado") {
  console.log(data.registro.fh);        // 50
  console.log(data.registro.fechaDato); // "2024-06-06"
} else {
  // Hueco declarado: NO es un error, y no se rellena con una estimación.
  console.log("sin dato:", data.motivo); // "sin-analitica-publica", …
}

Qué devuelve

Siempre un sobre con ok. Con ok: true viene data, y data.estado vale encontrado o sin-dato. Con ok: false viene error, con su code y su message.

Campos de registro, cuando el estado es encontrado

Campos de data.registro. Ninguno es opcional: un °fH sin fuente y sin fecha no se sirve.
CampoQué es
municipioIneCódigo INE del municipio al que corresponde el análisis.
municipioNombreNombre oficial del callejero del INE, tal cual, incluidas las formas bilingües (València, Araba/Álava).
provinciaNombre oficial de la provincia según el INE.
fhLa dureza, en grados franceses (°fH). Es la unidad del SINAC. 1 °fH = 10 mg/L de CaCO3 = 10 ppm; para grados alemanes, °dH = °fH × 0,56.
fuenteDe dónde sale ese registro concreto, ya redactado para citarlo.
urlFuenteDónde comprobarlo en el origen. Nunca viene vacío.
fechaDatoFecha del análisis, AAAA-MM-DD. Varía mucho de un municipio a otro y es la que hay que citar, no la de la consulta.
confianzamedido-municipio, medido-operadora o agregado-zona. No existe un nivel «estimado»: un hueco se declara hueco.

Consultando por ine llega además un cp representativo del municipio, que puede ser null. Nunca se rellena con el código INE.

Cuando no hay dato, que no es un error

De los 8.132 municipios de España, muchos no tienen analítica publicada que se pueda citar. Eso no se responde con un 404 ni con un fh: null: se responde con un 200, ok: true y estado: "sin-dato", con el motivo escrito.

La distinción es el producto entero. Un hueco declarado es información. Una cifra estimada a partir de la media provincial, presentada como si estuviera medida, no lo es, y por eso aquí no existe: nunca vas a recibir un valor interpolado.

curl "https://elmapadelagua.com/api/dureza?ine=40001"

{
  "ok": true,
  "data": {
    "estado": "sin-dato",
    "ine": "40001",
    "municipioNombre": "Abades",
    "provincia": "Segovia",
    "motivo": "sin-analitica-publica"
  }
}
Los cuatro motivos de sin-dato y qué significa cada uno.
motivoCuándo saleCon
sin-analitica-publicaEl municipio existe y no tenemos analítica publicada que se pueda citar.ine y cp
ine-desconocidoEse código INE no está en el callejero. Suele ser un municipio fusionado, un código inventado o un dígito de más.ine
cp-desconocidoEse código postal no aparece en CartoCiudad y no sabemos a qué municipio pertenece.cp
cp-multimunicipioEl código postal cubre varios municipios. Devolver el de uno de ellos sería publicar la dureza de otro sitio, así que no se elige: hay que preguntar por ine.cp

Códigos de estado

curl "https://elmapadelagua.com/api/dureza?ine=2807"

{
  "ok": false,
  "error": {
    "code": "bad_request",
    "message": "Codigo INE no valido (5 digitos)."
  }
}

Límites de uso, contados como son

No hay límite de peticiones. Ni por clave, ni por IP, ni por minuto. Lo decimos porque es la verdad hoy, no porque sea una promesa: si un día hace falta ponerlo, se pondrá generoso y se escribirá aquí antes.

No hay SLA ni soporte comprometido. Esto es un servicio gratuito de un proyecto pequeño. Funciona bien y nos interesa que siga funcionando, pero si tu producto no puede permitirse que se caiga una tarde, descarga el dataset y sírvelo tú.

Si vas a consultar miles de municipios, no uses esto. Recorrer 8.132 códigos INE de uno en uno son 8.132 peticiones para obtener lo mismo que trae un solo fichero JSON, que además viene con la licencia y la descripción de los campos dentro. La API es para consultas sueltas dentro de un producto, no para copiar la base.

Las respuestas con dato se cachean una hora (s-maxage=3600). El dato se refresca de madrugada, así que no vas a ver nada más viejo que eso. Los errores no se cachean.

La forma de la respuesta puede crecer, no encoger. Podemos añadir campos; quitarlos o renombrarlos rompería a quien ya la usa. Escribe tu código ignorando los campos que no conozcas.

Licencia y atribución

Lo que devuelve esta API es dato público reutilizable, también comercialmente. No es gratis del todo: quien lo consume lo está redistribuyendo, y le aplican las mismas condiciones que a cualquier otra copia del dataset. En la práctica son cuatro palabras en un pie de página.

Las fuentes que hay detrás de cada respuesta y cómo hay que citarlas.
FuenteQué aportaCómo se cita
SINAC — Sistema de Información Nacional de Agua de ConsumoLa dureza del agua de cada municipio, con su fecha de análisis.Origen de los datos: Ministerio de Sanidad, Consumo y Bienestar Social (condiciones)
CartoCiudad — Instituto Geográfico NacionalLa correspondencia entre códigos postales y municipios.CC BY 4.0 scne.es (condiciones)
INE — Instituto Nacional de EstadísticaEl nombre oficial, el código y la población de los municipios.Elaboración propia con datos extraídos del sitio web del INE: www.ine.es (condiciones)

Las condiciones, en corto

Ni el Ministerio de Sanidad ni el INE participan, patrocinan ni apoyan esta reutilización. El texto completo viaja en licencia.txt, y cada respuesta lo anuncia además en la cabecera Link con rel="license", para que un cliente automático lo encuentre sin leer esta página.

Preguntas frecuentes

¿Hace falta clave, registro o alta?
No. Es una petición GET a una URL pública, sin clave y sin registro. Tampoco hay cabecera de autorización ni cookies: si tu llamada envía credenciales, no se leen.
¿Se puede llamar desde el navegador?
Sí. La API responde con Access-Control-Allow-Origin en todas sus respuestas, también en las de error, así que un fetch desde otro dominio funciona sin proxy de por medio y los mensajes de error se pueden leer al depurar.
¿Hay límite de peticiones?
Hoy no hay ningún límite por peticiones ni por IP, y preferimos decirlo a prometer una cuota que no existe. Lo que sí hay es caché: las respuestas con dato se sirven con s-maxage de una hora, que es de sobra porque el dato se refresca una vez al día. Si vas a hacer miles de consultas, descarga el dataset entero en vez de recorrerlo municipio a municipio: es una sola petición y trae lo mismo.
¿Qué pasa si un municipio no tiene dato?
La respuesta sigue siendo un 200 con ok true, y el estado es sin-dato con el motivo escrito. No es un error: es un hueco declarado. Nunca se rellena con la media de la provincia ni con la de un municipio vecino, porque una cifra estimada presentada como medida deja de ser un dato.
¿Cada cuánto cambia el dato?
Una tarea nocturna repasa una provincia cada madrugada contra la consulta ciudadana del SINAC e incorpora lo que encuentra, así que la cobertura sube sola. La fecha que importa no es la de tu consulta sino la del análisis, y por eso viaja en el campo fechaDato de cada registro.
¿Puedo usar esto en un producto comercial?
Sí. Las condiciones de reutilización del Ministerio de Sanidad permiten el uso comercial y la redistribución, con la obligación de citar la fuente, mencionar la fecha de la última actualización y no desnaturalizar el sentido de la información. Quien consume la API está redistribuyendo ese dato y le aplican esas mismas condiciones.
¿Qué garantías de servicio hay?
Ninguna formal. Es un servicio gratuito de un proyecto pequeño: no hay SLA, no hay soporte con tiempo de respuesta comprometido y una URL puede cambiar avisando en esta página. Si tu producto no puede depender de eso, descarga el dataset y sírvelo tú: está publicado justamente para eso.