Vai al contenuto

API · Per sviluppatori

Dati sulle gare tramite API

I dati che vedono gli utenti di Tender Radar, nel tuo ERP, CRM o data warehouse: Prozorro, oltre cento piattaforme commerciali e portali aziendali, UE, Regno Unito e ONU. Un unico formato per ogni piattaforma, aggiornato ogni pochi minuti.

Cosa ti offre l'API

Ogni gara arriva in un unico formato ovunque sia stata pubblicata: numero, titolo, ente appaltante con il suo id aziendale, CPV, valore atteso, scadenze nel fuso orario dell'ente e in UTC, stato e un link all'originale. Quando la stessa gara è su più piattaforme ricevi un unico record che elenca ogni luogo di pubblicazione.

Fonti

  • Prozorro: gli appalti pubblici dell'Ucraina
  • Piattaforme commerciali ucraine e portali di approvvigionamento aziendali
  • Unione europea (TED)
  • Sistemi nazionali di appalto di altri paesi, tra cui il Regno Unito
  • Organizzazioni internazionali, tra cui l'ONU

Aggiornamento

Ogni fonte viene interrogata secondo un proprio calendario: la più frequente ogni pochi minuti, le altre da ogni ora a ogni poche ore. Il campo updated_at indica quando un record è cambiato l'ultima volta.

Campi della gara

CampoDescrizione
idId permanente del record in Radar (UUID). Aggiorna o inserisci le tue righe in base ad esso.
numberIl numero della gara presso la fonte, ad es. UA-2026-10-11-000337-a.
title · title_translated · description · languageTitolo e descrizione nella lingua originale; una traduzione ucraina del titolo di una gara estera quando disponibile.
status · status_sourceStato sulla scala comune di Radar e stato come lo fornisce la fonte.
procedureTipo di procedura: codice ed etichetta.
buyerEnte appaltante: nome, EDRPOU o id nazionale, regione, località.
cpvCodice CPV principale con il suo nome, più eventuali codici aggiuntivi.
valueValore atteso, valuta e se l'IVA è inclusa.
published_at · submission_deadline · enquiry_end · auction_atDate e scadenze: ora locale dell'ente (local) e UTC (utc); time_zone è il fuso orario dell'ente.
source · url · also_onFonte, link all'originale e le altre piattaforme che pubblicano la stessa gara.
lots · items · documentsLotti, voci e documenti, quando la fonte li pubblica.
radar_url · first_seen_at · updated_atLa gara in Radar, quando l'abbiamo vista per la prima volta e quando il record è cambiato l'ultima volta.

Autenticazione

Ogni richiesta porta la chiave dell'organizzazione nell'intestazione Authorization: Bearer rdr_live_…. Una chiave appartiene all'azienda, non a una persona: consegnala a un servizio o a un'integrazione.

  1. 1Le chiavi vengono create dal titolare o da un amministratore dell'azienda in Tender Radar: Impostazioni → «API».
  2. 2Mostriamo la chiave completa una sola volta, subito dopo la creazione. Conservala in un gestore di segreti o in una variabile d'ambiente.
  3. 3Conserviamo solo un hash della chiave, quindi non possiamo mostrarla di nuovo. Hai perso una chiave? Revocala e creane una nuova.
  4. 4Una chiave revocata smette di funzionare subito. Dai a ogni integrazione una propria chiave (fino a 10 attive).

URL di base

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

Prima richiesta

Gare aperte di copertura tetti in Ucraina. La chiave viene letta dalla variabile d'ambiente RADAR_API_KEY.

Endpoint

Ogni risposta è JSON in UTF-8. Gli elenchi arrivano come un oggetto con un campo data. I parametri di elenco possono essere ripetuti o separati da virgole.

Gare

GET/v1/data/tenders

Cerca ed esporta gare. L'ordine è sempre (updated_at, id) crescente, così il cursore non salta mai una modifica.

