# Bulk LLM Runner — GPT, Claude, Gemini, Perplexity (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, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

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

## 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, 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 used by the OpenRouter API. **Free tier users pay 10x more than paying users and are limited to 2,048 tokens per response.**

---

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

#### 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. Paste any OpenRouter model id (e.g. 'qwen/qwen3-vl-235b-a22b-thinking'). Browse the full list at https://openrouter.ai/models — click any model and copy the id shown under its name. If filled, this overrides the Model dropdown.

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

Appends ':online' so a live web search runs before the model answers.

## `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 OpenRouter model ids here 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.

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

Optional. Public image URLs attached to every prompt. Only used with multimodal models (GPT-4o/5, Claude 4.x, Gemini 2.5, Llama 4, Qwen-VL).

## `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, OpenRouter automatically retries with these models in order.

## `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
}
```

# 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("💾 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 '{
  "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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fayoussef/bulk-llm-runner",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bulk LLM Runner — GPT, Claude, Gemini, Perplexity (No API Key)",
        "description": "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.",
        "version": "0.1",
        "x-build-id": "4ddfLgETclbXZagmw"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fayoussef~bulk-llm-runner/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fayoussef-bulk-llm-runner",
                "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/fayoussef~bulk-llm-runner/runs": {
            "post": {
                "operationId": "runs-sync-fayoussef-bulk-llm-runner",
                "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/fayoussef~bulk-llm-runner/run-sync": {
            "post": {
                "operationId": "run-sync-fayoussef-bulk-llm-runner",
                "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",
                "required": [
                    "prompts",
                    "model"
                ],
                "properties": {
                    "prompts": {
                        "title": "Prompts",
                        "type": "array",
                        "description": "One prompt per line / per array item. Each prompt runs as an independent chat completion. Use this for batch / multi-command processing.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "system_prompt": {
                        "title": "System prompt (optional)",
                        "type": "string",
                        "description": "Shared system instruction prepended to every prompt.",
                        "default": "You are a helpful, accurate assistant. Use the available tools when they would improve the answer."
                    },
                    "model": {
                        "title": "Model",
                        "enum": [
                            "anthropic/claude-sonnet-4.5",
                            "anthropic/claude-opus-4.1",
                            "anthropic/claude-haiku-4.5",
                            "anthropic/claude-3.5-sonnet",
                            "anthropic/claude-3.5-haiku",
                            "perplexity/sonar-pro",
                            "perplexity/sonar",
                            "perplexity/sonar-reasoning-pro",
                            "perplexity/sonar-reasoning",
                            "perplexity/sonar-deep-research",
                            "openai/gpt-5",
                            "openai/gpt-5-mini",
                            "openai/gpt-5-nano",
                            "openai/gpt-4.1",
                            "openai/gpt-4.1-mini",
                            "openai/gpt-4o",
                            "openai/gpt-4o-mini",
                            "openai/o3",
                            "openai/o4-mini",
                            "google/gemini-2.5-pro",
                            "google/gemini-2.5-flash",
                            "google/gemini-2.5-flash-lite",
                            "google/gemini-2.0-flash-001",
                            "deepseek/deepseek-chat-v3.1",
                            "deepseek/deepseek-r1",
                            "deepseek/deepseek-v3",
                            "x-ai/grok-4",
                            "x-ai/grok-4-fast",
                            "x-ai/grok-code-fast-1",
                            "meta-llama/llama-4-maverick",
                            "meta-llama/llama-4-scout",
                            "meta-llama/llama-3.3-70b-instruct",
                            "qwen/qwen3-coder",
                            "qwen/qwen3-235b-a22b",
                            "qwen/qwen-2.5-72b-instruct",
                            "moonshotai/kimi-k2",
                            "mistralai/mistral-large-2411",
                            "mistralai/mistral-small-3.2-24b-instruct",
                            "nvidia/nemotron-nano-9b-v2",
                            "z-ai/glm-4.6",
                            "cohere/command-a"
                        ],
                        "type": "string",
                        "description": "Most-used OpenRouter models. Append ':online' or toggle 'Enable web search' to add real-time web search to any of them.",
                        "default": "anthropic/claude-haiku-4.5"
                    },
                    "custom_model": {
                        "title": "Custom model id (overrides Model)",
                        "type": "string",
                        "description": "Optional. Paste any OpenRouter model id (e.g. 'qwen/qwen3-vl-235b-a22b-thinking'). Browse the full list at https://openrouter.ai/models — click any model and copy the id shown under its name. If filled, this overrides the Model dropdown."
                    },
                    "enable_web_search": {
                        "title": "Enable web search",
                        "type": "boolean",
                        "description": "Appends ':online' so a live web search runs before the model answers.",
                        "default": true
                    },
                    "enable_file_parser": {
                        "title": "Enable PDF / file parsing",
                        "type": "boolean",
                        "description": "Activates the file-parser plugin so the model can read PDFs/URLs you reference in the prompt.",
                        "default": false
                    },
                    "temperature": {
                        "title": "Temperature",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Sampling temperature x100 (0 = deterministic, 200 = very creative).",
                        "default": 70
                    },
                    "max_tokens": {
                        "title": "Max output tokens",
                        "minimum": 64,
                        "maximum": 32000,
                        "type": "integer",
                        "description": "Upper bound on tokens per response.",
                        "default": 2048
                    },
                    "compare_models": {
                        "title": "Compare with extra models",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional. Add more OpenRouter model ids here 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.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "image_urls": {
                        "title": "Image URLs (vision)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional. Public image URLs attached to every prompt. Only used with multimodal models (GPT-4o/5, Claude 4.x, Gemini 2.5, Llama 4, Qwen-VL).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "response_format": {
                        "title": "Response format",
                        "enum": [
                            "json_object",
                            "text",
                            "json_schema"
                        ],
                        "type": "string",
                        "description": "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.",
                        "default": "json_object"
                    },
                    "json_schema": {
                        "title": "JSON schema (optional)",
                        "type": "object",
                        "description": "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": {
                        "title": "Reasoning effort",
                        "enum": [
                            "default",
                            "none",
                            "low",
                            "medium",
                            "high"
                        ],
                        "type": "string",
                        "description": "For reasoning models (o3, o4-mini, GPT-5, DeepSeek R1, Sonar Reasoning). 'none' disables reasoning where possible. Ignored by non-reasoning models.",
                        "default": "default"
                    },
                    "provider_sort": {
                        "title": "Provider routing preference",
                        "enum": [
                            "default",
                            "price",
                            "throughput",
                            "latency"
                        ],
                        "type": "string",
                        "description": "When a model is available from multiple providers, prefer the one optimised for this dimension.",
                        "default": "default"
                    },
                    "fallback_models": {
                        "title": "Fallback models",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional. If the main model fails or is rate-limited, OpenRouter automatically retries with these models in order.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "max_retries": {
                        "title": "Retries on transient errors",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of automatic retries on HTTP 429 / 5xx errors before giving up on a prompt.",
                        "default": 2
                    },
                    "concurrency": {
                        "title": "Parallel requests",
                        "minimum": 1,
                        "maximum": 16,
                        "type": "integer",
                        "description": "How many prompts to run in parallel against the openrouter actor.",
                        "default": 4
                    },
                    "apify_token": {
                        "title": "Apify token (optional)",
                        "type": "string",
                        "description": "Defaults to the run's own APIFY_TOKEN. Override only if you want to bill a different account."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
