Bulk HTTP Request Runner — Batch API Calls avatar

Bulk HTTP Request Runner — Batch API Calls

Pricing

from $33.50 / 1,000 http responses

Go to Apify Store
Bulk HTTP Request Runner — Batch API Calls

Bulk HTTP Request Runner — Batch API Calls

Send thousands of HTTP requests in one run: GET, POST, PUT, PATCH, DELETE with your own headers and JSON bodies. Each response is a row with status, headers, timing and body, JSON parsed. Retries, redirects, concurrency. Part of NexGen Signal — data tools and official-source data products

Pricing

from $33.50 / 1,000 http responses

Rating

0.0

(0)

Developer

NexGen Signal

NexGen Signal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

🔁 Bulk HTTP Request Runner — Batch API Calls

Send thousands of HTTP requests in one run (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS) with your own headers and bodies, and get every response as a row: status code, reason, headers, redirects, timing, content type, size and body, with JSON bodies parsed into data.

Give a simple list of links, or full request objects with method, headers, JSON or raw body and a label. Requests run in parallel (up to 50 at once), connection errors and 429/502/503/504 answers are retried with back-off (POST and PATCH only when the connection never opened, so nothing is sent twice), and redirects are followed. Large bodies can be saved whole as files.

The unit of output is one response received, whatever its status code. Requests that get no response are listed in the run receipt and not billed.

Who buys this and for what job

  • Developers and QA calling an API with many parameter sets, or checking many endpoints.
  • Data teams pulling JSON from public APIs page by page into a dataset.
  • SEO and ops teams checking status codes, redirects and response times for URL lists.
  • No-code builders who need a batch HTTP step in an Apify workflow.

Buyers usually search for this as "bulk HTTP requests", "batch API calls" or "HTTP request tool".

📊 Sample Output

Table of responses: position, URL, status code, elapsed milliseconds and parsed JSON body.

positionurlstatus_codeelapsed_msbody_json
10https://earthquake.usgs.gov/fdsnws/event/1/count?format=geojson&minmagnitude=2.9200189{"count": 1407, "maxAllowed": 20000}
2https://earthquake.usgs.gov/fdsnws/event/1/count?format=geojson&minmagnitude=2.1200206{"count": 2742, "maxAllowed": 20000}
6https://earthquake.usgs.gov/fdsnws/event/1/count?format=geojson&minmagnitude=2.5200207{"count": 1890, "maxAllowed": 20000}
4https://earthquake.usgs.gov/fdsnws/event/1/count?format=geojson&minmagnitude=2.3200209{"count": 2252, "maxAllowed": 20000}
1https://earthquake.usgs.gov/fdsnws/event/1/count?format=geojson&minmagnitude=2.0200233{"count": 3083, "maxAllowed": 20000}

Rows from live run xYRvCLXLxVf9QOXGK on Apify (40 GET requests to the USGS earthquake count API, one per minimum magnitude from 2.0 to 5.9). Notice that the JSON answers are parsed, so each count can be read straight from the row.

✅ What you get

Every field of each record:

  • record_id, position, label — stable id, position in your list and your label.
  • method, url, final_url, redirects — the request (secret query values shown as [redacted]) and redirects followed.
  • status_code, ok, reason, elapsed_ms — the answer and its timing.
  • content_type, bytes, response_headers — the body's type and size, and the response headers (Set-Cookie values are not shown).
  • body_text, body_json, body_truncated, body_file_url — the body as text or parsed JSON (up to maxBodyKb), whether it was cut off, and the full body's link (with saveFullBody).
  • sha256, requested_at — hash of the full body and when it was sent (UTC).

⚙️ Sample inputs

Two GET links (the Store example)

{
"urls": ["https://earthquake.usgs.gov/fdsnws/event/1/count?format=geojson&minmagnitude=6", "https://earthquake.usgs.gov/fdsnws/event/1/version"],
"maxRequests": 10
}

Default method and headers.

POST with a JSON body and a token

{
"requests": [{"url": "https://postman-echo.com/post", "method": "POST", "headers": {"Authorization": "Bearer YOUR_TOKEN"}, "json": {"hello": "world"}, "label": "echo"}],
"maxRequests": 5
}

The Authorization header is never written to the run receipt.

Status check of a URL list, headers only

{
"urls": ["https://www.federalreserve.gov/", "https://www.federalreserve.gov/this-page-does-not-exist-zz.htm"],
"method": "HEAD",
"maxBodyKb": 0,
"maxRequests": 1000
}

Status, redirects and timing for each link.

Input fields:

FieldMeaning
urlslinks sent with the default method and headers.
requestsobjects with url, method, headers, json or body, label.
method, headers, bodydefaults for every request.
parseJsonparse JSON bodies (default true).
maxBodyKbbody kept per row (default 512 KB; 0 = none).
saveFullBodystore longer bodies whole, up to 200 MB (default false).
followRedirectsfollow up to 8 redirects (default true).
timeoutSecs, retries, maxConcurrencyper-request timeout (30 s), retries (2) and parallel requests (10).
maxRequestssend at most this many requests (default 1,000). Each response received is billed.

🧾 JSON sample record

