# IB World Schools Scraper · Codes, Programmes & Contacts (`corent1robert/ib-world-schools-scraper`) Actor

Turn the official ibo.org directory into a spreadsheet: school code, PYP/MYP/DP/CP, languages and map coordinates — one row per school. One country or the full catalogue. No login. No API key.

- **URL**: https://apify.com/corent1robert/ib-world-schools-scraper.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.99 / 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.

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

## IB World Schools Scraper

**Turn the official IB World Schools directory into a spreadsheet — school code, authorised programmes, and languages — without copying pages by hand.**

This Actor reads the public [Find an IB School](https://www.ibo.org/programmes/find-an-ib-school/) directory on ibo.org and writes **one row per school**. Pick a country, paste a finder URL, or export the worldwide catalogue (~5,800 schools) with one click.

**No login. No API key. No IB account.** Contacts are copied only when a school publishes them on its own website. They are never invented.

***

### Who is this for?

| You are… | Typical goal | Suggested setup |
|---|---|---|
| EdTech / curriculum vendor | Official universe of authorised IB accounts | **Worldwide** — then **Start** |
| Education consultant / placement | Confirm which programmes a school actually runs | **Listing** — paste a country finder URL |
| Relocation / mobility team | Shortlist authorised IB schools in one market | **Catalogue** — one country, **Max schools** 20 |
| Market research | Count PYP / MYP / DP / CP coverage by country | **Catalogue** with **Max schools** at 0 on a paid plan |
| CRM / outbound | Public emails when the school lists them on its site | Turn on **Open each IB profile page** and website contacts |

**What you get by default** — name, IB school code, country, PYP / MYP / DP / CP flags, languages of instruction, map coordinates, and the official profile URL.

**When to open profiles** — the finder table is the official roster. Turn **Open each IB profile page** on only if you need head of school, address, or website. Website contact copy needs that option.

***

### How to use

1. Pick a **Mode**: Catalogue (countries), Listing (finder URLs), Individual (school URLs), or **Worldwide**.
2. Set **Max schools**. Free plan: **20 per run**. Paid plans: **0** = no ceiling.
3. Click **Start**. Download **CSV**, **Excel**, or **JSON** from the dataset.

**Full worldwide dump:** pick **Worldwide**, click **Start**. You can leave Countries and Max schools as they are. Default timeout is 4 hours. Free Apify accounts still stop at 20 rows.

***

### Ready-made examples

| Example | Use it when |
|---|---|
| [UAE IB schools sample](https://apify.com/corent1robert/ib-world-schools-scraper/examples/uae-ib-schools-sample) | Up to 20 authorised schools in the United Arab Emirates |
| [Singapore IB schools sample](https://apify.com/corent1robert/ib-world-schools-scraper/examples/singapore-ib-schools-sample) | Up to 20 authorised schools in Singapore |
| [One IB school profile](https://apify.com/corent1robert/ib-world-schools-scraper/examples/one-ib-school-profile) | A single official ibo.org/school page |
| [UAE + Singapore sample](https://apify.com/corent1robert/ib-world-schools-scraper/examples/uae-singapore-catalogue-sample) | Two markets, 20 rows |
| [Worldwide catalogue](https://apify.com/corent1robert/ib-world-schools-scraper/examples/worldwide-ib-schools-catalogue) | Every authorised IB school (~5,800). Paid plan. **Max schools** 0 |

***

### What it extracts

| Theme | Typical columns |
|--------|-----------------|
| Identity | Name, IB school code, official profile URL, country |
| Programmes | PYP, MYP, DP, CP flags and a combined programmes field |
| Languages | Languages of instruction from the directory |
| Map | Latitude / longitude when the finder map publishes them |
| Profile (optional) | Head of school, address, website, authorization years |
| Contact (optional) | Email and phone **only if published on the school website** |

Empty cells usually mean that school did not publish that detail on ibo.org.

***

### Example output

Default **Catalogue** run (finder table only — no invented contacts):

```json
{
  "url": "https://www.ibo.org/school/049476/",
  "schoolCode": "049476",
  "name": "Ajman Academy",
  "country": "United Arab Emirates",
  "countryCode": "AE",
  "city": "",
  "address": "",
  "headOfSchool": "",
  "pyp": true,
  "myp": true,
  "dp": false,
  "cp": false,
  "programmes": "PYP, MYP",
  "languages": "English, Arabic",
  "authorization": "",
  "website": "",
  "email": "",
  "phone": "",
  "latitude": "25.3767711",
  "longitude": "55.4430935"
}
```

Email, phone, address and website stay empty unless you turn on **Open each IB profile page** and the school published them.

***

### Input

| Field | What to put |
|--------|-------------|
| **Mode** | Catalogue, Listing, Individual, or Worldwide |
| **Countries** | Used in **Catalogue**. Ignored in **Worldwide**. |
| **Finder URLs** | `https://www.ibo.org/programmes/find-an-ib-school/?SearchFields.Country=SG` |
| **School URLs** | `https://www.ibo.org/school/049476/` |
| **Max schools** | `20` to start. `0` = no ceiling on a paid plan. Free plan: **20 / run** |
| **Open each IB profile page** | Off = finder table only (faster). On = try address / website |
| **Find published email & phone** | Only copies literals from the school website. Never guessed |

API-only: `maxConcurrency` (default 3, max 8), `verboseLogs` (extra debug lines). Residential Apify Proxy is applied automatically.

***

### How much does it cost to scrape IB World Schools?

Pay per school row in the default dataset. Platform compute is billed to you (PPE).

| Scenario | Approx. cost (rows only) |
|----------|--------------------------|
| 20 schools (first run / Free plan) | ~$0.14 |
| 1,000 schools | ~$6.99 |
| Worldwide catalogue (~5,800 schools) | ~$40.50 |

Price is **$0.00699** per result. Free Apify accounts are capped at **20 schools per run**. Upgrade to raise the cap — still billed per school.

***

### Is it legal to scrape ibo.org?

This Actor only accesses data that the [IB World Schools directory](https://www.ibo.org/programmes/find-an-ib-school/) makes publicly available. As with any data containing personal information, ensure your use complies with GDPR and relevant regulations, including direct-marketing rules where contacts are involved.

***

### Also available

- **[International Schools Scraper](https://apify.com/corent1robert/international-schools-database-scraper)** — fees, curriculum, facilities and published contacts from international-schools-database.com.
- **[WhichSchoolAdvisor Scraper](https://apify.com/corent1robert/whichschooladvisor-scraper)** — fees, inspection ratings and published contacts from WhichSchoolAdvisor.

Use **IB World Schools** when you need the **official authorization list**.

***

### FAQ

**Do I need an IB or ibo.org account?**\
No.

**Why are some emails empty?**\
The official finder table does not list mailboxes. With profile + website scan on, we copy an address only if it appears on the school's own site.

**Is this the full worldwide list?**\
Pick **Worldwide** and click **Start**. Paid plan, **Max schools** can stay at 20 — the Actor lifts that default. Free accounts still stop at 20 rows.

***

### Support

Questions or a custom pipeline: <corentin@outreacher.fr>.

***

### Local development

```bash
cd ib-world-schools-scraper
npm install
npm test
apify run --purge --input-file=./.actor/INPUT.json
```

# Actor input Schema

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

**Catalogue** — every authorised school in the countries you select.

**Listing** — paste a Find an IB School search URL.

**Individual** — paste ibo.org/school/… profile URLs.

**Worldwide** — the full official directory (~5,800 schools). Paid plan.

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

Markets to export in **Catalogue** mode. Ignored when mode is **Worldwide**. Leave the United Arab Emirates prefill for a first try.

## `listingUrls` (type: `array`):

Find an IB School search pages, e.g. https://www.ibo.org/programmes/find-an-ib-school/?SearchFields.Country=SG. Used when mode is **Listing**.

## `urlsToScrape` (type: `array`):

Official IB profile URLs (https://www.ibo.org/school/049476/). Used when mode is **Individual**.

## `maxSchools` (type: `integer`):

How many schools to export. **0** = no ceiling (paid plans). Free plan is capped at **20** per run.

## `scrapeProfiles` (type: `boolean`):

Add head of school, address and website from the official profile when that page is available. Leave off for a faster country roster from the finder table.

## `enrichContacts` (type: `boolean`):

When a profile lists a school website, open it and copy a published mailbox or phone if they are on the page. Never invented. Needs **Open each IB profile page**.

## `urlsToSkip` (type: `array`):

Optional. School profile URLs to exclude after discovery.

## Actor input object example

```json
{
  "mode": "catalog",
  "countries": [
    "AE"
  ],
  "listingUrls": [
    "https://www.ibo.org/programmes/find-an-ib-school/?SearchFields.Country=AE"
  ],
  "maxSchools": 20,
  "scrapeProfiles": false,
  "enrichContacts": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per school — IB code, programmes, languages, coordinates and published contacts

## `datasetOverview` (type: `string`):

Name, IB code, country, programmes, languages and published contacts

## `datasetProgrammes` (type: `string`):

PYP / MYP / DP / CP flags per school

## `runLog` (type: `string`):

Progress lines updated during the run

# 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": "catalog",
    "countries": [
        "AE"
    ],
    "listingUrls": [
        "https://www.ibo.org/programmes/find-an-ib-school/?SearchFields.Country=AE"
    ],
    "maxSchools": 20,
    "scrapeProfiles": false,
    "enrichContacts": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/ib-world-schools-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": "catalog",
    "countries": ["AE"],
    "listingUrls": ["https://www.ibo.org/programmes/find-an-ib-school/?SearchFields.Country=AE"],
    "maxSchools": 20,
    "scrapeProfiles": False,
    "enrichContacts": False,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/ib-world-schools-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": "catalog",
  "countries": [
    "AE"
  ],
  "listingUrls": [
    "https://www.ibo.org/programmes/find-an-ib-school/?SearchFields.Country=AE"
  ],
  "maxSchools": 20,
  "scrapeProfiles": false,
  "enrichContacts": false
}' |
apify call corent1robert/ib-world-schools-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/ib-world-schools-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/juum789TzlMOrjjDt/builds/LrtGn75dWji1g5oHf/openapi.json
