Bulk HTTP Requests — API Calls from CSV, JSON or Dataset
Pricing
from $0.70 / 1,000 http requests
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ış
Maintained by CommunityActor 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
- 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
|urlto URL-encode:?q={{name|url}}
- Give it rows. Paste CSV, pass JSON, link a CSV/JSON file (for example a published Google Sheet), or point to an Apify dataset.
- 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
| Field | Meaning |
|---|---|
index | Row number (0-based) |
method, url | The request that was sent |
statusCode, ok | HTTP status and whether it was 2xx |
json / body | Parsed JSON response, or the text body |
bodyBase64, contentType | For binary responses (images, PDFs, files): the body as base64 |
| your extracted fields | Columns from extract |
responseHeaders | Response headers |
durationMs, attempts | Time from sending to final answer (retries included), and how many tries |
waitMs | Time spent waiting for the per-host rate limit before sending |
truncated | true if the body was larger than the size limit |
error | Why it failed, if it did |
row | The 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
| Run | Price (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-Afterare 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.