eu-verifyFor AI agents · pay per call

EU public tenders API for AI agents

Find fresh European public procurement opportunities: this endpoint queries TED (Tenders Electronic Daily), the official journal of the Publications Office of the European Union where above-threshold public contracts must be published - new notices appear daily. Filter by 8-digit CPV classification code and 3-letter buyer country over a look-back window of up to 30 days; each notice returns title, buyer name, publication date, tender deadline and a direct TED URL.

It is built for autonomous agents: no account, no API key - the agent pays $0.01 per search in USDC and gets compact JSON instead of the TED expert-query API. Failed answers are never billed.

Endpoint

GET /v1/eu/tenders$0.01 per call (USDC on Base, x402). Also available as the MCP tool find_public_tenders_eu on https://data.greeneris.io/mcp.

Parameters

ParamDescription
cpv8-digit CPV classification code, e.g. 48000000 for software (optional)
country3-letter buyer country code, e.g. FRA, DEU, ITA (optional)
days_backLook-back window in days, 1-30 (default 7)
limitMax notices returned, 1-25 (default 10)

Example

curl -i "https://data.greeneris.io/v1/eu/tenders?cpv=48000000&country=FRA&days_back=7&limit=5"
# HTTP/1.1 402 Payment Required + machine-readable quote
# (any x402 client pays the quote and retries automatically)

Or pay and read the answer from code (pip install "x402[httpx,evm]"):

import asyncio, os
from eth_account import Account
from x402 import x402Client
from x402.http.clients import x402HttpxClient
from x402.mechanisms.evm.exact import register_exact_evm_client

buyer = Account.from_key(os.environ["BUYER_PRIVATE_KEY"])  # test buyer wallet

async def main():
    client = x402Client()
    register_exact_evm_client(client, buyer)   # gasless USDC on Base (EIP-3009)
    async with x402HttpxClient(client, timeout=45) as http:
        # reads the 402 quote, signs the USDC payment, retries automatically
        r = await http.get("https://data.greeneris.io/v1/eu/tenders?cpv=48000000&country=FRA&days_back=7&limit=5")
        print(r.status_code, (await r.aread()).decode())

asyncio.run(main())

Response after payment:

{"ok": true, "data": {"query": {"cpv": "48000000", "country": "FRA", "published_since": "20260706"}, "total_matches": 44, "notices": [{"publication_number": "460906-2026", "publication_date": "2026-07-06", "title": "France - Software package and information systems - Accord-cadre titres-restaurant", "buyer_name": "OPHIS", "deadline": "2026-08-10", "url": "https://ted.europa.eu/en/notice/460906-2026"}], "source": "TED - Tenders Electronic Daily, Publications Office of the European Union"}}

What agents use it for

How payment works

Call the endpoint: you get HTTP 402 with a signed quote (price, receiving address, network). Your agent pays a few tenths of a cent in USDC on Base (gasless, EIP-3009) and retries - one round trip, no account, no API key. Settlement only happens after a successful answer. Full catalog: llms.txt.

Related