Saltar al contenido

API · Para desarrolladores

Datos de licitaciones mediante una API

Los datos que ven los usuarios de Tender Radar, en tu ERP, CRM o almacén de datos: Prozorro, más de cien plataformas comerciales y portales de empresas, la UE, el Reino Unido y la ONU. Un solo formato para todas las plataformas, actualizado cada pocos minutos.

Qué te da la API

Cada licitación llega en un único formato, sea cual sea el lugar donde se publicó: número, título, comprador con su identificador de empresa, CPV, valor esperado, plazos en la zona horaria del comprador y en UTC, estado y un enlace al original. Cuando la misma licitación está en varias plataformas, recibes un solo registro que enumera todos los lugares donde se publicó.

Fuentes

  • Prozorro — la contratación pública de Ucrania
  • Plataformas comerciales ucranianas y portales de contratación de empresas
  • Unión Europea (TED)
  • Sistemas nacionales de contratación de otros países, entre ellos el Reino Unido
  • Organizaciones internacionales, entre ellas la ONU

Actualidad de los datos

Cada fuente se consulta según su propio calendario: la más frecuente cada pocos minutos, el resto desde cada hora hasta cada pocas horas. El campo updated_at indica cuándo cambió un registro por última vez.

Campos de la licitación

CampoDescripción
idIdentificador permanente del registro en Radar (UUID). Haz upsert de tus filas con él.
numberEl número de la licitación en la fuente, p. ej. UA-2026-10-11-000337-a.
title · title_translated · description · languageTítulo y descripción en el idioma original; una traducción al ucraniano del título de una licitación extranjera cuando la hay.
status · status_sourceEstado en la escala común de Radar y el estado tal como lo da la fuente.
procedureTipo de procedimiento: código y etiqueta.
buyerComprador: nombre, EDRPOU o identificador nacional, región, localidad.
cpvCódigo CPV principal con su nombre, más códigos adicionales.
valueValor esperado, moneda e indicación de si incluye IVA.
published_at · submission_deadline · enquiry_end · auction_atFechas y plazos: la hora local del comprador (local) y UTC (utc); time_zone es la zona horaria del comprador.
source · url · also_onFuente, enlace al original y las demás plataformas que publican la misma licitación.
lots · items · documentsLotes, artículos y documentos, cuando la fuente los publica.
radar_url · first_seen_at · updated_atLa licitación en Radar, cuándo la vimos por primera vez y cuándo cambió el registro por última vez.

Autenticación

Cada solicitud lleva la clave de la organización en la cabecera Authorization: Bearer rdr_live_…. Una clave pertenece a la empresa, no a una persona: dásela a un servicio o a una integración.

  1. 1Las claves las crea el propietario o un administrador de la empresa en Tender Radar: Ajustes → «API».
  2. 2Mostramos la clave completa una sola vez, justo después de crearla. Guárdala en un gestor de secretos o en una variable de entorno.
  3. 3Solo almacenamos un hash de la clave, por lo que no podemos volver a mostrarla. ¿Has perdido una clave? Revócala y crea una nueva.
  4. 4Una clave revocada deja de funcionar al instante. Da a cada integración su propia clave (hasta 10 activas).

URL base

https://app.metadani.com/v1/data
Authorization: Bearer rdr_live_…

Primera solicitud

Licitaciones abiertas de tejados en Ucrania. La clave se lee de la variable de entorno RADAR_API_KEY.

Endpoints

Cada respuesta es JSON en UTF-8. Las listas llegan como un objeto con un campo data. Los parámetros de lista pueden repetirse o separarse por comas.

Licitaciones

GET/v1/data/tenders

Busca y exporta licitaciones. El orden es siempre (updated_at, id) ascendente, de modo que el cursor nunca se salta un cambio.

