HTTP Request Runner — Bulk & Proxied avatar

HTTP Request Runner — Bulk & Proxied

Pricing

$3.00 / 1,000 successful requests

Go to Apify Store
HTTP Request Runner — Bulk & Proxied

HTTP Request Runner — Bulk & Proxied

Send hundreds of GET, POST, PUT or DELETE requests through datacenter or residential proxies and get status, headers, body and timing per URL.

Pricing

$3.00 / 1,000 successful requests

Rating

0.0

(0)

Developer

Andrew

Andrew

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

9 days ago

Last modified

Categories

Share

Send hundreds or thousands of GET, POST, PUT, PATCH, DELETE or HEAD requests in one run — through Apify datacenter or residential proxies, with browser-like TLS fingerprints and headers, automatic retries with IP rotation, and configurable concurrency. Every request comes back as one dataset row with status code, response headers, body and timing.

Blocked and failed requests are free. You only pay for rows that return a 2xx or 3xx status. A 403, 429, 5xx, timeout or DNS failure is still recorded in the dataset so you can see what happened, but it is never charged.

What you get

One row per request, containing:

  • statusCode, statusText, ok — the HTTP outcome (ok is true for 2xx/3xx)
  • headers — the full response header object (optional)
  • body — the response as text, parsed JSON or base64 (for images, PDFs and other binaries)
  • bodyLength, bodyTruncated, bodyParseError — so you always know whether you got the whole thing
  • durationMs (final attempt) and totalDurationMs (including retries), attempts, redirectCount, finalUrl
  • proxyUseddatacenter, residential, custom or none
  • error — a clear message for blocked, timed-out, invalid or refused requests
  • keyValueStoreUrl — a link to the full, untruncated body when you enable saving to the key-value store
  • index and label — to match rows back to your input, even though results stream in as they finish

Use cases

  • API scraping and bulk data pulls — hit paginated JSON endpoints, sitemaps or feeds in parallel and export straight to CSV, JSON or Google Sheets
  • Uptime, geo and block testing — check how a list of URLs responds from datacenter vs residential IPs, or from a specific country
  • Webhook and form submission — POST JSON or form bodies to hundreds of endpoints with per-request headers and payloads
  • Link checking and redirect auditing — collect status codes, redirect chains and final URLs for every link on your site
  • Pre-flight for scrapers — see which targets serve real content, which ones block, and how long they take before you build a full crawler

How to use

  1. Simple mode: paste your URLs into URLs — one request per line, all using the shared Method, Headers and Body.
  2. Advanced mode: put an array of request objects into Requests:
    [
    { "url": "https://api.example.com/items?page=1", "label": "page-1" },
    { "url": "https://api.example.com/items", "method": "POST", "headers": { "Authorization": "Bearer …" }, "body": { "name": "test" }, "label": "create" }
    ]
    A JSON object body is sent as application/json automatically. Both lists can be used together.
  3. Pick a Proxy. Apify datacenter proxy is the default; choose the RESIDENTIAL group (and optionally a country) for targets that block datacenter IPs, or paste your own proxy URLs. Every retry rotates to a fresh proxy session.
  4. Tune Concurrency (1–50), Max retries, Retry on statuses and Request timeout for your target.
  5. Choose a Response format: text, json (parsed into an object) or base64 (binary files).
  6. Run the actor. Rows appear in the Dataset tab as requests complete — sort by index to restore input order.

Large or binary responses

Bodies are truncated at Max body characters (default 500,000). Turn on Save bodies to key-value store to also keep every complete response as a record named <index>-<url-slug> in the run's key-value store; the row's keyValueStoreUrl links straight to it.

Long runs

If the run approaches its timeout, the actor stops starting new requests, logs which indexes were not attempted and writes them to the NOT_ATTEMPTED record in the key-value store so you can re-run just those. Up to 10,000 requests are accepted per run; use Max requests to process only the first N.

Output format

{
"index": 0,
"label": "page-1",
"url": "https://api.example.com/items?page=1",
"finalUrl": "https://api.example.com/items?page=1",
"method": "GET",
"statusCode": 200,
"statusText": "OK",
"ok": true,
"headers": { "content-type": "application/json", "cache-control": "no-cache" },
"contentType": "application/json",
"body": { "items": [ { "id": 1 } ], "next": 2 },
"bodyLength": 4821,
"bodyTruncated": false,
"bodyParseError": null,
"durationMs": 412,
"totalDurationMs": 412,
"attempts": 1,
"redirectCount": 0,
"proxyUsed": "datacenter",
"error": null,
"keyValueStoreUrl": null,
"fetchedAt": "2026-09-06T03:21:44.120Z"
}

A blocked request looks like this and is not charged:

{
"index": 1,
"url": "https://example.com/protected",
"statusCode": 403,
"statusText": "Forbidden",
"ok": false,
"attempts": 3,
"proxyUsed": "residential",
"error": "HTTP 403 Forbidden"
}

Pricing

Pay per successful result: one request-result event for each row with a 2xx or 3xx status. Rows with 4xx/5xx responses, network errors, timeouts, invalid URLs or refused targets cost nothing.

Limits and safety

  • Only http:// and https:// URLs are accepted.
  • Requests to localhost, private networks (10/8, 172.16/12, 192.168/16, 169.254/16, IPv6 loopback and ULA) and cloud metadata hosts are refused with a clear per-row error.
  • GET and HEAD requests never send a body.
  • Redirects are followed up to 10 hops.