Service · HTTP

Service · HTTP

JSON API

Every dataset this site browses is also a plain HTTP endpoint. No key, no signup, permissive CORS, and responses cacheable for an hour in the browser and a day at the CDN. The filters below are the same ones the tables expose, so anything you can narrow to on a page you can narrow to in a URL.

Machine-readable description: /api/openapi.json (OpenAPI 3.1). Endpoint index: /api.

Endpoints
5
Formats
JSON · CSV
Description
OpenAPI 3.1
Auth
None — no key, no signup
Cache
1 h browser · 1 day CDN

Section 01

Response shape

Responses are a data array plus a meta object describing the query that produced it. Add raw=1 for a bare array instead.
GET /api/countries?region=Europe&limit=2

{
  "data": [ { "alpha2Code": "AD", "name": "Andorra", ... }, ... ],
  "meta": {
    "total": 51,     // rows matching the query, before pagination
    "count": 2,      // rows in this response
    "offset": 0,
    "limit": 2,      // null when no limit was asked for
    "filters": { "region": "Europe" }
  }
}

Section 02

Common parameters

Accepted by every endpoint. All optional, and they combine with AND. An unknown parameter is rejected with a 400 rather than ignored — a typo like ?regoin=Europe should not quietly hand back all 249 countries.
ParameterTypeDescription
qstringFuzzy search across the dataset's main text fields.
searchstringAlias of q. Pass one or the other, not both.
sortstringComma-separated fields, each optionally suffixed :desc — e.g. name or region:desc,name.
fieldsstringComma-separated fields to return. Applied after filtering and sorting, so you can sort by a field you don't select.
limitintegerMaximum rows to return, up to 500. Omit for all matching rows.
offsetintegerRows to skip. Cannot be combined with page/size.
pageinteger1-based page number, the spelling the site's own URLs use. Cannot be combined with limit/offset.
sizeintegerRows per page when using page, up to 500. Defaults to 20.
raw01truefalseReturn a bare JSON array instead of the { data, meta } envelope.
formatjsoncsvResponse format. csv returns a flat table instead of the envelope, with the unpaginated total in the X-Total-Count header.
includestringComma-separated related data to embed in each row. Endpoint-specific; joined after pagination, so it costs nothing on rows you don't fetch.

Section 03

Building a query without writing one

Every data table on this site has a Copy API URL button beside its CSV and JSON buttons. Filter, sort and hide columns until the table shows what you want, then copy the URL that returns exactly those rows and columns. It disables itself when the view can't be expressed as a single query — a two-region selection, say — rather than hand you a URL that returns something else.

Section 04

Endpoints

Each endpoint adds its own filters on top of the common parameters.

GET/api/countries

Countries from the UN M49 standard with their ISO 3166-1 codes, plus passport (ICAO), vehicle (UNECE), Olympic (IOC), FIFA, aircraft, ccTLD, calling code and membership data.

SourcesUN M49 · ISO 3166-1 · ICAO Doc 9303 · IOC · FIFA

One caveat for parsers: numericCode is present on every row except Kosovo. It is the ISO 3166-1 numeric code — which ISO took from UN M49 — and neither body assigns Kosovo one, which is why it carries the user-assigned XK/XKX instead.

