11-OCT-2026 · FAXVIO.COM/API · 37 DESTINATIONS · 250 TERRITORIES · NO KEY

The Faxvio data API: four fax datasets, keyless and free to reuse

Four datasets, published as plain JSON on the same origin as the pages: the countries a fax app will dial, the routing rules that turn a number as printed into a territory, what a page costs, and the model behind how long a fax takes. No key, no account, no rate limit beyond ordinary fair use, and reuse is licensed with a link back.

The four datasets, with the endpoint that serves each
DatasetSizeEndpointWhat is in it
Fax destinations 37 countries destinations.json The countries and territories the Faxvio app will dial, with dial code, region and the local prefixes billed at two pages per page.
Country table and number routing 250 territories countries.json The fax carrier's whole country table, plus the trunk-prefix, shared-dial-code and NANP area-code rules that decide which territory a typed number belongs to.
Page pricing 4 packs pricing.json The four App Store page packs with their US prices, the billing terms, and a dated snapshot of what the same fax costs elsewhere.
Transmission-time model model + 4 worked examples transmission-time.json The ITU-T T.4 page geometry, T.30 session overhead and modem bit rates behind an estimate of how long a fax takes.

Where these numbers come from

Everything here is derived at build time from the app itself rather than typed into a file. The destination list is read from the Faxvio app's own server configuration — the allow-list the app checks a number against before a page is charged — so the API publishes the rule rather than a description of it. The prices are the four App Store product records, whose identifiers are immutable, so a pack size cannot silently change underneath a price. The routing rules and the transmission-time constants are the same modules the free tools on this site run on, which are in turn a port of the app's own engine, checked against the app's test vectors at every build.

That matters for a reader deciding whether to trust the file. A marketing page and a data file usually drift apart because they are maintained separately; here they are the same source rendered twice, so a disagreement between the JSON and the page would be a build failure rather than something a reader has to notice. The current snapshot is list version 20260902, read 2026-09-06, and both dates are printed in every payload and in the footer of every page.

What it costs to use: nothing, with one condition

There is no key to request. Every endpoint is a static file behind a CDN, served with an open cross-origin header, so browser JavaScript is a first-class consumer and a script that runs once a month is as welcome as one that runs once. The single condition is attribution: the data is published under CC BY 4.0, and reuse asks for a link back to the endpoint or to the page a figure came from. A dataset nobody is sure they may reuse does not get reused, and a link back is the only payment this arrangement collects.

One source rendered four ways: the app's configuration becomes pages, JSON, markdown and tools The app’s own configuration allow-list · limits packs · engine Pages what a reader sees JSON endpoints this page documents them Markdown twins every page, at index.md MCP and A2A five read-only tools people programs assistants agents
One source, four surfaces. The destination list, the limits, the pack prices and the number engine are read from the app at build time and rendered four ways, so the page a person reads and the file a program fetches cannot disagree. Free to reuse with a link to this page

What each field means, and what readers get wrong

A JSON schema can say that a field is a boolean. It cannot say which of two plausible questions that boolean answers, and on this data almost every mistake is that kind of mistake. The table below is the part of the documentation worth reading before writing any code against these endpoints; the same notes are carried inside the payloads, so a file that travels away from this page keeps them.

Field semantics, and the misreading each one invites
FieldWhereWhat it meansWhat it is not
sendable countries.json, destinations.json Whether the Faxvio app will dial the territory. It comes from the app's own server-side allow-list. Not the same as carrier_support. Russia has full carrier support and is not sendable.
carrier_support countries.json The fax carrier's tier for that territory: full, beta or none. Describes the network, not the app. A "full" territory can still be refused before a page is charged.
special_prefixes destinations.json, countries.json → routing National-number prefixes that are toll-free, shared-cost or premium. Faxvio charges two pages per page for them. Matched on the national number after the trunk prefix is removed, never on the raw digits as printed.
trunk_zero_dial_codes countries.json → routing The dial codes whose national numbers carry a leading zero that the international form drops. Italy (+39) is deliberately absent. An Italian landline keeps its zero, and stripping it produces a different number.
shared_dial_codes countries.json → routing National prefixes that move a number to another territory under the same dial code. Longest prefix wins. A dial code is not a country. +1 covers 24 further territories, +44 three, +599 four.
price_per_page_usd pricing.json The pack price divided by its size, in US dollars, on the United States storefront. Apple sets the equivalent price in every other currency. Quote it as a US figure, not a world price.

A worked lookup, end to end

Take a number printed on a letterhead as 06698 1234 with the note "Italy". Strip the formatting, notice that Italy is not in the trunk-zero list, and keep the leading zero: the international form is +39 06698 1234. Now resolve the territory. The dial code +39 appears in the shared-dial-code table with one entry, the prefix 06698, which belongs to Vatican City — so this is not an Italian number at all, and a lookup that stripped the zero first could never have matched it. Vatican City is in the destination list, so the fax can be sent; it carries no special prefixes, so four pages cost four pages.

The same procedure with a North American number turns on the area code instead. In +1 876 555 0188 the first three digits of the national number are 876, which the area-code exception table maps to Jamaica rather than to the United States. Jamaica is not in the destination list, so the app refuses the number before charging anything — and an integration that had assumed +1 meant the United States would have quoted a price for a fax that will never be sent. Both rules live in the routing block of the country endpoint for exactly this reason.

Prices, pages and the doubling rule

