Bulk HTTP Requests — API Calls from CSV, JSON or Dataset avatar

Bulk HTTP Requests — API Calls from CSV, JSON or Dataset

Pricing

from $0.70 / 1,000 http requests

Go to Apify Store
Bulk HTTP Requests — API Calls from CSV, JSON or Dataset

Bulk HTTP Requests — API Calls from CSV, JSON or Dataset

Send bulk HTTP requests: call any API once for every row of a CSV, JSON list or Apify dataset. Write the request once with {{column}} placeholders. Up to 200 parallel requests, per-host rate limit, free retries, JSON field extraction, webhooks for Clay, n8n and Make. $1 per 1,000 requests.

Pricing

from $0.70 / 1,000 http requests

Rating

0.0

(0)

Developer

Salih Küçükkayış

Salih Küçükkayış

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

2

Monthly active users

13 hours ago

Last modified

Categories

Share

Send bulk HTTP requests to any API: one call for every row of a CSV, JSON list or Apify dataset. Write the request once as a template, and the Actor fills in each row, sends the requests in parallel, retries what fails, and gives you one clean result row per request.

$1 per 1,000 requests ($0.90, $0.80 and $0.70 on the Starter, Scale and Business plans). Retries are free. No subscription, no platform usage fees. (Plus a tiny $0.00005 start fee per run.)

Quick start

Press Start with the example input to see it work. It calls a public test API three times, once per row:

{
"url": "https://httpbin.org/anything/{{id}}",
"method": "GET",
"csv": "id\n1\n2\n3"
}

Each request becomes one dataset row (trimmed here):

{
"index": 0,
"method": "GET",
"url": "https://httpbin.org/anything/1",
"statusCode": 200,
"ok": true,
"json": { "method": "GET", "url": "https://httpbin.org/anything/1" },
"durationMs": 43,
"waitMs": 3,
"attempts": 1,
"error": null,
"row": { "id": "1" }
}

A POST with a JSON body built from each row:

{
"url": "https://api.example.com/contacts",
"method": "POST",
"headers": { "Authorization": "Bearer YOUR_TOKEN" },
"body": { "email": "{{email}}", "company": "{{company}}" },
"csv": "email,company\nana@example.com,Acme\nbo@example.com,Globex",
"extract": { "contactId": "data.id" }
}

Typical uses

  • Enrich a lead list: call your enrichment API for every email in a CSV.
  • Push rows into a CRM or webhook: one POST per row with a JSON body built from the row.
  • Check thousands of URLs or IDs against an API and pull out one or two fields.
  • Feed the output of another Actor into an API (use its dataset ID as input).
  • Give an AI agent a safe "call this API for all of these" tool through the Apify MCP server.

How it works

  1. Write the request once. Put {{column}} wherever a value from the row should go: in the URL, query parameters, headers or JSON body.
    • https://api.example.com/users/{{id}}
    • Header Authorization: Bearer {{token}}
    • Body {"email": "{{email}}", "score": "{{score}}"} (a value that is exactly {{column}} keeps its type, so numbers stay numbers)
    • Add |url to URL-encode: ?q={{name|url}}
  2. Give it rows. Paste CSV, pass JSON, link a CSV/JSON file (for example a published Google Sheet), or point to an Apify dataset.
  3. Run. You get one result per request with status, timing, attempts, the parsed JSON (or text), any fields you asked to extract, and the original row.

Built to be fast and polite

  • Parallel: up to 200 requests at a time.
  • Rate limit per host: stays under API limits (default 10 requests/second per host).
  • Retries with backoff: timeouts, network errors, 408, 425, 429 and 5xx. Honors Retry-After.
  • Field extraction: {"userId": "data.id", "firstTag": "tags[0]"} adds those columns to the output, so you don't have to dig through JSON.
  • Webhook: optionally POST each result to Clay, Make, n8n or your own endpoint as it finishes.
  • Spending limit aware: stops cleanly when your run's spending limit is reached.

Output

FieldMeaning
indexRow number (0-based)
method, urlThe request that was sent
statusCode, okHTTP status and whether it was 2xx
json / bodyParsed JSON response, or the text body
bodyBase64, contentTypeFor binary responses (images, PDFs, files): the body as base64
your extracted fieldsColumns from extract
responseHeadersResponse headers
durationMs, attemptsTime from sending to final answer (retries included), and how many tries
waitMsTime spent waiting for the per-host rate limit before sending
truncatedtrue if the body was larger than the size limit
errorWhy it failed, if it did
rowThe input row, so results stay joined to your data

Good to know

  • Requests to private and internal addresses (localhost, 10.x, 192.168.x, cloud metadata) are blocked. This also applies to every redirect hop and is checked again when the connection is made. A row whose redirect points to a private address fails with a "Blocked redirect" error and is not retried.
  • You are responsible for calling APIs you have the right to use and for respecting their terms and rate limits.
  • Pricing: one charge per request in your input, however many retries it needed, plus $0.00005 when a run starts. Platform usage is included.

What it costs

RunPrice (no discount)
100 rows$0.10
10,000 rows$10.00
100,000 rows$100.00

Starter, Scale and Business plans pay 10 %, 20 % and 30 % less per request. Set Maximum cost per run and the run stops cleanly when it is reached.

Why not a script or a no-code HTTP step?

  • No code to keep running. Parallel requests, a per-host rate limit, retries with backoff and Retry-After are built in.
  • One row in, one row out. Every result keeps its input row, so results join back to your list without guesswork.
  • Many rows in one step. One run handles a whole CSV or dataset instead of one automation step per row.

FAQ

Can I send POST, PUT or PATCH with a JSON body? Yes. Put {{column}} placeholders in the body; a value that is exactly {{column}} keeps its type, so numbers stay numbers.

Am I charged for failed requests? Each request in your input is charged once, whatever the outcome. Retries are not charged again.

How do I keep under an API's rate limit? Lower perHostPerSecond (default 10) and concurrency (default 20).

Can I run it from Make, Zapier, n8n or my own code? Yes, like any Apify Actor: through Apify's integrations or the Apify API. Results can also be POSTed to your webhook as they finish (callbackUrl).

Can an AI agent use it? Yes, through the Apify MCP server. The agent passes a URL template and rows, and gets one result per row.

More from this developer

  • Website Screenshot + Change Detection: screenshots of many URLs on desktop and mobile, with visual change detection between runs.
  • Keyword Search Volume: Google search volume, CPC and trends for a keyword list, in up to 20 countries in one run.
  • Document to Markdown: PDF, Word, PowerPoint, Excel and scanned images to clean Markdown with tables and RAG chunks, $2 per 1,000 pages.
  • Audio to Text: audio, video and podcast feeds to timestamped text, SRT/VTT subtitles and RAG chunks with Whisper, $5 per 1,000 audio minutes.
  • Video to Scenes: scene cuts, one keyframe per scene, a contact sheet and the transcript of each scene, $2 per 1,000 frames.
  • Career Site Jobs: open jobs from Greenhouse, Lever, Ashby, Workable, Recruitee and Workday career sites, with a new-jobs monitor and a hiring summary per company, $1 per 1,000 jobs.

Questions or a missing feature: open an issue on the Actor page.