# AI Web Data Extractor (`datacortex/ai-web-data-extractor`) Actor

Extract structured data from any website by saying what you want in plain English. Products, prices, jobs, leads, news, tables or direct answers, as clean JSON, CSV or Excel. No selectors, no code. Works with AI agents via MCP. Pay per page; failed pages are free.

- **URL**: https://apify.com/datacortex/ai-web-data-extractor.md
- **Developed by:** [datacortex](https://apify.com/datacortex) (community)
- **Categories:** AI, E-commerce, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 pages

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## AI Web Data Extractor

Give it a web page and say what you want in plain English. You get clean JSON back: one row per item on a list page, one record for a single page, or a direct answer to a question. No code, no selectors.

**From $0.007 per page. Failed pages are free.**

### What is AI Web Data Extractor?

It reads a public web page the way a person would, and returns the fields you name as columns. Ask for `name, price and rating of every product` and you get a table with exactly those three columns, a row for each product, across the next pages too. Prices and ratings arrive as numbers, ready for a spreadsheet, a database or an AI agent.

It works on shops, job boards, directories, news sites, tables and JavaScript-built pages, in any language.

### What can you use it for?

- **Price monitoring:** products and prices from a shop's category or search pages, on a schedule.
- **Product catalogues:** open every product page behind a list and collect brand, SKU, description and images.
- **Lead lists:** turn a directory into company names, websites, phones and addresses.
- **Job data:** titles, companies, locations and salaries from job boards and careers pages.
- **News monitoring:** headlines, authors, dates and links from news sites and blogs.
- **Research datasets:** tables, rankings and statistics as rows.
- **Facts for AI agents:** an agent asks a site a question and gets a short, sourced answer instead of a whole page.

### Sites it reads well

Tested on 115 public websites it had never seen, in eight languages (15 October 2026): 83% returned usable data, 68% with every field correct. Pages that failed were free.

| Kind of site | Example ask that works |
| --- | --- |
| Shops and catalogues | `name, price and rating of every product` |
| News front pages | `headline, author, date and link of every article` |
| Job boards and careers pages | `title, team and location of every job` |
| Tables and rankings (Wikipedia, sports, finance) | `country, population and area of every country in the table` |
| A single product, film, recipe, package or repo page | `name, latest version, downloads and license` |
| Directories, forums and event listings | `name, date and group of every event` |
| Pricing and plan questions | `what does the Team plan cost per user per month?` |
| Government and science data | `date, location and magnitude of every earthquake` |

### How to use it

1. Paste one or more **URLs**.
2. Under **What do you want?**, name the fields, for example `name, price and rating of every product`.
3. Click **Start**. Your data appears in the **Output** tab.

Want each item's own page too? Put the list page in **URLs** and write `every product link` in **Follow links**. You get one full record per item page.

**Tip:** start with one URL and **Max pages per URL** set to 1, check the fields, then scale up.

### Examples to copy

| You want | URLs | Follow links | What do you want? |
| --- | --- | --- | --- |
| Prices from a shop | A category page | — | `name, price, currency and stock status of every product` |
| A full product catalogue | Category pages | `every product link` | `name, brand, price, SKU, description and image URL` |
| Job listings | Job search results | `every job posting` | `title, company, location, salary and full description` |
| A lead list | A directory page | `every company profile` | `company name, website, phone and address` |
| Headlines | A news home page | — | `headline, author, date and link of every article` |
| An answer about a company | Its home page | — | `does this company offer a free plan?` |
| Reviews | A product's review page | — | `reviewer, rating as a number, date and text of every review` |

### What you get

Three shapes, picked from your wording. Every example below is a real run, from 15 October 2026.

**Rows**: `title, price and star rating of every book` on `https://books.toscrape.com/`

| sourceUrl | title | price | star_rating | currency |
| --- | --- | --- | --- | --- |
| https://books.toscrape.com/ | A Light in the Attic | 51.77 | 3 | GBP |
| https://books.toscrape.com/ | Tipping the Velvet | 53.74 | 1 | GBP |
| https://books.toscrape.com/ | Soumission | 50.10 | 1 | GBP |

20 rows from 1 page, for $0.011.

**Rows from a table**: `city, country and population of every city in the table` on Wikipedia's list of largest cities

| city | country | population |
| --- | --- | --- |
| Jakarta | Indonesia | 41,913,860 |
| Dhaka | Bangladesh | 36,585,479 |
| Tokyo | Japan | 33,412,512 |

**Record**: `crate name, latest version, downloads and license` on `https://crates.io/crates/serde`

```json
{
  "sourceUrl": "https://crates.io/crates/serde",
  "crate_name": "serde",
  "latest_version": "1.0.229",
  "downloads": 1531313118,
  "license": "MIT OR Apache-2.0"
}
```

**Reply**: `what does the Team plan cost per user per month?` on `https://github.com/pricing`. It reads the pages it needs and says which ones.

```json
{
  "sourceUrl": "https://github.com/pricing",
  "plan_name": "Team",
  "price": 4,
  "currency": "USD",
  "billing_period": "month",
  "sources": ["https://github.com/pricing", "https://github.com/team"]
}
```

A value the page doesn't show comes back empty. Download as JSON, CSV or Excel.

### How much does it cost?

You pay per page read, plus $0.001 per run. Nothing else.

| Your Apify plan | Per page | Per 1,000 pages |
| --- | --- | --- |
| Free, Starter | $0.010 | $10 |
| Scale | $0.008 | $8 |
| Business and above | $0.007 | $7 |

- **Failed pages are free.**
- **Set Max total charge** on a run and it never spends more.
- Apify's free plan includes $5 of credit a month, about 500 pages.

For example, 50 shop category pages with 40 products each is 2,000 products for about $0.50 on the Free plan.

### Use it with AI agents and your tools

- **AI agents:** add it to Claude, Cursor or any MCP client through [Apify MCP](https://docs.apify.com/integrations/mcp). The agent writes the request and gets JSON back.
- **LangChain and LlamaIndex:** call it through Apify's integration for each.
- **No-code:** Make, Zapier and n8n through their Apify apps; send results on to Google Sheets, Slack or a webhook.
- **Schedules:** run it daily or hourly with Apify Schedules to watch prices or listings.

Or call it from code:

```bash
curl -X POST "https://api.apify.com/v2/acts/datacortex~ai-web-data-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://books.toscrape.com/"],"ask":"title, price and star rating of every book","maxPagesPerUrl":1}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("datacortex/ai-web-data-extractor").call(run_input={
    "urls": ["https://books.toscrape.com/"],
    "ask": "title, price and star rating of every book",
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

### Get the best results

- **Name the fields and say "every":** `name, price and rating of every product`, not `get the products`.
- **Use the words the page uses:** "SKU", "Availability", "Points". Describe content, not looks: `the price after discount`, not `the red number`.
- **Point it at the right page:** a list or search page for rows, an item's own page for a record, a home or pricing page for a question.
- **For tables, say which one:** `every row in the main table` or `every city in the table`.
- **Limits and filters work:** `the top 10 stories`, `every book under £20`.
- **Ask questions as questions:** `does it have a free plan, and what does it include?` The answer cites the pages it used.
- **The first run on a new site takes longer** (often 30–120 seconds) while it learns the page. Later runs on the same site and fields are faster.
- **Say the format if it matters:** `date as YYYY-MM-DD`, `price as a number`.

### FAQ

**Do I need CSS selectors or code?**
No. Describe the fields in plain English and it finds them on the page.

**Does it work on JavaScript-heavy pages?**
Yes. Pages are fully loaded before they are read.

**Does it follow pagination?**
Yes, for rows. It reads next pages up to **Max pages per URL** (10 by default).

**How is this different from a website crawler?**
A crawler gives you each page's full text. This gives you the specific fields you name, as columns. Use a crawler to feed whole pages to a model, and this when you want the data in a table.

**What if a site turns visitors away?**
Turn on **Residential network** and run it again. It costs the same per page.

**Can it read pages behind a login?**
No, public pages only. Sites whose terms forbid scraping (such as LinkedIn, Yelp and Zillow) are declined.

**Is it legal?**
Extracting public, non-personal data is generally legal. Personal data falls under laws like the GDPR, so only collect it with a legitimate reason. See Apify's [guide to the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### If something goes wrong

A URL that fails writes one row explaining what happened, and is not charged.

- **Missing fields:** use the words the page uses, like "SKU" or "Availability".
- **Too few rows:** raise **Max pages per URL**.
- **Follow links found nothing:** describe the links the way the page shows them, like `every "View details" link`.

### Help

Something not working, or a site you need? Open an issue on the **Issues** tab. We read every one.

# Actor input Schema

## `urls` (type: `array`):

Public web pages to read, one per line. A list page (search results, a category, a directory) returns one row per item and follows its next pages.

## `ask` (type: `string`):

Plain English. Name the fields for a list ('title, price and rating of every book'), describe one record ('product name, price, SKU and stock status'), or ask a question ('how many books are in the Travel category?'). The same request runs on every URL.

## `outputType` (type: `string`):

Auto reads it from your wording. Rows: one row per item on a list page, following next pages. Record: one row for the page itself. Reply: a direct answer to a question, reading linked pages if needed.

## `followLinks` (type: `string`):

Optional. Say which links to open on each URL, for example 'every product link' or 'every job posting'. Each page found is then asked What do you want? on its own, one row per page, with foundOn saying where it was found. Leave empty to read only the URLs above.

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

Most item pages Follow links opens in this run, across all URLs. Each item page is usually one billed page.

## `maxPagesPerUrl` (type: `integer`):

Most pages one URL may read. Leave empty for the defaults: 10 for rows, 5 for a reply, 1 for a record. With Follow links, this is how many list pages to read for links (default 1); each item page reads 1. Each page fetched is one billed page; failed pages are free.

## `residentialNetwork` (type: `boolean`):

Fetch through home-broadband IP addresses, for sites that turn data-centre visitors away. Same price per page.

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

Two-letter country code to browse from on the residential network, for example US, GB or DE. Used for rows only.

## `maxConcurrency` (type: `integer`):

How many URLs to work on at the same time (1–10).

## Actor input object example

```json
{
  "urls": [
    "https://books.toscrape.com/"
  ],
  "ask": "title, price and star rating of every book",
  "outputType": "auto",
  "maxItems": 100,
  "residentialNetwork": false,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `results` (type: `string`):

One row per item, record or answer, with the page it came from.

## `summary` (type: `string`):

Per URL: state, pages charged, row count, completeness and the pages read.

# 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 = {
    "urls": [
        "https://books.toscrape.com/"
    ],
    "ask": "title, price and star rating of every book"
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacortex/ai-web-data-extractor").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 = {
    "urls": ["https://books.toscrape.com/"],
    "ask": "title, price and star rating of every book",
}

# Run the Actor and wait for it to finish
run = client.actor("datacortex/ai-web-data-extractor").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 '{
  "urls": [
    "https://books.toscrape.com/"
  ],
  "ask": "title, price and star rating of every book"
}' |
apify call datacortex/ai-web-data-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datacortex/ai-web-data-extractor"
        }
    }
}
```

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/WbLrfRYOHW9F28MGF/builds/Rtjh4C5ecvKuAXzsm/openapi.json
