HTTP Request avatar

HTTP Request

Pricing

from $0.20 / 1,000 responses

Go to Apify Store
HTTP Request

HTTP Request

Call any public API, one endpoint or thousands per run, and get one tidy row per call: status, headers, decoded body, timing and typed errors. Retries, proxy and webhook delivery included. Works with Clay, n8n, Make, Zapier and AI agents.

Pricing

from $0.20 / 1,000 responses

Rating

0.0

(0)

Developer

Data Xplorer

Data Xplorer

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

8 days ago

Last modified

Share

HTTP Request calls any public API for you and hands back a tidy table: one row per call, with the status, the headers, the decoded body, the time it took and, when it fails, the exact reason. Make a single call or 10,000 in one run. Works with Clay, n8n, Make, Zapier and AI agents.

๐ŸŒ What is HTTP Request?

It is an HTTP client hosted on Apify. Instead of writing a script, you describe the calls you want (address, method, headers, body) and the Actor performs them in parallel, retries the ones that fail for a temporary reason, and stores every answer in a dataset.

From there you can download the results as JSON, CSV or Excel, read them from your code, or have each row pushed to a webhook.

โœจ What can this HTTP request tool do?

  • ๐Ÿ“ฆ Thousands of calls per run: up to 10,000, with up to 50 running in parallel
  • ๐Ÿ”ข Results in your order: the first row is your first request, whatever finished first
  • ๐Ÿงฐ All the usual methods: GET, POST, PUT, PATCH, DELETE, HEAD and OPTIONS, with a JSON or text payload
  • ๐Ÿ—‚๏ธ Defaults for the whole list: write an API key once, and let any request replace or drop it
  • ๐Ÿ”— List parameters done right: {"tag": ["a", "b"]} goes out as tag=a&tag=b
  • ๐Ÿ” Retries with judgement: temporary failures (network trouble, 429, 5xx) get new tries with growing pauses, and Retry-After is honoured. Final answers such as 404 or 401 come back immediately
  • ๐Ÿ“„ Any kind of answer: JSON becomes structured data, text stays text, files and images arrive as base64
  • โ†ช๏ธ Redirects made visible: each row shows where the call ended up and how many hops it took
  • ๐Ÿšจ Named failures: dns_error, timeout, connection_error, tls_error, proxy_error... so you know what to fix
  • ๐Ÿ“ฌ Webhook delivery: rows can be posted to your endpoint one by one, while the run is still going
  • ๐ŸŒ Proxy on demand: appear in the country you choose or vary the outgoing IP address
  • ๐Ÿ”’ Credentials masked: keys, tokens and cookies never show in the dataset, yet the API receives them intact
  • ๐Ÿ’ธ Billing on answers only: a call that gets no HTTP response costs nothing, and neither do retries

๐Ÿ’ก What is it used for?

  • ๐Ÿงฑ Enrichment in Clay: query an API that Clay has no connector for, once per row, and bring the answer back into the table
  • โš™๏ธ Loops in n8n, Make and Zapier: replace a slow loop of HTTP modules by one Actor run that returns every answer together
  • ๐Ÿ“ˆ Uptime and contract checks: put your endpoints on a schedule and watch statusCode and durationMs over time
  • ๐Ÿ“ฃ Notifications to several systems: deliver one event to a list of webhooks, each with its own credentials
  • ๐Ÿ—บ๏ธ Localised data: read the price, stock or ranking an API serves to visitors of a given country
  • ๐Ÿค– Tools for AI agents: let an agent reach any REST API through a single, predictable tool

๐Ÿš€ How to send HTTP requests in bulk

  1. Click Try for free and open the Input tab.
  2. List your calls in Requests. A URL is enough for a GET.
  3. Put what the calls have in common (API key, shared parameters) in the section below, once.
  4. Press Start.
  5. Open the Output tab: there is one row per call, in the order of your list.
  6. Export the table, fetch it through the API, or fill in Webhook URL before starting to receive rows live.

For a single call, leave Requests empty and fill in URL.

๐Ÿ’ฐ How much does it cost to send HTTP requests?

The price is per HTTP response received, and it includes platform usage.

EventFreeBronzeSilverGold
1,000 responses$0.30$0.27$0.24$0.20
1,000 responses through a proxy$1.00$0.90$0.80$0.70
Run start$0.00005

The proxy price is the same for datacenter and residential proxies.

๐ŸŽ Never billed:

  • extra tries of the same call
  • calls that end without an HTTP response (unknown domain, timeout, refused connection, address not allowed)
  • entries that could not be sent (invalid URL, run timeout or spending cap reached)
Calls answeredFree plan, no proxy
1$0.00035
100$0.03
1,000$0.30
10,000$3.00

