{
  "openapi": "3.0.1",
  "info": {
    "title": "Superprof Scraper $1💰 Tutors, Lessons, Prices & Ratings",
    "description": "From $1/1K. 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.",
    "version": "1.0",
    "x-build-id": "erF7eScC7sjs9UaUR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~superprof-tutor-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-superprof-tutor-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/abotapi~superprof-tutor-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-superprof-tutor-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/abotapi~superprof-tutor-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-superprof-tutor-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": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Choose how to find tutors. 'search' runs subject and location searches with filters. 'url' scrapes the tutor pages or results URLs you paste.",
            "default": "search"
          },
          "subjects": {
            "title": "Subjects",
            "type": "array",
            "description": "One or more subjects to search, e.g. 'Mathematics', 'Guitar', 'Spanish'. Each subject is searched independently against each location.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "One or more places to search, e.g. 'New York', 'London', 'United States'. Leave empty for a country-wide search. Each location is paired with each subject.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Tutor or results URLs",
            "type": "array",
            "description": "Multi-URL mode: paste Superprof tutor page URLs (e.g. https://www.superprof.com/some-tutor-headline.html) or results URLs. The fields in the Filters and sort section still apply to a pasted results URL; a pasted tutor page returns that one tutor. A results URL collects across its available pages up to Max items.",
            "items": {
              "type": "string"
            }
          },
          "lessonType": {
            "title": "Lesson type",
            "enum": [
              "any",
              "online",
              "face_to_face"
            ],
            "type": "string",
            "description": "Restrict to a lesson format. Applies in BOTH search mode and URL mode: a pasted results URL is re-queried through the same search feed, so the filter is sent with it. It does not narrow a pasted tutor page, which returns that one tutor.",
            "default": "any"
          },
          "minPrice": {
            "title": "Min hourly price",
            "minimum": 0,
            "type": "integer",
            "description": "Only return tutors charging at least this much per hour (in the local currency of the search location). Applies in BOTH search mode and URL mode: a pasted results URL is re-queried through the same search feed, so the filter is sent with it. It does not narrow a pasted tutor page, which returns that one tutor."
          },
          "maxPrice": {
            "title": "Max hourly price",
            "minimum": 0,
            "type": "integer",
            "description": "Only return tutors charging at most this much per hour. Applies in BOTH search mode and URL mode: a pasted results URL is re-queried through the same search feed, so the filter is sent with it. It does not narrow a pasted tutor page, which returns that one tutor."
          },
          "minRating": {
            "title": "Min rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Only return tutors with an average rating at or above this value (1 to 5). Applies in BOTH search mode and URL mode: a pasted results URL is re-queried through the same search feed, so the filter is sent with it. It does not narrow a pasted tutor page, which returns that one tutor."
          },
          "onlyWebcam": {
            "title": "Webcam tutors only",
            "type": "boolean",
            "description": "When on, only tutors who offer lessons by webcam are returned. Applies in BOTH search mode and URL mode: a pasted results URL is re-queried through the same search feed, so the filter is sent with it. It does not narrow a pasted tutor page, which returns that one tutor.",
            "default": false
          },
          "onlyFirstLessonFree": {
            "title": "First lesson free only",
            "type": "boolean",
            "description": "When on, only tutors who offer a free first lesson are returned. Applies in BOTH search mode and URL mode: a pasted results URL is re-queried through the same search feed, so the filter is sent with it. It does not narrow a pasted tutor page, which returns that one tutor.",
            "default": false
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "distance"
            ],
            "type": "string",
            "description": "Order of the results returned by the search. Applies in BOTH search mode and URL mode: a pasted results URL is re-queried through the same search feed, so the filter is sent with it. It does not narrow a pasted tutor page, which returns that one tutor.",
            "default": "relevance"
          },
          "fetchDetails": {
            "title": "Fetch full tutor profiles",
            "type": "boolean",
            "description": "When on, each tutor is enriched from its profile page with city, subjects taught and the full description. When off, only the rich results fields are returned (no per-tutor fetch).",
            "default": true
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Safety ceiling on how many result pages to walk per search. Empty or 0 (default) means unlimited -- the walk continues until the source's own page count is reached. This does NOT cap the number of items; use Max items for that.",
            "default": 0
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of tutors to collect across the whole run. The single overall limit. Set 0 for unlimited.",
            "default": 20
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Optional. Paste a previous run id (or its dataset id) to continue that run: tutors already collected there are skipped, so this run returns only new tutors (a delta). For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching tutors as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED tutors. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those tutors returned (and billed). State is kept separately for each search/URL and filter setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and filter settings -- different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged tutors (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return tutors that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired tutors (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return tutors that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search or URL set -- not when Max items or Max pages capped it, or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Connection settings. The default enables Apify Proxy and works on every plan; leaving it as is gives the most reliable results.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "mcpConnectors": {
            "title": "Export to your apps (MCP)",
            "type": "array",
            "description": "Optional. Connect MCP servers (Notion, Linear, Airtable, Apify) to push the scraped tutors straight into your tools after the run."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page URL",
            "type": "string",
            "description": "Optional. When a Notion MCP connector is set, the URL of the Notion page under which a results database is created."
          },
          "maxNotifyListings": {
            "title": "Max items to export",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Cap on how many tutors are pushed to the connected MCP apps."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}