ParámetroDescripción
qTexto libre, incluidas las formas flexivas. Una frase exacta va entre comillas; -palabra excluye.
cpvCódigos CPV o prefijos de 2 a 8 dígitos (45 — construcción, 4526 — obras de tejados).
countryPaís ISO 3166-1 alfa-2: UA, PL, GB…; EU — licitaciones de la UE desde TED.
sourceCódigos de fuente de /v1/data/sources.
groupSlugs de grupos de empresas de /v1/data/buyer-groups.
buyerComprador: EDRPOU, identificador nacional o identificador de comprador de Radar.
statusopen (por defecto) — un proveedor aún puede ofertar y el plazo no ha vencido; any — cualquier estado; o estados concretos: planned, active, enquiry, tendering, auction, qualification, awarded, complete, cancelled, unsuccessful, closed_by_deadline, withdrawn_from_hub, notice, non_competitive.
value_min, value_maxValor esperado desde / hasta, en la moneda propia de la licitación.
deadline_from, deadline_toPlazo de ofertas desde / hasta, fecha y hora ISO 8601.
updated_sinceISO 8601: solo licitaciones creadas o modificadas en este momento o después.
cursorCursor opaco del next_cursor de la respuesta anterior.
limitTamaño de página, 1–500, por defecto 100.
langIdioma de los nombres CPV, las etiquetas de procedimiento y los nombres de fuente: uk (por defecto), ru, en.
formatjson (por defecto) o csv.
Ejemplo de respuesta
{
  "data": [
    {
      "id": "0d6f4f7e-1c3b-4a51-9b7e-5b9b1f0c2a11",
      "number": "UA-2026-10-11-000337-a",
      "title": "Капітальний ремонт покрівлі",
      "status": "tendering",
      "source": { "code": "prozorro", "name": "Prozorro" },
      "value": { "amount": 1250000.0, "currency": "UAH", "vat_included": true },
      "submission_deadline": { "local": "2026-10-21T00:00:00+03:00", "utc": "2026-10-20T21:00:00Z" },
      "updated_at": "2026-10-11T19:31:02.123456Z",
      "…": "…"
    }
  ],
  "next_cursor": "eyJ1IjoiMjAyNi0xMC0xMVQxOTozMTowMi4xMjM0NTZaIiwiaSI6IjZmMWMifQ",
  "has_more": true,
  "as_of": "2026-10-11T19:40:00Z"
}

Una licitación

GET/v1/data/tenders/{id}

El registro completo por id. Identificador desconocido: 404 tender_not_found.

Sin parámetros.

Ejemplo de respuesta
{
  "id": "0d6f4f7e-1c3b-4a51-9b7e-5b9b1f0c2a11",
  "number": "UA-2026-10-11-000337-a",
  "title": "Капітальний ремонт покрівлі",
  "title_translated": null,
  "description": "…",
  "language": "uk",
  "status": "tendering",
  "status_source": "active.tendering",
  "procedure": {
    "code": "aboveThreshold",
    "label": "Відкриті торги з особливостями"
  },
  "buyer": {
    "name": "Київська міська рада",
    "edrpou": "22883141",
    "scheme": "UA-EDR",
    "region": "Київ",
    "locality": "Київ"
  },
  "country": "UA",
  "region": "Київ",
  "source": {
    "code": "prozorro",
    "name": "Prozorro"
  },
  "url": "https://prozorro.gov.ua/tender/UA-2026-10-11-000337-a",
  "also_on": [
    {
      "source": "smarttender",
      "url": "https://smarttender.biz/…"
    }
  ],
  "cpv": {
    "main": {
      "code": "45261000",
      "name": "Покрівельні роботи"
    },
    "extra": [
      {
        "code": "45262000",
        "name": "…"
      }
    ]
  },
  "value": {
    "amount": 1250000,
    "currency": "UAH",
    "vat_included": true
  },
  "time_zone": "Europe/Kyiv",
  "published_at": {
    "local": "2026-10-11T10:15:00+03:00",
    "utc": "2026-10-11T07:15:00Z"
  },
  "submission_start": {
    "local": "2026-10-11T10:15:00+03:00",
    "utc": "2026-10-11T07:15:00Z"
  },
  "enquiry_end": null,
  "submission_deadline": {
    "local": "2026-10-21T00:00:00+03:00",
    "utc": "2026-10-20T21:00:00Z"
  },
  "auction_at": null,
  "lots": [],
  "items": [],
  "documents": [],
  "radar_url": "https://platform.aurum-apps.com/uk/app/tenders/0d6f4f7e-1c3b-4a51-9b7e-5b9b1f0c2a11",
  "first_seen_at": "2026-10-11T07:16:40Z",
  "updated_at": "2026-10-11T19:31:02.123456Z"
}

Fuentes

GET/v1/data/sources

Todas las fuentes: código, país, segmento, calendario de consulta, última ejecución correcta, estado y número de licitaciones abiertas. Los códigos se usan en el parámetro source.

ParámetroDescripción
langIdioma de los nombres CPV, las etiquetas de procedimiento y los nombres de fuente: uk (por defecto), ru, en.
Ejemplo de respuesta
{
  "data": [
    {
      "code": "prozorro",
      "name": "Prozorro",
      "country": "UA",
      "segment": "ua_public",
      "kind": "api",
      "schedule_minutes": 5,
      "last_success_at": "2026-10-11T19:35:00Z",
      "status": "ok",
      "open_tenders": 18950
    }
  ]
}

Grupos de empresas

GET/v1/data/buyer-groups

Grupos de compradores (holdings) con sus miembros e identificadores de empresa. Los slugs se usan en el parámetro group.

ParámetroDescripción
langIdioma de los nombres CPV, las etiquetas de procedimiento y los nombres de fuente: uk (por defecto), ru, en.
Ejemplo de respuesta
{
  "data": [
    {
      "slug": "metinvest",
      "name": "Метінвест",
      "aliases": [
        "Metinvest"
      ],
      "members": [
        {
          "edrpou": "00191000",
          "name": "ПрАТ «ММК ім. Ілліча»"
        }
      ]
    }
  ]
}

