About toll402 – EU & Nordic Data (x402)
toll402 is a remote MCP server and HTTP API for agents that need EU and Nordic public-sector and related data. It charges per request through x402 stablecoin payments, without requiring an API key or account.
Key features
- 01EU VAT and company lookups
- 02Sanctions and MiCA checks
- 03ECB and Danish FX rates
- 04Nordic calendars and Danish energy data
- 05Search, jobs, ads and procurement data
Use cases
- 01Check VAT numbers and sanctions
- 02Convert currencies using official rates
- 03Find working days and electricity windows
- 04Search tenders, jobs and public ad libraries
MCP support
Provides a streamable HTTP MCP server at https://toll402.io/mcp, exposing data endpoints as tools. Calls use x402 payments; an unpaid request returns payment requirements for the agent to satisfy.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://toll402.io/mcpclaude mcp add --transport http io-toll402-toll402 https://toll402.io/mcp{"mcpServers":{"io-toll402-toll402":{"type":"http","url":"https://toll402.io/mcp"}}}Open in Cursor{"servers":{"io-toll402-toll402":{"type":"http","url":"https://toll402.io/mcp"}}}Open in VS Code{"mcpServers":{"io-toll402-toll402":{"type":"http","url":"https://toll402.io/mcp"}}}{"mcpServers":{"io-toll402-toll402":{"serverUrl":"https://toll402.io/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
Details
From the project READMEtoll402: EU & Nordic data for AI agents, paid per call (x402 + MCP)
25 live data endpoints · $0.005–$0.03 per call · no API key, no account, no signup · non-custodial
x402 · MCP · AI agents · agent payments · USDC / EURC on Base · USDC on Polygon & Arc · XRP & RLUSD on the XRP Ledger (RLUSD: non-EU buyers only) · EU VAT / VIES · EU, OFAC, UK & UN sanctions screening · MiCA · ECB FX · Nordic calendars · Danish energy data · Google Trends · Indeed jobs (DK/SE/NO + 57 countries)
Runnable examples (curl, Node x402 client, MCP configs): AtlasDataDenmark/toll402-examples
toll402 is an HTTP API and a remote MCP server that sells official EU and Danish/Nordic public-sector data to AI agents one call at a time. It uses the x402 protocol: an unpaid request gets 402 Payment Required with the payment requirements in the PAYMENT-REQUIRED header (x402 v2) and mirrored in the JSON body (x402Version + accepts), the agent's wallet signs a stablecoin payment, and the call goes through. Funds go straight from the buyer to the seller's address. toll402 never holds funds.
Why: agents that do invoicing, payroll, compliance, logistics or energy scheduling keep needing small facts like "is this VAT number valid?", "is the 24th a Danish banking day?" or "what is the ECB rate for that date?". Today each of those means a separate API key and account. With toll402 one wallet covers all of them, and you pay only for the calls you make.
- Website: https://toll402.io
- MCP (streamable HTTP):
https://toll402.io/mcp - XRPL merchant file:
/.well-known/trustline-merchant.txt - Discovery:
/llms.txt·/openapi.json·/.well-known/x402·/.well-known/mcp.json·/samples(free example outputs)
Endpoints and prices
| MCP tool | HTTP endpoint | What it returns | Price (USD) |
|---|---|---|---|
eu_vat_check | GET /v1/eu/vat-check?vat=DK10150817 | Live EU VAT number validation against the European Commission's VIES service | 0.01 |
no_company | GET /v1/no/company?orgnr=923609016 | Norwegian company lookup in Brønnøysund Enhetsregisteret by orgnr or name (NLOD 2.0) | 0.01 |
fi_company | GET /v1/fi/company?businessId=0112038-9 | Finnish company lookup in PRH/YTJ open data v3 by Business ID or name (CC BY 4.0) | 0.01 |
lei_lookup | GET /v1/lei?lei=5493001KJTIIGC8Y1R12 | Legal Entity Identifier lookup in the GLEIF Global LEI Index by LEI or legal name (CC0) | 0.01 |
eu_vat_rates | GET /v1/eu/vat-rates?country=DK | Standard, reduced, super-reduced and parking VAT rates for EU member states | 0.005 |
eu_sanctions | GET /v1/eu/sanctions?name=Wagner | Screen a person or company name against the EU consolidated financial sanctions list (fuzzy match, refreshed every 6 h) | 0.02 |
sanctions_screen_global | GET /v1/sanctions/screen?name=Wagner | Screen a name against EU, US OFAC SDN, UK Sanctions List (FCDO, incl. HM Treasury/OFSI asset freezes) and UN Security Council lists at once; per match: list, programme, reference, match_score, matched_alias (lists=eu,ofac,uk,un to narrow; refreshed every 6 h) | 0.03 |
mica_token_status | GET /v1/eu/mica/token?token=EURC | MiCA e-money-token status from ESMA's register | 0.01 |
mica_casp | GET /v1/eu/mica/casp?name=Coinbase | Whether a crypto firm holds a MiCA CASP authorisation | 0.01 |
fx_ecb | GET /v1/fx/convert?from=USD&to=DKK&amount=250 | Conversion at official ECB euro reference rates (~30 currencies, historical dates) | 0.005 |
fx_dkk | GET /v1/fx/dkk?currency=USD&amount=100 | Official Danmarks Nationalbank DKK rates | 0.005 |
eu_holidays | GET /v1/calendar/holidays?country=SE&year=2026 | Public holidays, EU/EEA/Nordic (+CH, GB) | 0.005 |
eu_working_days | GET /v1/calendar/working-days?country=DK&from=2026-12-01&to=2026-12-31 | Working days between dates, or date + N working days | 0.005 |
dk_bank_days | GET /v1/dk/bank-days?date=2026-12-24&add=3 | Danish banking days and payment deadlines | 0.005 |
dk_power_price | GET /v1/dk/power-price?area=DK2 | Day-ahead electricity spot prices, 15-min (DK1, DK2, NO2, SE3, SE4, DE-LU) | 0.005 |
dk_power_cheapest_window | GET /v1/dk/power-cheapest-window?area=DK1&hours=3 | Cheapest N-hour window for running a load (EV charging, heat pumps, batch jobs), same zones | 0.005 |
dk_co2 | GET /v1/dk/co2?area=DK2 | CO₂ intensity of Danish electricity | 0.005 |
dk_address | GET /v1/dk/address?q=Rådhuspladsen 1, København | Danish address validation + geocoding (official Danish Address Register, DAR) | 0.005 |
dk_weather | GET /v1/dk/weather?lat=55.68&lon=12.57 | Latest DMI weather observation from the nearest station | 0.005 |
dk_sea_level | GET /v1/dk/port-sea-level?port=Esbjerg | Sea level and water temperature at Danish ports | 0.005 |
stablecoin_receipt | GET /v1/accounting/stablecoin-receipt?token=USDC&amount=12.5&date=2026-10-27 | EUR/DKK accounting voucher data for a stablecoin payment | 0.01 |
Temporarily unavailable:
dk_company(/v1/dk/company) has been taken out of the paid catalog while we move it to the official CVR source from the Danish Business Authority, because the previous upstream's terms do not allow paid reuse. The path returns503and never asks for payment. For a Danish VAT/CVR number,eu_vat_check(VIES) still returns the registered name and address.
From Atlas Data (third-party seller)
These endpoints are provided by Atlas Data, the first outside seller on toll402. toll402 calls Atlas Data's own Apify actors (atlasdata/google-trends-scraper-reliable, atlasdata/indeed-jobs-scraper-reliable, atlasdata/facebook-ad-library-scraper-reliable, atlasdata/linkedin-ad-library-scraper-reliable, atlasdata/eu-tenders-ted-scraper-reliable, atlasdata/finland-ais-vessel-tracker-reliable, atlasdata/eudr-scope-risk-checker-reliable, atlasdata/cbam-cost-calculator-reliable) and returns clean JSON with source and provider set to Atlas Data. Payment works the same as for the other endpoints, on the same rails and to the same addresses.
| MCP tool | HTTP endpoint | What it returns | Price (USD) |
|---|---|---|---|
google_trends | GET /v1/trends/google?keywords=bitcoin,ethereum&geo=DK&timeRange=today%203-m | Google Trends for 1–5 keywords: relative interest over time (0–100), interest by region, top and rising related queries. Optional category, property (web/images/news/youtube/shopping), compare, maxItems (≤20 per list) | 0.03 |
indeed_jobs | GET /v1/jobs/indeed?keywords=developer&location=København&country=dk&maxItems=20 | Live Indeed job listings (Denmark, Sweden, Norway and 57 other Indeed country sites): title, company, location, salary where shown, job type, remote flag, posting date, apply link. Up to 3 keywords, maxItems ≤50; optional radius, datePosted, jobType, remote, minSalary, sort, includeDescription | 0.02 |
meta_ads | GET /v1/ads/meta?keywords=lego&country=DK&maxItems=10 | Search the Meta (Facebook/Instagram) Ad Library, Meta's public ad-transparency archive, by keyword or advertiser pageIds: advertiser page, ad text, format, landing page, platforms, start/end dates, active status, and spend/impression ranges where Meta publishes them. Up to 3 searches, maxItems ≤20; optional activeStatus, adType, mediaType, platforms, languages, exactPhrase, dateFrom, dateTo, sort | 0.02 |
linkedin_ads | GET /v1/ads/linkedin?advertiser=HubSpot&maxItems=10 | Search the LinkedIn Ad Library, LinkedIn's public ad-transparency archive, by advertiser or keyword: advertiser, headline, ad text, format, landing page; with includeDetails=true also run dates, impression ranges and targeting. Optional countries, dateRange or startDate/endDate, maxItems ≤20. Best-effort: LinkedIn sometimes blocks automated access; a failed run returns 503 within about 40 s and is not charged. Use meta_ads for a more reliable ad source | 0.02 |
eu_tenders | GET /v1/tenders/eu?keywords=software&countries=DK&onlyOpen=true&maxItems=10 | EU public procurement notices from TED (Tenders Electronic Daily, official TED Search API): title, buyer, country, CPV, procedure, estimated/awarded value, winners, deadline and TED links, newest first. Filters: keywords (≤5), countries (≤10), cpvCodes (≤10), noticeType, publishedSince (date or e.g. 7 days; default 30 days), publishedUntil, onlyOpen, language, expertQuery (≤300 chars), maxItems ≤25 (default 10). © European Union, https://ted.europa.eu | 0.03 |
maritime_vessels | GET /v1/maritime/vessels?lat=60.15&lon=24.95&radiusKm=20&maxItems=10 | Live AIS vessel positions, northern Baltic Sea and Finland only (Finnish AIS base stations, about 57–66°N, 17–35°E; not global AIS): ships near a point (radiusKm ≤1000, the circle must reach the coverage area) or by mmsi, imo, vesselName, shipCategories; name, IMO, type, speed, course, nav status, destination, ETA, size. maxItems ≤30. Not for navigation | 0.02 |
maritime_port_calls | GET /v1/maritime/port-calls?ports=FIHEL&maxItems=10 | Port calls at Finnish ports (Portnet): expected/arrived/departed ships with ETA/ETD/ATA/ATD, berth, vessel name/IMO/MMSI/flag/type, previous/next port. Filters: ports (Finnish UN/LOCODEs), mmsi, imo, vesselName, from/to, status; maxItems ≤15 | 0.02 |
eudr_check | `GET /v1/eu/eudr?codes=1801%2000%2000 | CI,4407%2011 | SE&companySize=large_or_medium` |
cbam_calc | `GET /v1/eu/cbam?lines=7208%2051%2020 | TR | 100 |
Input is checked strictly before the 402 step. Only the listed parameters are accepted, the keyword count is capped and maxItems is clamped. Bad input returns 400 with no payment requested. A request with no parameters at all (directory probes) gets the normal 402; if someone pays it anyway, the handler returns 400 and the payment is not settled. Identical queries are cached for up to 6 h (trends, ad libraries), 24 h (EUDR, CBAM), 1 h (jobs, TED tenders), 15 min (port calls) or 3 min (vessel positions), and responses include cached and fetched_at. If the upstream run fails (503, upstream temporarily unavailable) or times out (504; about 40–55 s), or Google Trends has no data (404), the payment is not settled: only 2xx responses are ever settled. Google Trends values are relative interest, not absolute search volume. Ad library results contain only what the public ad library shows; for LinkedIn advertisers that are individual people, profile URL and photo are left out, and message-ad sender names are never returned. /v1/ads/linkedin is best-effort: LinkedIn sometimes blocks automated access, so a run can fail (503) or time out (504); neither is charged.
Prices are per successful call: payment is verified first, and only settled after the endpoint returns a successful (2xx) response. On Base and Polygon the minimum is $0.01 per call, so the $0.005 tools cost $0.01 there; on XRPL and Arc they cost $0.005. The live catalog (prices, input schemas, example outputs) is always at /.well-known/x402 and /openapi.json.
Payment rails
| Rail | Network | Facilitator |
|---|---|---|
| USDC, EURC | Base (eip155:8453) | PayAI |
| USDC | Polygon (eip155:137) | PayAI |
| USDC | Arc (eip155:5042) | TRDEFI |
| XRP | XRP Ledger (xrpl:0) | t54 |
| RLUSD (non-EU buyers only) | XRP Ledger, Base | t54, PayAI |
RLUSD is offered only to buyers outside the EU, because it is not a MiCA-authorised e-money token. Buyers in the EU see USDC, EURC and XRP. Solana USDC is planned.
Use it from Claude Desktop, Cursor or VS Code (MCP)
Cursor (~/.cursor/mcp.json), VS Code and other clients that support remote MCP servers:
{
"mcpServers": {
"toll402": { "url": "https://toll402.io/mcp" }
}
}
Claude Desktop (claude_desktop_config.json), via the mcp-remote bridge:
{
"mcpServers": {
"toll402": { "command": "npx", "args": ["-y", "mcp-remote", "https://toll402.io/mcp"] }
}
}
tools/list is free. A tool call returns an x402 payment-required error until it is paid, so paid calls need an x402-capable MCP client such as @x402/mcp (example below).
Use it over HTTP
curl -i "https://toll402.io/v1/eu/vat-rates?country=DE"
# HTTP/2 402
# PAYMENT-REQUIRED: <base64 JSON listing the accepted rails, amounts and payTo>
# body: {"x402Version":2,"error":"Payment required","resource":{...},"accepts":[...same requirements...]}
x402 client (TypeScript, @x402/fetch)
import { x402Client, wrapFetchWithPayment } from "@x402/fetch";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
// Use a dedicated agent wallet holding a small amount of USDC on Base
const client = new x402Client();
registerExactEvmScheme(client, { signer: privateKeyToAccount(process.env.AGENT_KEY as `0x${string}`) });
const pay = wrapFetchWithPayment(fetch, client);
const res = await pay("https://toll402.io/v1/eu/vat-check?vat=DK10150817");
console.log(await res.json());
Paid MCP calls (TypeScript, @x402/mcp)
import { createx402MCPClient } from "@x402/mcp";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount(process.env.AGENT_KEY as `0x${string}`);
const mcp = createx402MCPClient({
name: "my-agent", version: "1.0.0",
schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }],
autoPayment: true,
});
await mcp.connect(new StreamableHTTPClientTransport(new URL("https://toll402.io/mcp")));
const r = await mcp.callTool("dk_bank_days", { date: "2026-12-24", add: "3" });
console.log(r.content[0].text);
Self-hosting and development
Production runs on Cloudflare Workers (src/worker.mjs, Hono + @x402/hono). There is also a local Express gateway (src/gateway.mjs) for tests.
npm install
npm test # unit + integration tests
cp .env.example .env.testnet # public receive addresses only, never keys
npm run gateway # local gateway on testnets
To add an endpoint, add a file in src/endpoints/ and register it in src/endpoints/index.mjs. It is then served over HTTP and MCP and appears in the manifests and tests automatically.
Data sources
European Commission (VIES, EU VAT rates, EU sanctions list), U.S. Treasury OFAC SDN list (public domain; fetched from OFAC, or when OFAC's server is unreachable from Cloudflare, from the SDN entries of the U.S. International Trade Administration Consolidated Screening List at data.trade.gov, also public domain), UK Sanctions List (FCDO; contains public sector information licensed under the Open Government Licence v3.0), UN Security Council Consolidated List, Brønnøysund Register Centre (Enhetsregisteret, NLOD 2.0), Finnish Patent and Registration Office / YTJ open data (CC BY 4.0), GLEIF Global LEI Index (CC0), ESMA (interim MiCA register), European Central Bank, Danmarks Nationalbank, Energi Data Service (Source: Energinet, energidataservice.dk, CC BY 4.0; also used for NO2/SE3/SE4/DE prices), DMI, Danish Address Register (DAR, © Klimadatastyrelsen, CC BY 4.0, via adressevaelger.dk). Google Trends, Indeed, Meta Ad Library, LinkedIn Ad Library, TED and Digitraffic data are collected, and the EUDR and CBAM calculations are made, by Atlas Data. EUDR/CBAM: © European Union, reuse under Commission Decision 2011/833/EU; informational only, not legal or tax advice and not legally binding (only the Official Journal texts are authentic). TED notices: © European Union, https://ted.europa.eu (reuse under Commission Decision 2011/833/EU). AIS and port calls: Source: Fintraffic / digitraffic.fi, license CC 4.0 BY. toll402 and Atlas Data are not affiliated with Google, Indeed, Meta or LinkedIn. toll402 is not affiliated with any of these bodies. Check legally binding facts with the primary source.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.