A data repository and reporting interface for the network of financial service providers using Open Payments with Interledger Protocol.
- Availability — market status of financial service providers offering Interledger Open Payments to customers
db/: data used to generate reports
db-schemas/: data format definitions for JSON files in db/
src/: site source code
static/: static assets served as-is
JSON data files follow a JSON:API-inspired structure, but this is a statically generated site. Each file has a type, an id, attributes, and relationships.
Represents a financial institution or fintech.
{
"type": "providers",
"id": "example",
"attributes": {
"name": "Example Inc",
"url": "https://example.com/",
"status": "active"
},
"relationships": {
"services": {
"data": [{ "type": "services", "id": "example-us" }]
}
}
}Provider status values: active | in development | discontinued
Represents a specific service offering, scoped to a country or region. A provider may have multiple service files if the service offering, operating entity, or sponsoring licensed entity differ in a country/region.
{
"type": "services",
"id": "example-us",
"attributes": {
"name": "wallet provider",
"status": "active",
"currencies-held": ["USD"],
"receivable-currencies": ["USD"],
"payable-currencies": ["USD"],
"countries": ["US"]
},
"relationships": {
"provider": { "data": { "type": "providers", "id": "example" } },
"peering": {
"data": [{ "type": "services", "id": "another-service-us" }]
}
}
}Service status values: active | in development | planned | discontinued
- Use
countriesfor a specific list of ISO 3166-1 alpha-2 country codes. - Use the
regionsrelationship instead ofcountrieswhen a service covers a named multi-country region (e.g. EU). Seedb/regions/. - Use
subdivision-exclusionsfor specific list of ISO 3166-2 regions of a country where service was not provided. peeringlists other service IDs that this service can interoperate with via Interledger. Peering relationships must be declared on both services.- Add
"closed-date": "YYYY-MM-DD"to a discontinued service to record when it closed.
A named group of countries, referenced by services.
{
"type": "regions",
"id": "eu",
"attributes": {
"name": "European Union",
"countries": ["AT", "BE", "DE"]
}
}A regulatory licence held by a provider for a specific country/region.
{
"type": "licenses",
"id": "walletinc-eu-emi",
"attributes": {
"country": "US",
"license": "Money Transmitter",
"verification": "https://example.gov/license/123"
}
}Data is stored in db/. Use the existing files as templates. Keep id values lowercase and hyphenated.
The reports are rebuilt automatically on merge.
To add a new provider:
- Create
db/providers/<id>.jsonwith the provider's name, website, and status. - Create one
db/services/<id>-<country-or-suffix>.jsonper distinct service offering.- If the provider operates across an entire named region (e.g. the EU), reference a
db/regions/entry in the service'srelationships.regionsfield and leavecountriesas an empty array.
- If the provider operates across an entire named region (e.g. the EU), reference a
- Create one
db/licenses/<id>-<jurisdiction>-<license-type>.jsonper distinct regulatory license and reference on the provider or service offering.
The site is a prerendered/static site using SvelteKit and served on GitHub Pages. Provider data is read directly from db/ at build time via src/lib/data.ts.
# Install dependencies
bun install
# Start dev server
bun run dev
# Build static site
bun run build
# Preview production build
bun run previewThe UN Population Division API is queried at build time to compute world population coverage. Set UN_API_TOKEN in a .env.local file (not committed):
UN_API_TOKEN=Bearer <your-token>
A token can be obtained from the UN Population Division Data Portal.
The globe uses static/ne_110m_admin_0_countries_v5_1_1_slim.geojson, a reduced version of the Natural Earth 1:110m Admin 0 Countries dataset containing only the three properties used by the app (ISO_A2, WB_A2, ADMIN). To regenerate it from a new source file:
jq '.features |= map(.properties |= {ISO_A2, WB_A2, ADMIN})' \
static/ne_110m_admin_0_countries_v5_1_1.geojson \
> static/ne_110m_admin_0_countries_v5_1_1_slim.geojsonAdd a term to the glossary by wrapping an occurance of the term with <dfn data-glossary-term="(canonical presentation of the term if different from the term wrapped, such as a lowercase version if the term is capitalized in context)" title="term definition"></dfn>.
Why is French Guiana labeled as France?
Because in the Natural Earth 1:110m dataset, French Guiana isn't a separate feature — it's one of three polygons bundled into the France MultiPolygon, along with metropolitan France and French Guiana (likely Corsica and one overseas territory form the third). There is no separate French Guiana entry in the file at all.
This is also the root cause of France's ISO_A2 === '-99': the combined metropolitan-France-plus-overseas-territories feature can't be cleanly assigned a single ISO country code, so Natural Earth leaves it as -99 and puts FR in WB_A2 instead.
At the 1:110m scale this is by design — overseas territories are merged into their sovereign states. A higher-resolution dataset (1:10m or 1:50m) has them as separate features, but is a much larger file.
- Source code (
src/,static/) — Blue Oak Model License 1.0.0 - Data (
db/) — Creative Commons Attribution-ShareAlike 4.0
© 2026 Interledger Foundation