# Angi Phone Number Scraper (`solid-scraper/angi-phone-number-scraper`) Actor

📞 Angi Phone Number Scraper instantly extracts verified business contacts from Angi listings. Save time on prospecting and outreach with fast, targeted results—ideal for sales teams, agencies, and lead generation. 🚀

- **URL**: https://apify.com/solid-scraper/angi-phone-number-scraper.md
- **Developed by:** [SolidScraper](https://apify.com/solid-scraper) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### Angi Phone Number Scraper 🔍

**Angi Phone Number Scraper** is a focused data extraction tool that helps you collect phone numbers from Angi profiles, bios, and post content using your chosen keywords and a targeted country dial code. Whether you’re searching for an **Angi lead scraper**, an **Angi contact info scraper**, or an **Angi business phone numbers scraper**, this actor streamlines discovery by using keyword + country targeting—so you can build outreach lists faster and save hours of manual research.

***

### Why choose Angi Phone Number Scraper?

| Feature | Benefit |
|---|---|
| ✅ **All-in-one contact extraction** | Pulls phone numbers from Angi bios, profiles, and post content in one run |
| ✅ **Keyword + country targeting** | Uses your keywords and a country dial code to focus results on the right region |
| ✅ **Reliability with resilience** | Includes retries and fallbacks for resilience when pages don’t return results as expected |
| ✅ **Structured dataset output** | Saves results with consistent fields like `url`, `phone_number`, `country`, and `dial_code` |
| ✅ **Bulk scraping with limits** | Supports larger extraction jobs and stops after `maxPhoneNumbers` are found |
| ✅ **Incremental saving** | Pushes each found record to the dataset as it’s discovered |

***

### Key features

- 📌 **Angi phone number discovery**: Extracts phone numbers from Angi bios, profiles, and post content
- 🎯 **Keyword-driven targeting**: Uses your provided `keywords` to find relevant Angi contacts faster (including variations like *Angi lead scraper* and *Angi contact scraper tool*)
- 🌍 **Country dial code filtering**: Targets phone numbers for the selected country (useful for *Angi business phone numbers scraper* workflows)
- 🧰 **Max limit control**: Stops automatically after it finds the number of phone numbers you set in `maxPhoneNumbers`
- 🛡️ **Resilient scraping behavior**: Includes retries and stops on sustained no-result conditions to keep runs productive
- 💾 **Real-time dataset saving**: Each phone number record is pushed incrementally to the dataset
- 🔁 **Resume-friendly progress**: Persists progress in a key-value store so runs can resume from where they left off
- 🔗 **Source URL included**: Every extracted record includes the profile/page `url` for verification and auditing

***

### Input

Provide input via an `input.json` file. Example structure:

```json
{
  "keywords": ["marketing", "founder"],
  "location": "London",
  "country": "United Kingdom (+44)",
  "maxPhoneNumbers": 20
}
```

#### Input Fields

| Field | Required | Description |
|---|---:|---|
| `keywords` | ✅ | A list of keywords used to target relevant Angi bios/profiles/posts (for example, “marketing” or “founder”). |
| `location` | ❌ | Optional location filter (example: “London”, “California”). Leave it empty for a global search. |
| `country` | ✅ | Select the country whose phone numbers you want to target (includes a country + dial code like “United Kingdom (+44)”). |
| `maxPhoneNumbers` | ❌ | Stop scraping after this many phone numbers are found. Higher values can extend runtime. |

***

### Output

After execution, the actor saves each extracted contact’s data in JSON format into the dataset **“Scraped Phone Numbers”**.

Example output record (dataset row pushed by the actor):

```json
{
  "platform": "Angi",
  "keyword": "marketing",
  "title": "No title",
  "description": "No data",
  "url": "No URL",
  "phone_number": "+447700900123",
  "country": "United Kingdom",
  "dial_code": "+44"
}
```

#### Output Fields

| Field | Type | Description |
|---|---|---|
| `platform` | string | The source platform name (set to `Angi`). |
| `keyword` | string | The keyword that was used during extraction for this result. |
| `title` | string | The title associated with the matched result (may be missing and fall back to a default string). |
| `description` | string | Text content associated with the matched result (used as the basis for finding phone numbers). |
| `url` | string | The source URL for the matched Angi listing/profile/post. |
| `phone_number` | string | The extracted phone number in international (E.164) format. |
| `country` | string | The target country (derived from the selected country option). |
| `dial_code` | string | The dial code associated with the target country option. |
| `error_message` | ❌ | Not present in the pushed dataset schema. The actor does not include an `error_message` field in pushed records. |

You can export your dataset to common formats like **JSON** (and typically CSV via Apify’s dataset export UI).

***

### How to use Angi Phone Number Scraper (via Apify Console)

1. **Open Apify Console**\
   Go to [console.apify.com](https://console.apify.com) and sign in.

2. **Find the actor page**\
   Search for **Angi Phone Number Scraper** and open the actor detail page.

3. **Go to the Input section**\
   In the **INPUT** tab, fill in values for `keywords`, `location` (optional), `country`, and optionally `maxPhoneNumbers`.

4. **Set your targeting**\
   Choose the `country` (e.g. “United Kingdom (+44)”) and add relevant `keywords` for your *Angi lead scraper* use case (e.g. contractor roles, specialties, or business descriptors).

5. **Run the actor**\
   Click **Run**. The actor will push results incrementally to the dataset while it searches.

6. **Monitor progress in logs**\
   Watch the run logs for progress and stopping conditions. If results are fewer than expected, the actor suggests trying broader keywords or different country settings.

7. **Open the output dataset**\
   After completion, open the dataset named **“Scraped Phone Numbers”** and review the table view.

8. **Export results**\
   Export from the dataset UI to your preferred format for CRM, outreach lists, or analysis.

No coding required — get accurate results in minutes with this **Angi contact info scraper**.

***

### Advanced features & SEO optimization

- 🧠 **Engineered for Angi prospecting**: Designed specifically for **Angi phone number scraper** and **Angi contact scraper tool** workflows where you need phone numbers tied to Angi profiles and listings.
- 🔄 **Resume and progress persistence**: Maintains a saved progress state so long runs can continue without starting from scratch.
- ⏳ **Timeout-aware operations**: Uses a default run timeout (mentioned in the input description) suitable for large batches; you can adjust via **Run Options**.
- 🔍 **Improves targeting with keyword + country**: Uses your keywords and a country dial code to help *Angi business contact scraper* projects stay focused on the right region.
- 🧾 **Structured output for downstream use**: Every result row includes `url`, `phone_number`, `country`, and `dial_code`, making it straightforward to merge into lead pipelines or research datasets.

***

### Best use cases

- 📈 **Marketing team: build outreach lists faster**: Extract Angi business phone numbers for campaigns filtered by country and keyword intent to reduce manual searching time.
- 🏗️ **Contractor lead generation: find phone-first contacts**: Use as an **Angi contractor phone number scraper** to compile contractor and service business contacts from publicly available Angi pages.
- 🧑‍💼 **Sales research: validate availability and region fit**: Collect phone numbers with consistent country/dial codes for region-specific lead qualification.
- 🔎 **Lead sourcing for agencies: keyword-based discovery**: Run an **Angi lead scraper** workflow with multiple keywords to cover different service niches.
- 🧾 **Data analysis: create structured datasets**: Turn **Angi data extraction tool** outputs into a clean table (`url`, `phone_number`, `keyword`) for analysis or reporting.
- 🤝 **CRM enrichment: automate contact ingestion**: Feed extracted records into CRM pipelines as a reusable contact dataset foundation.
- 🌍 **International prospecting: control the dial code**: Use country targeting to help you find phone numbers aligned to your target market, useful for **Angi business phone numbers scraper** operations.

***

### Technical specifications

- **Supported Input Formats**
  - ✅ `keywords` as an array
  - ✅ `location` as a string (optional)
  - ✅ `country` as one of the provided country + dial code options
  - ✅ `maxPhoneNumbers` as an integer (1–10000)

- **Proxy Support**
  - ✅ Built-in proxy support for reliable scraping
  - ✅ Includes resilience behavior when results are missing or scraping conditions change

- **Retry Mechanism**
  - ✅ Includes retries and fallbacks for resilience during extraction

- **Dataset Structure**
  - ✅ Dataset: **“Scraped Phone Numbers”**
  - ✅ Fields pushed per record: `keyword`, `title`, `description`, `url`, `phone_number`, `country`, `dial_code` (plus `platform` in pushed rows)

- **Rate Limits & Performance**
  - ✅ Designed for scraping tasks that can take time; you can adjust runtime via **Run Options** (timeout described in input text)
  - ✅ Stops when `maxPhoneNumbers` is reached (if provided)

- **Limitations**
  - ❌ Results depend on publicly available phone numbers present in Angi bios/profiles/post content
  - ❌ If fewer than expected are found, you’ll likely need broader keywords or different country settings (as suggested by the actor logs)

***

### FAQ

#### Does Angi Phone Number Scraper only pull phone numbers?

✅ Yes. The actor focuses on extracting phone numbers from Angi bios, profiles, and post content, and it saves each result with the associated `url`, `country`, and `dial_code` for verification.

#### What fields will I get in the dataset?

The dataset includes fields pushed for each discovered phone number, including `keyword`, `title`, `description`, `url`, `phone_number`, `country`, and `dial_code` (and the pushed row also sets `platform` to `Angi`).

#### How do I target a specific region?

You select the `country` in the input (for example, “United Kingdom (+44)”). Optionally, you can also provide a `location` string to narrow the search scope further.

#### Can I limit how many phone numbers the actor finds?

Yes. Use `maxPhoneNumbers` to stop scraping after the actor finds that many phone numbers. This is helpful for controlled lead generation runs.

#### Will it take a long time for large batches?

Large scraping tasks may take time. The actor’s input description notes a default timeout (and that you can adjust timeout in **Run Options**) to match your workload.

#### Can I resume a run if it stops early?

Yes. The actor saves progress in a key-value store and resumes based on saved cursor state and previously seen phone numbers.

#### Is this the right tool for “Angi lead scraper” and “Angi contact info scraper” tasks?

✅ Yes. The actor is specifically oriented toward building contact datasets (phone numbers) from Angi pages, using keyword and country targeting—making it a strong fit for **Angi lead scraper** and **Angi contact info scraper** use cases.

***

### Support & feature requests

If you’re using **Angi Phone Number Scraper** and want improvements, enhancements, or troubleshooting help, tell us what you need.

- 💡 **Feature Requests**: Ideas like better export formatting, additional filtering options, or expanding how results are structured are welcome.
- 📧 **Contact**: Email <dataforleads@gmail.com>.

Your feedback helps shape the roadmap for this Angi contact scraper tool.

***

*Ready to scale your Angi phone number finder workflow? **Angi Phone Number Scraper** is the most comprehensive, SEO-optimized way to collect structured Angi business contact phone numbers at speed.*

***

### Disclaimer

**This tool only accesses publicly accessible sources.** It does not access private profiles, authenticated content, or password-protected pages. Legal compliance (including GDPR/CCPA, spam regulations, and each platform’s terms) is your responsibility.

If you need to request data removal, contact <dataforleads@gmail.com>. Please use Angi Phone Number Scraper responsibly, ethically, and for legitimate purposes only.

# Actor input Schema

## `keywords` (type: `array`):

Enter keywords to search for (e.g., 'Target Keyword').

## `location` (type: `string`):

Filter by location (e.g., 'London', 'California'). Leave empty for global search.

## `country` (type: `string`):

Select the country to target for phone numbers.

## `maxPhoneNumbers` (type: `integer`):

Stop scraping after this many phone numbers are found. Setting a higher limit extends the scraping duration.

## Actor input object example

```json
{
  "keywords": [
    "marketing",
    "founder"
  ],
  "country": "United Kingdom (+44)",
  "maxPhoneNumbers": 20
}
```

# 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 = {
    "keywords": [
        "marketing",
        "founder"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("solid-scraper/angi-phone-number-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 = { "keywords": [
        "marketing",
        "founder",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("solid-scraper/angi-phone-number-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 '{
  "keywords": [
    "marketing",
    "founder"
  ]
}' |
apify call solid-scraper/angi-phone-number-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solid-scraper/angi-phone-number-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/PmyiF4BmnFCiFTc1L/builds/BR53DyslhYogUASZe/openapi.json