ParametroDescrizione
qTesto libero, forme flesse incluse. Una frase esatta va tra virgolette, -word esclude.
cpvCodici CPV o prefissi di 2–8 cifre (45: edilizia, 4526: lavori di copertura).
countryPaese ISO 3166-1 alpha-2: UA, PL, GB…; EU: gare UE da TED.
sourceCodici delle fonti da /v1/data/sources.
groupSlug dei gruppi di aziende da /v1/data/buyer-groups.
buyerEnte appaltante: EDRPOU, id nazionale o id ente di Radar.
statusopen (predefinito): un fornitore può ancora partecipare e la scadenza non è passata; any: ogni stato; oppure stati specifici: planned, active, enquiry, tendering, auction, qualification, awarded, complete, cancelled, unsuccessful, closed_by_deadline, withdrawn_from_hub, notice, non_competitive.
value_min, value_maxValore atteso da / a, nella valuta della gara.
deadline_from, deadline_toScadenza dell'offerta da / a, data-ora ISO 8601.
updated_sinceISO 8601: solo gare create o modificate in questo momento o dopo.
cursorCursore opaco da next_cursor della risposta precedente.
limitDimensione della pagina, 1–500, predefinita 100.
langLingua dei nomi CPV, delle etichette di procedura e dei nomi delle fonti: uk (predefinito), ru, en.
formatjson (predefinito) o csv.
Risposta di esempio
{
  "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 gara

GET/v1/data/tenders/{id}

Il record completo per id. Id sconosciuto: 404 tender_not_found.

Nessun parametro.

Risposta di esempio
{
  "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"
}

Fonti

GET/v1/data/sources

Ogni fonte: codice, paese, segmento, calendario di interrogazione, ultima esecuzione riuscita, stato e numero di gare aperte. I codici vanno nel parametro source.

ParametroDescrizione
langLingua dei nomi CPV, delle etichette di procedura e dei nomi delle fonti: uk (predefinito), ru, en.
Risposta di esempio
{
  "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
    }
  ]
}

Gruppi di aziende

GET/v1/data/buyer-groups

Gruppi di enti appaltanti (holding) con i loro membri e id aziendali. Gli slug vanno nel parametro group.

ParametroDescrizione
langLingua dei nomi CPV, delle etichette di procedura e dei nomi delle fonti: uk (predefinito), ru, en.
Risposta di esempio
{
  "data": [
    {
      "slug": "metinvest",
      "name": "Метінвест",
      "aliases": [
        "Metinvest"
      ],
      "members": [
        {
          "edrpou": "00191000",
          "name": "ПрАТ «ММК ім. Ілліча»"
        }
      ]
    }
  ]
}

Codici CPV

GET/v1/data/cpv

Trova i codici CPV per prefisso del codice o per parole, con i nomi in tre lingue.

ParametroDescrizione
qPrefisso del codice o parole.
langLingua dei nomi CPV, delle etichette di procedura e dei nomi delle fonti: uk (predefinito), ru, en.
limitQuanti codici restituire.
Risposta di esempio
{
  "data": [
    {
      "code": "45261000",
      "name": "Покрівельні роботи",
      "names": {
        "uk": "Покрівельні роботи",
        "en": "Roofing works",
        "ru": "Кровельные работы"
      }
    }
  ]
}

Utilizzo

GET/v1/data/usage

La tua chiave, i suoi limiti, quante richieste e righe sono state usate oggi e lo stato del tuo accesso.

Nessun parametro.

Risposta di esempio
{
  "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
  }
}

Schema OpenAPI

GET/v1/data/openapi.json

Schema OpenAPI 3 della sola API dei dati; nessuna chiave necessaria. Generane un client per il tuo linguaggio.

Nessun parametro.

Sincronizzazione incrementale

Come mantenere una copia aggiornata: carica tutto una volta, poi recupera solo le modifiche.

  1. 1Primo caricamento: GET /v1/data/tenders?limit=500, poi segui next_cursor finché has_more è true. Salva l'ultimo next_cursor.
  2. 2Ogni 10 minuti: GET /v1/data/tenders?cursor=…&status=any&limit=500, di nuovo finché has_more. Inserisci o aggiorna le righe per id: una gara che è cambiata arriva di nuovo con il nuovo stato, ad es. closed_by_deadline. Salva il nuovo next_cursor.
  3. 3status=any in modo che anche le gare chiuse e annullate arrivino come modifiche. Le righe che non avevi e che non sono più aperte possono essere ignorate.