Every Apify account receives free credits each month, which cover thousands of calls. If you set a maximum cost in the run options, the Actor stops sending when the cap is reached and marks the remaining entries as skipped_charge_limit.

โฌ‡๏ธ Input

FieldDescription
RequestsYour list of calls. Each entry is a URL or { url, method, headers, params, body, id }.
URLAddress for a single call, or default address of the entries.
MethodGET by default.
HeadersSent with every call. An entry can replace one, or remove it with null.
Query parametersAppended to the address. A list repeats the name.
BodyJSON payload for write calls. A string is accepted through the API.
Parallel calls1 to 50, 10 by default.
Timeout1 to 300 seconds per try.
Retries0 to 10 new tries, 2 by default.
Statuses worth retrying408, 425, 429, 500, 502, 503, 504 by default.
Follow redirects, Redirect limitUp to 20 hops, or none at all.
Decode JSONStructured data, or raw string.
Size limit per response1 MB by default, 10 MB at most. With a residential proxy: 100 kB.
Mask credentials in resultsEnabled by default.
Webhook URLReceives each row as it is produced.
ProxyApify Proxy (country and group) or your own proxy servers.

A list of calls with a shared API key:

{
"headers": { "X-API-Key": "YOUR_KEY" },
"requests": [
{ "id": "acme", "url": "https://api.example.com/companies", "params": { "domain": "acme.com" } },
{ "id": "globex", "url": "https://api.example.com/companies", "params": { "domain": "globex.com" } },
{ "id": "new-contact", "url": "https://api.example.com/contacts", "method": "POST", "body": { "email": "jane@acme.com", "tags": ["lead", "2026"] } }
],
"maxConcurrency": 5
}

One call:

{
"url": "https://jsonplaceholder.typicode.com/todos/1"
}

A call seen from the United States, with rows pushed to a webhook:

{
"requests": [
{ "id": "sku-1042", "url": "https://shop.example.com/api/products/1042" }
],
"proxy": { "useApifyProxy": true, "apifyProxyCountry": "US" },
"webhookUrl": "https://your-app.example.com/hooks/http-results"
}

โฌ†๏ธ Output

FieldDescription
idThe id of your entry, or request-1, request-2...
indexRank of the entry in your list, from 0
urlAddress called, parameters included
finalUrlAddress that answered, once redirects were followed
methodHTTP method
statusCode, statusTextStatus returned by the server
oktrue when the status is between 200 and 299
requestHeadersHeaders you supplied, credentials masked
responseHeadersHeaders of the answer
bodyThe answer: structured JSON, text, or base64
bodyEncodingjson, text, base64 or none
bodyBytesSize of the answer in bytes
truncatedtrue when the size limit cut the answer
durationMsTime spent on the call, retries included
attemptsNumber of tries
redirectCountNumber of redirects followed
proxyUsedWhether the call went through a proxy
errorType, errorMessageReason, when there is no HTTP response
webhookStatusWhat your webhook answered, when one is set
fetchedAtDate and time of the call

A row for a successful POST:

{
"id": "create-post",
"index": 1,
"url": "https://jsonplaceholder.typicode.com/posts",
"finalUrl": "https://jsonplaceholder.typicode.com/posts",
"method": "POST",
"statusCode": 201,
"statusText": "Created",
"ok": true,
"requestHeaders": { "content-type": "application/json" },
"responseHeaders": { "content-type": "application/json; charset=utf-8" },
"body": { "title": "Hello", "userId": 1, "id": 101 },
"bodyEncoding": "json",
"bodyBytes": 50,
"truncated": false,
"durationMs": 212,
"attempts": 1,
"redirectCount": 0,
"proxyUsed": false,
"errorType": null,
"errorMessage": null,
"fetchedAt": "2026-10-06T21:40:07.115Z"
}

A row for a call that never got an answer:

{
"id": "old-partner",
"url": "https://api.partner-that-closed.example/v2/status",
"statusCode": null,
"ok": false,
"attempts": 1,
"errorType": "dns_error",
"errorMessage": "getaddrinfo ENOTFOUND api.partner-that-closed.example"
}
errorTypeWhat happenedNew try?
dns_errorThe domain name does not resolveOnly if the resolver itself was unavailable
timeoutThe answer did not arrive in timeYes
connection_errorThe server refused or dropped the connectionYes
tls_errorThe HTTPS certificate is not validNo
proxy_errorThe proxy failed, or your plan has no access to itYes, unless access was denied
network_errorAnother transport problemYes
blocked_urlThe address is not on the public internet, or uses a port reserved for another protocolNo
too_many_redirectsThe redirect limit was exceededNo
invalid_requestThe entry has no valid URL or an unknown methodNo
skipped_timeoutThe run was about to time out before this entryNo
skipped_charge_limitYour spending cap was reached before this entryNo

