# YourMechanic Scraper - Mobile Mechanic Profiles & Leads (`scrapersdelight/yourmechanic-scraper`) Actor

Scrape US mobile-mechanic profiles from YourMechanic by city: name, years of experience, state licence id, employment type, home city and full service-area list, rating, review count, star breakdown, badges, spoken languages, bio and photo. No login.

- **URL**: https://apify.com/scrapersdelight/yourmechanic-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Automation, Lead generation, Business
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.50 / 1,000 per mechanic returneds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## 🔧 YourMechanic Scraper — Mobile Mechanic Profiles, Ratings & Service Areas

**Export the US mobile-mechanic network from YourMechanic — name, years of experience, state licence ID, home city, full service-area list, rating, review breakdown, badges, languages and bio.**

> 🕒 Last updated: 2026-07-29 · 📊 25+ fields per mechanic · 🇺🇸 3,000+ US cities · 🚫 No login or API key · ⚡ Plain HTTP, fast & cheap · ♻️ Cross-city dedupe (never billed twice for the same mechanic)

YourMechanic is the largest **mobile** (comes-to-you) auto-repair network in the US. This actor turns its public mechanic profiles into a flat, ready-to-use dataset: pick cities — or leave it empty and it crawls **every city on YourMechanic's own city index (3,243 of them)** — and get one clean JSON record per mechanic.

Because one mechanic serves many neighbouring cities, the actor **dedupes globally on the mechanic's canonical `/pro/<slug>` id**: the same technician is fetched once, returned once, and charged once, no matter how many city pages list him.

***

### 📊 What you get — 25+ fields per mechanic

| Field | Example |
|---|---|
| 🆔 `slug` / `profile_url` | `tinashe` / `https://www.yourmechanic.com/pro/tinashe` |
| 👤 `first_name` / `display_name` / `last_initial` | `Tinashe` / `Tinashe K` / `K` |
| 🏷️ `business_name` | `Tinashe's Auto Repair` |
| 🛠️ `years_experience` | `18` |
| 📍 `city` / `state` / `location` | `Atlanta` / `GA` / `Atlanta, GA` |
| 🏠 `home_city` / `home_city_slug` | `Canton` / `canton-ga` |
| 🗺️ `service_area_cities` | `[{ "name": "Roswell, GA", "slug": "roswell-ga", "url": "…" }, …]` |
| 📄 `license_id` | `ARD304699` *(California ARD registration — CA mechanics only)* |
| 💼 `employment_type` | `Independent Contractor` |
| ⭐ `rating` / `review_count` | `4.5` / `1220` |
| 📈 `rating_breakdown` | `{ "5_star": 1172, "4_star": 22, "3_star": 5, "2_star": 5, "1_star": 16 }` |
| 💬 `review_tags` | `[{ "tag": "Professional", "count": 1129 }, …]` |
| 🏅 `badges` | `["ASE Certified", "Master Technician", "Highly Rated"]` |
| ✅ `background_checked` | `true` |
| 🗣️ `languages` | `["Español", "English"]` |
| 📝 `about` | mechanic-written bio |
| 🖼️ `photo_url` | headshot image URL |
| 🔗 `booking_url` | `https://www.yourmechanic.com/book?mechanic=tinashe` |
| 🔍 `meta_title` / `meta_description` | the profile's SEO copy |
| 🏙️ `source_city_slug` / ⏱️ `scraped_at` | which city page it was found on / run timestamp |

> ⚠️ **Honest coverage note (measured on 30 live profiles, 5 cities):** name, years of experience, city/state, home city, employment type, rating, review count, star breakdown, badges, languages and photo come back **100%**. `about` is **~85–93%** (some mechanics genuinely leave the bio blank), `service_area_cities` **~90–97%** (a few profiles render the area as a map only), and `license_id` appears **only for California mechanics** (~30% of a CA sample, 0% outside CA) — it is the state ARD registration, not a nationwide field. **YourMechanic does not publish mechanic phone numbers or emails**, so this actor does not return them and does not guess them.

***

### 🎯 Who it's for

