Documentation.
7 services, each 1 route and 1 price. Send a value, pay a fraction of a cent in USDC with x402, get tidy JSON back.
- UK Company Lookup 0.005 USDC
- UK Postcode Lookup 0.002 USDC
- UK Company Filing History 0.005 USDC
- LEI Lookup 0.005 USDC
- GB Carbon Intensity 0.002 USDC
- ECB Euro Reference Rate 0.001 USDC
- UK Food Hygiene Ratings 0.002 USDC
UK Company Lookup 0.005 USDC
UK company profile from the Companies House public register, returned as JSON.
Route
GET https://pennydatahq.com/api/company/{number}number: Companies House company number: up to 8 digits, or a 2-letter prefix such as SC followed by digits. Example: 02366777.
Returns
Name, status, type, incorporation date, registered office, SIC codes, and when the next accounts and confirmation statement are due. Empty fields are null. A real response:
{
"company_number": "02366777",
"company_name": "DWR CYMRU CYFYNGEDIG",
"status": "active",
"type": "ltd",
"incorporation_date": "1989-04-01",
"registered_office_address": {
"care_of": null,
"po_box": null,
"premises": null,
"address_line_1": "Dwr Cymru Welsh Water Linea, Fortran Road",
"address_line_2": "St. Mellons",
"locality": "Cardiff",
"region": null,
"postal_code": "CF3 0LT",
"country": "Wales"
},
"sic_codes": [
"36000",
"37000"
],
"accounts_next_due": "2027-12-31",
"confirmation_statement_next_due": "2027-04-14"
}Source
Fetched live from Companies House on each call, never cached. Companies House allows this service 600 requests per 5 minutes in total; past that, calls return 502 and are not charged.
Contains public sector information from Companies House, licensed under the Open Government Licence v3.0. Not affiliated with Companies House.
UK Postcode Lookup 0.002 USDC
Location and areas for a Great Britain postcode: latitude and longitude, ward, district, constituency and region, as JSON.
Route
GET https://pennydatahq.com/api/postcode/{postcode}postcode: Great Britain postcode, with or without the space, any case. Northern Ireland (BT) is not supported. Example: SW1A1AA.
Returns
The postcode, its latitude and longitude, and its ward, district, parliamentary constituency, region and country. Empty fields are null. A real response:
{
"postcode": "SW1A 1AA",
"latitude": 51.50101,
"longitude": -0.141563,
"ward": "St James's",
"district": "Westminster",
"constituency": "Cities of London and Westminster",
"region": "London",
"country": "England"
}Source
Fetched live from postcodes.io on each call, never cached. postcodes.io is a free public service with no published limit; if it is slow or down, calls return 502 and are not charged.
Data from postcodes.io. Great Britain postcode data under the OS OpenData licence. Contains Ordnance Survey data © Crown copyright and database right 2025. Contains Royal Mail data © Royal Mail copyright and database right 2025. Contains National Statistics data © Crown copyright and database right 2025. Contains NRS data © Crown copyright and database right 2025.
UK Company Filing History 0.005 USDC
Recent filings and key dates for a UK company from the Companies House public register: accounts and confirmation statement dates and the latest filings by date and form type, as JSON. Officer and PSC filings are excluded.
Route
GET https://pennydatahq.com/api/filings/{number}number: Companies House company number: up to 8 digits, or a 2-letter prefix such as SC followed by digits. Example: 02366777.
Returns
Company name, status and key dates (incorporation, dissolution, accounts and confirmation statement: last made up to, next due, overdue), the total number of filings, and up to 25 of the most recent filings with date, form type, category, a description code and the made-up date where there is one. Officer and PSC filings are excluded. Empty fields are null. A real response:
{
"company_number": "02366777",
"company_name": "DWR CYMRU CYFYNGEDIG",
"status": "active",
"key_dates": {
"incorporation_date": "1989-04-01",
"dissolution_date": null,
"accounts": {
"last_made_up_to": "2026-03-31",
"next_made_up_to": "2027-03-31",
"next_due": "2027-12-31",
"overdue": false
},
"confirmation_statement": {
"last_made_up_to": "2026-03-31",
"next_made_up_to": "2027-03-31",
"next_due": "2027-04-14",
"overdue": false
}
},
"total_filings": 279,
"filings": [
{
"date": "2026-09-16",
"form": "AA",
"category": "accounts",
"description_code": "accounts-with-accounts-type-full",
"made_up_date": "2026-03-31"
},
{
"date": "2026-04-15",
"form": "CS01",
"category": "confirmation-statement",
"description_code": "confirmation-statement-with-no-updates",
"made_up_date": "2026-03-31"
}
]
}Source
Fetched live from Companies House on each call, never cached. Each call makes 2 requests to Companies House, which allows this service 600 requests per 5 minutes in total (shared with the company lookup); past that, calls return 502 and are not charged.
Contains public sector information from Companies House, licensed under the Open Government Licence v3.0. Not affiliated with Companies House.
LEI Lookup 0.005 USDC
Legal Entity Identifier (LEI) record from the GLEIF global index: legal name, status, jurisdiction, addresses, registration dates and direct and ultimate parents, as JSON.
Route
GET https://pennydatahq.com/api/lei/{lei}lei: 20-character LEI (ISO 17442), any case. The check digits are verified. Example: RR3QWICWWIPCS8A4S074.
Returns
The LEI, legal name, previous and other names, entity status, category, legal form code, jurisdiction, local registration number, legal and headquarters addresses, creation date, LEI registration status and dates, BIC codes, and the direct and ultimate parent (LEI, name, country) where reported. Empty fields are null. A real response:
{
"lei": "RR3QWICWWIPCS8A4S074",
"legal_name": "NATWEST MARKETS PLC",
"other_names": [
{
"name": "THE ROYAL BANK OF SCOTLAND PUBLIC LIMITED COMPANY",
"type": "PREVIOUS_LEGAL_NAME"
}
],
"entity_status": "ACTIVE",
"category": "GENERAL",
"legal_form_code": "B6ES",
"jurisdiction": "GB",
"registered_as": "SC090312",
"legal_address": {
"lines": [
"36 ST ANDREW SQUARE"
],
"city": "EDINBURGH",
"region": "GB-EDH",
"postal_code": "EH2 2YB",
"country": "GB"
},
"headquarters_address": {
"lines": [
"36 ST ANDREW SQUARE"
],
"city": "EDINBURGH",
"region": "GB-EDH",
"postal_code": "EH2 2YB",
"country": "GB"
},
"entity_creation_date": "1984-10-31",
"registration": {
"status": "ISSUED",
"initial_registration_date": "2012-06-06",
"last_update_date": "2026-08-28",
"next_renewal_date": "2027-10-27",
"corroboration_level": "FULLY_CORROBORATED"
},
"bic": [
"ABNAINBBXXX",
"NATGGB21XXX"
],
"direct_parent": {
"lei": "2138005O9XJIJN4JPN90",
"legal_name": "NATWEST GROUP PLC",
"country": "GB"
},
"ultimate_parent": {
"lei": "2138005O9XJIJN4JPN90",
"legal_name": "NATWEST GROUP PLC",
"country": "GB"
}
}Source
Fetched live from GLEIF on each call, never cached. Each call makes 3 requests to the GLEIF API, which allows 60 requests a minute per client (about 20 lookups a minute); past that, calls return 502 and are not charged.
LEI data from the Global Legal Entity Identifier Foundation (GLEIF), available under CC0 1.0. Not affiliated with GLEIF.
GB Carbon Intensity 0.002 USDC
Forecast carbon intensity of Great Britain electricity for the current half hour in the region of a postcode, with the generation mix, as JSON.
Route
GET https://pennydatahq.com/api/carbon/{postcode}postcode: Great Britain postcode or outward code (the first half, such as RG10), with or without the space, any case. Northern Ireland (BT) is not on the GB grid and is not supported. Example: RG10.
Returns
The outward code, its electricity region and distribution network area, the half hour covered (UTC), the forecast carbon intensity in gCO2/kWh with its index (very low to very high), and the generation mix by fuel in percent. Empty fields are null. A real response:
{
"postcode": "RG10",
"region": "South England",
"dno_region": "SSE South",
"from": "2026-10-27T14:00Z",
"to": "2026-10-27T14:30Z",
"intensity_gco2_per_kwh": 85,
"intensity_index": "low",
"generation_mix": {
"biomass": 5.2,
"coal": 0,
"imports": 3.1,
"gas": 20,
"nuclear": 9.2,
"other": 0,
"hydro": 0,
"solar": 20,
"wind": 42.5
}
}Source
Fetched live from Carbon Intensity API on each call, never cached. The Carbon Intensity API is free with no published limit; if it is slow or down, calls return 502 and are not charged.
Carbon intensity data from the Carbon Intensity API (carbonintensity.org.uk) by the National Energy System Operator (NESO), licensed under CC BY 4.0. Regional figures are forecasts. Not affiliated with NESO.
ECB Euro Reference Rate 0.001 USDC
The latest ECB euro foreign exchange reference rate for a currency (units per 1 euro) and its date, unmodified, as JSON. The same data is available free of charge from the ECB website; reference rates are for information purposes only.
Route
GET https://pennydatahq.com/api/fx/{currency}currency: ISO 4217 currency code, any case, for a currency the ECB publishes a reference rate for (about 30, such as USD, GBP, JPY, CHF). Not EUR: every rate is against the euro. Example: USD.
Returns
The currency code and name, the base (EUR), the reference rate as units of the currency per 1 euro, the date it applies to, and the ECB source and free-availability notice. Rates are published around 16:00 CET on working days. Empty fields are null. A real response:
{
"currency": "USD",
"currency_name": "US dollar",
"base": "EUR",
"rate": 1.1188,
"date": "2026-10-26",
"notice": "Source: ECB statistics (euro foreign exchange reference rates), unmodified. This data is available free of charge at https://www.ecb.europa.eu. Published by the ECB for information purposes only; not for transaction purposes."
}Source
Fetched live from the ECB Data Portal on each call, never cached. The ECB Data Portal is free with no published limit; if it is slow or down, calls return 502 and are not charged.
ECB statistics (euro foreign exchange reference rates), reproduced unmodified. The same data is available free of charge from the ECB at https://www.ecb.europa.eu. The ECB publishes reference rates for information purposes only and discourages using them for transactions. Not affiliated with the ECB.
UK Food Hygiene Ratings 0.002 USDC
Food hygiene ratings for food businesses at a UK postcode from the Food Standards Agency: business name and type, address, rating and the date of the inspection it is based on, as JSON.
Route
GET https://pennydatahq.com/api/food-hygiene/{postcode}postcode: Full UK postcode, with or without the space, any case. Example: M11AE.
Returns
The postcode, the number of rated food businesses there, and for each: FSA id, business name and type, address, rating (0 to 5 or a status such as Exempt in England, Wales and Northern Ireland; Pass or Improvement Required in Scotland), the rating date, the scheme, whether a new rating is pending, the local authority and a link to its FSA page. Empty fields are null. A real response:
{
"postcode": "M1 1AE",
"count": 1,
"establishments": [
{
"fhrs_id": 1894640,
"business_name": "The Head of Steam Manchester - Northern Quarter",
"business_type": "Pub/bar/nightclub",
"address": "16 Newton Street, Manchester, M1 1AE",
"rating": "5",
"rating_date": "2026-04-24",
"scheme": "FHRS",
"new_rating_pending": false,
"local_authority": "Manchester",
"fsa_url": "https://ratings.food.gov.uk/business/1894640"
}
]
}Source
Fetched live from the FSA ratings API on each call, never cached. The FSA ratings API is free with no published limit; if it is slow or down, calls return 502 and are not charged.
Contains public sector information from the Food Standards Agency, licensed under the Open Government Licence v3.0. Ratings are fetched live on each call; each shows the date of the inspection it is based on. Not affiliated with the Food Standards Agency.
For every service
Price
- Network
- Base
eip155:8453 - Asset
- USDC
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 - Scheme
- x402
exact. The facilitator pays the gas; you need no ETH. - Account
- None. No API key, no sign-up.
Pay with x402
The first request answers 402 with the payment details in the PAYMENT-REQUIRED header. An x402 client signs a USDC transfer for exactly that amount and retries with a PAYMENT-SIGNATURE header; the data comes back with a PAYMENT-RESPONSE header holding the settlement transaction. In Node:
// npm install @x402/fetch @x402/evm viem
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
// A wallet holding a little USDC on Base. No ETH needed.
const signer = privateKeyToAccount(process.env.EVM_PRIVATE_KEY as `0x${string}`);
const client = new x402Client().register("eip155:8453", new ExactEvmScheme(signer));
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
const res = await fetchWithPayment("https://pennydatahq.com/api/company/02366777");
console.log(res.status, await res.json());To see what you will be asked to pay, decode the header from a bare request:
curl -si https://pennydatahq.com/api/company/02366777 \
| grep -i '^payment-required:' | cut -d' ' -f2 | tr -d '\r' | base64 -dThe part that matters:
{
"scheme": "exact",
"network": "eip155:8453",
"amount": "5000",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"payTo": "0xd0A3c0f5612EcD88e4b16Ef1cD458e1a5E8FFD49",
"maxTimeoutSeconds": 300
}Errors
| Status | Meaning | Charged |
|---|---|---|
| 200 | Data returned. | Yes |
| 400 | Malformed input. | No |
| 402 | Payment required, or the payment was invalid. Details in the headers. | No |
| 404 | Nothing found for that input. | No |
| 502 | The data source did not answer, or returned an error. | No |
Your payment is verified first and settled only after the data is ready. If the lookup fails, the signed payment is never submitted, so no USDC leaves your wallet.
Rate limits
No per-caller limit. Each data source has its own; see the service above. Retry after a short wait.
For agents
- /.well-known/x402 x402 discovery manifest
- /openapi.json OpenAPI 3.1 with x402 payment info
- /llms.txt plain-text summary
- /stats every settled payment
What we keep
For each paid call we keep the payer address, the service, the value looked up and the transaction, which are shown on the payments ledger. Data from the sources is never stored.