Superprof Scraper - Tutors, Lessons, Prices & Ratings avatar

Superprof Scraper - Tutors, Lessons, Prices & Ratings

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Superprof Scraper - Tutors, Lessons, Prices & Ratings

Superprof Scraper - Tutors, Lessons, Prices & Ratings

Scrape Superprof tutors by subject and location, or paste tutor URLs. One rich record per tutor: name, photo, price, rating, reviews count, subjects, city, geo, response time, lesson type and more. Filter by price, rating and lesson type.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

9

Total users

1

Monthly active users

16 days ago

Last modified

Security

Limited permissions

Share

Superprof Scraper: Tutors, Prices, Ratings & Lesson Details

Superprof Scraper turns Superprof into a clean tutor data feed. Search by subject and location, or paste results links, and get one structured record per tutor: name, hourly price plus pack rates, average rating and review count, subjects taught, city, lesson format (webcam or face to face), response time, badges and more. A single pasted tutor link returns that tutor's profile-page fields only, since it never comes from a search result. Export to JSON, CSV or Excel, or read results straight through the API.

Why This Scraper?

  • One rich record per tutor covering price, 5h/10h pack rates, rating, review count, badge, response time, lesson format, subjects taught and profile photo.
  • Two ways to find tutors: search by subject and location, or paste tutor pages and results links directly.
  • Filters that actually narrow the search: hourly price, minimum rating, lesson format, webcam availability and free first lesson apply in search mode and to a pasted results link alike.
  • Optional per-tutor enrichment pulls city, subjects taught and the full profile description straight from each tutor's own page, billed only for tutors that are actually returned.
  • Resume a capped or interrupted run with one pasted run id, and the run survives a platform restart automatically with no duplicate tutors and no double charges.
  • Incremental mode for recurring monitoring: schedule the same search and later runs return only new and updated tutors by default (reappeared tutors need an earlier run that completed a full scan with Emit expired tutors on).
  • A refused run fails loudly instead of quietly completing with an empty, billed dataset that looks the same as a genuinely empty search.

Use Cases

  • Tutoring marketplaces and comparison sites: build a searchable directory of tutors with live pricing, ratings and availability.
  • Price and market research: track average hourly rates and pack pricing by subject and city over time.
  • Lead generation for tutoring businesses: find tutors in a subject and location with profile links ready to review.
  • Recurring monitoring: schedule the actor to catch new tutors, price changes and tutors who stop listing.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
id_annonce"10000001"
teacherName"Jane Doe"
title"Personalized math lessons for all levels"
url"https://www.superprof.com/sample-tutor-headline.html"
price / price_1H30 / 30
teacherCity / city"New York" / "New York"
country"US"
lat / lng40.712800 / -74.006000
subjects["Mathematics", "Algebra", "Statistics"]
badge / is_ambassador"Ambassador" / true
stat_stars / stat_count_reviews5 / 120
offer_lesson_first_is_free / offer_lesson_first_lesson_durationtrue / "0hr30"
price_5H / price_10H / price_webcam100 / 200 / 30
webcam / faceToFacetrue / false
responseTimeDesc / response_time_sec"Responds within 1 hour" / 3600
levels["All Levels"]
languages / native_language["English"] / "English"
status"Ambassador"
stat_count_recommendations15
interview / has_interview[{"question": "1) When did you start tutoring?", "answer": "..."}] / true
reviews (up to Reviews per tutor, default 50, max 50; needs profile fetch, no extra charge)[{"author": "Sam", "text": "Great tutor, very patient."}]
gallery["https://example.com/photo.jpg"]
teacherPhoto"https://example.com/photo.jpg"
search_url"https://www.superprof.com/s/mathematics,New-York,,,,.html"

Every record also carries the raw source leaves the fields above summarize (teacherRating, rating_score/rating_count/rating_label, offers, teacherId, key, sex, is_superprof, is_verified_member, has_valid_diploma, has_video/video, experience, teaching, venue_can_move/venue_can_receive, searchMode, sourceUrl, scrapedAt and more) so nothing the source exposes is lost. subjects, country, pack rates (price_5H, price_10H, price_webcam), levels, languages, native_language, experience, teaching, interview/has_interview, stat_count_recommendations and the review list are filled from the tutor's own profile page and are only present when Fetch full tutor profiles is on (it is, by default); city, gallery and status fall back to search-result values when it's off. A single pasted tutor link always reads the profile page regardless of that toggle, but returns only profile-page fields; the search-result-only fields (name, rating, badge, response time, webcam/in-person flags) are empty for a pasted tutor link, since it never comes from a search result. contact_label is read from the contact button on the tutor page. contact_url is the tutor's "contact this tutor" link taken from the search result, so it is filled for tutors found by a search and empty for a single pasted tutor link. A few other contact/CV fields (emails, cv, department, creation_date) are always present on the record shape but are not exposed on the pages we read, so they read as empty on every run. In incremental mode, records also carry changeType, changedFields, firstSeenAt and lastSeenAt; an EXPIRED row repeats the tutor's last known field values with changeType set to "EXPIRED".

