Countries, languages and calling codes
These GET endpoints need no key and use no lookup credits. The metadata limit is 120 requests per minute per network prefix. Cache the list instead of fetching it for each visitor.
| Field or endpoint | Meaning |
|---|---|
| /v1/countries | countries array and attributions |
| /v1/countries/{code} | One country object |
| /v1/countries/{code}/languages | code and languages array |
| /v1/countries/{code}/calling-codes | code and calling_codes array |
curl --max-time 10 'https://orig.ooo/v1/countries/GB'
curl --max-time 10 'https://orig.ooo/v1/countries/GB/languages'
curl --max-time 10 'https://orig.ooo/v1/countries/GB/calling-codes'Fields and errors
Codes are case-insensitive two-letter ISO codes. A country includes code, name, calling_codes and languages. Language entries contain tag, official_status and population_percent where available. Calling codes such as +44 are strings and can be shared. The bundle covers 249 ISO territories. These metadata languages are not a visitor’s preference.
Unknown codes return 404 country_not_found. Preserve attribution from the full metadata response.
Use metadata without a location lookup
const response = await fetch('https://orig.ooo/v1/countries/GB');
if (!response.ok) throw new Error('Country metadata unavailable');
const country = await response.json();
const callingCodes = country.calling_codes; // array of strings
const rankedInput = country.languages; // language records
// A country can have multiple codes/languages; do not assume one value.The manual widgets bundle the same metadata and can run from your own server without IP detection. Language metadata describes a territory; the preselector uses its population ranking to suggest a code while your application preserves saved visitor preferences.
