Built to be quoted correctly
If an assistant is going to answer “what does it cost to live in Lisbon”, we would rather it called the engine than scraped a rendered page and paraphrased a number out of it. So the engines are a documented API, every page has a markdown rendering, and nothing is behind a key.
For agents and models
| Path | What it is |
|---|---|
| /llms.txt | Short, linked map of the site — the llmstxt.org convention. |
| /llms-full.txt | Every city, comparison and guide URL with a one-line summary. |
| /openapi.json | OpenAPI 3.1 description of every endpoint above. |
| /cost-of-living/lisbon.md | Any city page as clean markdown. Append .md to the URL. |
| /compare/london-vs-dubai.md | Any comparison as markdown. |
| /guides/best-cities-for-remote-workers.md | Any guide as markdown. |
| /methodology.md | How the numbers are built, and where they break. |
JSON endpoints
| Method | Endpoint | Returns |
|---|---|---|
| GET | /api/cities | Every city with headline monthly cost, index, safety and visa status. |
| POST | /api/cost | Itemised monthly breakdown for a household, each line carrying its assumption. |
| POST | /api/salary | Equivalent gross salary between two cities, solved for equal monthly surplus. |
| POST | /api/afford | Does this income cover this city? Disposable income, savings rate, verdict. |
| POST | /api/compare | Two cities across cost, tax, housing, quality of life and climate. |
| POST | /api/recommend | Rank all cities against weighted preferences and hard filters. |
Full parameter schemas are in openapi.json. All endpoints send permissive CORS headers, so browser-based agents can call them directly.
Examples
curl -s https://cost-of-life.com/api/cost \
-H 'content-type: application/json' \
-d '{"city":"lisbon","currency":"EUR",
"household":{"adults":2,"children":2,
"housing":"3bed-outer","car":true,"childcare":true}}'curl -s https://cost-of-life.com/api/salary \
-H 'content-type: application/json' \
-d '{"from":"los-angeles","to":"berlin","grossAnnual":150000}'curl -s https://cost-of-life.com/api/recommend \
-H 'content-type: application/json' \
-d '{"weights":{"cost":10,"safety":9,"weather":8,"beach":7,
"healthcare":5,"transport":4,"english":6,"internet":6,
"nightlife":2,"family":2},
"climate":"warm","requireCoastal":true,
"requireNomadVisa":true,"limit":5}'curl -s https://cost-of-life.com/cost-of-living/tokyo.mdWhat the data is, and is not
70 cities. Prices are held in USD and normalised into a monthly budget for a specified household. Salaries are taxed under each country’s own brackets and employee social contributions, with sub-national rates and surtaxes modelled explicitly.
Tax models are simplified single-filer approximations: no dependants, no itemised deductions, no employer benefits, no expat regimes. They are good enough to compare cities and not good enough to file anything.
Seed prices are modelled estimates compiled from public statistical sources, not scraped from a competitor. Each city carries a review date and a confidence figure. Full detail: methodology or methodology.md.