Developer API

Free, keyless JSON over the same data the site runs on. No signup, no key — just fetch. CORS is open for GET, responses are cached ~60s, and there's a generous per-IP limit (120 requests/minute) so the free tier can't be abused. Response shape:{ "api": "v1", "data": … }.

GET /api/tenders

Search tenders (q, cpv, country, min, max, within, closing, source, awarded, page). Add mode=semantic for cross-lingual meaning search (adds a similarity score).

https://tenderfeed.eu/api/tenders?q=asfalt&country=NL&closing=30

Try it →

GET /api/tenders/{id}

One tender, with the bid-check extraction when present.

https://tenderfeed.eu/api/tenders/<uuid>

Response

List endpoints paginate — add ?page=2 for the next page (50/page).

{
  "api": "v1",
  "data": {
    "total": 5232,           // total matches
    "page": 1,
    "page_size": 50,
    "tenders": [{
      "id": "…", "source": "TED", "notice_id": "453102-2026",
      "title": "…", "buyer": "Rijkswaterstaat", "country": "NL",
      "cpv": ["45233141"], "published_at": "2026-07-02",
      "deadline_at": "2026-07-14T12:00:00.000Z",
      "estimated_value_eur": "3400000", "awarded_to": null,
      "url": "https://tenderfeed.eu/tenders/<id>"
    }]
  }
}

The /api/tenders/{id} object also carries description, awarded_value_eur/kvk and bid_check (the AI extraction, when present). Errors: { "api": "v1", "error": "…" } with a 400/404/429 status.

Data is TED (© European Union) + TenderNed, reused under EU open-data terms. TenderRadar is an independent service — why use it over the portals. Please attribute and rate-limit politely; abuse caps may tighten. Questions or higher limits for research? Get in touch via Data & sources.