Apify vs AnswerLine
Apify publishes its own actors for ChatGPT, Perplexity, Gemini, Copilot, Google AI Mode, AI Overviews and Google Search, priced per event on top of a platform plan. This API is one request contract across AI assistants and Google, priced in credits.
Coverage
| Apify | AnswerLine | |
|---|---|---|
| ChatGPT | Yes, Apify's ChatGPT Search Scraper actor: answer text, sources, query fan-out and widgets. | Yes, POST /v1/monitor/chatgpt. |
| Perplexity | Yes, Perplexity Search Scraper actor: answer text and sources; images and related questions optional. | Yes, POST /v1/monitor/perplexity. |
| Gemini | Yes, Gemini Search Scraper actor: answer and cited sources. | Yes, POST /v1/monitor/gemini. |
| Microsoft Copilot | Yes, Microsoft Copilot Search Scraper actor. | Yes, POST /v1/monitor/copilot. |
| Grok | No Apify-published actor; community actors only. | Yes, POST /v1/monitor/grok. |
| Google AI Mode | Yes, Google AI Mode Scraper actor, or an add-on of the Google Search actor. | Yes, POST /v1/monitor/aimode. |
| Google AI Overview | Yes, Google AI Overviews Scraper actor, or an add-on of the Google Search actor. | Supported by the API. +2 credits, added once per request. |
| Google Search | Yes, Google Search Results Scraper actor. | Supported by the API. |
| Google News | No Apify-published actor; community actors only. | Supported by the API. |
Apify's platform plans
| Plan | Monthly | Prepaid usage | Store price tier |
|---|---|---|---|
| Free | $0 | $5 | No store discount |
| Starter | $19 | $19 | Bronze |
| Scale | $199 | $199 | Silver |
| Business | $999 | $999 | Gold |
Apify's event prices for these actors
| Event | Starter (Bronze) | Business (Gold) |
|---|---|---|
| Google Search results page | $0.0025 | $0.0018 |
| Google Search run start | $0.001 | $0.001 |
| AI Overview | $0.002 | $0.001 |
| AI Mode answer | $0.005 | $0.002 |
| ChatGPT, Gemini or Copilot answer | $0.005 | $0.003 |
| Perplexity answer | $0.013 | $0.009 |
Price per request
| Request | AnswerLine credits | AnswerLine price | Apify |
|---|---|---|---|
| ChatGPT | 5 | $0.003 | $0.005 (Business: $0.003) |
| Perplexity | 4 | $0.002 | $0.013 (Business: $0.009) |
| Gemini | 4 | $0.002 | $0.005 (Business: $0.003) |
| Microsoft Copilot | 5 | $0.003 | $0.005 (Business: $0.003) |
| Grok | 4 | $0.002 | No Apify-published actor |
| Google AI Mode | 4 | $0.002 | $0.005 (Business: $0.002) |
| Google AI Overview | 5 | $0.003 | $0.0025 per page + $0.002 per AI Overview |
| Google Search | 3 | $0.002 | $0.0025 per results page + $0.001 per run |
| Google News | 3 | $0.002 | No Apify-published actor |
How requests, geo, billing and delivery work
| Apify | AnswerLine | |
|---|---|---|
| Parsing depth | Dataset items per actor: text and sources for AI answers (ChatGPT adds query fan-out and widgets); organic and paid results, People Also Ask and related queries for Google. | One JSON schema per engine in the OpenAPI document. Assistants: answer text, markdown and sources, plus the engine-specific fields each schema defines. Google: organic results, ads, People Also Ask, local pack, knowledge graph and the AI Overview with its sources. |
| Geo targeting | Google Search actor: country, search and interface language, UULE location and mobile results. The standalone ChatGPT, Gemini, AI Mode and AI Overview actors' input schemas take queries only. | country on every engine; US state on ChatGPT, Perplexity, Gemini, Copilot and Grok; location, uule, hl and device on Google Search and AI Mode. |
| Billing on failures | AI answer events are charged when an answer is returned and Google pages when successfully scraped; run-start events are charged per run. | A failed request or task is not charged, and neither is a queued task you clear before it starts. |
| Async and webhooks | Synchronous run-and-get-items endpoint (408 after 300 s), or start a run with ad-hoc webhooks on run events such as succeeded, failed and timed out. | Synchronous monitor calls, or async tasks and batches with idempotency keys, polled or delivered to a signed webhook with up to 10 delivery attempts. |
Where Apify is stronger
- Apify's store lists thousands of actors beyond search and AI answers, so one account also covers maps, social and e-commerce data.
- The Google Search actor can attach AI Overview, AI Mode, ChatGPT, Perplexity, Copilot and Gemini results, plus lead enrichment, to one run.
- Schedules, storage, proxies, CSV and Excel exports and Zapier and Make integrations come with the account.
Choose this API to measure AI answers across engines on a schedule, with one request schema, country and US state on every assistant, and per-task webhooks. The guide below covers the migration.
Which to pick
Pick Apify when AI answers are one input among many web data jobs you already run on its platform, when you want one Google Search run to carry AI Overview, AI Mode and assistant add-ons together, or when you need an actor for a site no search or AI API covers.
Pick this API when AI answers are the product input itself: a prompt set that runs across the AI assistants and Google Search, in specific countries or US states, on a schedule, with answers and sources in documented fields.
If you already run Apify for maps, social or e-commerce data, keep those actors and move only the AI answer jobs.
Actors versus endpoints
Apify is a platform for running programs. An actor is a packaged scraper with its own input schema, output dataset and pricing events. Running one means starting a run, waiting for it to finish and reading the dataset items it produced. Each engine is a separate actor maintained on its own schedule, with its own input fields: the Google Search actor takes countryCode, languageCode and locationUule; the standalone ChatGPT actor’s input schema takes queries and nothing else (checked 2026-09-17).
This API is a request/response contract. Each engine has one endpoint, POST /v1/monitor/<engine>, and one response schema documented in the OpenAPI document. The same request can run synchronously or as an async task, and every task can carry its own idempotency key and webhook. There is no run, dataset or actor version to manage.
- Unit of work. On Apify a run can hold many queries and its cost has a run-start event plus a per-answer event. Here one request is one answer, and its cost is known before you send it.
- Schema. Actor outputs are defined by each actor’s README and dataset. Here every engine’s fields are in one OpenAPI document.
- Markets. On Apify, geo options vary by actor. Here
countryis accepted by every engine,stateby the five assistants, andlocation,uule,hlanddeviceby Google Search and AI Mode.
Migration: the same job, two requests
The job: ask ChatGPT “best CRM for a 10-person agency” and store the answer and its sources.
On Apify
Apify’s API reference documents a synchronous endpoint that runs an actor and returns its dataset items. The body is the actor’s input; for the ChatGPT Search Scraper the input schema’s field is queries, a newline-separated string (checked 2026-09-17 on docs.apify.com and the actor’s input schema).
curl -X POST "https://api.apify.com/v2/acts/apify~chatgpt-search-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "queries": "best CRM for a 10-person agency" }'
The response is an array of dataset items, one per query, with query, text, sources, queryFanOut and widgets. Apify’s docs say a synchronous run that takes longer than 300 seconds returns a 408, after which you read the dataset of the still-running run.
On this API
curl -X POST https://api.answerline.dev/v1/monitor/chatgpt \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "best CRM for a 10-person agency",
"country": "US",
"state": "NY",
"include": { "markdown": true }
}'
The response is { "success": true, "result": { ... } }. The fields you would have mapped from the actor output:
| Apify ChatGPT actor | This API |
|---|---|
query |
the prompt you sent |
text |
result.text (and result.markdown with include.markdown) |
sources[] (title, url) |
result.sources[] (label, url, position, description) |
queryFanOut |
result.searchQueries (with include.searchQueries) |
widgets |
result.shoppingCards, result.inlineProducts, result.entities |
The same request in TypeScript with the SDK:
import { Client } from "@answerline/sdk";
const client = new Client({ apiKey: process.env.API_KEY!, baseUrl: "https://api.answerline.dev" });
const { result } = await client.chatgpt({
prompt: "best CRM for a 10-person agency",
country: "US",
include: { markdown: true },
});
for (const s of result.sources ?? []) console.log(s.position, s.url);
Replacing scheduled Apify runs
Most visibility pipelines don’t call one prompt at a time; they run a prompt set every day or week. On Apify that is typically a schedule that starts a run, plus an ad-hoc webhook on ACTOR.RUN.SUCCEEDED that tells your service to read the dataset.
Here the equivalent is a batch of async tasks with a webhook per task:
import os, requests
prompts = ["best CRM for a 10-person agency", "HubSpot or Pipedrive for agencies?"]
markets = [("US", "NY"), ("US", "CA")]
day = "2026-09-17"
tasks = [
{
"taskType": "CHATGPT",
"payload": {"prompt": p, "country": c, "state": s},
"idempotencyKey": f"crm-{i}-{c}-{s}-{day}",
"webhook": {"url": "https://your-app.com/hooks/answers"},
}
for i, p in enumerate(prompts)
for c, s in markets
]
r = requests.post(
"https://api.answerline.dev/v1/async/task/batch",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json=tasks,
timeout=60,
)
for item in r.json()["results"]:
if not item["success"]:
print(tasks[item["index"]]["idempotencyKey"], item["error"]["code"])
Differences to plan for:
- Granularity. An Apify webhook fires per run; here a delivery arrives per task, carrying the task’s status, its credits and the engine result. Your receiver stores one answer per delivery instead of paging a dataset.
- Retries you control. The idempotency key is derived from prompt, market and day, so resubmitting a batch after a timeout never runs a task twice: a repeat answers
RESOURCE_ALREADY_EXISTSfor that item. See async tasks. - Signatures. Deliveries carry a
Webhook-Signatureheader (HMAC-SHA256 over timestamp and raw body). Verify it before trusting the payload; webhooks has the code. - Batch limit. One batch call takes up to 500 tasks. Larger prompt sets are several batch calls.
Modelling cost
Apify pricing has three layers: the platform plan (which sets the store price tier), the per-event price of each actor at that tier, and any run-start events. The event price for the same ChatGPT answer differs between Apify’s Starter and Business tiers, and its Free plan lists AI answer events at $0.20 each, so trial runs on the Free plan are not a guide to production cost.
This API has two layers: credits per request and the credit price of your plan. A ChatGPT task costs 5 credits, plus 2 once if you add search queries, shopping, ads or the raw response; a synchronous call adds 2 more. Other engines are on pricing and in credits.
To compare for your own workload:
- List prompts × engines × markets × runs per month.
- For Apify, multiply the answer count per engine by that engine’s event price at the tier your plan gives you, then add run-start events for the number of runs you start.
- For this API, multiply the answer count per engine by credits per request, and pick the smallest plan whose monthly credits cover the total.
- Add the engineering time for anything one side does not return and you would have to derive, such as citation positions or US state variants.
Running both side by side before cutting over
Start with a parallel run: the same prompts, markets and schedule on Apify and on this API for one or two weeks, stored in the same table with a provider column.
- Choose prompts for engines both sides cover, plus Google queries where you use the AI Overview add-on.
- Keep your Apify schedule unchanged.
- Submit matching tasks here, keyed by prompt, engine, market and day, with a webhook.
- Store both in one table; on Apify note which runs timed out and which queries went to the errors dataset.
What to compare at the end of the run:
- Completion rate per engine: answers you can use divided by answers you asked for.
- Market effect: answers here in the markets you report on versus Apify’s untargeted AI actors.
- Cited domains overlap per prompt, against day-to-day variation on one provider.
- Cost per usable answer at your Apify plan tier, including run-start events.
Cut over one engine at a time and keep the parallel data: it is the only record of how the switch itself moved your numbers.
Handling errors after the switch
On Apify, a failed or timed-out run is an actor-level event, and queries that return nothing go to a separate errors dataset on the ChatGPT and AI Mode actors.
This API’s errors carry a stable code to branch on (authentication and errors):
| Situation | Status and code | What to do |
|---|---|---|
| Too many requests this second | 429 RATE_LIMIT_EXCEEDED |
Back off with jitter and retry; nothing ran or was charged. |
| Every concurrency slot busy on a synchronous call | 429 CONCURRENT_LIMIT_EXCEEDED |
Retry when a running call finishes, or send a task instead. |
| Queue would overflow | 429 QUEUE_LIMIT_EXCEEDED |
The whole submission was rejected; resubmit later. |
| API shedding load | 429 SERVICE_OVERLOADED |
Wait at least Retry-After seconds. |
| Balance can’t cover the request | 403 INSUFFICIENT_CREDITS |
Top up or wait for the next cycle; check GET /v1/credits. |
| Repeated idempotency key | 409 RESOURCE_CONFLICT |
The task already exists; fetch it instead of creating it. |
| Engine failed after automatic retries | 500 or 502 EXTERNAL_SERVICE_ERROR |
Not charged. For tasks, resubmit with a new key if you still need the answer. |
Every response carries an X-Request-Id; send your own to tie a request to your logs, and quote it to support. The TypeScript SDK applies this retry policy for you.
Decision checklist
- Engines. Do you need Grok or Google News? Apify’s store has no Apify-published actor for either (checked 2026-09-17); this API has an endpoint for both.
- Markets. Do answers need to come from a specific country or US state on every assistant? Check each actor’s input schema; this API takes
countryeverywhere andstateon all five assistants. - Fields. Do you store citation positions, shopping cards or brand entities? Map each to a documented output field before migrating.
- Scheduling. Is the schedule already in your own job runner? Then per-task webhooks fit better than run-level webhooks.
- Other data. Do you depend on Apify actors outside search and AI answers? Keep those; move only the AI answer jobs.
- Failure semantics. Decide how you treat an answer that did not come back. Here a failed task has status
FAILEDand is not charged; on Apify, check each actor’s event definitions and the run-start charge.
Pitfalls when moving
- Joining on the query string. Apify datasets return
query; tasks here return your idempotency key and task id. Keep your own prompt id in the key, as in the batch example, and join on that. - Assuming one answer per run. A run-level retry on Apify reruns every query in it. Here retry only the tasks that failed; completed ones are final.
- Forgetting the synchronous surcharge. Synchronous calls cost more than tasks. Use them for interactive lookups; use tasks for anything scheduled.
- Unverified webhook payloads. Apify ad-hoc webhooks and this API’s deliveries are different formats. Rewrite the receiver instead of adapting the old one, and deduplicate by
task.id, since the same delivery can arrive more than once. - Mixing engines in one parser. Each engine’s result has its own schema. ChatGPT, Copilot and Grok define
searchQueries; Gemini’s schema has no such field. Read the engine pages before writing a shared mapper.
Start with the quickstart, or read the ChatGPT engine page for the full result schema.
Questions
Does Apify have actors for ChatGPT, Perplexity and Google AI Mode?
Yes. As checked on 2026-09-17, Apify publishes its own ChatGPT Search Scraper, Perplexity Search Scraper, Gemini Search Scraper, Microsoft Copilot Search Scraper, Google AI Mode Scraper and Google AI Overviews Scraper, priced per event. Its store lists no Apify-published actor for Grok or Google News.
Can I target a country with Apify's AI answer actors?
The Google Search Results Scraper takes a country code, languages and a UULE location. The input schemas of the standalone ChatGPT, Gemini, AI Mode and AI Overview actors take only queries (checked 2026-09-17). This API takes country on every engine and a US state on the five assistants.
How do I replace an Apify run-sync call with this API?
Replace the POST to the actor's run-sync-get-dataset-items endpoint with a POST to the engine's monitor endpoint, and send one prompt per request instead of a newline-separated queries string. For scheduled volume, submit async tasks in batches and receive results by webhook.
Is Apify cheaper than this API?
It depends on the Apify plan and the engine. Apify's AI answer events cost less on its Business plan than on Starter, and each AI answer event is listed at $0.20 on its Free plan. Compare per-request prices for your engine mix on the table above and on the pricing page.
How does this API differ from Apify's ChatGPT actor?
Both return the answer text and its sources. The differences are in the request: this API takes country and a US state on every assistant, delivers each task to its own webhook, and covers Copilot and Grok, which have no Apify-published actors.