# Towbook Scraper (`jungle_synthesizer/towbook-scraper`) Actor

Scrape towing and roadside assistance company profiles from Towbook's public directory (public.towbook.com). Extracts company name, address, city, state, zip, phone, and fax for every listed business.

- **URL**: https://apify.com/jungle\_synthesizer/towbook-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Towbook Towing Company Directory Scraper

Scrape towing and roadside assistance company profiles from [Towbook's public directory](https://public.towbook.com). Returns company name, address, city, state, ZIP, phone, and fax for 390+ listed businesses — which is every tow company on the platform that bothered to set up a public profile.

---

### Towbook Scraper Features

- Extracts company contact details: name, address, phone, fax
- Parses and normalizes addresses into city, state, and ZIP components
- Scrapes 390+ known-good profiles by default, no configuration needed
- Supports direct profile code input for targeting specific companies
- Handles invalid and missing profiles gracefully — no failed requests, no crashes
- Pure HTML scraping with CheerioCrawler — no browser required, no proxies needed
- Runs at 1,700+ requests per minute because Towbook doesn't have anti-bot protection

---

### What Can You Do With Towbook Data?

- **Towing industry analysts** — Build a directory of towing companies by state and region
- **Insurance companies** — Source roadside assistance providers for partner networks
- **Fleet managers** — Find towing services near your routes before you need one, which is always the better time to look
- **CRM builders** — Import structured towing company leads with verified contact info
- **Market researchers** — Map the towing and roadside assistance landscape across the US

---

### How Towbook Scraper Works

1. Choose your mode: use the built-in list of 390+ known-good codes, supply your own profile codes, or enumerate the full base-62 code space for discovery.
2. The scraper hits each Towbook public profile page, parses the HTML, and extracts contact details. Invalid profiles are skipped silently.
3. Results come back as structured JSON with normalized addresses and formatted phone numbers.

---

### Input

```json
{
  "maxItems": 50
}
````

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `codes` | array | — | Specific 4-character Towbook profile codes to scrape (e.g., `BVo2`, `K7w3`). Leave empty to use the built-in known-good list. |
| `maxItems` | integer | `50` | Maximum number of company profiles to return. Set to 0 for unlimited. |
| `windowStart` | integer | `0` | Start index for the known-good codes list. Use with `windowLength` for paginated crawls. |
| `windowLength` | integer | `0` | Number of codes to process from the known-good list. 0 means all codes. |
| `proxyConfiguration` | object | `{useApifyProxy: true}` | Proxy settings. Not required — Towbook has no bot detection. |

#### Scrape Specific Companies

```json
{
  "codes": ["BVo2", "K7w3", "4WLL", "aJqj"],
  "maxItems": 0
}
```

***

### Towbook Scraper Output Fields

```json
{
  "company_name": "Dave's Towing & Recovery",
  "address": "1423 Industrial Blvd",
  "city": "Oklahoma City",
  "state": "OK",
  "zip": "73108",
  "phone": "+14055551234",
  "fax": "+14055555678",
  "url": "https://public.towbook.com/BVo2",
  "code": "BVo2"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `company_name` | string | Business name of the towing company |
| `address` | string | Street address |
| `city` | string | City name |
| `state` | string | US state abbreviation |
| `zip` | string | ZIP / postal code |
| `phone` | string | Contact phone number (E.164 format) |
| `fax` | string | Fax number (E.164 format) |
| `url` | string | Towbook public profile URL |
| `code` | string | 4-character Towbook profile code |

***

### FAQ

#### How do I scrape Towbook?

Towbook Scraper handles the entire process. Set `maxItems`, click Start, and it scrapes every public profile in the directory. No login required, no API key, no proxies.

#### How much does Towbook Scraper cost to run?

Towbook Scraper uses Pay Per Event pricing. The actor start costs $0.10, and each company record costs $0.002. A full run of all 390+ profiles costs roughly $0.88 total.

#### What data can I get from Towbook?

Towbook Scraper returns company name, street address, city, state, ZIP code, phone number, and fax number for every public profile. Addresses are parsed into components and phone numbers are formatted to E.164 standard.

#### Does Towbook Scraper need proxies?

Towbook Scraper works without proxies. The site has no anti-bot protection and serves public profiles over plain HTML. Datacenter proxies are fine if you want to use them, but they're not required.

#### Can I scrape specific Towbook companies?

Towbook Scraper accepts a list of 4-character profile codes in the `codes` input field. If you know the codes for the companies you want, pass them directly and skip the default list.

***

### Need More Features?

Need custom fields, filters, or a different towing directory? [Open an issue](https://console.apify.com/actors/bawv45Ut2r7fBE9uS/issues) or get in touch.

### Why Use Towbook Scraper?

- **Fast** — 1,700+ requests per minute. The full directory scrapes in under 15 seconds.
- **Clean output** — Addresses parsed into components, phone numbers in E.164 format. No cleanup needed.
- **Affordable** — Under $1 for the entire directory. That's less than a gas station coffee, and more useful.

# 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.

## `codes` (type: `array`):

Specific 4-character Towbook profile codes to scrape (e.g., BVo2, K7w3). Leave empty to use the built-in list of known-good codes.

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

Maximum number of company profiles to return. Set to 0 for unlimited.

## `windowStart` (type: `integer`):

Start index for the known-good codes list. Use with windowLength for paginated crawls.

## `windowLength` (type: `integer`):

Number of codes to process from the known-good list. 0 = all codes.

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

Select proxies. Datacenter proxies work — Towbook has no anti-bot protection.

## 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": 50,
  "windowStart": 0,
  "windowLength": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/towbook-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": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/towbook-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": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call jungle_synthesizer/towbook-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Towbook Scraper",
        "description": "Scrape towing and roadside assistance company profiles from Towbook's public directory (public.towbook.com). Extracts company name, address, city, state, zip, phone, and fax for every listed business.",
        "version": "0.1",
        "x-build-id": "GlEocJCkwjDMcg8lc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~towbook-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-towbook-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/jungle_synthesizer~towbook-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-towbook-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/jungle_synthesizer~towbook-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-towbook-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": [
                    "sp_intended_usage",
                    "sp_improvement_suggestions"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "codes": {
                        "title": "Towbook Profile Codes",
                        "type": "array",
                        "description": "Specific 4-character Towbook profile codes to scrape (e.g., BVo2, K7w3). Leave empty to use the built-in list of known-good codes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of company profiles to return. Set to 0 for unlimited.",
                        "default": 50
                    },
                    "windowStart": {
                        "title": "Window Start Index",
                        "type": "integer",
                        "description": "Start index for the known-good codes list. Use with windowLength for paginated crawls.",
                        "default": 0
                    },
                    "windowLength": {
                        "title": "Window Length",
                        "type": "integer",
                        "description": "Number of codes to process from the known-good list. 0 = all codes.",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Select proxies. Datacenter proxies work — Towbook has no anti-bot protection."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