Nessun buco e nessun duplicato: una modifica ancora in scrittura viene trattenuta finché non è confermata, quindi il cursore non la salta mai. Se una richiesta si interrompe, ripetila con lo stesso cursore.

Esportazione CSV

Aggiungi format=csv e le stesse righe arrivano come CSV: colonne piatte, separate da virgole, una riga di intestazione, UTF-8 con BOM (Excel lo apre così com'è). Il cursore arriva nelle intestazioni X-Next-Cursor e X-Has-More, quindi la sincronizzazione funziona allo stesso modo.

Limiti

  • 120 richieste al minuto per chiave.
  • 100.000 righe di gare al giorno per organizzazione (giorno UTC).
  • Fino a 500 righe per pagina.
  • Entrambi i limiti possono essere aumentati per la tua organizzazione: scrivici.

Intestazioni dei limiti di frequenza

Ogni risposta riporta lo stato attuale dei limiti:

IntestazioneDescrizione
X-RateLimit-LimitRichieste al minuto per questa chiave.
X-RateLimit-RemainingRichieste rimaste nel minuto corrente.
X-RateLimit-ResetSecondi prima del reset della finestra del minuto.
X-RateLimit-Rows-LimitRighe al giorno per l'organizzazione.
X-RateLimit-Rows-RemainingRighe rimaste oggi.
Retry-AfterSolo su un 429: secondi da attendere prima di riprovare.

Errori

Il corpo dell'errore è sempre lo stesso: code per i programmi, message e detail per le persone. Un errore di validazione (422) ha il corpo standard in cui detail elenca i campi.

CodiceCosa è successo
401 missing_api_keyNessuna intestazione Authorization: Bearer.
401 invalid_api_keyChiave sconosciuta.
401 api_key_revokedLa chiave è stata revocata.
402 api_plan_requiredL'organizzazione non ha un abbonamento API attivo.
400 invalid_cursorIl cursore è danneggiato o non proviene da questa API.
404 tender_not_foundNessuna gara con questo id.
422 —Un parametro non è valido.
429 rate_limitedTroppe richieste al minuto; riprova dopo Retry-After.
429 daily_rows_exceededIl limite giornaliero di righe è esaurito; si azzera a mezzanotte UTC.
{
  "code": "invalid_api_key",
  "message": "Unknown API key",
  "detail": "Check the Authorization header"
}

Server MCP

Gli stessi dati sulle gare come server Model Context Protocol (MCP), così un assistente può cercare gare e aprirne una all'interno di una conversazione. Un unico endpoint, POST /v1/mcp, JSON-RPC 2.0 sul trasporto Streamable HTTP. Usa la chiave dell'organizzazione, come l'API REST (l'intestazione Authorization: Bearer rdr_live_…), con lo stesso abbonamento e gli stessi limiti.

Endpoint

POST https://metadani.com/v1/mcp

Strumenti

StrumentoDescrizione
search_tendersCerca gare per testo, CPV, paese, stato e valore; restituisce le corrispondenze aggiornate più di recente con ente appaltante, valore, scadenza e link.
get_tenderRecupera una gara tramite il suo id di Radar.

Collega un client

Aggiungi il server a qualsiasi client MCP che consenta di impostare un'intestazione di richiesta e passa la tua chiave nell'intestazione Authorization. Per un client che legge una configurazione JSON, il bridge mcp-remote trasporta l'intestazione:

{
  "mcpServers": {
    "metadani-radar": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://metadani.com/v1/mcp",
        "--header",
        "Authorization: Bearer rdr_live_…"
      ]
    }
  }
}

Un client che parla direttamente Streamable HTTP non ha bisogno del bridge: invia JSON-RPC 2.0 con POST all'endpoint con l'intestazione Authorization e Accept: application/json.

I connettori web ospitati che richiedono OAuth non sono ancora supportati: usa un client che accetti un'intestazione, oppure scrivici.

L'API è inclusa con un abbonamento

Invia una richiesta: concordiamo volume e prezzo, attiviamo l'abbonamento per la tua organizzazione e il titolare o un amministratore crea subito una chiave.

Hai già l'accesso? Le chiavi si creano in Impostazioni → «API». Apri le impostazioni

Ottieni una chiave / Richiedi l'accesso