Documentación de la API
Cuatro rutas de solo lectura sobre HTTPS que devuelven JSON. Esta página describe la API tal como funciona hoy, con sus particularidades incluidas.
Autenticación
Todas las rutas exigen un token. Se envía en la cabecera Authorization, tal cual, sin el prefijo Bearer. La URL base y el token se entregan al dar de alta el acceso; en los ejemplos aparecen como $BASE y $TOKEN.
curl "$BASE/api/auctions/SUB-JA-2026-000000" \
-H "Authorization: $TOKEN" \
-H "Accept: application/json"Sin token, o con uno incorrecto, la respuesta es un 401. ¿Aún no tienes uno? Solicita acceso.
Convenciones
Identificadores
Cada subasta se identifica con el mismo código que usa el portal, por ejemplo SUB-JA-2026-266546. En la API ese valor es auction_number. El blog explica cómo se lee ese identificador.
Bloques de la ficha serializados
En el listado y en la ficha, los bloques general_information, managing_authorities, properties, lots, related y bids llegan como una cadena que contiene JSON. Hay que decodificarlos una segunda vez. La ruta de pujas y la de cambios devuelven objetos directamente.
const subasta = await respuesta.json();
const bienes = JSON.parse(subasta.properties ?? '[]');
const general = Object.assign({}, ...JSON.parse(subasta.general_information));
console.log(general['Valor subasta'], bienes[0]?.superficie);Importes y fechas
Los importes se conservan como los publica el portal, en texto con formato español: "199.407,52 €". Las fechas de la ficha incluyen su equivalente ISO con huso horario: "19-10-2026 18:00:00 CET (ISO: 2026-10-19T18:00:00+02:00)". Ese valor ISO es la referencia exacta para la hora de cierre. El campo concludes_at expresa esa misma hora en horario peninsular español. Las marcas de tiempo del sistema (created_at, updated_at, bids_refreshed_at, changed_at) van en UTC.
Datos de terceros
La ficha reproduce lo que publica el portal, incluidos nombres de acreedores y direcciones de los bienes. Quien integre la API es responsable del uso que haga de esos datos.
Listado de subastas
GET/api/auctions
Devuelve todas las subastas registradas, paginadas de 500 en 500.
| Parámetro | Tipo | Descripción |
|---|---|---|
page | entero | Número de página, desde 1. Por defecto, 1. |
{
"current_page": 1,
"data": [ /* hasta 500 subastas, con la forma de la ficha */ ],
"per_page": 500,
"total": 15422,
"last_page": 31,
"next_page_url": "…/api/auctions?page=2",
"prev_page_url": null
}Ficha de una subasta
GET/api/auctions/{auction_number}
| Campo | Contenido |
|---|---|
auction_number | Identificador de la subasta en el portal. |
general_information | Lista de pares clave-valor: tipo de subasta, fechas de inicio y conclusión, cantidad reclamada, anuncio en el BOE, valor de subasta, tasación, puja mínima, tramos entre pujas e importe del depósito. |
managing_authorities | Autoridad gestora: código, descripción, dirección, teléfono y correo. |
properties | Un elemento por bien, con title, description, superficie (m², o null si el texto no la indica) y property, la lista de pares del portal: dirección, código postal, localidad, provincia, referencia catastral, cargas, situación posesoria… |
lots | Solo en subastas por lotes: cada lote con sus importes (datos_puja) y los datos de su bien (datos_bien). En el resto es null. |
related | Acreedores y otros intervinientes publicados en la pestaña «Relacionados». |
bids | Estado de las pujas, con la misma forma que devuelve la ruta de pujas. |
category | Tipo de bien: Vivienda, Garaje, Local comercial, Finca rústica, Solar, Nave industrial… Si hay varios, separados por comas. |
concludes_at | Fecha y hora de conclusión, en horario peninsular español. |
bids_refreshed_at | Última vez que se comprobó el estado de las pujas (UTC). |
created_at, updated_at | Alta y última actualización del registro (UTC). |
La provincia y la localidad se leen de cada bien, dentro de properties[].property; el campo province_id de la raíz está reservado y no debe usarse para filtrar.
Si el identificador no existe, la respuesta es un 404.
Estado de las pujas
GET/api/auctions/{auction_number}/bids
La ruta más ligera para seguir una subasta abierta. En las subastas en curso el estado se comprueba aproximadamente cada hora.
{
"auction_number": "SUB-JA-2026-000000",
"bids": {
"tipo": "oculta",
"importe": null,
"mensaje": "La subasta ha recibido alguna puja. Para ver su importe debe acceder como usuario registrado.",
"lotes": []
},
"bids_refreshed_at": "2026-09-30T12:56:03.000000Z"
}Valores de bids.tipo
| Valor | Significado |
|---|---|
sin_pujas | La subasta no ha recibido pujas. |
oculta | Ha recibido alguna puja; el portal reserva el importe a usuarios registrados. |
secreta | La puja máxima es secreta por las reglas de esa subasta. |
lotes | Subasta por lotes: el detalle va en el array lotes. |
puja_maxima_final | Subasta concluida con puja; importe contiene la puja máxima. |
puja_maxima_actual | Puja máxima de una subasta aún abierta, cuando el portal la muestra. |
cancelada | Cancelada o suspendida por la autoridad gestora. |
desconocido | El portal muestra un texto que no encaja en los casos anteriores; va en mensaje. |
sin_datos | Todavía no se ha leído la pestaña de pujas de esa subasta. |
Mientras la subasta está abierta, el portal no publica importes: lo habitual es pasar de sin_pujas a oculta y, al concluir, a puja_maxima_final con el importe; el blog lo explica con un caso en primeros pasos con la API. En las subastas por lotes, lotes es una lista de objetos { lote, importe } donde importe es el texto que muestra el portal para ese lote.
Histórico de cambios
GET/api/changes
Cada vez que el sistema refresca una subasta abierta compara los valores con los anteriores y anota las diferencias. Esta ruta las devuelve, de la más reciente a la más antigua salvo que se indique otro orden.
| Parámetro | Tipo | Descripción |
|---|---|---|
auction_numbers | lista separada por comas | Limita el resultado a esas subastas. Máximo 50. |
fields | lista separada por comas | Limita el resultado a esos campos. Máximo 20. |
since, until | fecha | Rango sobre changed_at, ambos inclusive. Admite fecha o fecha y hora ISO. |
order | asc | desc | Orden por fecha de detección. Por defecto, desc. |
limit | entero, 1–500 | Cambios por respuesta. Por defecto, 100. |
before_id | entero | Cursor: devuelve cambios con id menor que el indicado. |
Campos con histórico
fecha_conclusion, puja_minima, tramos_entre_pujas, valor_subasta, tasacion, importe_deposito, bids.tipo, bids.importe y, en subastas por lotes, bids.lote.N, donde N es el número de lote.
{
"count": 2,
"changes": [
{
"id": 2791,
"auction_number": "SUB-JA-2026-000000",
"field": "bids.tipo",
"old_value": "sin_pujas",
"new_value": "oculta",
"changed_at": "2026-09-30T13:42:03.000000Z"
},
{
"id": 2764,
"auction_number": "SUB-AT-2026-00R0000000000",
"field": "fecha_conclusion",
"old_value": "30-09-2026 18:00:00 CET (ISO: 2026-09-30T18:00:00+02:00)",
"new_value": "30-09-2026 18:53:12 CET (ISO: 2026-09-30T18:53:12+02:00)",
"changed_at": "2026-09-30T16:20:04.000000Z"
}
],
"has_more": true,
"before_id_next": 2764
}Paginación
Cuando has_more es true, repite la petición añadiendo before_id con el valor de before_id_next. El cursor está pensado para el orden descendente.
Valores nulos
Un new_value nulo indica que el dato ha dejado de aparecer en la ficha. Ocurre, por ejemplo, con la fecha de conclusión cuando la autoridad gestora cancela la subasta. Sobre los cambios de hora de cierre, véase por qué se prorroga una subasta.
Errores
| Código | Cuándo | Cuerpo |
|---|---|---|
400 | Parámetros no válidos en el histórico de cambios. | {"error":"invalid_params","details":{…}} |
401 | Falta la cabecera Authorization o el token no es correcto. | {"error":"Unauthorized or invalid token"} |
404 | La subasta no está registrada. | {"message":"Record not found."} |
En un 400, details indica qué parámetro falla y por qué: un limit mayor de 500, una fecha ilegible o un campo que no tiene histórico.