Saltar al contenido
Servicio independiente · No es un sitio oficial del BOEDatos a 30 de septiembre de 2026, 14:16 UTC
Subastas BOEAPI

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.

Petición de ejemplo
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.

JavaScript
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ámetroTipoDescripción
pageenteroNúmero de página, desde 1. Por defecto, 1.
Respuesta 200 (abreviada)
{
  "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}

CampoContenido
auction_numberIdentificador de la subasta en el portal.
general_informationLista 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_authoritiesAutoridad gestora: código, descripción, dirección, teléfono y correo.
propertiesUn 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…
lotsSolo en subastas por lotes: cada lote con sus importes (datos_puja) y los datos de su bien (datos_bien). En el resto es null.
relatedAcreedores y otros intervinientes publicados en la pestaña «Relacionados».
bidsEstado de las pujas, con la misma forma que devuelve la ruta de pujas.
categoryTipo de bien: Vivienda, Garaje, Local comercial, Finca rústica, Solar, Nave industrial… Si hay varios, separados por comas.
concludes_atFecha 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_atAlta 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.

Respuesta 200
{
  "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

ValorSignificado
sin_pujasLa subasta no ha recibido pujas.
ocultaHa recibido alguna puja; el portal reserva el importe a usuarios registrados.
secretaLa puja máxima es secreta por las reglas de esa subasta.
lotesSubasta por lotes: el detalle va en el array lotes.
puja_maxima_finalSubasta concluida con puja; importe contiene la puja máxima.
puja_maxima_actualPuja máxima de una subasta aún abierta, cuando el portal la muestra.
canceladaCancelada o suspendida por la autoridad gestora.
desconocidoEl portal muestra un texto que no encaja en los casos anteriores; va en mensaje.
sin_datosTodaví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ámetroTipoDescripción
auction_numberslista separada por comasLimita el resultado a esas subastas. Máximo 50.
fieldslista separada por comasLimita el resultado a esos campos. Máximo 20.
since, untilfechaRango sobre changed_at, ambos inclusive. Admite fecha o fecha y hora ISO.
orderasc | descOrden por fecha de detección. Por defecto, desc.
limitentero, 1–500Cambios por respuesta. Por defecto, 100.
before_identeroCursor: 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.

GET/api/changes?fields=fecha_conclusion,bids.tipo&since=2026-09-30&limit=2
{
  "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ódigoCuándoCuerpo
400Parámetros no válidos en el histórico de cambios.{"error":"invalid_params","details":{…}}
401Falta la cabecera Authorization o el token no es correcto.{"error":"Unauthorized or invalid token"}
404La 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.