¿Qué es esto?
Una API es una puerta para programas: en lugar de una página para leer, tu programa pide una dirección web y recibe los datos ordenados en formato JSON, listos para guardarlos en una hoja de cálculo o cruzarlos con otros. Sirve, por ejemplo, para vigilar cada día los contratos de una consejería o montar tu propio análisis.
Un servidor MCP hace lo mismo para asistentes de inteligencia artificial como Claude. MCP (Model Context Protocol) es el idioma común con el que esos asistentes consultan fuentes externas. Lo conectas una vez y puedes preguntarle en lenguaje normal, por ejemplo: «¿qué contratos de limpieza adjudicó Educación en 2025 y a quién?». El asistente buscará aquí y te dará las direcciones de las fichas para que lo compruebes.
Las dos son de solo lectura y muestran exactamente lo que muestra la web. Si lo que quieres es la base de datos entera de una vez, tienes los datos abiertos en CSV.
Cómo conseguir tu clave
Cada persona usa su propia clave, una contraseña larga que empieza por cmk_. Es gratis, no hay que pedir permiso y se consigue en el bot de Telegram @ContratosMelillaBot, el mismo de las alertas. No hace falta suscribirse a las alertas.
/claveTe da tu clave. Si ya tienes una, te recuerda cómo empieza (la clave completa solo se muestra al crearla).
/clave_nuevaAnula tu clave y te da otra. Úsalo si la pierdes o crees que alguien la ha visto.
/clave_bajaAnula tu clave. Deja de funcionar al momento.
- Los comandos solo funcionan en un chat privado con el bot, nunca en un grupo: en un grupo la clave la leería todo el mundo.
- Como mucho 5 claves nuevas por hora en cada chat.
- La clave se muestra una sola vez. Guárdala en un lugar seguro y no la compartas. Si se te escapa,
/clave_nuevala sustituye.
Límites
Cada clave puede hacer 60 peticiones por minuto, sumando las de la API y las del servidor MCP: es un solo contador por clave. Si te pasas, la respuesta es un error 429 con la cabecera Retry-After, que dice cuántos segundos esperar. Cada respuesta correcta trae X-RateLimit-Remaining con las peticiones que te quedan en ese minuto.
Para frenar a quien prueba claves al azar, una misma conexión que falla la clave 30 veces queda bloqueada hasta que pasa un minuto desde el primer fallo.
Las cinco consultas
Todas usan el método GET y llevan la clave en la cabecera Authorization: Bearer cmk_… (cambia cmk_… por tu clave). En los ejemplos se usa curl, un programa de la terminal; cualquier lenguaje sirve. Donde pone {slug}, pon el último tramo de la url de la ficha: para https://contratosmelilla.es/contrato/abc sería abc.
La descripción técnica completa, en formato OpenAPI, está en /api/v1/openapi.json (no necesita clave). Muchas herramientas la leen directamente.
Buscar contratos
GET /api/v1/contratos
La búsqueda de /buscar: contratos menores y mayores, con los mismos filtros. Sin parámetros devuelve los más recientes.
curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/contratos?query=limpieza&anio=2025&tipo=menor&limit=5"Ficha de un contrato
GET /api/v1/contratos/{slug}
Lo que muestra la ficha /contrato/…: importes, fechas, órgano, adjudicatarios, documentos y señales de riesgo.
curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/contratos/{slug}"Ficha de una empresa
GET /api/v1/empresas/{slug}
Lo que muestra la ficha /empresa/…: total adjudicado y sus contratos, de 25 en 25.
page: Página de la lista de contratos de la ficha (25 por página). Entero desde 1 (por defecto 1).
curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/empresas/{slug}?page=1"Ficha de un órgano de contratación
GET /api/v1/organos/{slug}
Lo que muestra la ficha /organo/…: total adjudicado y sus contratos, de 25 en 25.
page: Página de la lista de contratos de la ficha (25 por página). Entero desde 1 (por defecto 1).
curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/organos/{slug}?page=1"Novedades
GET /api/v1/novedades
Los últimos movimientos de /novedades: contratos nuevos, adjudicaciones y documentos.
limit: Número de entradas. Entero, por defecto 50, máximo 50.
curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/novedades?limit=10"Parámetros de la búsqueda de contratos
/api/v1/contratos admite los mismos filtros que el buscador. Todos son opcionales y se combinan entre sí. A diferencia de la web, un parámetro desconocido, repetido o mal escrito no se ignora: devuelve un error 400 que dice cuál es, para que sepas que tu búsqueda no era la que pediste. Un DNI/NIE en cualquier parámetro devuelve un error 400.
| Parámetro | Qué filtra | Valores |
|---|---|---|
query | Palabras del objeto del contrato (lo que se contrata). | Texto de 1 a 200 caracteres. Sin DNI/NIE ni 7 cifras seguidas |
idExpediente | Número de expediente. | Texto de 1 a 200 caracteres |
organoId | Órgano de contratación, por su identificador. | UUID |
adjudicatario | Nombre (o parte del nombre) de quien ganó el contrato. | Texto de 1 a 200 caracteres |
unidad | Unidad que tramitó el contrato. | Texto de 1 a 200 caracteres |
cif | CIF de una empresa (persona jurídica). | CIF de persona jurídica; un DNI/NIE da error |
anio | Año. | 4 cifras, por ejemplo 2025 |
trimestre | Trimestre del año. | 1, 2, 3 o 4 |
tipo | Contratos menores, mayores o todos. | menor, mayor o todos (por defecto todos) |
tipoContrato | Tipo de contrato. | Texto de 1 a 200 caracteres, por ejemplo Servicios, Suministros u Obras |
urgencia | Tramitación. | ordinaria, urgente o emergencia |
financiacionUe | Con o sin fondos europeos. | true o false |
anomalias | Señales de riesgo que debe tener el contrato. Se puede repetir. | Hasta 10, entre: licitador_unico, nocturno, previa_informe, tramitacion_express, sin_tablon, riesgo_alto, precio_apurado_limite, precio_apurado_3_ofertas |
cpv | Código CPV (clasificación europea de lo que se compra) o su comienzo. | De 1 a 8 cifras |
procedimiento | Procedimiento de adjudicación. | Texto de 1 a 200 caracteres |
estado | Estado del expediente. | Texto de 1 a 200 caracteres, por ejemplo ADJ o RES |
sort | Orden: por fecha, importe o riesgo. | date, amount, risk (por defecto date) |
dir | Sentido del orden; solo cuenta junto a sort. | asc o desc (por defecto desc) |
page | Página de resultados. | Entero desde 1 (por defecto 1) |
limit | Resultados por página. | Entero, por defecto 20, máximo 50 |
La respuesta trae data (los contratos) y paginacion (página, resultados por página, total y número de páginas).
Errores
Un error siempre tiene la misma forma, con un código fijo y un mensaje en español:
{ "error": { "code": "VALIDATION", "message": "Parámetro no válido: anio." } }Cita la fuente
Cada contrato, empresa, órgano o novedad lleva un campo url con su dirección en esta web. Úsalo para citar la fuente y para que tus lectores lo comprueben. Si publicas algo hecho con estos datos, cita ContratosMelilla.es con ese enlace. Las fichas de contrato traen además enlaceOficial, el enlace a la publicación oficial.
Servidor MCP para asistentes de IA
La dirección del servidor es:
https://contratosmelilla.es/mcpUsa la misma clave y el mismo límite que la API. Tu asistente verá estas herramientas, cada una equivalente a una consulta de la API:
buscar_contratosBuscar contratosver_contratoVer un contratover_empresaVer una empresaver_organoVer un órgano de contrataciónnovedadesNovedades
Claude Code
Escribe en la terminal (con tu clave en lugar de cmk_…):
claude mcp add --transport http contratosmelilla https://contratosmelilla.es/mcp --header "Authorization: Bearer cmk_…"Claude Desktop y otros asistentes
Los conectores remotos de Claude Desktop y de claude.ai se identifican con OAuth, un sistema de inicio de sesión que este servidor no usa: aquí basta la clave. Para usarlo desde un programa instalado en tu ordenador hace falta un pequeño puente, mcp-remote, que necesita Node.js y añade la clave a cada petición:
npx mcp-remote https://contratosmelilla.es/mcp --header "Authorization: Bearer ${CLAVE}"En Claude Desktop se configura en su archivo de configuración, dentro de mcpServers:
{
"mcpServers": {
"contratosmelilla": {
"command": "npx",
"args": [
"mcp-remote",
"https://contratosmelilla.es/mcp",
"--header",
"Authorization: Bearer ${CLAVE}"
],
"env": {
"CLAVE": "cmk_…"
}
}
}
}En Windows, si el puente no conecta, prueba a escribir la cabecera sin espacios (Authorization:${CABECERA}, con CABECERA = "Bearer cmk_…" en env), como explican las instrucciones de mcp-remote. La versión web de claude.ai no puede ejecutar este puente.
Lo que preguntes y lo que el servidor responda pasa también por la empresa que ofrece tu asistente de IA. Y comprueba siempre lo que te diga el asistente en la ficha de la web: puede equivocarse al resumir.
Privacidad
Son datos de contratos del sector público. La API y el servidor MCP muestran exactamente lo mismo que la web, con la misma protección: el DNI/NIE de las personas físicas (autónomos, por ejemplo) aparece enmascarados igual que en sus fichas. Los CIF de empresas son públicos y se muestran completos.
No hay otra forma de obtener datos sin enmascarar: ni la clave, ni un parámetro, ni el servidor MCP dan acceso a más de lo que muestra la web. No escribas DNI/NIE en las búsquedas: se rechazan, y la dirección de una petición puede quedar guardada en registros técnicos.
Qué guardamos de tu clave y para qué lo cuenta la política de privacidad.