๐Ÿงฉ How to use HTTP Request with Clay, n8n, Make and Zapier

Any tool able to send a POST can drive the Actor. This endpoint launches a run and replies with the rows once they are ready:

POST https://api.apify.com/v2/acts/data_xplorer~http-request/run-sync-get-dataset-items
  • Clay: make one run per table row with url, your headers and an id, then map fields of the returned body to columns.
  • n8n, Make, Zapier: turn your items into the requests list, launch one run, then iterate over the rows. Since the order is kept, row N belongs to item N.
  • Large lists: fill in Webhook URL and let your scenario be triggered by each row, instead of keeping a connection open until the end.

n8n, Make and Zapier also have an Apify app, if you prefer modules to raw calls.

๐Ÿ”Œ Can I use HTTP Request as an API?

Yes, through the Apify API or the Apify clients.

cURL:

curl -X POST "https://api.apify.com/v2/acts/data_xplorer~http-request/run-sync-get-dataset-items" \
-H "Authorization: Bearer <YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"requests":["https://jsonplaceholder.typicode.com/todos/1","https://jsonplaceholder.typicode.com/users/1"]}'

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("data_xplorer/http-request").call(run_input={
"requests": [
{"id": "todo", "url": "https://jsonplaceholder.typicode.com/todos/1"},
{"id": "user", "url": "https://jsonplaceholder.typicode.com/users/1"},
],
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["id"], row["statusCode"], row["durationMs"])

Node.js:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('data_xplorer/http-request').call({
requests: [
{ id: 'todo', url: 'https://jsonplaceholder.typicode.com/todos/1' },
{ id: 'user', url: 'https://jsonplaceholder.typicode.com/users/1' },
],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const row of items) console.log(row.id, row.statusCode, row.durationMs);

๐Ÿค– Use HTTP Request with AI agents (MCP)

Through the Apify MCP server, assistants such as Claude, Cursor or VS Code can use this Actor as a tool. The agent decides which endpoints to call, and gets back structured rows it can reason on, including a named error when a call fails.

Server URL restricted to this Actor:

https://mcp.apify.com?tools=data_xplorer/http-request

Claude Code:

$claude mcp add --transport http http-request "https://mcp.apify.com?tools=data_xplorer/http-request"

MCP config file of Cursor, VS Code and similar clients:

{
"mcpServers": {
"http-request": {
"url": "https://mcp.apify.com?tools=data_xplorer/http-request"
}
}
}

Things you can ask:

  • "Fetch these 15 product endpoints and list the ones whose price changed since my last note."
  • "Are all the URLs in this sitemap answering with a 200? Give me the broken ones and why."
  • "Send this JSON to my staging webhook and show me what it replies."

๐Ÿ›ก๏ธ Safety

  • Only addresses on the public internet can be called. Loopback, private networks and reserved ranges are refused, and the check is repeated on every redirect and on the IP address the name resolves to.
  • When a redirect leaves the original site, your Authorization header and cookies stay behind.
  • Results are safe to share: credentials are masked unless you decide otherwise.

โ“ FAQ

๐Ÿ“ฆ How many calls fit in one run?

10,000. Rows are written to the dataset in groups while the run is going, so a long list is never held back until the end.

๐Ÿ”ข Is the order of the results guaranteed?

Yes. Calls are made in parallel, but rows are stored in the order of your list. index and id are there as well if you sort or filter later.

๐Ÿ” What if the API replies 429 or 503?

Those two are treated as temporary. The Actor pauses, longer after each failure, and follows Retry-After when the API provides it (15 seconds at most). After the last try you receive the answer as it is, billed as one response.

๐Ÿ”‘ How do I pass an API key?

In Headers (for instance X-API-Key or Authorization) or in Query parameters, depending on the API. It reaches the API unchanged and is masked in the stored results.

๐Ÿช Can I read the cookies a server sets?

Yes: disable Mask credentials in results and set-cookie appears in responseHeaders.

๐Ÿ“Ž Can it download a file?

Yes, within the size limit. Its content is in body as base64, and bodyEncoding says so.

๐Ÿ–ฅ๏ธ Does it run JavaScript or sign in to websites?

No. It speaks plain HTTP, which is all an API needs and the reason it is quick and inexpensive. Pages that depend on a browser call for a scraper built for them.

๐ŸŒ Which proxy countries can I pick?

The ones offered by the proxy groups of your Apify plan. If a country is not available to you, the row says so with a proxy_error.

๐Ÿ›Ÿ Something is missing or broken. What now?

Tell us in the Issues tab. Every report gets an answer.

๐Ÿ”— Other tools you may like