ParameterTypeDescription
codestringISO 3166-1 alpha-2 or alpha-3 code, e.g. ES or ESP.
regionstringUN M49 macro-region, matched as a substring, e.g. Europe.
independent01truefalseISO 3166 independence status.
unMembershipmembernon-member-stateUN status. member is one of the 193 member States; non-member-state is a non-member State with a standing observer invitation (Holy See, State of Palestine). Anything on neither list has no value and matches neither.
euMember01truefalseCurrent EU member state.
sovereignStatestringAlpha-2 of the administering country, for territories.
localestringISO 639-1 locale, e.g. ca. Adds localizedName (the country's name in that language) and localizedLanguage (the locale code it was rendered in) to each row. Use include=localizedNames for every locale at once.
hasstringComma-separated fields that must have a value. Allowed: alpha3Code, icaoCode, dsitCode, iocCode, fifaCode, aircraftRegPrefixes, ccTLD, phonePrefix, sovereignState, subdivisionCount.
missingstringComma-separated fields that must be absent. Allowed: alpha3Code, icaoCode, dsitCode, iocCode, fifaCode, aircraftRegPrefixes, ccTLD, phonePrefix, sovereignState, subdivisionCount.

Embeddable with include: subdivisions, timezones, currencies, historicalCurrencies, languages, localizedNames

Fields

Selectable with fields and sortable with sort: flag, alpha2Code, name, fullName, localShortNames, alpha3Code, icaoCode, dsitCode, iocCode, fifaCode, aircraftRegPrefixes, ccTLD, phonePrefix, independent, unMembership, sovereignState, euMember, region, numericCode, notes, subdivisionCount

Selectable with fields but not sortable, and only present when a parameter above asks for them: localizedName, localizedLanguage, subdivisions, timezones, currencies, historicalCurrencies, languages, localizedNames. They are produced after the rows are sorted, so sort rejects them rather than quietly doing nothing.

GET/api/currencies

Active ISO 4217 currencies with their code, numeric code, minor units, symbol and name.

SourcesISO 4217

ParameterTypeDescription
codestringISO 4217 alpha code, e.g. EUR.
countrystringAlpha-2 of a country that uses the currency, e.g. FR.
typecurrencysupranationalfundprecious metaltestingno-currencybond market unitspecial drawing rightISO 4217 entity type.
Fields

Selectable with fields and sortable with sort: code, numericCode, name, type, minorUnit, symbolUnicode, symbolIntl, countries, definitions

GET/api/historical-currencies

Withdrawn ISO 4217 currencies (List Three) with their code, numeric code, the country that used them and the date they were withdrawn.

SourcesISO 4217

ParameterTypeDescription
codestringISO 4217 alpha code, e.g. ESP for the Spanish peseta.
countrystringAlpha-2 of the country that used the currency, e.g. ES.
isFund01truefalseFund entries rather than national currencies.
withdrawnFromstringWithdrawn on or after this date, as YYYY or YYYY-MM.
withdrawnUntilstringWithdrawn on or before this date, as YYYY or YYYY-MM.
Fields

Selectable with fields and sortable with sort: code, numericCode, name, country, countryCode, withdrawalDate, isFund

GET/api/languages

Languages with their ISO 639-1 / 639-3 codes, English names and native names.

SourcesISO 639-1 · ISO 639-3 · Unicode CLDR

ParameterTypeDescription
codestringISO 639-1 or 639-3 code, e.g. en or eng.
Fields

Selectable with fields and sortable with sort: code, iso639_3, name, nativeName, localizedName, bcp47Variants, cldrVariants, intlVariants

GET/api/timezones

IANA tzdata timezones with their canonical id, UTC offset, covered countries and coordinates.

SourcesIANA tzdata

ParameterTypeDescription
countrystringAlpha-2 of a country the zone covers, e.g. ES.
regionstringZone region, matched as a substring, e.g. Europe.
utcOffsetstringUTC offset, compared numerically so UTC+9 matches the stored UTC+09.
Fields

Selectable with fields and sortable with sort: id, name, offset, region, countryCodes, coordinates, comment

Section 05

Examples

Every link returns live JSON.

Section 06

Errors

A rejected request returns 400 with one entry per bad parameter, and is never cached.
GET /api/countries?unMembership=yes  ->  400

{
  "error": {
    "message": "Invalid query parameters",
    "issues": [
      { "param": "unMembership",
        "message": "Invalid option: expected one of \"member\"|\"non-member-state\"" }
    ]
  }
}

503 is the other status you may see, and only from /api/timezones: the IANA zone table is fetched at runtime, and a process that has never fetched it successfully says so rather than answering with an empty list. It is transient and retryable — like the 400, it carries Cache-Control: no-store, so a failure is never cached in front of a working endpoint.

Section 07

Base URL

Paths are relative to https://standards.23quirats.dev. Requests are read-only GETs; there is no write surface. Requests are rate-limited to 100 per minute per IP — over that you get a 429. Responses are CDN-cached, so repeat the same URL rather than varying it.