{
"record_id": "38fa70d79b5d5f6cc7116bc1",
"position": 1,
"label": "echo",
"method": "POST",
"url": "https://postman-echo.com/post?api_key=[redacted]",
"final_url": "https://postman-echo.com/post?api_key=[redacted]",
"status_code": 200,
"ok": true,
"reason": "OK",
"redirects": 0,
"elapsed_ms": 28,
"content_type": "application/json; charset=utf-8",
"bytes": 815,
"response_headers": {
"date": "Sat, 17 Oct 2026 03:54:06 GMT",
"content-type": "application/json; charset=utf-8",
"transfer-encoding": "chunked",
"connection": "keep-alive",
"etag": "W/\"32f-hZDzd+WEgkx9PUAvGeVc63axcj4\"",
"vary": "Accept-Encoding",
"x-envoy-upstream-service-time": "5",
"cf-cache-status": "DYNAMIC",
"content-encoding": "gzip",
"server": "cloudflare",
"cf-ray": "a4bc5c2d0e0e86f1-IAD",
"set-cookie": "[present, not shown]"
},
"body_text": null,
"body_json": {
"args": {
"api_key": "dummy-not-secret"
},
"data": {
"hello": "world"
},
"files": {},
"form": {},
"headers": {
"host": "postman-echo.com",
"content-type": "application/json",
"authorization": "Bearer dummy-not-secret",
"accept": "*/*",
"x-forwarded-proto": "https",
"user-agent": "Mozilla/5.0 (compatible; NexGenSignal/1.0; +https://apify.com/nexgensignal)",
"content-length": "18",
"accept-encoding": "gzip, br",
"cookie": "__cf_bm=ibm2yTyf9BBsiylR_jnFeA_gDtdaUzMc8ZsG82t6NsU-1792209246.2340958-1.0.1.1-JFRDWbWNxmXFFywiHobYkCfvI2BHJYhhdBhnliExnh9gjPLl.1V6SCeWa9DiXFEhEm42dcGofwFybYRvjourR.5aHBjcvp1hm_7_fBBQ611txmlb_j.LSq.Lv2pVzDcB; _cfuvid=s1m_yXNBGYnVgxl75dFSqBLyPvLjHwPHtSg56o1e6AY-1792209246.2340958-1.0.1.1-gj36F5GtHH0C_35r8QuMmCNKTJJtpVSSNFNWl0JvkZY"
},
"json": {
"hello": "world"
},
"url": "https://postman-echo.com/post?api_key=dummy-not-secret"
},
"body_truncated": false,
"body_file_url": null,
"sha256": "6958b0b65467b5accb9382caa59b00958fb3f938aec815f4abd3fd5513617e42",
"requested_at": "2026-10-17T03:54:06.246Z"
}

🔧 How it works

Requests use one connection pool with HTTP keep-alive. Header names and values are checked (no line breaks), and Host, Content-Length, Transfer-Encoding and Connection headers are set by the client, not taken from input. Secret-looking headers (Authorization, Cookie, API keys, tokens) and secret query values are replaced with [redacted] in the run receipt and in the URLs stored in rows.

Every run reads each host's robots.txt first: a path it disallows is skipped, listed in the run receipt and never charged. Only public internet addresses are fetched (no private, loopback or cloud-metadata addresses, checked again on every redirect). No logins, no CAPTCHA solving, no proxies.

Delivery is pushed first and charged after. The run receipt (RUN_RECEIPT) lists outcomes by status, every request that got no response or was skipped, the robots.txt result per host, and the delivered and charged counts.

💰 Pricing example

Per response delivered, no start fee, no monthly charge:

Apify planPrice per response
Free$0.05
Bronze$0.045
Silver$0.04
Gold, Platinum, Diamond$0.0335
  • 10 responses: $0.50 on the Free plan, $0.335 on Gold.
  • 1,000 responses: $50.00 on Free, $33.50 on Gold.
  • 10,000 responses: $500.00 on Free, $335.00 on Gold.

Coverage and size. Proof runs on 17 Oct 2026: 40 USGS API calls answered in about 6 seconds; a missing Federal Reserve page came back as a 404 row; api.weather.gov was skipped because its robots.txt disallows all paths.

Use it only with APIs and sites you are allowed to call, within their rate limits and terms. Every run reads each host's robots.txt first: a path it disallows is skipped, listed in the run receipt and never charged. Only public internet addresses are fetched (no private, loopback or cloud-metadata addresses, checked again on every redirect). No logins, no CAPTCHA solving, no proxies.

❓ FAQ

Is a 404 or 500 billed? Yes: it is a response and gets a row. Requests with no response at all are not billed.

Are my tokens stored? Not in the run receipt or in stored URLs. They are sent to the URL you chose, and a service that echoes them back will put them in its response body.

Can it call localhost or internal IPs? No. Only public internet addresses.

🆘 Troubleshooting

  • skipped: robots.txt disallows this path — That host's robots.txt blocks it; the request was not sent or billed.
  • body_truncated is true — Raise maxBodyKb or turn on saveFullBody.
  • SOURCE UNAVAILABLE — No request got a response after retries. Nothing was charged.

🏢 About NexGen Signal — data tools and official-source data products on Apify. Browse the catalog: apify.com/nexgensignal

⭐ Found this useful?

If this actor saved you time, a rating on its Apify Store page helps other buyers find it.

Part of NexGen Signal — data tools and official-source data products.