# TeacherOn Tutors Scraper (`crawlerbros/teacheron-scraper`) Actor

Scrape TeacherOn.com, a global tutoring marketplace with 200,000+ tutors across 18,000+ subjects. Search by keyword, browse by subject, or enrich profile URLs. Extracts name, subjects, rate, rating, reviews, location, languages, and teaching type.

- **URL**: https://apify.com/crawlerbros/teacheron-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 7 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## TeacherOn Tutors Scraper

Extract tutor profiles from [TeacherOn.com](https://www.teacheron.com) — a global tutoring marketplace with 200,000+ active tutors across 18,000+ subjects in 178 countries.

Use this actor to build datasets of tutors by subject, compare rates, analyze the tutoring market, or find qualified tutors for any subject area.

---

### What This Actor Does

- **Search tutors** by keyword or subject query (e.g., "python", "math", "guitar")
- **Browse by subject category** using TeacherOn's subject slugs (e.g., `python`, `web_scraping`)
- **Enrich specific profiles** from a list of tutor profile URLs
- **Filter results** by minimum rating and minimum review count
- **Filter by teaching type**: online only, home/in-person only, or all types

---

### Output Fields

Each record in the dataset represents one tutor:

| Field | Type | Description |
|---|---|---|
| `tutorId` | string | Unique TeacherOn tutor identifier (e.g., `9ye0`) |
| `name` | string | Tutor's display name |
| `profileUrl` | string | Full URL to the tutor's profile page |
| `subjects` | array of strings | All subjects the tutor teaches |
| `teachingType` | string | `"online"`, `"in-person"`, or `"both"` |
| `hourlyRateMin` | number | Minimum hourly rate in USD |
| `hourlyRateMax` | number | Maximum hourly rate in USD |
| `currency` | string | Always `"USD"` |
| `avgRating` | number | Average rating out of 5 (absent if no reviews) |
| `reviewCount` | integer | Number of student reviews |
| `location` | string | Tutor's location (city, state, country) |
| `country` | string | Country extracted from location |
| `languages` | array of strings | Languages the tutor speaks |
| `verified` | boolean | Whether the tutor has a verified green check |
| `profilePhotoUrl` | string | URL to the tutor's profile photo (if available) |
| `bio` | string | Tutor's self-description |
| `recordType` | string | Always `"tutor"` |
| `scrapedAt` | string | ISO 8601 UTC timestamp of scraping |

---

### Input Configuration

#### Mode

| Mode | Description |
|---|---|
| `searchTutors` (default) | Search by keyword/subject query |
| `bySubject` | Browse by exact subject slug |
| `byTutorUrls` | Enrich a list of specific profile URLs |

#### All Input Fields

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `searchTutors` | How to find tutors |
| `searchQuery` | string | — | Keyword or subject to search (e.g., `python`, `guitar`, `english`) |
| `subjectSlug` | string | — | Subject slug for `bySubject` mode (e.g., `web_scraping`, `data_science`) |
| `tutorUrls` | array | — | Profile URLs for `byTutorUrls` mode |
| `teachingType` | select | `online` | Filter: `online`, `home`, or `both` |
| `minRating` | number | — | Only emit tutors with rating ≥ this value (0–5) |
| `minReviews` | integer | — | Only emit tutors with ≥ this many reviews |
| `maxItems` | integer | `20` | Maximum number of tutor records to emit (1–5000) |
| `useResidentialProxy` | boolean | `false` | Enable residential proxy if datacenter IPs are blocked |

---

### Example Inputs

#### Search for Python tutors (online only, top 20)
```json
{
  "mode": "searchTutors",
  "searchQuery": "python",
  "teachingType": "online",
  "maxItems": 20
}
````

#### Browse all data science tutors with at least 5 reviews

```json
{
  "mode": "bySubject",
  "subjectSlug": "data_science",
  "minReviews": 5,
  "maxItems": 50
}
```

#### Enrich specific tutor profiles

```json
{
  "mode": "byTutorUrls",
  "tutorUrls": [
    "https://www.teacheron.com/tutor/9ye0",
    "https://www.teacheron.com/tutor/2xTY"
  ]
}
```

#### Find highly-rated math tutors (4.5+ stars, 10+ reviews)

```json
{
  "mode": "searchTutors",
  "searchQuery": "mathematics",
  "teachingType": "online",
  "minRating": 4.5,
  "minReviews": 10,
  "maxItems": 100
}
```

***

### Subject Slug Reference

TeacherOn uses URL-safe slugs for subjects. Common examples:

| Subject | Slug |
|---|---|
| Python | `python` |
| Web Scraping | `web_scraping` |
| Data Science | `data_science` |
| Machine Learning | `machine_learning` |
| Mathematics | `mathematics` |
| English | `english` |
| Guitar | `guitar` |
| JavaScript | `javascript` |
| SQL | `sql` |
| Excel | `excel` |

To find the slug for any subject, visit `https://www.teacheron.com/{subject}-tutors` and use the URL path segment before `-tutors`.

***

### Performance & Pricing

- Each tutor requires one profile page fetch for full data.
- Expect ~1–2 tutors per second at default settings.
- For 100 tutors, expect 2–4 minutes of run time.
- Memory: 2048 MB (Playwright).

***

### Proxy & Anti-Bot

TeacherOn returns 403 from some datacenter IP ranges. The actor uses an escalating strategy:

1. Fast HTTP request (no cost)
2. Playwright headless browser (standard)
3. Enable `useResidentialProxy` if still blocked

Residential proxy adds cost per GB of data transferred. Try without it first.

***

### Frequently Asked Questions

**Q: What subjects can I search for?**
A: TeacherOn has 18,000+ subjects. Any skill or academic subject is likely available — from mathematics to guitar to Python programming.

**Q: Can I get tutors for a specific country?**
A: Use `mode=bySubject` with the subject slug and filter by `country` in your downstream processing. The `location` and `country` fields are scraped from each profile.

**Q: Why are some tutors missing a photo or rating?**
A: TeacherOn tutors don't have to upload a photo, and rating/review count only appears once a tutor has received at least one review. The actor only outputs fields that are present.

**Q: What is the maximum number of tutors I can scrape?**
A: Up to 5,000 per run. TeacherOn listing pages show ~15 tutors per page.

**Q: Can I filter for verified tutors only?**
A: The `verified` field is included in output. You can filter downstream using the Apify dataset API or integrate into your workflow.

**Q: What does "teaching type" mean?**
A: TeacherOn tutors specify whether they teach online (video call), at the student's home (in-person), or both. The `teachingType` field reflects this.

**Q: How fresh is the data?**
A: Data is scraped live from TeacherOn at run time. Each record includes a `scrapedAt` timestamp.

**Q: Is this actor legal to use?**
A: This actor scrapes publicly available tutor profiles. Always review TeacherOn's terms of service and ensure your use case complies with applicable data protection regulations (GDPR, CCPA, etc.).

# Actor input Schema

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

How to find tutors: search by keyword, browse by subject, or enrich specific profile URLs.

## `searchQuery` (type: `string`):

Subject or keyword to search tutors for, e.g. `python`, `math`, `guitar`, `english`. Used when mode=searchTutors.

## `subjectSlug` (type: `string`):

TeacherOn subject slug for browsing, e.g. `python`, `web_scraping`, `data_science`, `machine_learning`. Used when mode=bySubject.

## `tutorUrls` (type: `array`):

List of tutor profile URLs to enrich, e.g. `https://www.teacheron.com/tutor/9ye0`. Used when mode=byTutorUrls.

## `teachingType` (type: `string`):

Filter tutors by teaching type. `online` = online tutors only, `home` = home tutors only, `both` = all types.

## `minRating` (type: `number`):

Only emit tutors with an average rating at or above this value (0–5). Leave blank to include all.

## `minReviews` (type: `integer`):

Only emit tutors with at least this many reviews. Leave blank to include all.

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

Maximum number of tutor records to emit.

## `useResidentialProxy` (type: `boolean`):

Enable Apify residential proxy (US) if the scraper encounters 403 blocks. Usually not needed — try without first.

## Actor input object example

```json
{
  "mode": "searchTutors",
  "searchQuery": "python",
  "tutorUrls": [],
  "teachingType": "online",
  "maxItems": 5,
  "useResidentialProxy": false
}
```

# Actor output Schema

## `tutors` (type: `string`):

Dataset containing all scraped TeacherOn tutor 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": "searchTutors",
    "searchQuery": "python",
    "tutorUrls": [],
    "teachingType": "online",
    "maxItems": 5,
    "useResidentialProxy": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/teacheron-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": "searchTutors",
    "searchQuery": "python",
    "tutorUrls": [],
    "teachingType": "online",
    "maxItems": 5,
    "useResidentialProxy": False,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/teacheron-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "searchTutors",
  "searchQuery": "python",
  "tutorUrls": [],
  "teachingType": "online",
  "maxItems": 5,
  "useResidentialProxy": false
}' |
apify call crawlerbros/teacheron-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/teacheron-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TeacherOn Tutors Scraper",
        "description": "Scrape TeacherOn.com, a global tutoring marketplace with 200,000+ tutors across 18,000+ subjects. Search by keyword, browse by subject, or enrich profile URLs. Extracts name, subjects, rate, rating, reviews, location, languages, and teaching type.",
        "version": "1.0",
        "x-build-id": "07as5KjlTcNimlQ2G"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~teacheron-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-teacheron-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~teacheron-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-teacheron-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~teacheron-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-teacheron-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "searchTutors",
                            "bySubject",
                            "byTutorUrls"
                        ],
                        "type": "string",
                        "description": "How to find tutors: search by keyword, browse by subject, or enrich specific profile URLs.",
                        "default": "searchTutors"
                    },
                    "searchQuery": {
                        "title": "Search query (mode=searchTutors)",
                        "type": "string",
                        "description": "Subject or keyword to search tutors for, e.g. `python`, `math`, `guitar`, `english`. Used when mode=searchTutors."
                    },
                    "subjectSlug": {
                        "title": "Subject slug (mode=bySubject)",
                        "type": "string",
                        "description": "TeacherOn subject slug for browsing, e.g. `python`, `web_scraping`, `data_science`, `machine_learning`. Used when mode=bySubject."
                    },
                    "tutorUrls": {
                        "title": "Tutor profile URLs (mode=byTutorUrls)",
                        "type": "array",
                        "description": "List of tutor profile URLs to enrich, e.g. `https://www.teacheron.com/tutor/9ye0`. Used when mode=byTutorUrls.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "teachingType": {
                        "title": "Teaching type filter",
                        "enum": [
                            "online",
                            "home",
                            "both"
                        ],
                        "type": "string",
                        "description": "Filter tutors by teaching type. `online` = online tutors only, `home` = home tutors only, `both` = all types.",
                        "default": "online"
                    },
                    "minRating": {
                        "title": "Minimum average rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Only emit tutors with an average rating at or above this value (0–5). Leave blank to include all."
                    },
                    "minReviews": {
                        "title": "Minimum review count",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Only emit tutors with at least this many reviews. Leave blank to include all."
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of tutor records to emit.",
                        "default": 20
                    },
                    "useResidentialProxy": {
                        "title": "Use residential proxy",
                        "type": "boolean",
                        "description": "Enable Apify residential proxy (US) if the scraper encounters 403 blocks. Usually not needed — try without first.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
