# Toolify AI Directory Scraper (`automation-lab/toolify-ai-directory-scraper`) Actor

📊 Export public Toolify AI catalog records, rankings, websites, pricing, ratings, saves, and feature data for market intelligence, lead lists, and scheduled monitoring.

- **URL**: https://apify.com/automation-lab/toolify-ai-directory-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business, Lead generation, AI
- **Stats:** 2 total users, 1 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Toolify AI Directory Scraper

Export public AI tool listings from [Toolify.ai](https://www.toolify.ai) into clean JSON, CSV, Excel, or API-ready dataset records.

Use category pages, Toolify ranking lists, or category keywords. The Actor returns one normalized row per unique AI tool with its name, profile, website, categories, popularity signals, pricing, and source position when those fields are visible.

- 🔎 Discover AI products in a niche
- 📈 Snapshot new, most-saved, or most-used rankings
- 🧭 Map categories for market research
- 💼 Build SaaS prospect and partner lists
- ⏱️ Schedule recurring competitor-monitoring runs

No Toolify account is required for public catalog data.

### What does Toolify AI Directory Scraper do?

Toolify AI Directory Scraper turns Toolify catalog pages into structured data.

It accepts three source types in the same run:

1. Toolify category, ranking, or tool URLs
2. Ranking modes such as `new` and `most_used`
3. Category keywords such as `web scraping`

The Actor follows pagination, stops at your global `maxItems` limit, and deduplicates records by Toolify handle.

Category pages can expose rich expansion data without opening every tool profile. This keeps requests and runtime low while still collecting pricing plans, features, use cases, and descriptions when available.

### Who is this Toolify scraper for?

#### AI market researchers

Export a category to compare entrants, positioning, pricing, ratings, and save signals.

#### SaaS founders and product teams

Monitor newly listed or most-used tools to spot competitors, partnership targets, and changing category leaders.

#### Directory and newsletter operators

Create a structured source list for editorial research, curation, and scheduled updates.

#### Lead-generation teams

Collect official product websites and category context before downstream company or contact enrichment.

#### Investors and analysts

Capture repeatable ranking snapshots with timestamps for trend analysis.

### Why use this AI tools directory scraper?

- **HTTP-first:** no browser is launched for pages that already expose server-rendered data.
- **Global deduplication:** mixed inputs do not create duplicate rows for the same Toolify handle.
- **Ranking context:** every row retains its source type, position, and source URL.
- **Optional enrichment:** disable rich page details for smaller listing-only exports.
- **Bounded crawling:** `maxItems` and `maxPagesPerSource` prevent accidental oversized runs.
- **Strict scope:** explicit URLs must point to supported public `toolify.ai` catalog paths.
- **Honest output:** omitted source values are not replaced with invented nulls or estimates.
- **Export anywhere:** use Apify datasets, integrations, API clients, webhooks, or MCP.

### What Toolify data can I extract?

| Field | Type | Meaning |
|---|---|---|
| `name` | string | AI tool or product name |
| `handle` | string | Canonical Toolify handle |
| `tagline` | string | Short listing description |
| `description` | string | Longer summary when exposed |
| `toolifyUrl` | URL | Canonical Toolify profile |
| `websiteUrl` | URL | Official outbound website |
| `imageUrl` | URL | Listing image when available |
| `categories` | string[] | Human-readable categories |
| `categoryHandles` | string[] | Toolify category identifiers |
| `rating` | number | Visible Toolify rating |
| `reviewCount` | number | Visible review count |
| `savedCount` | number | Visible save/bookmark count |
| `isFree` | boolean | Whether the listing is marked free |
| `pricingPlans` | string[] | Visible plan, price, and description text |
| `features` | string[] | Core features exposed by Toolify |
| `useCases` | string[] | Toolify use-case labels |
| `faqs` | string[] | Visible question and answer pairs |
| `listType` | string | Category-keyword, category, or ranking context |
| `rank` | number | Position in the fetched source page |
| `sourceUrl` | URL | Input page that produced the row |
| `searchQuery` | string | Keyword used to resolve a Toolify category |
| `scrapedAt` | date | ISO 8601 extraction timestamp |

Fields appear only when Toolify exposes them on the selected public page.

### How to scrape Toolify in 5 steps

1. Open the Actor input page.
2. Add a Toolify category URL, choose ranking lists, or enter category keywords.
3. Set a small `maxItems` value for the first run.
4. Enable details if you need pricing, features, use cases, or FAQs.
5. Click **Start** and export the dataset from the run.

The prefilled category input is suitable for a quick first test.

### Input parameters

#### Toolify URLs (`startUrls`)

Accepts public Toolify category, ranking, and tool pages.

Example:

```json
{
  "startUrls": [
    { "url": "https://www.toolify.ai/category/ai-web-scraping" }
  ],
  "maxItems": 20
}
````

URLs on other hostnames fail closed instead of being crawled.

#### Category keywords (`searchQueries`)

Add one or more Toolify category phrases. The Actor normalizes each phrase to Toolify's public category URL, for example `web scraping` becomes `/category/ai-web-scraping`.

```json
{
  "searchQueries": ["web scraping"],
  "maxItems": 50
}
```

Use an explicit category URL if Toolify's handle differs from the normalized phrase.

#### Ranking lists (`listModes`)

Supported values:

- `new` — recently listed AI tools
- `most_saved` — tools with the strongest save signal
- `most_used` — tools ranked by Toolify usage

#### Limits and details

- `maxItems`: global unique-tool limit, default 20
- `maxPagesPerSource`: pagination safety cap, default 10
- `includeDetails`: retain rich expansion fields, default true
- `proxyConfiguration`: optional Apify Proxy settings, disabled by default

### Example: category market map

```json
{
  "startUrls": [
    { "url": "https://www.toolify.ai/category/ai-web-scraping" }
  ],
  "maxItems": 100,
  "includeDetails": true,
  "maxPagesPerSource": 5
}
```

Use this workflow to compare products in one established category.

### Example: scheduled ranking monitor

```json
{
  "listModes": ["new", "most_used"],
  "maxItems": 100,
  "includeDetails": false,
  "maxPagesPerSource": 3
}
```

Schedule the task daily or weekly. Store each dataset or send it to your database to compare positions over time.

### Output example

```json
{
  "name": "Apify",
  "handle": "apify",
  "tagline": "Apify is a full-stack platform for web scraping, data extraction, and automation.",
  "toolifyUrl": "https://www.toolify.ai/tool/apify",
  "websiteUrl": "https://www.apify.com/?fpr=7nnph",
  "categories": ["AI Developer Tools", "Web Scraping"],
  "rating": 5,
  "reviewCount": 0,
  "savedCount": 6,
  "pricingPlans": ["Free | $0 | $5 to spend in Apify Store or on your own Actors"],
  "listType": "category",
  "rank": 1,
  "sourceUrl": "https://www.toolify.ai/category/ai-web-scraping",
  "scrapedAt": "2026-07-24T00:00:00.000Z"
}
```

Actual values change as Toolify updates its directory.

### How much does it cost to scrape Toolify AI tools?

This Actor uses pay-per-event pricing.

- Actor start: **$0.005 per run**
- AI tool result: **$0.000096556 per result on the BRONZE tier** before volume discounts

At the current BRONZE price, 100 results cost about **$0.0147** including the start event. Higher subscription tiers receive lower per-result prices.

The Apify Free plan includes platform credits, so small tests may fit within your monthly allowance. Check the live pricing panel for the price applicable to your plan; the final price is based on saved records, not requested limits.

### Data quality and deduplication

The Actor identifies tools by canonical Toolify handle.

When multiple sources contain the same handle, only the first encountered record is stored. That record keeps the ranking context of its first source.

The parser normalizes whitespace, resolves relative URLs, converts visible K/M/B counts to numbers, and omits empty optional fields.

A page that returns no recognizable tool records fails the run. This prevents successful-looking empty datasets from hiding a route or parser problem.

### Pagination and scaling tips

- Start with 10–20 items.
- Prefer category URLs for rich detail fields.
- Increase `maxPagesPerSource` only when the category is known to have many pages.
- Combine related sources in one run to benefit from global deduplication.
- Use listing-only mode for frequent lightweight snapshots.
- Keep concurrency conservative because Toolify is a public directory, not a bulk export API.

The Actor waits between pages and stops when pagination repeats the same handles.

### Integrations and automation workflows

#### Google Sheets or Airtable

Send each finished dataset to a research table for sorting by category, rating, saves, or rank.

#### Webhooks and Make

Trigger a downstream workflow when a scheduled run finishes. Filter new handles and notify your product or editorial team.

#### Slack monitoring

Compare the latest ranking snapshot with yesterday's dataset and post new or moved tools to a channel.

#### Database enrichment

Use `websiteUrl` as the key for a separate company, domain, or contact-enrichment process.

#### Apify schedules

Create a daily or weekly schedule for new-tool discovery and category monitoring.

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/toolify-ai-directory-scraper').call({
  startUrls: [{ url: 'https://www.toolify.ai/category/ai-web-scraping' }],
  maxItems: 50,
  includeDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("automation-lab/toolify-ai-directory-scraper").call(run_input={
    "listModes": ["most_used"],
    "maxItems": 50,
    "includeDetails": False,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### cURL API example

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~toolify-ai-directory-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url":"https://www.toolify.ai/category/ai-web-scraping"}],
    "maxItems": 20,
    "includeDetails": true
  }'
```

Fetch results from the run's `defaultDatasetId` after it succeeds.

### Use Toolify AI Directory Scraper with MCP

Connect the Actor to Claude Code:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/toolify-ai-directory-scraper"
```

Claude Desktop, Cursor, and VS Code can use this configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/toolify-ai-directory-scraper"
    }
  }
}
```

Example prompts:

- “Export the first 30 tools in Toolify's AI web scraping category.”
- “Run the Toolify most-used ranking monitor and summarize the top 10.”
- “Build a dataset of AI coding assistant websites from Toolify.”

### Proxy and rate-limit behavior

Direct HTTP is the default because verified category pages expose useful SSR data anonymously.

Some ranking routes use stricter Cloudflare rules. The Actor retries selected locale-prefixed public pages. If a ranking remains blocked, enable Apify Proxy in the input.

Use the cheapest proxy setup that works. Do not enable residential proxies for category pages that already work directly.

The Actor reports route blocks in logs and fails on total extraction failure.

### Limitations

- Toolify controls which fields are visible on each page type.
- Ranking cards may contain fewer details than category cards.
- Category keywords work only when the normalized phrase matches a public Toolify category handle.
- The same tool can move between pages while a large live crawl is running.
- `rank` is the position in the fetched source page, not a universal Toolify score.
- This Actor does not scrape private accounts, saved lists, or user-only data.
- It does not invent traffic estimates when Toolify does not expose them.

### Is it legal to scrape Toolify?

This Actor extracts publicly accessible directory information.

You are responsible for your use of the data. Review Toolify's terms, robots guidance, and applicable privacy, database, copyright, and marketing laws. Avoid collecting or using personal data without a lawful purpose.

Use conservative run sizes and schedules. Do not overload the source or attempt to bypass private access controls.

### Troubleshooting

#### The run says a Toolify route was blocked

Try a category URL first. If the selected public ranking route is required, enable Apify Proxy and rerun with a small limit.

#### The run produced no records

Check that the URL is a supported Toolify category, ranking, or tool path. Review logs for an HTTP block or page-layout change. The Actor intentionally fails rather than returning a silent empty export.

#### Some fields are missing

Different Toolify page types expose different data. Use a category page with `includeDetails: true` for pricing, features, and use cases when available.

#### Results stop before `maxItems`

The source may contain fewer unique tools, pagination may have ended, or duplicate handles may have been removed. Increase `maxPagesPerSource` only when more source pages exist.

### FAQ

#### Do I need a Toolify login?

No. The supported scope uses public catalog data.

#### Can I combine categories and rankings?

Yes. Add URLs and list modes in one input. `maxItems` applies globally and duplicate handles are removed.

#### Can I scrape one Toolify tool profile?

Yes, supported public `/tool/...` URLs are accepted, but Toolify may protect detail routes more aggressively. Category pages often expose the same useful details more reliably.

#### Does this Actor return monthly traffic?

Only when the selected page exposes a value the parser can verify. It never fabricates missing traffic metrics.

#### Can I schedule it?

Yes. Apify schedules are ideal for new-tool, ranking, and category snapshots.

#### What export formats are available?

Apify datasets support JSON, CSV, Excel, XML, RSS, and API access.

### Related scrapers

- [G2 Scraper](https://apify.com/automation-lab/g2-scraper) — collect software review and product-market evidence.
- Browse other [Automation Lab actors](https://apify.com/automation-lab) for company, directory, and lead enrichment workflows.

Use a review scraper when buyer sentiment is the primary goal. Use this Toolify scraper when the AI product catalog, rankings, and outbound websites are the core dataset.

### Support

Open an issue from the Actor's Apify page with:

- the exact input,
- the failed run URL,
- the route type,
- and the behavior you expected.

That evidence makes source-side changes and route-specific blocks faster to diagnose.

# Actor input Schema

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

Add public toolify.ai category, ranking, or individual tool URLs. Use searchQueries for category keywords. Only supported Toolify URLs are accepted.

## `searchQueries` (type: `array`):

Resolve category phrases such as web scraping to public Toolify category handles. Use an explicit URL for unusual handles.

## `listModes` (type: `array`):

Collect recently added, most saved, or most used AI tools.

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

Stop after this many unique tool records across all sources.

## `includeDetails` (type: `boolean`):

Extract pricing, features, use cases, and FAQs when Toolify exposes them in the selected page.

## `maxPagesPerSource` (type: `integer`):

Safety limit for pagination on each category, ranking, or search source.

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

Optional Apify Proxy settings for routes that Toolify rate-limits.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.toolify.ai/category/ai-web-scraping"
    }
  ],
  "searchQueries": [],
  "listModes": [],
  "maxItems": 20,
  "includeDetails": true,
  "maxPagesPerSource": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the default dataset table containing one deduplicated row per Toolify AI tool.

# 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://www.toolify.ai/category/ai-web-scraping"
        }
    ],
    "searchQueries": [],
    "listModes": [],
    "maxItems": 20,
    "includeDetails": true,
    "maxPagesPerSource": 2,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/toolify-ai-directory-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://www.toolify.ai/category/ai-web-scraping" }],
    "searchQueries": [],
    "listModes": [],
    "maxItems": 20,
    "includeDetails": True,
    "maxPagesPerSource": 2,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/toolify-ai-directory-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://www.toolify.ai/category/ai-web-scraping"
    }
  ],
  "searchQueries": [],
  "listModes": [],
  "maxItems": 20,
  "includeDetails": true,
  "maxPagesPerSource": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call automation-lab/toolify-ai-directory-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Toolify AI Directory Scraper",
        "description": "📊 Export public Toolify AI catalog records, rankings, websites, pricing, ratings, saves, and feature data for market intelligence, lead lists, and scheduled monitoring.",
        "version": "0.1",
        "x-build-id": "QYPj7xgTe11hXOik8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~toolify-ai-directory-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-toolify-ai-directory-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/automation-lab~toolify-ai-directory-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-toolify-ai-directory-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/automation-lab~toolify-ai-directory-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-toolify-ai-directory-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": "🔗 Toolify category or ranking URLs",
                        "type": "array",
                        "description": "Add public toolify.ai category, ranking, or individual tool URLs. Use searchQueries for category keywords. Only supported Toolify URLs are accepted.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "searchQueries": {
                        "title": "🔎 Toolify category keywords",
                        "type": "array",
                        "description": "Resolve category phrases such as web scraping to public Toolify category handles. Use an explicit URL for unusual handles.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "listModes": {
                        "title": "📈 Ranking lists",
                        "type": "array",
                        "description": "Collect recently added, most saved, or most used AI tools.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "new",
                                "most_saved",
                                "most_used"
                            ],
                            "enumTitles": [
                                "New AI tools",
                                "Most saved AI tools",
                                "Most used AI tools"
                            ]
                        },
                        "default": []
                    },
                    "maxItems": {
                        "title": "Maximum AI tools",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Stop after this many unique tool records across all sources.",
                        "default": 20
                    },
                    "includeDetails": {
                        "title": "Include details exposed on list pages",
                        "type": "boolean",
                        "description": "Extract pricing, features, use cases, and FAQs when Toolify exposes them in the selected page.",
                        "default": true
                    },
                    "maxPagesPerSource": {
                        "title": "Maximum pages per source",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Safety limit for pagination on each category, ranking, or search source.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy settings for routes that Toolify rate-limits."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
