# Numbeo Scraper: Cost of Living & City Indices (`recordsdata/numbeo-cost-of-living-scraper`) Actor

Scrape Numbeo cost of living by city: 55 item prices with low/high ranges (rent, groceries, transport, salaries), family and single-person monthly budgets, quality of life, crime and property metrics in 15 currencies. Export CSV, Excel, JSON. No login or API key.

- **URL**: https://apify.com/recordsdata/numbeo-cost-of-living-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Travel, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 price items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

> **Numbeo Scraper by RecordsData extracts Numbeo cost of living data by city or country: 55 item prices with low and high ranges, family-of-four and single-person monthly budgets, worldwide city and country rankings (7 index types), plus quality of life, crime, property, health care, pollution and traffic indices, in 161 currencies. Export CSV, Excel, JSON or XML. No login, no API key. Priced from $0.01 per price row; health care, pollution and traffic rows are $0.02 and ranking rows $0.002. Verified in the Apify cloud on 2026-10-10.**

### 🏙 Numbeo cost of living scraper: what does it do?

This Numbeo scraper turns the cost of living pages of [Numbeo](https://www.numbeo.com), the largest crowdsourced cost of living database, into structured datasets. In a cloud run on Berlin and Germany, one request per page returned **55 itemized prices for the city and 55 for the country**, each with an average price and a low/high range, in the currency you pick.

- Scrape the full price basket of one city, one country, or hundreds of both.
- Get Numbeo's monthly cost estimates for a family of four and a single person (rent excluded).
- Pull worldwide rankings for cities (about 300 to 560 rows) or countries, 7 index types, with `rank`.
- Add optional quality of life, crime, property, health care, pollution and traffic modules.
- Choose from 161 display currencies (all Numbeo codes except Bitcoin and four metals, which Numbeo prints as 0.00).
- Pay per row: **1,000 price rows cost $10**. Run from the Console, API, a schedule or an AI agent through MCP.

### 📋 Numbeo data you can extract: which fields come back?

Rows are told apart by `recordType`; fields that do not apply are omitted.

| recordType | One row per | Main fields |
|---|---|---|
| `price`, `country-price` | price item | `city`, `citySlug`, `region`, `country`, `category`, `item`, `price`, `currency`, `rangeLow`, `rangeHigh` |
| `city-summary`, `country-summary` | place | `familyOfFourMonthlyCost`, `singlePersonMonthlyCost`, `currency`, `rank` |
| `quality-of-life`, `crime`, `property`, `health-care`, `pollution`, `traffic` (prefix `country-` for countries) | place | `metrics` with the index values, `ratings` with Numbeo labels such as High or Very Low |
| `ranking`, `country-ranking` | ranked place | `indexType`, `rank`, `metrics`, `period` |

The default dataset has 23 columns, adding `contributors`, `lastUpdated`, `url`, `scrapedAt` and `error`, and five views: Overview, Prices, Budgets, Indices and Rankings. `rank` is the row position in the table. With rankings on, your own cities also carry `rank` (Berlin was 105 in the cost of living city ranking in the test run). An unrecognised place gives one free row with an `error` message.

### 📊 Numbeo scraper sample output (real rows from a cloud run)

A row from an earlier cloud run on Lima, in USD (newer columns such as `region`, `country` and `ratings` are not shown):

```json
{
  "recordType": "price",
  "city": "Lima",
  "citySlug": "Lima",
  "category": "Restaurants",
  "item": "Meal at an Inexpensive Restaurant",
  "price": 4.34,
  "currency": "USD",
  "rangeLow": 2.89,
  "rangeHigh": 8.68,
  "url": "https://www.numbeo.com/cost-of-living/in/Lima",
  "scrapedAt": "2026-10-04T04:01:58.916Z"
}
```

### 💰 How much does it cost to scrape Numbeo?

| Event | Price |
|---|---|
| Price item (city or country) | $0.01 per row ($10 per 1,000) |
| Budget summary, quality of life, crime, property, health care, pollution, traffic | $0.02 each per place |
| Ranking row | $0.002 ($2 per 1,000) |

The Pricing tab on the actor page is the source of truth if it ever differs. Examples (same on every plan tier):

- **1,000 price rows cost $10**, about 18 cities of 55 items.
- 1 city with prices and the budget summary (56 rows) costs about $0.57.
- Berlin plus Germany with prices, both budgets and 20 ranking rows (cloud run ZCeG3VoK3yR4Skt0R, 132 rows) cost $1.14 + 20 x $0.002 = $1.18.
- 1,000 ranking rows cost $2.

This actor costs more per price row than the cheapest rivals, see the comparison below. Unrecognised slugs, error rows and failed requests are never billed. A run that delivers nothing fails and charges nothing. `Max total charge` is respected. Free Apify plan users are limited to 10 rows per run as a preview.

### 🚀 How to scrape Numbeo cost of living data in 3 steps

1. Add places in **Cities** (`Berlin`, `New-York`, `Austin, TX`, or a full Numbeo URL) and/or **Countries** (`Germany`). The API default is empty.
2. Pick a currency and switch on the modules you need. Prices and the budget summary are on by default.
3. Click **Start**, then download the dataset as CSV, Excel, JSON or XML.

### ⚙️ Numbeo scraper input

| Field | Default | What it does |
|---|---|---|
| `cities`, `countries` | empty | City slugs, "City, State", full URLs, or country names. |
| `displayCurrency` | `USD` | Currency for every price and budget, 161 options. |
| `maxItems` | none | Cap on rows delivered. Free plan: 10. |
| `includePrices`, `includeCityIndices` | `true` | Price rows (55 per place) and the budget summary. |
| `includeQualityOfLife`, `includeCrime`, `includeProperty`, `includeHealthCare`, `includePollution`, `includeTraffic` | `false` | One index row per place ($0.02). |
| `includeRankings` | `false` | Add worldwide ranking tables ($0.002 per row). |
| `rankingTypes` | `["cost-of-living"]` | cost-of-living, quality-of-life, crime, property, health-care, pollution, traffic. |
| `rankingScope` | `cities` | `cities` or `countries` (latest half-year edition). |
| `maxCities` | `50` | Rows kept per ranking, 1 to 1000. |
| `proxyConfiguration` | Apify RESIDENTIAL | Numbeo answers datacenter IPs with HTTP 503. |

```json
{
  "cities": ["Berlin"],
  "countries": ["Germany"],
  "displayCurrency": "EUR",
  "includeRankings": true,
  "rankingTypes": ["cost-of-living"],
  "maxCities": 20,
  "maxItems": 200
}
```

### 🔍 Numbeo scraper vs alternatives on Apify

Read from the Store pages and prices on 2026-10-10. Prices are the Free-tier price per result.

| | This actor | logiover | solidcode |
|---|---|---|---|
| Price per result | $0.01 per price row, $0.02 per index row | $0.0035 plus $0.00005 start | $0.00215 plus $0.005 start |
| Countries and rankings | Yes, 7 ranking types, cities or countries | Yes, 7 categories, city rankings | Yes, 7 categories, city rankings |
| Currencies | 161, budgets included | None listed in its input | 24 |

A 55-item city with its budget row costs about $0.57 here and about $0.20 at logiover, so this actor is roughly three times more expensive per price row. The difference buys the family and single-person budgets, 161 currencies, `ratings` and `contributors` columns and a dataset schema with five views. If you only need raw prices in USD at the lowest cost, logiover or solidcode is the better buy. parseforge ($0.0049) offers a two-city compare mode that this actor does not have, and bovi ($0.00375) covers cities only.

### 💼 Use cases for Numbeo cost of living data

- **Compensation localization:** price an offer for every office city from the same basket.
- **Relocation and market entry:** compare rent, groceries and safety in the client's currency, or build dated "cheapest cities" lists from the rankings.

### 🔌 Run the Numbeo scraper via API, schedule and integrations

```bash
curl -X POST "https://api.apify.com/v2/acts/RecordsData~numbeo-cost-of-living-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"cities":["Lima"],"countries":["Peru"],"displayCurrency":"USD","includeCrime":true}'
```

Schedule it monthly or send results to Google Sheets, Make, Zapier or n8n.

### 🤖 Numbeo scraper MCP server for AI agents (Claude, Cursor, VS Code)

Connect any MCP client through the Apify MCP server. This URL exposes only this actor as a tool:

`https://mcp.apify.com?tools=RecordsData/numbeo-cost-of-living-scraper`

Example agent prompt: "Use the Numbeo cost of living scraper to get prices in EUR for Lisbon, Madrid and Berlin, include the budget summary and crime modules, then tell me which city is cheapest for a single person and which has the lowest crime index. Also turn on rankings with maxCities 20 and tell me where Berlin ranks."

Tool description: the tool scrapes Numbeo cost of living, rankings and city indices for the cities and countries you give it, and returns dataset rows. It takes the same input as the actor (`cities`, `countries`, `displayCurrency`, module switches, `includeRankings`, `rankingTypes`, `maxCities`, `maxItems`). Set `maxItems` to keep agent runs small and cheap.

### ⚖️ Is it legal to scrape Numbeo?

The actor reads public Numbeo pages that anyone can open without logging in and collects aggregate city and country statistics, not personal data. You remain responsible for using the data in line with Numbeo's terms and the laws that apply to you. This is an independent tool and is not affiliated with Numbeo.

### ❓ Numbeo scraper FAQ

#### How do I export Numbeo prices for a city to CSV or Excel?

Enter the city in the Cities field, for example `Buenos-Aires`, then click Start. When the run finishes, open the dataset tab and choose CSV, Excel, JSON, XML or HTML. Each Numbeo price becomes one spreadsheet-ready row with item, category, average price and low and high range.

#### Can I get Numbeo prices in my own currency?

Yes. Set `displayCurrency` to any of 161 currency codes. Bitcoin and the four metals (XAU, XAG, XPD, XPT) are left out because Numbeo prints 0.00 for every price in them. Numbeo does the conversion, so every row in one run uses the same currency. For several currencies, start one run per currency.

#### How do I write city names for the Numbeo scraper?

Write each city as in the Numbeo URL, such as `Mexico-City` or `San-Francisco`. Spaces are converted to dashes for you. You can also write "City, State" (for example `Austin, TX`) or paste a full Numbeo URL. When unsure, search the city on numbeo.com and copy the last part of the address.

#### Why did I get 0 results for my city on Numbeo?

The name most likely does not match the one Numbeo uses. Open numbeo.com, search the city, and copy the last part of its URL into the Cities field. The scraper returns one free error row naming the place it could not find, and nothing is charged for it.

#### Why does the Numbeo scraper run fail instead of returning empty data?

If Numbeo blocks every request, or its page layout changes so that no rows can be read, the run is marked as failed with a clear message instead of finishing with an empty dataset. A failed run delivers nothing and you are not charged for it, so an empty result never costs you money.

#### Do I pay for Numbeo modules I switch off?

No. Each module is its own billing event. A module you leave off produces no rows and no charge, and you are billed only for rows actually delivered. Price rows cost $0.01, index and budget rows $0.02 each, and ranking rows $0.002 each.

#### Where do the family and single-person budgets come from on Numbeo?

They are the estimated monthly costs that Numbeo prints in the summary of each cost of living page. The scraper copies them into the `city-summary` or `country-summary` row as `familyOfFourMonthlyCost` and `singlePersonMonthlyCost`. Both exclude rent and use the currency in the `currency` column.

#### Why is residential proxy on by default for the Numbeo scraper?

In testing, Numbeo answered every datacenter or no-proxy request from the cloud with HTTP 503, while residential IPs worked: about 2 percent of 104 residential requests needed a retry on a new IP and no run failed. So the default is Apify RESIDENTIAL proxy. Turning the proxy off makes the run fail.

#### How many cities can one Numbeo scraper run cover?

As many as you list in the Cities and Countries fields. One city with every priced module on produces 59 rows, 55 price rows plus 4 module rows, in the Lima test. Set `maxItems` or the Max total charge on the run to cap the size and cost of a large run.

#### How fresh is the Numbeo data?

The scraper reads each page live from Numbeo at run time, so a run returns whatever Numbeo shows at that moment. Every row carries a `scrapedAt` timestamp plus the `lastUpdated` date Numbeo shows. Schedule monthly runs to track changes. Country rankings use the latest half-year edition, shown in `period`.

#### Can I scrape whole countries, not just cities?

Yes. Add names to the `countries` field, for example `Germany` or `South Korea`. You get `country-price` rows for the same 55 items, a `country-summary` budget row, and country index rows when those modules are on. Country price rows are billed as price items.

#### How do the Numbeo rankings work, and what does maxCities do?

Switch on `includeRankings`, choose `rankingTypes` and `rankingScope` (`cities`, about 300 to 560 rows, or `countries`). `maxCities` (default 50, 1 to 1000) keeps the first rows of each ranking. One request returns a whole table, so rankings are cheap: each row costs $0.002, about $1 for 500 rows.

#### Are health care, pollution and traffic included, and do they cost anything?

They are separate switches (`includeHealthCare`, `includePollution`, `includeTraffic`), all off by default. Each gives one row per place with the index, its sub-scores in `metrics` and Numbeo's labels in `ratings`. Each row is billed at $0.02, the same as quality of life, crime and property rows, so all three cost $0.06 per place.

#### Why are the default cities empty now?

Earlier versions scraped Buenos-Aires when you gave no input. Now the API default is empty, so a run with no cities, countries or rankings returns one free error row saying nothing was requested, instead of an unwanted scrape. The Console form still shows Buenos-Aires and Madrid as an example.

#### What happens when a run only partly succeeds?

Each page gets at most 6 attempts, each on a new residential IP. The scan stops after 3 failed pages in a row, 60 seconds of consecutive failures, or 25 unknown places in a row. If some rows were delivered, the run ends as "Partial: ..." with status success and the rows are kept and billed. If none were, it fails and charges nothing.

#### Does the Numbeo scraper have a compare mode for two cities?

No. There is no input for pairs of places and no comparison row. A comparison is a join of two city results on the `item` column, which you can do in a spreadsheet or in code from the output.

#### What changed in the budget and currency columns?

Budget rows are now always in the currency named in `currency`; before, an amount in the local currency could carry the chosen display currency label. Prices in dotted-symbol currencies (Swiss franc, Peruvian sol) were silently dropped and are now delivered. Crime rows gained 15 perception metrics, and a property key with a trailing space is now trimmed.

### 🔗 More RecordsData scrapers

[H1B Salaries Scraper](https://apify.com/RecordsData/h1b-salaries-scraper), [Remote Jobs Aggregator](https://apify.com/RecordsData/remote-jobs-aggregator) and [MercadoLibre Scraper](https://apify.com/RecordsData/mercadolibre-scraper).

### 🆘 Support

Open an issue on the Issues tab of the actor page or write to contact.punkrecordsdata@gmail.com.

Last updated: 2026-10-11

# Actor input Schema

## `cities` (type: `array`):

City names as in Numbeo URLs (Berlin, New York, Buenos-Aires, Mexico-City). Spaces become dashes. "City, State" such as "Portland, OR" and full Numbeo city URLs also work. Leave empty if you only want countries or rankings.

## `countries` (type: `array`):

Country names as on Numbeo (Germany, United States, South Korea). Returns the national average of the same prices and indices, one row per item. Optional.

## `displayCurrency` (type: `string`):

Currency for all prices (161 codes offered by Numbeo; the amounts are Numbeo's own conversion at the time of the run).

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `includePrices` (type: `boolean`):

One row per price item (55 per city or country): restaurants, markets, transport, utilities, rent, salaries, with the price range.

## `includeCityIndices` (type: `boolean`):

One summary row per city or country: estimated monthly cost for a family of four and for a single person, excluding rent, in the chosen currency.

## `includeQualityOfLife` (type: `boolean`):

One row per city or country: quality of life, purchasing power, safety, health care, climate, cost of living, property price to income, traffic and pollution indices, with Numbeo rating labels.

## `includeCrime` (type: `boolean`):

One row per city or country: crime index, safety index and all 15 perception metrics (worries, problems, safety walking alone), with rating labels.

## `includeProperty` (type: `boolean`):

One row per city or country with 10 property metrics: price-to-income ratio, mortgage as percentage of income, price-to-rent ratios, gross rental yields, GDP per capita and growth rates.

## `includeHealthCare` (type: `boolean`):

One row per city or country: health care index plus its 8 sub-scores (staff skill, speed, equipment, accuracy, friendliness, waiting, cost, location), with rating labels.

## `includePollution` (type: `boolean`):

One row per city or country: pollution index, air, water, noise, garbage and green-space scores, plus PM2.5 and PM10 where Numbeo shows them.

## `includeTraffic` (type: `boolean`):

One row per city or country: traffic index, time and inefficiency indices, CO2 emission index, commute mode shares and average commute times.

## `includeRankings` (type: `boolean`):

Adds one row per ranked city (or country) with its rank and index values, for each ranking you pick below. When on, the budget summary and index rows of your own cities also carry their rank.

## `rankingTypes` (type: `array`):

Which Numbeo ranking tables to return when worldwide rankings are on. One table per entry.

## `rankingScope` (type: `string`):

Cities: current ranking of about 300 to 560 cities (updated continuously). Countries: latest half-year edition of the country ranking.

## `maxCities` (type: `integer`):

How many rows to return from the top of each ranking (rank 1 first). The cost of living ranking has about 560 cities and 150 countries.

## `proxyConfiguration` (type: `object`):

Numbeo answers HTTP 503 to datacenter IPs and limits each address, so the actor uses Apify RESIDENTIAL proxy by default and switches to a new IP on every retry. Turn it off only if you know your network can reach Numbeo.

## Actor input object example

```json
{
  "cities": [
    "Buenos-Aires",
    "Madrid"
  ],
  "countries": [],
  "displayCurrency": "USD",
  "maxItems": 10,
  "includePrices": true,
  "includeCityIndices": true,
  "includeQualityOfLife": false,
  "includeCrime": false,
  "includeProperty": false,
  "includeHealthCare": false,
  "includePollution": false,
  "includeTraffic": false,
  "includeRankings": false,
  "rankingTypes": [
    "cost-of-living"
  ],
  "rankingScope": "cities",
  "maxCities": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Every column of every record type

## `prices` (type: `string`):

Price rows with ranges

## `budgets` (type: `string`):

Family and single-person monthly cost

## `indices` (type: `string`):

Quality of life, crime, health care, pollution, traffic, property

## `rankings` (type: `string`):

Worldwide city and country rankings

## `fullData` (type: `string`):

Complete dataset with all fields

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "cities": [
        "Buenos-Aires",
        "Madrid"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/numbeo-cost-of-living-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "cities": [
        "Buenos-Aires",
        "Madrid",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/numbeo-cost-of-living-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "cities": [
    "Buenos-Aires",
    "Madrid"
  ],
  "maxItems": 10
}' |
apify call recordsdata/numbeo-cost-of-living-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/numbeo-cost-of-living-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MybSqSNHrv7KPmSbE/builds/VndT5EkihSL1v1pBN/openapi.json
