{
  "openapi": "3.0.1",
  "info": {
    "title": "TaskRabbit Scraper - Taskers, Rates, Ratings & Availability",
    "description": "Scrape TaskRabbit taskers by US city and service. Extract hourly rates, ratings, reviews, completed tasks, elite status, and availability. Track NEW, UPDATED, REAPPEARED, and EXPIRED taskers with incremental runs, resume, and MCP export.",
    "version": "0.1",
    "x-build-id": "T6zVdWCOK9QGBB758"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~taskrabbit-tasker-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-taskrabbit-tasker-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~taskrabbit-tasker-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-taskrabbit-tasker-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~taskrabbit-tasker-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-taskrabbit-tasker-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": "Search finds taskers for your cities and service categories. URL mode reads one or more taskers by id or profile link.",
            "default": "search"
          },
          "locations": {
            "title": "Cities",
            "type": "array",
            "description": "Where to look: one entry per city. US city names like New York, Portland, OR or Austin, Texas. Names are matched to the source's own city pages automatically.",
            "default": [
              "Portland, OR"
            ],
            "items": {
              "type": "string"
            }
          },
          "services": {
            "title": "Services",
            "type": "array",
            "description": "Search mode: service categories such as furniture assembly, TV mounting, moving, house cleaning, handyman or lawn mowing. Friendly names and source slugs both work.",
            "default": [
              "furniture assembly",
              "tv mounting"
            ],
            "items": {
              "type": "string"
            }
          },
          "profileInputs": {
            "title": "Tasker links, ids or city links",
            "type": "array",
            "description": "URL mode: numeric tasker ids, tasker API or profile links (by id or by name slug), tasker review-page links, /locations city or city + service links, the locations index, or the city sitemap. City, index and sitemap links expand into the city's popular services and read them until Max items. Unsupported links are logged as warnings and skipped. Left untouched, it scrapes one example per link shape.",
            "default": [
              "https://www.taskrabbit.com/api/v3/rabbits/1883135",
              "https://www.taskrabbit.com/api/v3/rabbits/1883135/reviews?page=2",
              "https://www.taskrabbit.com/profile/glenn-w--3",
              "https://www.taskrabbit.com/locations/portland",
              "https://www.taskrabbit.com/locations/portland/lawn-mowing",
              "https://www.taskrabbit.com/locations",
              "https://www.taskrabbit.com/sitemaps/www.taskrabbit.com/geo_marketing_pages.xml.gz"
            ],
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Tasker links or ids (alias)",
            "type": "array",
            "description": "Alias for Tasker links, ids or city links; accepts the same link shapes.",
            "default": [
              "https://www.taskrabbit.com/api/v3/rabbits/1883135",
              "https://www.taskrabbit.com/api/v3/rabbits/1883135/reviews?page=2",
              "https://www.taskrabbit.com/profile/glenn-w--3",
              "https://www.taskrabbit.com/locations/portland",
              "https://www.taskrabbit.com/locations/portland/lawn-mowing",
              "https://www.taskrabbit.com/locations",
              "https://www.taskrabbit.com/sitemaps/www.taskrabbit.com/geo_marketing_pages.xml.gz"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many records (0 = no limit; the run then stops when taskers or reviews run out). Tasker, review, city review, service FAQ and EXPIRED records all share this one budget, and each tasker's reviews are read right after that tasker, so with reviews on a small Max items returns fewer taskers (lower Max reviews per tasker to get more taskers). Tasker records are marked kind=tasker, reviews kind=review, city testimonials kind=city_review.",
            "default": 20
          },
          "includeProfiles": {
            "title": "Fetch full tasker profiles (rates and availability)",
            "type": "boolean",
            "description": "On by default. Search mode then reads each tasker's public profile for hourly rates, categories, hours worked, availability and review stats. Turn off for a lighter card-only pull (no rates).",
            "default": true
          },
          "includeReviews": {
            "title": "Also fetch tasker reviews",
            "type": "boolean",
            "description": "Off by default. Emits one review record per public review, kind=review, up to Max reviews per tasker. Review rows share the Max items budget. Works wherever the tasker record is emitted.",
            "default": false
          },
          "maxReviewsPerTasker": {
            "title": "Max reviews per tasker",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Bound on review rows fetched per tasker when Also fetch tasker reviews is on. Hard cap per tasker (maximum 100); the source serves reviews 10 per page.",
            "default": 20
          },
          "includeCityReviews": {
            "title": "Also return city service reviews (search mode)",
            "type": "boolean",
            "description": "Off by default. Also emits the recent service testimonials the source shows on each city page, kind=city_review. These rows share the Max items budget.",
            "default": false
          },
          "scrapeServiceInfo": {
            "title": "Also return service info (FAQ answers)",
            "type": "boolean",
            "description": "Off by default. Also emits one record per city and service page with its frequently asked questions and answers, kind=service_info. Each record counts toward Max items and is a normal result record.",
            "default": false
          },
          "maxTaskersPerPage": {
            "title": "Max taskers per city page",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Take at most this many featured taskers from each city and service page (1-20, default 6). The source currently features 6 taskers per page, so values above 6 return the same 6.",
            "default": 6
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy settings. Works on every proxy plan; requests go through connection pools with automatic exit rotation."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning items already collected there."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns every matching record as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search, filter and lookup setup; use State key to name or deliberately share a monitoring campaign.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search and filter settings."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. This returns, and bills, extra rows. Only produced once a run has fully scanned the tracked search.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Output field names that should NOT make a tasker count as UPDATED. Always ignored: imageUrl, avatarUrl, ratingDistribution and categories.inDemand (rotating image addresses, a breakdown derived from the review count, and a live demand flag; reviewsCount and totalReviewCount still catch new reviews). Add fields such as bio or description here if changes to them are not relevant to you. Use a dotted path (for example categories.hourlyRateDisplay) to ignore a field inside a nested list. Ignored fields are still returned in the output.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output.",
            "items": {
              "type": "string"
            }
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}