Códigos CPV

GET/v1/data/cpv

Busca códigos CPV por prefijo de código o por palabras, con nombres en tres idiomas.

ParámetroDescripción
qPrefijo de código o palabras.
langIdioma de los nombres CPV, las etiquetas de procedimiento y los nombres de fuente: uk (por defecto), ru, en.
limitCuántos códigos devolver.
Ejemplo de respuesta
{
  "data": [
    {
      "code": "45261000",
      "name": "Покрівельні роботи",
      "names": {
        "uk": "Покрівельні роботи",
        "en": "Roofing works",
        "ru": "Кровельные работы"
      }
    }
  ]
}

Uso

GET/v1/data/usage

Tu clave, sus límites, cuántas solicitudes y filas se han usado hoy y el estado de tu acceso.

Sin parámetros.

Ejemplo de respuesta
{
  "org": "ТОВ «Альфа»",
  "key": {
    "name": "ERP sync",
    "prefix": "rdr_live_ab12cd"
  },
  "limits": {
    "requests_per_minute": 120,
    "rows_per_day": 100000,
    "max_page": 500
  },
  "today": {
    "requests": 14,
    "rows": 1200,
    "rows_remaining": 98800
  },
  "subscription": {
    "status": "active",
    "plan": "api",
    "trial_until": null
  }
}

Esquema OpenAPI

GET/v1/data/openapi.json

Esquema OpenAPI 3 solo de la API de datos; no hace falta clave. Genera a partir de él un cliente para tu lenguaje.

Sin parámetros.

Sincronización incremental

Cómo mantener una copia actualizada: carga todo una vez y luego obtén solo los cambios.

  1. 1Primera carga: GET /v1/data/tenders?limit=500, y después sigue next_cursor mientras has_more sea true. Guarda el último next_cursor.
  2. 2Cada 10 minutos: GET /v1/data/tenders?cursor=…&status=any&limit=500, de nuevo mientras has_more. Haz upsert de las filas por id: una licitación que cambió llega de nuevo con su nuevo estado, p. ej. closed_by_deadline. Guarda el nuevo next_cursor.
  3. 3status=any para que las licitaciones cerradas y canceladas también lleguen como cambios. Las filas que nunca tuviste y que ya no están abiertas pueden omitirse.

Sin huecos ni duplicados: un cambio que aún se está escribiendo se retiene hasta que se confirma, de modo que el cursor nunca lo salta. Si una solicitud se interrumpe, repítela con el mismo cursor.

Exportación a CSV

Añade format=csv y las mismas filas llegan como CSV: columnas planas, separadas por comas, una fila de cabecera, UTF-8 con BOM (Excel lo abre tal cual). El cursor llega en las cabeceras X-Next-Cursor y X-Has-More, por lo que la sincronización funciona igual.

Límites

  • 120 solicitudes por minuto por clave.
  • 100 000 filas de licitaciones al día por organización (día UTC).
  • Hasta 500 filas por página.
  • Ambos límites pueden ampliarse para tu organización: escríbenos.

Cabeceras de límite de frecuencia

Cada respuesta lleva el estado actual de los límites:

CabeceraDescripción
X-RateLimit-LimitSolicitudes por minuto para esta clave.
X-RateLimit-RemainingSolicitudes restantes en el minuto en curso.
X-RateLimit-ResetSegundos hasta que se reinicia la ventana del minuto.
X-RateLimit-Rows-LimitFilas por día para la organización.
X-RateLimit-Rows-RemainingFilas restantes hoy.
Retry-AfterSolo en un 429: segundos que esperar antes de reintentar.

Errores

El cuerpo del error es siempre el mismo: code para los programas, message y detail para las personas. Un error de validación (422) tiene el cuerpo estándar donde detail enumera los campos.

CódigoQué ocurrió
401 missing_api_keyFalta la cabecera Authorization: Bearer.
401 invalid_api_keyClave desconocida.
401 api_key_revokedLa clave fue revocada.
402 api_plan_requiredLa organización no tiene una suscripción activa a la API.
400 invalid_cursorEl cursor está dañado o no es de esta API.
404 tender_not_foundNo hay ninguna licitación con este identificador.
422 —Un parámetro no es válido.
429 rate_limitedDemasiadas solicitudes por minuto; reintenta tras Retry-After.
429 daily_rows_exceededSe agotó el límite diario de filas; se reinicia a medianoche UTC.
{
  "code": "invalid_api_key",
  "message": "Unknown API key",
  "detail": "Check the Authorization header"
}

La API se incluye con una suscripción

Envía una solicitud: acordamos el volumen y el precio, activamos la suscripción para tu organización y el propietario o un administrador crea una clave de inmediato.

¿Ya tienes acceso? Las claves se crean en Ajustes → «API». Abrir ajustes

Obtener una clave / Solicitar acceso