- 🚗 **Mobile-mechanic and auto-repair startups** — map the incumbent network city by city before you enter a market.
- 🧑‍🔧 **Recruiters & fleet-service operators** — find experienced, ASE-certified, background-checked technicians by metro, years of experience and rating.
- 📊 **Competitive & market analysts** — technician density, tenure, rating distribution and service-area footprints across 3,000+ US cities.
- 🛠️ **Auto-parts, tooling, insurance and warranty vendors** — size and segment the independent-technician channel.
- 🔍 **Local SEO / directory builders** — structured, citable profile data with the exact city slugs YourMechanic ranks for.

***

### ▶️ How to use it

1. Click **Try for free**.
2. Enter one or more **Cities** as YourMechanic city slugs — e.g. `atlanta-ga`, `chicago-il`, `los-angeles-ca`. Leave empty to crawl **every city** on the index.
3. *(Optional)* set a **State filter** (`ga`, `tx`, …) to keep the crawl to one or more states.
4. Set **Max mechanics** and click **Start**. Export from the **Dataset** tab (JSON, CSV, Excel, Google Sheets) or via API.

#### Input

| Field | What it does |
|---|---|
| `cities` | City slugs (`atlanta-ga`, `chicago-il`). Empty = every city on YourMechanic's city index. |
| `states` | Two-letter state codes to filter the city list (`ga`, `tx`). |
| `startUrls` | Paste specific `/city/<slug>` or `/pro/<slug>` URLs. |
| `maxMechanics` | Stop after this many **unique** mechanics (`0` = no limit). |
| `proxyConfiguration` | Apify auto (datacenter) proxy by default; falls back to direct, then residential. |
| `requestConcurrency` | Parallel profile requests (1–10, default 5). |

```json
{
  "cities": ["atlanta-ga", "chicago-il", "los-angeles-ca"],
  "maxMechanics": 100
}
```

One whole state:

```json
{ "states": ["ga"], "maxMechanics": 500 }
```

#### Output — sample mechanic record

```json
{
  "slug": "tinashe",
  "profile_url": "https://www.yourmechanic.com/pro/tinashe",
  "booking_url": "https://www.yourmechanic.com/book?mechanic=tinashe",
  "first_name": "Tinashe",
  "display_name": "Tinashe K",
  "last_initial": "K",
  "business_name": "Tinashe's Auto Repair",
  "years_experience": 18,
  "location": "Atlanta, GA",
  "city": "Atlanta",
  "state": "GA",
  "home_city": "Canton",
  "home_city_slug": "canton-ga",
  "employment_type": "Independent Contractor",
  "license_id": null,
  "about": "I have been servicing vehicles full-time for over 10 years…",
  "rating": 4.5,
  "review_count": 1220,
  "rating_breakdown": { "5_star": 1172, "4_star": 22, "3_star": 5, "2_star": 5, "1_star": 16 },
  "badges": ["Highly Rated"],
  "background_checked": true,
  "languages": ["English"],
  "review_tags": [{ "tag": "Professional", "count": 1129 }, { "tag": "Friendly", "count": 1070 }],
  "service_area_cities": [{ "name": "Roswell, GA", "slug": "roswell-ga", "url": "https://www.yourmechanic.com/city/roswell-ga" }],
  "photo_url": "https://res.cloudinary.com/yourmechanic/image/upload/…",
  "source_city_slug": "atlanta-ga",
  "scraped_at": "2026-07-29T00:00:00.000Z"
}
```

***

### ⚙️ How it works & limits

- **Source:** YourMechanic's public city pages (`/city/<slug>`) and mechanic profiles (`/pro/<slug>`), read over plain HTTP — no browser, no login, no API key. Every field is parsed with **structural CSS selectors** (the profile header, the schema.org `aggregateRating` block, the star-breakdown rows, the sidebar boxes), never by a loose regex over the page.
- **Sanity-checked numbers:** in validation the star breakdown summed **exactly** to `review_count` on 30/30 profiles, and the reviews-tab count matched `review_count` on 30/30.
- **~10 mechanics per city page.** That is what YourMechanic lists per city; there is no "next page". Coverage comes from breadth (3,243 cities), and neighbouring cities overlap heavily — expect far fewer unique mechanics than `cities × 10`.
- **Some city pages list 0 mechanics** (e.g. Boston at the time of writing). That is a real site condition, not a scrape failure; the actor logs it and moves on.
- **Individual review texts are not returned** — YourMechanic renders them client-side from an API. You get the aggregate rating, the full star breakdown and the trait tags with counts.
- **No emails or phone numbers** are published on these profiles, so none are returned.
- **Fails loudly:** if the frontier returns nothing parseable, the run errors instead of finishing with an empty dataset.

