# Superprof Scraper (`memo23/superprof-scraper`) Actor

Scrape tutor listings from Superprof across 17 country sites — tutor name, subject, price, rating, photo, city, distance, webcam/face-to-face flags, response time, verified status. Uses the mobile app's JSON API through Apify Unblocker to bypass DataDome. Search by subject and/or location. JSON/CSV.

- **URL**: https://apify.com/memo23/superprof-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.90 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Superprof Scraper — Tutors, Prices, Ratings & Contact Links

Extract structured tutor listings from **Superprof** across 17 country sites. Give the actor a subject (and optionally a location) and it returns one clean row per tutor: name, subject headline, hourly price, star rating and review count, city, verified badge, webcam/face-to-face availability, response time, photo and the tutor's own profile URL.

### Why use this Superprof Scraper

Superprof sits entirely behind **DataDome**, a commercial anti-bot that 403s datacenter and residential IPs alike — so a plain HTTP scraper returns nothing. This actor reads Superprof's own mobile-app JSON API through **Apify Unblocker**, the one path that clears DataDome's fingerprint check. No browser automation, no CAPTCHA solving, no cookies to manage — a subject keyword is enough.

- One row per tutor, analyst-ready — no padding rows.
- Real star rating **and** review count per tutor (not just a badge).
- Verified status, webcam vs face-to-face, response time, first-lesson-free flag.
- Works across all 17 Superprof country sites from one input.
- Search by subject, by location (lat/lng + radius), or both.

### Supported inputs

| You provide | Example |
|---|---|
| A subject keyword | `maths` · `guitar` · `english` |
| A country site | `fr` · `co.uk` · `com` · `de` · `es` … (17 total) |
| A location (optional) | `latitude` + `longitude` + `distance` (km) |
| Price / webcam filters (optional) | `minPrice`, `maxPrice`, `webcamOnly` |

### Use cases

- Build a tutor-supply and pricing dataset for a subject or a city.
- Benchmark hourly rates across subjects, cities and countries.
- Track how many verified, highly-rated tutors compete in a market.
- Feed tutor inventory into a marketplace, search or comparison product.
- Generate outreach lists of high-rated tutors by subject and location.

### How it works

1. You supply a subject and a country site (optionally a lat/lng + radius).
2. The actor queries Superprof's mobile API through Apify Unblocker, which clears DataDome.
3. It reads the result count, then pages through the listings (18 tutors per page).
4. Each tutor is normalized and written to the dataset as one clean row.

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `countrySite` | string | `fr` | Superprof country TLD (`fr`, `co.uk`, `com`, `de`, `es`, `it`, `be`, `ch`, `ca`, `com.au`, `com.br`, `mx`, `pt`, `ie`, `lu`, `at`, `co.nz`). |
| `subject` | string | — | Subject to search (e.g. `maths`, `guitar`). Empty = all subjects at the location. |
| `latitude` / `longitude` | number | — | Search center. Together with `distance`, filters tutors near a point. |
| `distance` | number | `200` | Search radius in km from the lat/lng center. Ignored without a location. |
| `orderBy` | string | `pertinence_DESC` | Sort: `pertinence_DESC`, `price_ASC`, `price_DESC`, `rating_DESC`, `distance_ASC`. |
| `minPrice` / `maxPrice` | integer | — | Hourly price filters, in the site's local currency. |
| `webcamOnly` | boolean | `false` | Only tutors offering webcam (online) lessons. |
| `maxItems` | integer | `100` | Maximum tutors to output. |
| `maxPages` | integer | `0` | Max result pages (0 = until `maxItems` or end of results). |
| `proxy` | object | Unblocker | Proxy override. Defaults to Apify Unblocker, which is required to clear DataDome. |

### Output overview

One dataset item per tutor. Example (real, trimmed) for a maths tutor in Paris:

```json
{
  "id_annonce": "115890",
  "teacherName": "Chris",
  "subject": "Devenez Fort - Apprenez avec le plus Fort en Maths de Superprof | HIT THE NEXT LEVEL",
  "title": "Devenez Fort - Apprenez avec le plus Fort en Maths de Superprof | HIT THE NEXT LEVEL",
  "price": "117",
  "price_ci": "58",
  "price_html": "117€<sup>/h</sup>",
  "currency": "€",
  "teacherRating": 5,
  "reviewCount": 643,
  "ratingLabel": "643 évaluations",
  "teacherCity": "Paris 16e",
  "teacherPhoto": "https://c.superprof.com/i/a/…/600/…/maths.jpg",
  "url": "https://www.superprof.fr/devenez-fort-apprenez-fort-maths-superprof-hit-the-next-level.html",
  "firstHourFree": true,
  "is_credit_impot": false,
  "verified": true,
  "faceToFace": true,
  "webcam": true,
  "responseTime": 1,
  "responseTimeDesc": "Répond en 1 heure",
  "badge": "Ambassador",
  "senior": false,
  "countrySite": "fr",
  "scrapedAt": "2026-09-28T10:00:00.000Z"
}
```