How to Use

  1. Pick a mode: search (by subject and location) or url (paste tutor or results links).
  2. In search mode, list one or more subjects and locations; in url mode, paste the links. Set the price, rating, lesson-format, webcam and free-first-lesson filters you want; they apply in both modes, except to a single pasted tutor page.
  3. Set Max items (and, if you want a page-count safety net, Max pages) to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search a subject in a location:

{
"mode": "search",
"subjects": ["Mathematics"],
"locations": ["New York"],
"maxItems": 20
}

Filtered search for online lessons:

{
"mode": "search",
"subjects": ["Guitar"],
"locations": ["London"],
"lessonType": "online",
"minRating": 4,
"maxPrice": 40,
"onlyFirstLessonFree": true,
"maxItems": 50
}

Scrape specific URLs:

{
"mode": "url",
"urls": [
"https://www.superprof.com/s/mathematics,United-States,,,,.html",
"https://www.superprof.com/sample-tutor-headline.html"
],
"fetchDetails": true
}

Monitor a search on a schedule and get only what changed:

{
"mode": "search",
"subjects": ["Mathematics"],
"locations": ["New York"],
"incrementalMode": true,
"emitExpired": true,
"maxItems": 0
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/superprof-tutor-scraper").call(run_input={
"mode": "search", "subjects": ["Mathematics"], "locations": ["New York"], "maxItems": 20
})
for tutor in client.dataset(run["defaultDatasetId"]).iterate_items():
print(tutor["teacherName"], tutor["price"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/superprof-tutor-scraper').call({
mode: 'search', subjects: ['Mathematics'], locations: ['New York'], maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How Max items and Max pages shape a run

Max items is the single overall cap on tutors collected across the whole run (0 means unlimited); when several subjects and locations are combined, the cap is split evenly across each subject/location pair so one search cannot use up the whole budget before the others start. Max pages is a separate, optional safety ceiling on how many result pages a single search walks; it never caps the number of tutors returned, only how far one search is allowed to page before stopping.

Resume and recurring updates

Two different features, both optional:

  • Resume (resumeFromRunId): continue ONE specific interrupted or capped run. Paste a previous run id or dataset id and this run returns only tutors it did not already collect. The run also checkpoints its own progress automatically, so a platform restart resumes it without any input from you, with no duplicate tutors and no double charges.

  • Incremental mode (incrementalMode): for scheduling this actor again and again against the SAME search or URL set. The actor remembers its own state; no run id to paste. Every tutor is classified:

    • NEW: never tracked before.
    • UPDATED: a comparable field changed since last time; changedFields names exactly which.
    • UNCHANGED: nothing changed. Suppressed and not billed by default; turn on Emit unchanged tutors to also get (and be billed for) these rows.
    • REAPPEARED: was marked EXPIRED in a previous run and is back.
    • EXPIRED: was tracked before and is no longer found. Only ever produced after a run that proved a complete, uncapped scan of the tracked search or URL set, with no Resume used; if Max items or Max pages cut the run short, or Resume seeded it, expiry detection is skipped for that run and last run's state is kept as is. Off by default; turn on Emit expired tutors to also get (and be billed for) these rows.

    What is compared: every output field of the tutor (price, rating, availability flags, profile text, subjects, gallery, reviews). What is excluded: scrapedAt, distance (depends on the proxy location) and resultTier (the search's own ranking), plus any field names you list in Ignore fields when detecting changes; excluded fields stay in the output and only stop triggering UPDATED. Whole numbers compare equal whether written 25 or 25.0.

    By default (both toggles off) a recurring run returns only NEW and UPDATED tutors. REAPPEARED only appears once an earlier run had Emit expired tutors on and completed a full, uncapped, non-resumed scan and marked a tutor EXPIRED. State is scoped automatically to the search/URL and filter combination you use; State key lets you name a campaign explicitly, or deliberately share state across differently configured runs.

Send results into your apps (MCP connectors)

Connect one or more MCP servers to push the scraped tutors straight into your tools after a run finishes. Set mcpConnectors to the servers you want (Notion, Linear, Airtable, Apify). For Notion, also set notionParentPageUrl to the page under which a results database is created, and use maxNotifyListings to cap how many tutors are sent. The export is a side channel: it never changes or blocks the dataset output.

  1. Authorize a connector once under Apify > Settings > Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Export to your apps (MCP)" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where records should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modeselectsearchsearch for subject/location searches, url to scrape pasted URLs.
subjectsarrayno default (prefill: ["Mathematics"])Subjects to search, e.g. "Mathematics", "Guitar". Search mode only.
locationsarrayno default (prefill: ["United States"])Places to search, e.g. "New York". Empty means country-wide. Search mode only.
urlsarraya country results URL, a city results URL, an Online results URL and one tutor page URLTutor page URLs or results URLs on www.superprof.com. URL mode only. If you leave the field out entirely, these four sample URLs are scraped (previously nothing was); pass an empty list to scrape nothing. Other Superprof country sites and other hosts are skipped with a warning.
lessonTypeselectanyRestrict to any, online or face_to_face. Applies in search mode and to a pasted results URL; does not narrow a single pasted tutor page.
minPriceintegerno defaultOnly tutors charging at least this much per hour.
maxPriceintegerno defaultOnly tutors charging at most this much per hour.
minRatingintegerno defaultOnly tutors with an average rating at or above this value (1 to 5).
onlyWebcambooleanfalseOnly tutors who offer lessons by webcam.
onlyFirstLessonFreebooleanfalseOnly tutors who offer a free first lesson.
sortByselectrelevanceResult order: relevance or distance.
fetchDetailsbooleantrueAdds city, subjects taught and the full description from the tutor's own profile page.
reviewLimitinteger50Written reviews returned per tutor (needs fetchDetails). Values above 50 are lowered to 50; 0 returns none. In incremental mode a non-default limit is tracked as its own baseline (its own state key), so changing it does not report unchanged tutors as updated; the default of 50 keeps your existing baseline.
maxPagesinteger0Safety ceiling on result pages per search. 0 is unlimited; does not cap items.
maxItemsinteger20Maximum tutors collected across the whole run. 0 is unlimited.
resumeFromRunIdstringno defaultPaste a previous run id (or its dataset id) to continue that run: tutors already collected there are skipped.
incrementalModebooleanfalseTurn on for recurring/scheduled monitoring of the same search or URL set.
stateKeystringno defaultOptional. Name a monitoring campaign, or deliberately share state across differently configured runs.
emitUnchangedbooleanfalseIncremental mode only. Also return (and bill) tutors unchanged since the last run.
emitExpiredbooleanfalseIncremental mode only. Also return (and bill) tutors no longer found, after a complete scan.
ignoreFieldsForChangesarray[]Incremental mode only. Top-level field names to leave out of change detection, on top of the built-in exclusions.
proxyobject{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}Connection settings.
mcpConnectorsarrayno defaultOptional MCP servers (Notion, Linear, Airtable, Apify) to receive the results.
notionParentPageUrlstringno defaultOptional Notion page URL under which a results database is created.
maxNotifyListingsintegerno defaultOptional cap on how many tutors are pushed to the connected apps.

In the Console dataset you can switch between four views: Overview, Detail, Reviews and Changes (the incremental status and changed fields).

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"id_annonce": "10000001",
"teacherName": "Jane Doe",
"title": "Personalized math lessons for all levels",
"url": "https://www.superprof.com/sample-tutor-headline.html",
"landing_url": "https://www.superprof.com/s/mathematics,United-States,,,,.html",
"teacherPhoto": "https://example.com/photo.jpg",
"price": 30,
"price_1H": 30,
"prices": { "hourly": 30, "firstHour": 30, "currency_hint": null },
"teacherCity": "New York",
"city": "New York",
"country": "US",
"lat": 40.7128,
"lng": -74.006,
"subjects": ["Mathematics", "Algebra", "Statistics"],
"subjects_raw": ["Mathematics", "Algebra", "Statistics"],
"badge": "Ambassador",
"is_ambassador": true,
"is_available": true,
"search_url": "https://www.superprof.com/s/mathematics,New-York,,,,.html",
"sex": "female",
"is_superprof": true,
"is_verified_member": true,
"stat_count_reviews": 120,
"stat_stars": 5,
"response_time_sec": 3600,
"offer_lesson_first_is_free": true,
"offer_lesson_first_lesson_duration": "0hr30",
"stat_count_recommendations": 15,
"status": "Ambassador",
"price_5H": 100,
"price_10H": 200,
"price_webcam": 30,
"price_with_travel": null,
"offers": [
{ "type": "hourly", "price": 30 },
{ "type": "pack_5h", "price": 100 },
{ "type": "pack_10h", "price": 200 },
{ "type": "webcam", "price": 30 }
],
"levels": ["All Levels"],
"has_all_levels": true,
"native_language": "English",
"languages": ["English"],
"experience": "Sample tutor bio placeholder.",
"teaching": "Sample lesson approach placeholder.",
"explications": "Sample lesson approach placeholder.",
"interview": [{ "question": "1) When did you start tutoring?", "answer": "Sample answer placeholder." }],
"has_interview": true,
"video": null,
"has_video": false,
"gallery": ["https://example.com/photo.jpg"],
"reviews": [{ "author": "Sam", "text": "Great tutor, very patient." }],
"has_valid_diploma": true,
"venue_can_move": false,
"venue_can_receive": false,
"venue_can_receive_individually": false,
"venue_can_receive_several_students": false,
"venue_max_distance": null,
"creation_date": null,
"update_date": "2026-02-23T09:41:38Z",
"contact_label": "Contact",
"contact_url": null,
"emails": [],
"cv": null,
"department": null,
"teacherId": "20000001",
"key": "a1b2c3d4",
"webcam": true,
"faceToFace": false,
"responseTimeDesc": "Responds within 1 hour",
"description": "Sample tutor bio placeholder.",
"searchMode": "search",
"sourceUrl": "https://www.superprof.com/sample-tutor-headline.html",
"scrapedAt": "2026-01-01T00:00:00+00:00"
}

Plan Requirement

Superprof protects its pages with two different walls: a datacenter connection meets an AWS WAF "Human Verification" captcha, and a residential connection meets a DataDome interstitial. Neither connection type gets through on its own, so the actor clears the check internally and then reads the pages. There is nothing for you to configure, but a run is not guaranteed to succeed, and pages can still be refused in waves.

  • Keep the default Residential proxy group. If you select a non-residential proxy group, the run logs a boxed warning that the selected group may be refused by some pages and that you can try another proxy group in the Proxy configuration input.
  • If the Apify residential connection is refused (free plans do not include residential proxies), the run logs a boxed warning, continues on a backup connection, and says so in the log when that backup serves data. Some pages may still be unavailable.
  • If every connection is refused, the run fails with a message that your plan does not include proxy access. If residential was unavailable and the backup could not load the pages, it fails saying so. Any other run that loads no page fails with "Could not load any results page", so a failed connection is never mistaken for an empty search. A pasted tutor link that cannot be loaded is skipped with a warning and is neither returned nor billed; if no page at all loads, the run fails.

FAQ

How much does it cost?

You pay per tutor record returned, plus a small per-run start fee, with the per-tutor profile enrichment (the detail-enrichment event, one unit per tutor) billed only when it is switched on and a tutor is actually returned. It is charged as each tutor record is saved, so an interrupted run is billed only for the tutors already delivered. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.

This actor collects only publicly available tutor listing data. You are responsible for how you use it: follow Superprof's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Contact details and personal profile content may be subject to additional privacy obligations in your jurisdiction.

Can I get only new or changed tutors on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated tutors, and unchanged ones are not billed unless you opt in. Reappeared and expired tutors only appear once an earlier run had Emit expired tutors on and completed a full scan.

Why do minPrice, maxPrice and the other filters apply even in URL mode?

A pasted results URL is re-queried through the same search feed as search mode, so every filter you set (price, rating, lesson format, webcam, free first lesson) is sent along with it and narrows the results exactly as it would in search mode. The one exception is a single pasted tutor page: it always returns that one tutor, unfiltered.

Why did my run fail instead of returning an empty dataset?

If the connection is refused before any page can be read, or every request during the run is rejected with nothing getting through, the run stops with a clear error message instead of completing with zero tutors, so "nothing matched" is never confused with "nothing could be read". A genuinely empty search (the connection worked, but no tutors matched) still succeeds normally with an empty dataset and a status message explaining why.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

πŸ”— Want more jobs data?

Pair this actor with these related scrapers from the same team:

🏷️ Kijiji.ca Scraper
Scrape Kijiji.ca listings across property, vehicles, jobs, electronics, furniture...
🏷️ FINN.no Jobs Scraper
Scrape active FINN.no job listings by search filters or URL. Extract 30+ fields including...
πŸ›’ Flippa Scraper
Scrape Flippa listings with full enrichment, including revenue, profit, valuation...
πŸ’Ό Cwjobs UK
Scrape tech and IT jobs from CWJobs.co.uk into clean, structured data. Search by keyword...
πŸ“‡ ThomasNet Scraper
Scrape ThomasNet suppliers and manufacturers by keyword, category, location...
πŸ›’ ProductReview.com.au Scraper
Scrape ProductReview.com.au products, businesses and customer reviews. Search by...

πŸ‘‰ Browse all abotapi scrapers

πŸ’¬ Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • πŸ› οΈ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.