# NTTS Breakdown Location Scraper (`jungle_synthesizer/ntts-scraper`) Actor

Scrape towing, breakdown, and transportation service locations from nttsbreakdown.com. Searches by ZIP code and service category across the entire US, with automatic reCAPTCHA solving and deduplication.

- **URL**: https://apify.com/jungle\_synthesizer/ntts-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Other
- **Stats:** 8 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#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

## NTTS Breakdown Location Scraper — Towing & Roadside Assistance Directory

Scrape towing, breakdown, and transportation service locations from [nttsbreakdown.com](https://www.nttsbreakdown.com/). This NTTS Breakdown scraper searches the towing company directory by ZIP code and service category across the entire US — by state, by metro, or nationwide — handles reCAPTCHA automatically, and deduplicates results by location ID. Use it to extract roadside assistance and towing service data with contact details and GPS coordinates.

### What it does

The NTTS Breakdown Directory lists verified service providers — towing companies, breakdown assistance, flatbed carriers, and 17 other transportation categories — searchable by ZIP code and distance radius.

This actor:

- Queries the NTTS internal API for each (ZIP code, category) combination
- Solves the reCAPTCHA v2 challenge automatically via CapSolver (token is reused across requests — one solve per session unless the server refreshes it)
- Paginates through all results for each combination
- Deduplicates records by `location_id` across overlapping search areas
- Returns clean, normalized location records

By default, the actor covers the entire US using a curated set of ~84 representative ZIP codes spanning all major metro areas and regions. Full coverage across all 17 categories produces up to ~25,000+ unique locations.

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `maxItems` | integer | No | 100 | Cap on unique records returned. Set to 0 for unlimited. |
| `zipCodes` | array | No | built-in nationwide set | Specific US ZIP codes to query. Leave empty to use the default ~84-ZIP coverage set. |
| `categories` | array | No | all 17 | NTTS category numbers (1–17) to search. Leave empty to search every category. |
| `sp_intended_usage` | string | Yes | — | How you plan to use the data. |
| `sp_improvement_suggestions` | string | Yes | — | Feedback for improving the actor. |

#### Example: single city, two categories

```json
{
  "maxItems": 500,
  "zipCodes": ["10001", "10036", "10019"],
  "categories": [1, 5],
  "sp_intended_usage": "Building a towing services directory for New York City.",
  "sp_improvement_suggestions": "None at this time."
}
```

#### Example: full nationwide crawl

```json
{
  "maxItems": 0,
  "sp_intended_usage": "Market research on US breakdown service coverage.",
  "sp_improvement_suggestions": "None."
}
```

Leave `zipCodes` and `categories` empty to use all defaults. The full crawl covers 84 ZIPs × 17 categories = 1,428 search combinations and may take several hours.

### Output

Each record represents one unique service location.

| Field | Type | Description |
|---|---|---|
| `location_id` | string | Unique location identifier from the NTTS API |
| `name` | string | Business name |
| `address` | string | Street address |
| `city` | string | City |
| `state` | string | US state abbreviation (e.g. `TX`, `NY`) |
| `zip` | string | ZIP / postal code |
| `country` | string | Always `US` |
| `phone` | string | Contact phone number |
| `website` | string | Business website URL |
| `category` | string | NTTS category identifier (e.g. `category_5`) |
| `category_name` | string | Human-readable service category name |
| `latitude` | number | Geographic latitude |
| `longitude` | number | Geographic longitude |
| `distance` | number | Distance from the searched ZIP code (miles) |
| `rating` | number | Customer rating (if available) |
| `review_count` | number | Number of customer reviews |
| `is_dealer` | boolean | Whether the location is a dealer vs. independent provider |
| `source_url` | string | Always `https://www.nttsbreakdown.com/` |

#### Sample record

```json
{
  "location_id": "12345",
  "name": "Acme Towing & Recovery",
  "address": "123 Main St",
  "city": "New York",
  "state": "NY",
  "zip": "10001",
  "country": "US",
  "phone": "212-555-0100",
  "website": "https://acmetowing.example.com",
  "category": "category_1",
  "category_name": "Towing",
  "latitude": 40.7484,
  "longitude": -73.9967,
  "distance": 0.3,
  "rating": 4.2,
  "review_count": 87,
  "is_dealer": false,
  "source_url": "https://www.nttsbreakdown.com/"
}
```

### Pricing

This actor uses Pay-Per-Event pricing:

| Event | Price |
|---|---|
| Actor start | $0.10 per run |
| Record scraped | $0.002 per record |

A run returning 1,000 records costs approximately $2.10 ($0.10 start + 1,000 × $0.002).

### Performance

- **Memory:** 256 MB minimum (2 GB maximum)
- **Concurrency:** 8 search combinations processed in parallel
- **Proxy:** Residential US proxies for TLS fingerprint resilience
- **CAPTCHA:** Solved once per session; token reused across all requests until the server demands a refresh
- **Deduplication:** Results are deduplicated in-memory by `location_id` — locations that appear in multiple ZIP code search areas are only returned once

### Use cases — towing directory & roadside assistance data

- Building a nationwide directory of breakdown and towing services
- Competitive landscape analysis for the roadside assistance market
- Fleet management and logistics — pre-populating vendor contact lists
- Insurance and warranty companies sourcing service network data
- Lead generation for automotive aftermarket suppliers

### FAQ

**How do I scrape towing companies by ZIP code or state?**
Pass the ZIP codes you want into `zipCodes`, or leave it empty for the built-in nationwide set. Each result carries its `state` field, so you can filter towing and roadside assistance providers by state after the run.

**Can I get a list of breakdown and transportation services with phone numbers?**
Yes. Every record includes `name`, `address`, `phone`, and `website` where the NTTS Breakdown directory publishes them.

**Does this pull GPS coordinates for each towing location?**
Each record includes `latitude` and `longitude`, plus `distance` from the searched ZIP code in miles.

### Notes

- The NTTS API requires a valid reCAPTCHA v2 token on every request. This is handled automatically — no manual configuration needed.
- If the captcha solver is slow or fails on the first attempt, the actor retries up to 10 times before aborting.
- Locations near ZIP code boundaries appear in multiple search results. The deduplication step ensures each unique `location_id` is only output once.
- Setting `maxItems: 0` disables the limit and returns all unique locations found. A full nationwide crawl may take 2–6 hours depending on captcha solve times and proxy speed.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

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

Maximum number of unique location records to return. Set to 0 for unlimited (full crawl may take many hours).

## `zipCodes` (type: `array`):

Specific US ZIP codes to search. Leave empty to use the built-in nationwide coverage set (~84 ZIPs).

## `categories` (type: `array`):

NTTS service category numbers to search (1-17). Leave empty to search all 17 categories.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 25,
  "zipCodes": [
    "10001"
  ],
  "categories": [
    "1"
  ]
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 25,
    "zipCodes": [
        "10001"
    ],
    "categories": [
        "1"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/ntts-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 25,
    "zipCodes": ["10001"],
    "categories": ["1"],
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/ntts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 25,
  "zipCodes": [
    "10001"
  ],
  "categories": [
    "1"
  ]
}' |
apify call jungle_synthesizer/ntts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/ntts-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0CzvZ7QeISh6ymcux/builds/55pPySMbnB3KsVybZ/openapi.json