### Key output fields

| Field | Description |
|---|---|
| `id_annonce` | Superprof listing (announcement) ID. |
| `teacherName` | Tutor display name. |
| `subject`, `title` | The listing headline (Superprof uses one line for both). |
| `price`, `price_ci`, `price_html`, `currency` | Hourly price, tax-credit-adjusted price (FR), formatted string, and currency. |
| `teacherRating`, `reviewCount`, `ratingLabel` | Average star rating, number of reviews, and the site's own rating label. |
| `teacherCity` | Tutor city. |
| `teacherPhoto` | Main profile photo URL. |
| `url` | Full tutor profile URL on the country site. |
| `firstHourFree`, `is_credit_impot` | First lesson free, and tax-credit eligibility (FR). |
| `verified`, `badge`, `senior` | Verified-profile flag, badge label (e.g. Ambassador), senior flag. |
| `faceToFace`, `webcam` | In-person and online-lesson availability. |
| `responseTime`, `responseTimeDesc` | Response time and its human label. |
| `countrySite`, `scrapedAt` | Country site scraped and the capture timestamp. |

### FAQ

**Do I need a Superprof account or cookies?** No. The actor reads the public mobile-search API.

**Why does it need Apify Unblocker?** Superprof runs DataDome. Datacenter and residential proxies get 403'd; Unblocker clears the fingerprint check. It's the default proxy — you don't need to configure anything.

**Which countries are supported?** All 17 Superprof sites — set `countrySite` to the TLD (`fr`, `co.uk`, `com`, `de`, `es`, `it`, `be`, `ch`, `ca`, `com.au`, `com.br`, `mx`, `pt`, `ie`, `lu`, `at`, `co.nz`).

**Can I search a specific city?** Yes — pass `latitude`, `longitude` and a `distance` radius. Without a location the search is country-wide.

**How does pagination work?** The actor reads the total result count and pages through it (18 tutors per page) up to your `maxItems`.

### Support

Found a bug or need a field added? Open an issue on the actor's Issues tab and it will be addressed.

### ⚠️ Disclaimer

This actor collects only publicly available tutor-listing information from Superprof. It does not access private or personal account data and it does not bypass authentication. Use the data in compliance with Superprof's terms and all applicable laws, including data-protection regulations where you operate. You are responsible for how you use the output.

### SEO keywords

Superprof scraper, Superprof API, scrape Superprof, Superprof tutors, tutor listings scraper, private tutor data, tutoring marketplace data, tutor prices, tutor ratings, Superprof France, Superprof UK, DataDome bypass, tutor lead generation, online tutoring data, language tutor scraper, music teacher scraper.

# Actor input Schema

## `countrySite` (type: `string`):

Superprof country TLD to scrape. One of: fr, co.uk, com, de, es, it, be, ch, ca, com.au, com.br, mx, pt, ie, lu, at, co.nz. Defaults to fr (largest catalog).

## `subject` (type: `string`):

Subject to search for (free text, e.g. 'mathematiques', 'english', 'guitar'). Leave empty to scrape all subjects at the given location.

## `latitude` (type: `number`):

Latitude of the search center. Combined with longitude, filters tutors within `distance` km. If omitted, the search is country-wide (no geo filter).

## `longitude` (type: `number`):

Longitude of the search center. Combined with latitude.

## `distance` (type: `number`):

Search radius in kilometers from the lat/lng center. Default 200 (the app's own default). Ignored when no lat/lng is provided.

## `maxPages` (type: `integer`):

Maximum number of result pages to fetch (18 tutors per page). 0 = no limit (scrape until maxItems or end of results). Default 0.

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

Maximum number of tutor listings to output. Default 100.

## `orderBy` (type: `string`):

Result ordering. pertinence\_DESC is the app default.

## `minPrice` (type: `integer`):

Minimum hourly price filter (in the site's local currency).

## `maxPrice` (type: `integer`):

Maximum hourly price filter (in the site's local currency).

## `webcamOnly` (type: `boolean`):

If true, return only tutors offering webcam (online) lessons.

## `proxy` (type: `object`):

Proxy settings. Defaults to Apify Unblocker (groups-UNBLOCKER), which is required to bypass DataDome. Residential and datacenter proxies get 403'd. Override only if you know what you're doing.

## Actor input object example

```json
{
  "countrySite": "fr",
  "distance": 200,
  "maxPages": 0,
  "maxItems": 100,
  "orderBy": "pertinence_DESC",
  "webcamOnly": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/superprof-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("memo23/superprof-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 '{}' |
apify call memo23/superprof-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/superprof-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/jh5c22QcRmnv0TQjI/builds/MFOr15GkOUvRvg0nR/openapi.json
