# REST Countries Scraper (`crawlerbros/rest-countries-scraper`) Actor

Scrape REST Countries, the free public API for country metadata. Get name, capital, population, area, currencies, languages, borders, region/subregion, flags, timezones, calling codes, and more for all 250 ISO countries. HTTP-only, no auth, no proxy.

- **URL**: https://apify.com/crawlerbros/rest-countries-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Developer tools, Other, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## REST Countries Scraper

Scrape REST Countries — the free public API for country metadata. All 250 ISO countries, with name (common + official + native), capital, population, area, currencies, languages, borders, region/subregion, flags (emoji + PNG + SVG), timezones, calling codes, TLDs, lat/lng, and more. HTTP-only via the public `restcountries.com/v3.1` API. No auth, no proxy.

### What this actor does

- **Seven modes:** `all`, `byNames`, `byAlphaCodes`, `byRegion`, `bySubregion`, `byCurrency`, `byLanguage`
- **Filters:** min population, min area (km²), UN members only, independent states only
- **Auto-resolves alpha-2 / alpha-3 / numeric codes**
- **Empty fields are omitted**

### Output per country

- **Names:** `commonName`, `officialName`, `altSpellings[]`, `demonym`
- **ISO codes:** `cca2`, `cca3`, `ccn3`, `cioc`, `fifaCode`
- **Status:** `independent`, `unMember`, `status`, `landlocked`
- **Capital:** `capital[]`, `capitalPrimary`
- **Geography:** `region`, `subregion`, `continents[]`, `borders[]`, `latitude`, `longitude`
- **Demographics:** `population`, `areaKm2`
- **Symbols:** `flagEmoji` (🇩🇪), `flagPng`, `flagSvg`, `coatOfArmsPng`, `coatOfArmsSvg`
- **Currency / language:** `currencies[]` (code + name + symbol), `currencyCodes[]`, `languageCodes[]`, `languageNames[]`
- **Communications:** `timezones[]`, `callingCodes[]`, `tlds[]`
- **Maps:** `googleMapsUrl`, `openStreetMapsUrl`
- `recordType: "country"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `all` | One of seven modes |
| `names` | array | – | Country names (mode=byNames) |
| `alphaCodes` | array | – | Alpha-2/3 codes (mode=byAlphaCodes) |
| `region` | string | – | Continental region |
| `subregion` | string | – | Subregion (e.g. `Western Europe`) |
| `currency` | string | – | ISO 4217 (mode=byCurrency) |
| `language` | string | – | Language name or ISO code |
| `minPopulation` | int | – | Drop countries below this |
| `minArea` | int | – | Drop countries below this km² |
| `unMembersOnly` | bool | `false` | – |
| `independentOnly` | bool | `false` | Excludes territories |
| `maxItems` | int | `250` | Hard cap (1–500) |

#### Example: all UN member states with population > 10M

```json
{
  "mode": "all",
  "minPopulation": 10000000,
  "unMembersOnly": true
}
```

#### Example: lookup specific countries

```json
{
  "mode": "byAlphaCodes",
  "alphaCodes": ["DE", "FR", "ES", "IT", "GB", "PT"]
}
```

#### Example: all Eurozone countries

```json
{
  "mode": "byCurrency",
  "currency": "EUR"
}
```

#### Example: all Spanish-speaking countries

```json
{
  "mode": "byLanguage",
  "language": "spanish"
}
```

### Use cases

- **Geographic dropdowns** — populate forms with all countries, sorted by region
- **Lookup tables** — alpha-2 ↔ alpha-3 ↔ numeric ISO mappings
- **Phone-number formatting** — `callingCodes[]` for international dialing
- **Flag UI** — `flagEmoji` for inline display, `flagSvg` for high-DPI
- **Currency converter** — group countries by currency for FX UIs
- **i18n** — group countries by official language

### FAQ

**Is the REST Countries API free?**  Yes. Self-hosted, no auth, no rate limits beyond reasonable use.

**What's the difference between `cca2` / `cca3` / `ccn3` / `cioc`?**  ISO 3166-1 alpha-2 (`DE`), alpha-3 (`DEU`), numeric (`276`), and IOC (`GER`) codes respectively.

**Why does `mode=all` require many requests of fields?**  REST Countries v3.1+ requires explicit `fields=` parameter for `/all` to keep payloads small. The actor sends a comprehensive list — every field documented above.

**How many countries are there?**  250 entries (includes territories, dependencies, Antarctic). For sovereign UN states only, set `unMembersOnly: true` (193 entries).

**What's `cioc`?**  International Olympic Committee code. Only set for countries that compete in the Olympics.

**Why is `latitude` / `longitude` sometimes missing?**  REST Countries returns `latlng: ["bad", "data"]` for a few entries. The actor handles this gracefully.

**How fresh is the data?**  Updated periodically (manual edits by maintainers). For real-time political changes, supplement with a different source.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `names` (type: `array`):

Country names to look up (e.g. `Germany`, `United States`, `India`). Matched fully via fullText param.

## `alphaCodes` (type: `array`):

ISO 3166-1 alpha-2 (e.g. `DE`, `US`) or alpha-3 (e.g. `DEU`, `USA`) codes.

## `region` (type: `string`):

Continental region.

## `subregion` (type: `string`):

Subregion (e.g. `Western Europe`, `Southern Asia`, `Caribbean`).

## `currency` (type: `string`):

ISO 4217 currency code (e.g. `EUR`, `USD`, `JPY`).

## `language` (type: `string`):

Language name or ISO 639-1/2/3 code (e.g. `english`, `eng`, `spa`).

## `capital` (type: `string`):

Capital city name (e.g. `Berlin`, `Tokyo`, `Brasilia`).

## `translation` (type: `string`):

Country name in another language (e.g. `Deutschland`, `Allemagne`, `Alemania`).

## `demonym` (type: `string`):

Demonym for residents (e.g. `german`, `french`, `american`).

## `minPopulation` (type: `integer`):

Drop countries below this population.

## `minArea` (type: `integer`):

Drop countries with land area below this (in km²).

## `unMembersOnly` (type: `boolean`):

Only emit UN member states.

## `independentOnly` (type: `boolean`):

Only emit independent (sovereign) states; excludes territories / dependencies.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "all",
  "names": [],
  "alphaCodes": [],
  "unMembersOnly": false,
  "independentOnly": false,
  "maxItems": 250
}
```

# Actor output Schema

## `countries` (type: `string`):

Dataset containing all scraped country records.

# 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 = {
    "mode": "all",
    "names": [],
    "alphaCodes": [],
    "unMembersOnly": false,
    "independentOnly": false,
    "maxItems": 250
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/rest-countries-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 = {
    "mode": "all",
    "names": [],
    "alphaCodes": [],
    "unMembersOnly": False,
    "independentOnly": False,
    "maxItems": 250,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/rest-countries-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 '{
  "mode": "all",
  "names": [],
  "alphaCodes": [],
  "unMembersOnly": false,
  "independentOnly": false,
  "maxItems": 250
}' |
apify call crawlerbros/rest-countries-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/rest-countries-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/OMgchXBn86TSuNom5/builds/C6Lu9JUP1OdKSLEBG/openapi.json
