Penny Data

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 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 -d

The part that matters:

{
  "scheme": "exact",
  "network": "eip155:8453",
  "amount": "5000",
  "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
  "payTo": "0xd0A3c0f5612EcD88e4b16Ef1cD458e1a5E8FFD49",
  "maxTimeoutSeconds": 300
}

Errors

StatusMeaningCharged
200Data returned.Yes
400Malformed input.No
402Payment required, or the payment was invalid. Details in the headers.No
404Nothing found for that input.No
502The 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

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.