Bulk AI Prompt: ChatGPT-style LLM on Every Row avatar

Bulk AI Prompt: ChatGPT-style LLM on Every Row

Pricing

from $2.00 / 1,000 row processeds

Go to Apify Store
Bulk AI Prompt: ChatGPT-style LLM on Every Row

Bulk AI Prompt: ChatGPT-style LLM on Every Row

Run one AI prompt on every row of a CSV, Excel file, Google Sheet or dataset: classify, extract fields, summarise, write lines. Answers as new columns. All-inclusive price, no API key.

Pricing

from $2.00 / 1,000 row processeds

Rating

0.0

(0)

Developer

Tom J

Tom J

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

10 days ago

Last modified

Categories

Security

Limited permissions

Share

Run one AI prompt on every row of a CSV, Excel file, Google Sheet or dataset: classify reviews, extract fields, sort products into categories, summarise tickets or write a first line per lead. It works like running ChatGPT-style prompts in bulk, and the answers come back as new columns next to your data. Model included: no API key, no OpenAI account. $2 per 1,000 rows with the standard model.

What you can do with it

  • Classify text in bulk: sentiment of 5,000 reviews, topic of support tickets, lead quality.
  • Extract structured fields: job title, city and "remote yes/no" from job ads, as separate columns.
  • Categorise products: map titles and descriptions to your own category list.
  • Write personalised lines: one opening sentence per company for outreach.
  • Summarise: one-sentence summary of every ticket, note or review.

How to run AI on every row of a CSV or Google Sheet in 3 steps

  1. Add your data: a link to a CSV, Excel file or Google Sheet, a dataset from another Actor, or JSON rows.
  2. Write your prompt with column names in double curly braces, e.g. Classify the sentiment of this review: {{review}}. Optionally list output fields such as sentiment.
  3. Click Start. You get one result row per input row, in the same order, with your columns plus ai_answer or ai_<field>, also saved as results.csv.

Ready-made examples

TaskPromptOutput fields
SentimentClassify the sentiment of this review as positive, neutral or negative: {{review}}sentiment
Product categoryPick the best category (Home, Garden, Kitchen, Electronics, Other). Title: {{title}}. Description: {{description}}category, confidence
Field extractionFrom this job ad, extract the job title, the city and whether it is remote. Ad: {{text}}job_title, city, remote
Outreach lineWrite one friendly opening sentence for an email to {{company}}, a {{industry}} company in {{city}}. No greeting, no sign-off.—
SummarySummarise this support ticket in one sentence: {{body}}—

Tip: temperature 0 for classifying and extracting; about 0.7 for writing.

Your data

SourceFieldNotes
CSV / TSV / Excel / Google Sheet linkfileUrlFirst sheet, first row = column names; Google Sheets shared "Anyone with the link" (the tab in the link is used); Drive, Dropbox, OneDrive links work; max 50 MB
Another Actor's datasetdatasetIdItems become rows
JSON rowsrows[{"review": "Arrived fast, works well"}]

One source per run: dataset first, then file link, then JSON rows. CSV separators (comma, semicolon, tab, pipe) and encodings (UTF-8, UTF-16, Latin-1) are detected.

Placeholders

  • {{column}} inserts a value; names are not case-sensitive and spaces inside braces are ignored.
  • {{address.city}} and {{tags.0}} reach nested values; objects and lists are inserted as compact JSON.
  • Without any placeholder, the whole row is added as JSON.
  • A row whose placeholders are all empty is skipped (skipped_empty) and not charged.

Input

FieldMeaningDefault
promptTemplateInstruction per row (required)—
outputFieldsUp to 20 fields, each becomes column ai_<field>plain answer in ai_answer
systemPromptRole, language, tone for every rowshort default
modelstandard or largestandard
maxRowsRows read100 (max 10,000)
maxInputCharsPrompt length per row6,000
maxOutputTokensAnswer length per row400
temperature0 = predictable, higher = varied0.2
includeOriginalColumnsKeep your columns in the outputon

Output

{
"row_number": 1,
"input_preview": "Bright, easy to set up and it arrived a day early…",
"product": "Desk lamp",
"review": "Bright, easy to set up and it arrived a day early. Very happy with it.",
"ai_sentiment": "positive",
"ai_answer": "{\"sentiment\": \"positive\"}",
"ai_status": "ok",
"ai_message": "Done."
}

Format illustration. Also saved: results.csv (UTF-8), results.json and a run summary (OUTPUT) with rows per status, charged rows, model and tokens.

ai_statusMeaningCharged
okAnsweredyes
failedNo usable answer after 2 triesno
not_processed_limitStopped by a limit (cost, free plan)no
quota_exhaustedDaily AI capacity used up (resets 00:00 UTC)no
skipped_emptyNothing to sendno

Which model should I pick?

  • Standard (Gemma 4 26B): fast, good for classifying, extracting and short writing. $0.002 per row.
  • Large (Llama 3.3 70B): stronger reasoning for harder or longer rows; uses at most 12,000 characters in and 800 tokens out per row. $0.005 per row.

Both run on Cloudflare Workers AI; the run summary names the model used.

How much does bulk AI processing cost?

EventPrice
Row processed, standard model$0.002 ($2 per 1,000)
Row processed, large model$0.005 ($5 per 1,000)

Example: classifying 5,000 reviews with the standard model = $10, model included.

What you are not charged for

Failed rows, empty rows, rows stopped by a limit (maximum cost per run, free-plan limits, daily capacity) and rows beyond Maximum rows. Each row is checked against your maximum cost per run before it is sent.

Use it from n8n, Make or Zapier

Call the Actor with Apify's integration or the Run Actor API and pass the rows of your previous step directly:

{
"rows": [{ "company": "Example Bakery", "city": "Ghent" }],
"promptTemplate": "Write one friendly opening sentence for an email to {{company}} in {{city}}.",
"maxRows": 500
}

Then read the dataset items (same order as your rows) or download results.csv.

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("olliolli/bulk-ai-prompt").call(run_input={
"fileUrl": "https://docs.google.com/spreadsheets/d/…",
"promptTemplate": "Classify the sentiment: {{review}}",
"outputFields": ["sentiment"],
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["row_number"], row.get("ai_sentiment"))

Through Apify's MCP server, AI assistants can hand a whole spreadsheet to this Actor.

Privacy

The text of each row (after filling in the prompt) is sent to Cloudflare Workers AI to get the answer; nothing else is sent there. Nothing is kept after the run except your own dataset and key-value store. Row text and answers are never written to the log. Don't send data you are not allowed to share with a processor such as Cloudflare.

Good to know

  • Free Apify plan: at most 20 rows per run and 100 rows per day. Paid plans don't have these limits.
  • Rows are processed 4 at a time. An invalid JSON answer is retried once.
  • Answers come from a language model: check a sample before you use them.

FAQ

Is this ChatGPT? No. It runs open models (Gemma 4 26B and Llama 3.3 70B) in the same chat-style way, without an OpenAI account or API key.

Can I get the answer split into columns? Yes: list output fields and each becomes an ai_<field> column.

Does it work with Google Sheets? Yes, with a link shared as "Anyone with the link". The tab in the link is used.

What are the free-plan limits? 20 rows per run and 100 rows per day.

Can I use it in n8n, Make or Zapier? Yes, pass your rows as JSON in rows.

Is my data used to train models? Rows are processed by Cloudflare Workers AI under Cloudflare's terms; this Actor keeps nothing after the run.

Need help?

Open an issue on the Issues tab.