# AI Valley Scraper (`bitdoze/ai-valley-scraper`) Actor

Scrape AI tool data (names, categories, descriptions, images, URLs) from the AI Valley directory of 1,700+ AI tools.

- **URL**: https://apify.com/bitdoze/ai-valley-scraper.md
- **Developed by:** [Dragos Mihai Balota](https://apify.com/bitdoze) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

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

### What does AI Valley Scraper do?

**AI Valley Scraper** extracts structured data from [AI Valley](https://aivalley.ai/), a curated directory of **1,700+ AI tools** across dozens of categories. It pulls **tool names, categories, descriptions, images, and URLs** for every tool listed, and returns the results as a clean, structured dataset.

AI Valley is one of the most comprehensive AI tool directories on the web, covering categories like AI assistants, code tools, design, data analysis, chatbots, content creation, and more. The site uses WordPress with server-rendered HTML, so this Actor uses **Cheerio** (HTTP-based parsing) for maximum speed and low run cost.

You get all the benefits of the Apify platform: API access, scheduling, proxy rotation, monitoring, and one-click exports to JSON, CSV, Excel, and more.

### Why use AI Valley Scraper?

- **Market intelligence**: Track the AI tools landscape - new launches, categories, and trends.
- **Competitor research**: Monitor which AI tools are gaining traction in your category.
- **Lead generation**: Build lists of AI tool companies for outreach, partnerships, or investment research.
- **Content creation**: Curate AI tool roundups, newsletters, or comparison articles.
- **SEO & directories**: Build your own AI tool directory with structured, up-to-date data.

### How to use AI Valley Scraper

1. Click **Try for free** or **Try Actor** on the Apify Store.
2. In the **Input** tab, optionally add category URLs or category slugs to filter (e.g., `design`, `code-assistant`). Leave empty to scrape all tools.
3. Set **Max items total** to limit results, or leave at 0 for all tools.
4. Click **Start** and wait for the run to finish.
5. Open the **Output** tab to view, filter, and export your dataset.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `startUrls` | Array of URLs | No | AI Valley category or listing URLs to start from. Defaults to all AI tools. |
| `categories` | Array of strings | No | Category slugs to scrape (e.g., `design`, `chatbots`). |
| `maxItems` | Integer | No | Maximum total tools to collect. `0` = no limit. |
| `maxRequestsPerCrawl` | Integer | No | Maximum pages to crawl. Default: 50. |
| `scrapeDetails` | Boolean | No | Visit each tool's detail page for pricing and full description (slower). |

#### Example input

```json
{
    "startUrls": [
        { "url": "https://aivalley.ai/category/aitools/" }
    ],
    "maxItems": 0,
    "maxRequestsPerCrawl": 50
}
````

### Output

Each result is an AI tool object. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
[
    {
        "toolName": "Tables",
        "category": "data-analyst",
        "toolUrl": "https://aivalley.ai/tables/",
        "imageUrl": "https://aivalley.ai/wp-content/uploads/2024/12/Screenshot-2024-12-07.png",
        "excerpt": "Instantly transform unstructured data into actionable tables",
        "pricingModel": null,
        "scrapedAt": "2026-07-07T14:07:00.000Z"
    }
]
```

#### Output fields

| Field | Description |
|-------|-------------|
| `toolName` | Name of the AI tool. |
| `category` | AI Valley category slug (e.g., `design`, `code-assistant`). |
| `toolUrl` | AI Valley page URL for the tool. |
| `imageUrl` | Tool thumbnail/screenshot image URL. |
| `excerpt` | Short description from the listing. |
| `pricingModel` | Pricing model if available (`free`, `freemium`, `paid`). |
| `price` | Numeric price if available. |
| `currency` | Currency code if price is available. |
| `scrapedAt` | ISO timestamp of when the item was collected. |

### Pricing / Cost estimation

This Actor uses lightweight HTTP parsing (no browser), so runs are very inexpensive. Scraping all 1,700+ tools across 18+ pages completes in under a minute. You only pay for the Apify platform usage, and you can try it for free with the platform's trial credits.

### Tips

- **Filter by category**: Pass category slugs in the `categories` field to only scrape specific tool types.
- **Limit results**: Use `maxItems` to cap collection and keep costs predictable.
- **Bulk scraping**: The default settings scrape all AI tools. Increase `maxRequestsPerCrawl` to scrape more pages.

### FAQ, disclaimers, and support

- **Is this legal?** This Actor only reads publicly available directory pages. You are responsible for complying with AI Valley's Terms of Service and applicable laws when using the data.
- **Does it need login or API keys?** No. It scrapes public HTML.
- **How often is the data updated?** AI Valley adds new tools regularly. Schedule periodic runs to keep your dataset fresh.
- **Need a custom solution?** Open an issue on the Actor's **Issues** tab for feedback or custom requests.

### Getting started (local development)

```bash
npm install
npm test        # runs unit + integration tests
npm run build   # compiles TypeScript
apify run       # run locally with simulated Apify environment
```

### Deploy to Apify

```bash
apify login    # provide your Apify API token
apify push     # build & deploy the Actor to the Apify platform
```

# Actor input Schema

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

AI Valley category or listing URLs to start scraping from. Leave empty to scrape all AI tools.

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

AI Valley category slugs to scrape (e.g., 'design', 'code-assistant', 'chatbots'). Leave empty to scrape all tools.

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

Maximum total tools to collect across all pages. 0 = no limit.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of pages the crawler may load.

## `scrapeDetails` (type: `boolean`):

If true, visit each tool's detail page for pricing and full description (slower).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://aivalley.ai/category/aitools/"
    }
  ],
  "categories": [],
  "maxItems": 0,
  "maxRequestsPerCrawl": 50,
  "scrapeDetails": false
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://aivalley.ai/category/aitools/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bitdoze/ai-valley-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 = { "startUrls": [{ "url": "https://aivalley.ai/category/aitools/" }] }

# Run the Actor and wait for it to finish
run = client.actor("bitdoze/ai-valley-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 '{
  "startUrls": [
    {
      "url": "https://aivalley.ai/category/aitools/"
    }
  ]
}' |
apify call bitdoze/ai-valley-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AI Valley Scraper",
        "description": "Scrape AI tool data (names, categories, descriptions, images, URLs) from the AI Valley directory of 1,700+ AI tools.",
        "version": "0.0",
        "x-build-id": "TlyjFp1EA0yvU5Mg6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bitdoze~ai-valley-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bitdoze-ai-valley-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/bitdoze~ai-valley-scraper/runs": {
            "post": {
                "operationId": "runs-sync-bitdoze-ai-valley-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/bitdoze~ai-valley-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-bitdoze-ai-valley-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",
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "AI Valley category or listing URLs to start scraping from. Leave empty to scrape all AI tools.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "AI Valley category slugs to scrape (e.g., 'design', 'code-assistant', 'chatbots'). Leave empty to scrape all tools.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items total",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum total tools to collect across all pages. 0 = no limit.",
                        "default": 0
                    },
                    "maxRequestsPerCrawl": {
                        "title": "Max Requests per Crawl",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of pages the crawler may load.",
                        "default": 50
                    },
                    "scrapeDetails": {
                        "title": "Scrape tool detail pages",
                        "type": "boolean",
                        "description": "If true, visit each tool's detail page for pricing and full description (slower).",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