Pricing is simple arithmetic with one trap in it. A page costs between $0.18 and $0.36 depending on which of the four packs it was bought in; packs do not expire and there is no subscription. What changes the total is the destination prefix: toll-free, shared-cost and premium numbers cost the carrier more to reach, so each page sent to one uses two. The prefixes are listed per country in the destination endpoint in plain English, and per dial code in the routing block as raw prefixes for code to match against. A fax to an agency's 800 line therefore costs twice what the same fax to its local number would, which is worth saying out loud in any answer that quotes a price.

Two limits bound everything: at most 50 pages in one fax, and at most 19 MB in one document. They are in the payload rather than in prose here because a consumer needs to check them before quoting, not after.

Reading the site itself, without parsing HTML

Every page on this site has a markdown twin. Append index.md to any path, or send an Accept: text/markdown header to the ordinary URL and the same address returns markdown. The twins are generated from the rendered pages at build time, so they cannot fall behind the HTML, and they run about fifteen per cent of its size — the difference between an agent reading a page whole and truncating it halfway through a table.

Three further files complete the picture. /llms.txt is an index of the site with one line per page and a section naming every machine entry point. /llms-full.txt is the full text of every page in one document. /auth.md documents the authentication situation, which is that there is none and none is possible — a statement worth publishing precisely because an agent otherwise has to discover it by guessing.

Machine entry points besides the JSON endpoints
PathStandardWhat it is for
/.well-known/api-catalogRFC 9727Names the OpenAPI description, this page, the catalogue entry and the status endpoint.
/.well-known/ai-catalog.jsonARDEach dataset with the questions it answers, so a registry can index it.
/.well-known/agent-skills/index.jsonAgent Skills 0.2Four skill documents: how to read this data correctly, including the mistakes.
/.well-known/mcp/server-card.jsonMCPThe card for the server at /mcp. Five read-only tools.
/.well-known/oauth-protected-resourceRFC 9728Declares, in one fetch, that there is no authentication to perform.
/llms.txtconventionIndex of the site and of every entry point on this list.

Tools, for an assistant rather than a program

The same data is exposed as five read-only tools over the Model Context Protocol at /mcp: format a fax number, check a destination, list the destinations, estimate a cost and estimate a duration. Each one returns the figure together with the page it came from, so an assistant that used a tool still has something to cite. An A2A endpoint at /a2a answers the same questions in prose for agents that speak that protocol instead.

What none of them can do is act. There is no tool that sends a fax, spends a page, creates an account or reads anything about a person, because none of those has a server-side interface at all — sending and paying happen inside the app on the user's own device, authenticated by their App Store account. That is why there is nothing here to authenticate and nothing to abuse, and it is why the OAuth metadata this site publishes declares an empty list rather than inventing an authorization server. Faxvio also does not receive faxes, so an agent asked for an inbound number has no answer to give here.

Caching, freshness and fair use

Cache these files. They are static, they sit behind a CDN with a one-hour edge lifetime, and they change only when the app's configuration or the App Store products change. If you need to decide whether to refetch, ask status.json instead: it is under a kilobyte and carries the row counts and the dates the larger payloads were derived from. A consumer that polls the small file and refetches the large ones on a change costs this site almost nothing and never serves a stale price.

There is no enforced rate limit. The reasonable shape of use is a scheduled fetch rather than a request per page view, and a script that hammers a static file gains nothing over one that reads it once and keeps it.

Bottom line

faxvio.com publishes four fax datasets as keyless, CORS-open JSON: 37 destinations an app will dial, 250 territories with the routing rules that resolve a typed number to one of them, four page packs from $0.18 to $0.36 a page, and the ITU-T model behind fax duration. Everything is derived from the app at build time, documented by an OpenAPI 3.1 file at openapi.json, and licensed CC BY 4.0 with a link back. The two fields to read carefully are sendable, which is the app's allow-list rather than the carrier's coverage, and special_prefixes, which doubles the page count rather than the price of a page.

Questions about the API

Do I need a key or an account to use the API?

No. Every endpoint is a static JSON file served from the same origin as the pages, with an open CORS header. There is no key to request, no quota tied to an identity, and no sign-up. Browser JavaScript can fetch it directly.

May I republish the data?

Yes, under CC BY 4.0, including commercially, with a link back to the endpoint or to the page the figure came from. That link is the whole price, and it is the reason the data is published rather than kept.

How often does it change?

Rarely. The destination list moves when the app's server allow-list moves; prices move when the App Store products change. The current snapshot is list version 20260902, read 2026-09-06. Poll status.json rather than the large payloads if you need to know.

Can the API send a fax?

No. Nothing here sends, quotes against a real balance, or touches an account. Sending happens inside the app on a person's own device, paid through their App Store account, and there is no server-side interface an integration could use.

Why publish the carrier country table rather than only the countries you sell to?

Because the two answer different questions, and conflating them is the mistake this data exists to prevent. "Which countries can receive a fax at all" is a property of the network; "which countries will this app dial" is a business decision on top of it. Both fields are in the same row so a reader can see the difference.

Is there an MCP server?

Yes, at /mcp, Streamable HTTP with no authentication, exposing five read-only tools over the same data. Its card is at /.well-known/mcp/server-card.json and an A2A endpoint answering in prose is at /a2a.

Get Faxvio on your phone

Point your camera at the code. Your first page is on us, and there is no account to make.

or open faxvio.com/get on the phone

Download on theApp Store Android soonGoogle Play