How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://apify.com/pricingin Page URLs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Turn public web pages into structured JSON with your own OpenAI, Anthropic or Google Gemini API key: give page URLs and the fields you want, and get one row per page with the values and the tokens your key used.
- Values that are not on the page come back as
null. The model is told never to guess. - List mode returns every record on a page (all plans, all products, all people) in
data.items.
Good for
- The same fields (name, price, date, contact page, specs) from pages on many different sites.
- Pricing tables, product pages, team pages, event pages, job posts: anything readable in the page HTML.
- Teams that already have an OpenAI or Gemini key and want to pay their provider directly for tokens.
Not a good fit
- Pages that build their content with JavaScript. They are reported as
JS_REQUIREDand no model call is made. - Pages behind a login, paywall or bot protection. The Actor never logs in and never bypasses them; HTTP 401/403 pages are errors.
- Crawling a whole site. The Actor reads only the URLs you give (up to 300 per run). It does not follow links.
- Guaranteed accuracy. LLMs can make mistakes; check important values.
Who uses it
Analysts
Pull price, date or specs from pages on many sites.
Developers
Get JSON that matches your schema, without writing scraping code.
Researchers
Collect plans, team members or events from public pages.
Price
Prices will be shown after release.
Questions
Do I need my own API key?
Yes. Use a key from Google Gemini, OpenAI or Anthropic. Your provider bills the tokens.
Is Anthropic tested?
Not yet with a live key. It follows the public API docs. Gemini and OpenAI are tested.
Does it work on pages that need JavaScript?
No. Those pages are marked JS_REQUIRED and no model call is made.
What if a value is not on the page?
It comes back as null. The model is told not to guess.
Is Anthropic supported?
The Anthropic option follows the public API docs, but Anthropic: not tested with a live key yet. Gemini and OpenAI are tested.
Are the values always correct?
No guarantee: LLMs can make mistakes. The model sees only the page text, is told to use null instead of guessing, and treats the page as untrusted data. Check important values.
How fresh is the data?
Each page is downloaded during the run; fetchedAt shows when. Nothing is cached.
Details
Step by step on Apify
- Open the Input tab. The form is prefilled with
https://apify.com/pricingand two fields:plan_nameandmonthly_price, in list mode. - Keep LLM provider = Google Gemini (default) or pick OpenAI.
- Paste your key into Your API key.
- Click Start.
- Open the Output tab and check
statusanddata.items.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Compare competitor pricing | urls + fields, mode: list | one row per pricing page | data.items, status, fetchedAt | Google Sheets, CSV export |
| Product specs from many shops | urls + jsonSchema | one row per product page | data, truncated, status | Dataset API, webhook to your database |
| Company facts from About pages | urls + fields | one row per company page | data, pageTitle, finalUrl | CRM import via Make or Zapier |
| Track token use per page | any | one row per page | inputTokens, outputTokens, model | your cost report |
Tips for better results
- Use list mode when a page has many records, like a pricing table.
- Limit page text to keep token costs low.
- Check important values. AI models can make mistakes.
Limits and good to know
- Max total charge (Apify run option): when the next page would go over it, the run stops, marks the rest
skipped/CHARGE_LIMITand endsPARTIAL. The model is not called for a page that cannot be charged - No data at the start: if the model finds none of your fields on 10 pages before any page had data, the run stops with
PARTIAL/NO_DATA_STREAKto save your tokens - Dead sites or provider: after 10 timeouts or connection/model errors in a row, or when no page finishes for 120 s, the run stops with
PARTIAL/SOURCE_FAILINGand marks the restskipped - Up to 300 URLs per run. Default timeout 300 s, memory 1 GB
- Server HTML only, no JavaScript rendering, no login, no paywall or bot-protection bypass. Private and internal addresses are blocked
- Pages up to 5 MB of HTML; text sent to the model up to
maxPageChars - Each request to a site identifies itself as
llm-web-extractor-apify-actor
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"url": "https://apify.com/pricing",
"finalUrl": "https://apify.com/pricing",
"status": "complete",
"data": { "items": [
{ "plan_name": "Free", "monthly_price": "$0" },
{ "plan_name": "Starter", "monthly_price": "$19" },
{ "plan_name": "Scale", "monthly_price": "$199" },
{ "plan_name": "Business", "monthly_price": "$999" }
] },
"provider": "gemini",
"model": "gemini-flash-lite-latest",
"inputTokens": 4906,
"outputTokens": 121,
"reasoningTokens": 0,
"pageTitle": "Apify pricing - flexible plan + pay as you go · Apify",
"pageChars": 28144,
"truncated": false,
"fetchedAt": "2026-10-22T05:50:56.165Z",
"error": null
}Data fields (14)
| Field | Type | Meaning |
|---|---|---|
url | string | Page URL from the input. |
finalUrl | string | URL after redirects; null when the page was not downloaded. |
status | string | complete = data extracted; not_found = HTTP 404/410, or the model found none of the requested data (error.code NO_DATA, only the $0.001 page read charged); error = see error.code; skipped = not processed (quota, budget, timeout); api_key_required / api_key_invalid = key problem, nothing processed. |
data | object | Extracted fields. Values not on the page are null. In list mode the records are in data.items. null unless status is complete or not_found with NO_DATA (then it holds the empty answer). |
provider | string | gemini, openai or anthropic. |
model | string | Model id used. |
inputTokens | integer | Prompt tokens the provider billed to your key for this page. null when no model call was made. |
outputTokens | integer | Output tokens billed to your key, including reasoning or thinking tokens. |
reasoningTokens | integer | Part of outputTokens spent on reasoning, when the provider reports it. |
pageTitle | string | Page title. |
pageChars | integer | Characters of clean page text before any cut. |
truncated | boolean | True when the page text was cut to maxPageChars before it was sent. |
fetchedAt | string | When the row was written, ISO 8601. |
error | object | Why the row is not complete: code (e.g. QUOTA_EXCEEDED, JS_REQUIRED, HTTP_ERROR, LLM_TRUNCATED) and a short message. null for complete rows. |
Input settings (11)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Page URLs required | urls | array | ["https://apify.com/pricing"] |
| Fields to extract | fields | array | [{"key": "plan_name", "value": "Name of the pricing plan"}, {"key": "monthly_price", "v… |
| One record or a list per page | mode | string | "list" |
| LLM provider | provider | string | "gemini" |
| Your API key | apiKey | string | |
| Model | model | string | |
| JSON Schema (advanced) | jsonSchema | object | |
| Extra instructions | instructions | string | |
| Max page characters sent | maxPageChars | integer | 40000 |
| Pages at the same time | maxConcurrency | integer | 3 |
| Keep navigation and footer | keepBoilerplate | boolean | false |