***

### ❓ FAQ

**Is this legal?** The actor reads publicly available profile pages that YourMechanic publishes and Google indexes. You are responsible for complying with YourMechanic's Terms of Service. These records describe individual tradespeople, so handling that personal data lawfully (GDPR/CCPA, marketing consent, CAN-SPAM/TCPA where applicable) is your responsibility.

**Does it return phone numbers or emails?** No — YourMechanic does not publish them on mechanic profiles. Every field here comes from the public profile page; nothing is guessed or enriched.

**Can I scrape the whole US?** Yes — leave `cities` and `states` empty and it discovers every city slug from YourMechanic's own city index, then walks them. Use `maxMechanics` to cap cost.

**Will I be charged twice for a mechanic who serves five cities?** No. Dedupe is global on the `/pro/<slug>` id, before the profile is fetched.

**What is `license_id`?** California's Automotive Repair Dealer (ARD) registration number, shown only on CA mechanic profiles. It is `null` elsewhere.

**Can I export to Excel or Google Sheets?** Yes — the dataset exports to JSON, CSV, Excel or Google Sheets, or pull it via API.

**How much does it cost?** Pay-per-result — you pay per unique mechanic returned. A single-city run stays tiny, and it's free to try.

### Notes & fair use

You are responsible for complying with YourMechanic's Terms of Service. This actor reads publicly available mechanic directory pages. The output contains personal data about individuals; using it lawfully is your responsibility.

# Actor input Schema

## `cities` (type: `array`):

YourMechanic city slugs, e.g. 'atlanta-ga', 'chicago-il', 'los-angeles-ca'. Leave empty to crawl every city on the YourMechanic city index (3,000+). Each city page lists up to 10 mechanics; mechanics that serve several cities are returned only once.

## `states` (type: `array`):

Two-letter state codes, e.g. 'ga', 'tx'. Keeps only cities in those states — handy when you leave 'Cities' empty and want one state instead of the whole US.

## `startUrls` (type: `array`):

Paste specific YourMechanic URLs: city pages (https://www.yourmechanic.com/city/atlanta-ga) or mechanic profiles (https://www.yourmechanic.com/pro/tinashe).

## `maxMechanics` (type: `integer`):

Stop after this many unique mechanics (0 = no limit). Duplicates across cities are not counted or charged.

## `proxyConfiguration` (type: `object`):

Proxy settings. Apify auto (datacenter) proxy works fine — YourMechanic serves the full page to datacenter IPs. The actor falls back to a direct connection and then to residential if a request fails.

## `requestConcurrency` (type: `integer`):

Max parallel profile requests. Higher = faster; keep modest to respect the site.

## Actor input object example

```json
{
  "cities": [
    "atlanta-ga",
    "chicago-il",
    "los-angeles-ca"
  ],
  "states": [],
  "startUrls": [],
  "maxMechanics": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestConcurrency": 5
}
```

# Actor output Schema

## `records` (type: `string`):

The dataset of scraped YourMechanic mobile mechanics (one item per mechanic).

# 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 = {
    "cities": [
        "atlanta-ga",
        "chicago-il",
        "los-angeles-ca"
    ],
    "states": [],
    "startUrls": [],
    "maxMechanics": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/yourmechanic-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 = {
    "cities": [
        "atlanta-ga",
        "chicago-il",
        "los-angeles-ca",
    ],
    "states": [],
    "startUrls": [],
    "maxMechanics": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/yourmechanic-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 '{
  "cities": [
    "atlanta-ga",
    "chicago-il",
    "los-angeles-ca"
  ],
  "states": [],
  "startUrls": [],
  "maxMechanics": 10
}' |
apify call scrapersdelight/yourmechanic-scraper --silent --output-dataset

```

## MCP server setup

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