# Bulk LLM Runner GPT, Claude, Perplexity, Kimi (No API Key) (`fayoussef/bulk-llm-runner`) Actor

Run hundreds of prompts in parallel across GPT, Claude, Gemini and Perplexity Sonar — plus 400+ other LLMs — without API key. Built-in web search, PDF reading, vision, JSON output and side-by-side model comparison.

- **URL**: https://apify.com/fayoussef/bulk-llm-runner.md
- **Developed by:** [youssef farhan](https://apify.com/fayoussef) (community)
- **Categories:** AI, Agents, MCP servers
- **Stats:** 347 total users, 43 monthly users, 99.5% runs succeeded, 6 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Bulk LLM Runner — GPT, Claude, Gemini, Perplexity (No API Key)

**Run hundreds of prompts in parallel across GPT-5, Claude Sonnet 4.5, Gemini 2.5 Pro, Perplexity Sonar — and 400+ other large language models — without an OpenAI, Anthropic, Google or Perplexity API key.** Built-in web search, PDF reading, vision input, strict JSON output and side-by-side model comparison. No code. No SDK. One form, every model.

***

### Why people use this actor

- **Bulk by design.** Paste 10, 100 or 1,000 prompts — they run **concurrently** (1–16 in parallel). What takes hours in ChatGPT finishes in minutes here.
- **The Big 4 in one place: GPT, Claude, Gemini, Perplexity.** Plus DeepSeek, Llama 4, Grok, Qwen, Kimi, Mistral, Command. Switch models from a dropdown — no rewriting code.
- **No API keys.** You don't need an OpenAI key, an Anthropic key, a Google AI Studio key, or a Perplexity key. Your Apify account is the only login.
- **All tools on by default.**
  - Live **web search** on any model (even ones without native browsing).
  - **PDF & URL parsing** — drop a link in the prompt and the model reads the page.
  - **Vision / image input** for multimodal models.
- **Side-by-side model comparison.** Add extra models in `compare_models` and the actor runs every prompt against each — one dataset row per (prompt × model). Pick the winner with data.
- **Strict JSON output.** Force the model to return JSON that matches your schema — perfect for data extraction, classification and scraping cleanup.
- **Cost transparency.** Every dataset row carries the exact USD cost of that call, and the run summary totals tokens + spend.
- **One-click export.** Results land in a structured dataset — download as JSON, CSV or Excel, or pipe into Zapier, Make, n8n or Google Sheets via Apify's native integrations.

***

### Three example prompts that ship with the actor

These are the defaults you'll see when you open the form — try them as-is to feel what the actor can do.

#### 1. SEO content factory (bulk marketing copy)

> Act as a senior SEO copywriter. For the product *Patagonia Nano Puff jacket*, write: (1) a 60-word benefit-driven product description, (2) an SEO meta title under 60 characters, (3) a meta description under 155 characters, and (4) 8 long-tail keywords people actually search for. Return everything as clean Markdown.

Swap the product name and run with **1,000 prompts in one go** to generate a full catalogue's worth of SEO copy in minutes. Pair with `Claude Sonnet 4.5` for quality or `Gemini 2.5 Flash` for cheap bulk.

#### 2. Real-time market intelligence (web search)

> Search the web for the three most recent funding rounds (last 30 days) in the European AI-agent startup space. For each, return: company name, amount raised, lead investor, one-sentence description, and the source URL. Format as a Markdown table.

With **Enable web search** on, even non-browsing models get live results. Run the same prompt daily on a schedule for an automated competitive-intel brief. `Perplexity Sonar Pro` is the natural choice; `GPT-5` with `:online` works just as well.

#### 3. Structured extraction from any URL (JSON output)

> Read the page at https://en.wikipedia.org/wiki/Transformer\_(deep\_learning\_architecture) and extract: (1) year introduced, (2) paper title and authors, (3) the three core components in plain English, (4) two products that use it today, (5) one well-known limitation. Return as a JSON object with exactly those five keys.

Set **Response format = JSON Schema**, paste a schema, and the model is forced to return clean structured data — ready to drop into a database. Combine with **Enable PDF / file parsing** to run the same extraction on hundreds of PDFs, papers or product pages.

***

### Who it's for

- **Marketing & SEO teams** — generate 500 product descriptions, meta titles, FAQs or ad variants in one run.
- **Researchers & analysts** — A/B test the same question across GPT-5, Claude 4.5, Gemini 2.5 Pro and Perplexity Sonar Pro side by side.
- **Data teams** — turn unstructured pages, PDFs and emails into clean JSON at scale.
- **Founders & no-code builders** — wire AI into Zapier, Make, n8n or Google Sheets without touching code.
- **Developers** — prototype prompts at scale before locking in one model in production.

***

### Supported models (the most-used LLMs in 2026)

| Provider | Models |
|---|---|
| **OpenAI (GPT)** | GPT-5, GPT-5 mini, GPT-5 nano, GPT-4.1, GPT-4.1 mini, GPT-4o, GPT-4o mini, o3, o4-mini |
| **Anthropic (Claude)** | Claude Sonnet 4.5, Claude Opus 4.1, Claude Haiku 4.5, Claude 3.5 Sonnet, Claude 3.5 Haiku |
| **Google (Gemini)** | Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite, Gemini 2.0 Flash |
| **Perplexity** | Sonar Pro, Sonar, Sonar Reasoning Pro, Sonar Reasoning, Sonar Deep Research |
| **DeepSeek** | DeepSeek V3.1, DeepSeek R1, DeepSeek V3 |
| **xAI** | Grok 4.3, Grok 4 Fast, Grok Code Fast 1 |
| **Meta** | Llama 4 Maverick, Llama 4 Scout, Llama 3.3 70B |
| **Alibaba** | Qwen3 Coder, Qwen3 235B A22B, Qwen 2.5 72B |
| **Others** | Moonshot Kimi K2, Mistral Large 2411, Mistral Small 3.2, NVIDIA Nemotron, Z.ai GLM 4.6, Cohere Command A |

Need a model that's not in the dropdown? Paste any model id into **Custom model** — the full catalogue is at <https://openrouter.ai/models>.

***

### Pricing

This Actor uses a **pay-per-event** pricing model on the Apify platform — you pay for the tokens the models actually use.

> ⚠️ **Free Apify plan users are charged 10× the AI token cost.** Subscribe to a paid [Apify plan](https://apify.com/pricing?fpr=youssef) to pay the standard (10× lower) per-token rate.

**Failed prompts are reported, not hidden.** Each call is retried automatically on rate limits and server errors. If it still fails, you get a row for it with the reason in the `error` column, so you always know which prompt broke and why:

```json
{
  "prompt": "Summarise this PDF: https://example.com/broken.pdf",
  "model": "openai/gpt-5",
  "response": null,
  "tools_used": [],
  "usage": null,
  "cost_usd": null,
  "error": "HTTP 400: file-parser could not fetch the URL"
}
```

An error row is a result row like any other and is billed as one. Sort or filter by the `error` column to separate failures from successes.

***

### Frequently asked questions

#### Do I need an OpenAI / Anthropic / Google / Perplexity API key?

No. You don't sign up anywhere else. Your Apify account is the only key you need — billing for all 400+ models is bundled into the run.

#### Can I really run many prompts at once?

Yes — that's the whole point. The `prompts` field accepts an array; the `concurrency` slider (1–16) controls parallelism. 100 prompts in ~30 seconds is normal.

#### Can I compare GPT-5, Claude 4.5, Gemini 2.5 and Perplexity Sonar on the same task?

Yes. Pick one model in `Model`, then add the others to `Compare with extra models`. You get one row per (prompt × model) — perfect for picking the best model for *your* use case.

#### Does it support web search?

Yes. Toggle **Enable web search** and any model — even ones without native browsing — gets real-time results. Perplexity Sonar models also have it baked in.

#### Can the model read PDFs and URLs?

Yes. Toggle **Enable PDF / file parsing**, mention the URL in your prompt, and the file-parser plugin extracts the content for the model.

#### Does it support vision / image input?

Yes. Paste direct image URLs into the `image_urls` field and they're attached to every prompt. Works with GPT-4o/5, Claude 4.x, Gemini 2.5, Llama 4 and Qwen-VL.

The link has to open the image file itself, publicly, with no login and no expiring token, and be under 10 MB. Sharing pages from Google Drive, Dropbox or OneDrive serve a web page instead of an image, so use the direct file link. The Actor downloads each image before the run starts, so a broken link stops the run right away with an explanation instead of failing your prompts one by one. Downloads are retried automatically, and if a host refuses cloud traffic the Actor retries the same link through a proxy, so sites that only answer ordinary browsers still work. Large images are resized automatically to fit the request limit, so a full-size photo or poster works without you preparing it first.

#### Can it return strict JSON for data extraction?

Yes. Set **Response format** to `JSON Schema`, paste a JSON Schema, and the model is forced to obey it. Great for scraping cleanup, classification and ETL pipelines.

#### How is cost reported?

Every dataset row carries `cost_usd` for that call. The run summary (in the key-value store under `SUMMARY`) totals tokens and USD spend.

#### Can I use it with Zapier, Make, n8n or Google Sheets?

Yes. Apify ships native integrations for all of them. Trigger this actor on a new sheet row, get the answers back automatically.

#### Which model should I pick?

- **Best overall (coding, agents, writing):** Claude Sonnet 4.5
- **Hardest reasoning:** GPT-5, Claude Opus 4.1, o3
- **Cheapest reliable bulk:** Gemini 2.5 Flash Lite, GPT-5 nano, DeepSeek V3.1
- **Up-to-date answers without toggles:** Perplexity Sonar Pro
- **Open-source / self-hostable path:** Llama 4, DeepSeek R1, Qwen3, Kimi K2

#### Is my data used for training?

No. Requests pass through to the upstream provider you picked. Most providers (Anthropic, OpenAI API, Google Vertex routes, Perplexity API) do not train on API inputs.

***

### Output format

One dataset item per (prompt × model):

```json
{
  "prompt": "Search the web for the three most recent funding rounds ...",
  "model": "perplexity/sonar-pro:online",
  "response": "| Company | Raised | Lead | Description | Source |\n| --- | --- | --- | --- | --- |\n| ... |",
  "tools_used": ["web_search"],
  "annotations": [{"type": "url_citation", "url": "https://.../"}],
  "tool_calls": [],
  "usage": {"prompt_tokens": 312, "completion_tokens": 487, "total_tokens": 799, "cost": 0.0042},
  "cost_usd": 0.0042,
  "error": null
}
```

A `SUMMARY` record in the run's key-value store reports total prompts, models used, tokens in/out, failures and total USD cost.

***

### Tags

`bulk-llm` · `batch-ai` · `no-api-key` · `gpt-5` · `gpt-4o` · `claude-sonnet-4.5` · `claude-opus-4.1` · `gemini-2.5-pro` · `gemini-2.5-flash` · `perplexity-sonar` · `deepseek-r1` · `llama-4` · `grok-4` · `qwen3` · `kimi-k2` · `multi-model-comparison` · `prompt-runner` · `ai-batch` · `llm-batch` · `chatgpt-bulk` · `web-search-ai` · `pdf-ai` · `vision-ai` · `json-extraction` · `no-code-ai`

# Actor input Schema

## `prompts` (type: `array`):

One prompt per line / per array item. Each prompt runs as an independent chat completion. Use this for batch / multi-command processing.

## `system_prompt` (type: `string`):

Shared system instruction prepended to every prompt.

## `model` (type: `string`):

Most-used OpenRouter models. Append ':online' or toggle 'Enable web search' to add real-time web search to any of them.

## `custom_model` (type: `string`):

Optional. Enter a model id in vendor/model format — it must include the vendor prefix and the slash. Correct: qwen/qwen3-vl-235b-a22b-thinking. Wrong: qwen3-vl-235b-a22b-thinking (missing the 'qwen/' prefix — this will be rejected). More examples: anthropic/claude-opus-4.8, openai/gpt-5, google/gemini-2.5-pro. To find the exact id, open https://openrouter.ai/models, click a model, and copy the id shown under its name (it always has a slash). Tip: common labels like 'Claude Opus 4.8' are auto-corrected, but any model not in the dropdown must be entered as its exact vendor/model id. If filled, this overrides the Model dropdown.

## `enable_web_search` (type: `boolean`):

Runs a live web search before the model answers and feeds the results in as context. Works with any model.

## `enable_file_parser` (type: `boolean`):

Activates the file-parser plugin so the model can read PDFs/URLs you reference in the prompt.

## `temperature` (type: `integer`):

Sampling temperature x100 (0 = deterministic, 200 = very creative).

## `max_tokens` (type: `integer`):

Upper bound on tokens per response.

## `compare_models` (type: `array`):

Optional. Add more model ids in vendor/model format (e.g. openai/gpt-5, google/gemini-2.5-pro, anthropic/claude-opus-4.8) to run EVERY prompt against the main model AND each of these. One dataset row per (prompt × model). Great for A/B testing GPT-5 vs Claude vs Gemini side by side. Enter ids, not display names — find them at https://openrouter.ai/models.

## `image_urls` (type: `array`):

Optional. Direct, publicly downloadable image URLs attached to every prompt. Only used with multimodal models (GPT-4o/5, Claude 4.x, Gemini 2.5, Llama 4, Qwen-VL). The URL must open the image file itself with no login and no expiring link: sharing pages from Google Drive, Dropbox or OneDrive serve a web page, not an image, so use the direct file link. Each image must be under 10 MB. Bad URLs stop the run immediately with an explanation, before anything is charged.

## `response_format` (type: `string`):

How the model should format its reply. Default 'Auto JSON' makes every reply a JSON object so the Excel/CSV export gets one column per field: simple prompts return `{"response": "..."}` (a single 'response' column), and prompts that ask for specific fields like 'return description, price, rating' return those exact keys as columns. Pick 'JSON Schema (strict)' to lock the output to an exact schema, or 'Plain text' for free-form text.

## `json_schema` (type: `object`):

Only used when Response format = 'JSON Schema (strict)'. Paste a JSON Schema describing the exact shape you want back; each top-level property becomes its own column. Example: { "type": "object", "properties": { "title": {"type":"string"}, "tags": {"type":"array","items":{"type":"string"}} }, "required": \["title","tags"] }

## `reasoning_effort` (type: `string`):

For reasoning models (o3, o4-mini, GPT-5, DeepSeek R1, Sonar Reasoning). 'none' disables reasoning where possible. Ignored by non-reasoning models.

## `provider_sort` (type: `string`):

When a model is available from multiple providers, prefer the one optimised for this dimension.

## `fallback_models` (type: `array`):

Optional. If the main model fails or is rate-limited, it automatically retries with these models in order. Use model ids in vendor/model format (e.g. anthropic/claude-sonnet-4.6, openai/gpt-4o-mini) — not display names.

## `max_retries` (type: `integer`):

Number of automatic retries on HTTP 429 / 5xx errors before giving up on a prompt.

## `concurrency` (type: `integer`):

How many prompts to run in parallel against the openrouter actor.

## `apify_token` (type: `string`):

Defaults to the run's own APIFY\_TOKEN. Override only if you want to bill a different account.

## Actor input object example

```json
{
  "prompts": [
    "Act as a senior SEO copywriter. For the product 'Patagonia Nano Puff jacket', write: (1) a 60-word benefit-driven product description, (2) an SEO meta title under 60 characters, (3) a meta description under 155 characters, and (4) 8 long-tail keywords people actually search for. Return everything as clean Markdown with headings.",
    "Search the web for the three most recent funding rounds (last 30 days) in the European AI-agent startup space. For each, return: company name, amount raised, lead investor, one-sentence description of what they do, and the source URL. Format as a Markdown table.",
    "Read the page at https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture) and extract: (1) the year the architecture was introduced, (2) the paper title and authors, (3) the three core components in plain English, (4) two real-world products that use it today, (5) one well-known limitation. Return as a JSON object with exactly those five keys."
  ],
  "system_prompt": "You are a helpful, accurate assistant. Use the available tools when they would improve the answer.",
  "model": "anthropic/claude-haiku-4.5",
  "enable_web_search": true,
  "enable_file_parser": false,
  "temperature": 70,
  "max_tokens": 2048,
  "response_format": "json_object",
  "reasoning_effort": "default",
  "provider_sort": "default",
  "max_retries": 2,
  "concurrency": 4
}
```

# Actor output Schema

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

All prompt/model responses, one row per call. Opens the Overview view by default.

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

Run totals: token usage, USD spend, ok/failed counts, and whether the run resumed from saved state.

# 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 = {
    "prompts": [
        "Act as a senior SEO copywriter. For the product 'Patagonia Nano Puff jacket', write: (1) a 60-word benefit-driven product description, (2) an SEO meta title under 60 characters, (3) a meta description under 155 characters, and (4) 8 long-tail keywords people actually search for. Return everything as clean Markdown with headings.",
        "Search the web for the three most recent funding rounds (last 30 days) in the European AI-agent startup space. For each, return: company name, amount raised, lead investor, one-sentence description of what they do, and the source URL. Format as a Markdown table.",
        "Read the page at https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture) and extract: (1) the year the architecture was introduced, (2) the paper title and authors, (3) the three core components in plain English, (4) two real-world products that use it today, (5) one well-known limitation. Return as a JSON object with exactly those five keys."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fayoussef/bulk-llm-runner").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 = { "prompts": [
        "Act as a senior SEO copywriter. For the product 'Patagonia Nano Puff jacket', write: (1) a 60-word benefit-driven product description, (2) an SEO meta title under 60 characters, (3) a meta description under 155 characters, and (4) 8 long-tail keywords people actually search for. Return everything as clean Markdown with headings.",
        "Search the web for the three most recent funding rounds (last 30 days) in the European AI-agent startup space. For each, return: company name, amount raised, lead investor, one-sentence description of what they do, and the source URL. Format as a Markdown table.",
        "Read the page at https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture) and extract: (1) the year the architecture was introduced, (2) the paper title and authors, (3) the three core components in plain English, (4) two real-world products that use it today, (5) one well-known limitation. Return as a JSON object with exactly those five keys.",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("fayoussef/bulk-llm-runner").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 '{
  "prompts": [
    "Act as a senior SEO copywriter. For the product '\''Patagonia Nano Puff jacket'\'', write: (1) a 60-word benefit-driven product description, (2) an SEO meta title under 60 characters, (3) a meta description under 155 characters, and (4) 8 long-tail keywords people actually search for. Return everything as clean Markdown with headings.",
    "Search the web for the three most recent funding rounds (last 30 days) in the European AI-agent startup space. For each, return: company name, amount raised, lead investor, one-sentence description of what they do, and the source URL. Format as a Markdown table.",
    "Read the page at https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture) and extract: (1) the year the architecture was introduced, (2) the paper title and authors, (3) the three core components in plain English, (4) two real-world products that use it today, (5) one well-known limitation. Return as a JSON object with exactly those five keys."
  ]
}' |
apify call fayoussef/bulk-llm-runner --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fayoussef/bulk-llm-runner"
        }
    }
}

```

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/0pArcqOZFSjoCBlJX/builds/gcfYfm0uqRkPQ9oMi/openapi.json
