HTTP Request Runner: Single or Bulk API Calls with curl Import avatar

HTTP Request Runner: Single or Bulk API Calls with curl Import

Pricing

from $0.61 / 1,000 http responses

Go to Apify Store
HTTP Request Runner: Single or Bulk API Calls with curl Import

HTTP Request Runner: Single or Bulk API Calls with curl Import

Send one API call or thousands per run. Paste curl commands, fill URL templates from your rows, follow pagination, retry safely and extract JSON fields. Works with Clay, n8n, Make and Zapier. Private and cloud-metadata addresses are always blocked, so agents can use it safely.

Pricing

from $0.61 / 1,000 http responses

Rating

0.0

(0)

Developer

GetAScraper

GetAScraper

Maintained by Community

Actor stats

0

Bookmarked

63

Total users

27

Monthly active users

4 days ago

Last modified

Share

๐Ÿ”Œ HTTP Request Runner: Single or Bulk API Calls with curl Import

One API call or ten thousand, one clean row per response
Fill a URL, paste a curl command, or map a list of rows. Get status, JSON, timing and errors back in a table your workflow can read.
๐Ÿ“‹ curl in, request out
Paste what DevTools or Postman gave you. Several commands at once work too.
๐Ÿงฉ Rows become requests
Use a URL template, a lookup key and field extraction to join answers back to your table.
๐Ÿ“„ Walks every page
Page numbers, offsets, next links and cursors, with each page returned as its own row.
๐Ÿ›ก๏ธ Safe by default
Private network and cloud-metadata addresses are always blocked, and tokens stay encrypted.

Run a single request from a form, or send a whole list in one run. Every request returns a row with the status code, parsed JSON, selected fields, redirect chain, timing and a plain-language failure reason. Retries, rate limits and concurrency are handled for you, so your pipeline, monitor or AI agent only reads the results.

๐ŸŽฏ Common workflows

  • Clay, n8n, Make and Zapier builders: Map your row to url, headers, params and data, add a rowId, and join the answer back to the row. Use callbackUrl to push each result to a webhook as it finishes.
  • Bulk enrichment: Put https://api.example.com/users/{{id}} in the URL template, list your ids, and get one response per id with the fields you picked.
  • QA and uptime checks: Run a list of endpoints on a schedule and filter on assertionPassed when you set expected status codes or expected text.
  • AI agents and MCP tools: Give your agent one tool that can call any API. A single request needs only a URL, and unsafe targets are refused before anything is sent.
  • Data teams: Page through an API that returns thousands of records and land every page as a row you can export.

๐Ÿš€ How to use it

STEP 1
Describe the call
Fill the URL, paste curl commands, add a list of URLs, or use a template with rows.
STEP 2
Set the rules
Concurrency, retries, pagination, field extraction and proxy are all optional.
STEP 3
Read the rows
Download JSON, CSV or Excel, call the API, or receive each row on your webhook.

๐Ÿ“ฅ Input

Fill url, or use any of the batch fields. Nothing is required, and no account or key is needed to call public APIs. If the API you call needs credentials, you pass your own.

FieldTypeRequiredDescription
urlstringConditionalThe address to call for a single request.
methodenumNoGET, POST, PUT, PATCH, DELETE, HEAD or OPTIONS. A body with GET selected is sent as POST.
headersobject (secret)NoRequest headers for every request in the run. Stored encrypted and hidden in saved tasks.
paramsobjectNoQuery-string parameters added to the URL.
dataobjectNoJSON body, or a form body when the content type says so.
rowIdstringNoAn identifier echoed back on the result row as lookupKey.
requestsarrayConditionalRequest objects with id, label, url, method, headers, params, data, expectedStatusCodes and expectedBodyContains.
urlsarray of URLsConditionalA list of URLs to fetch, typed, pasted or uploaded as a text file.
urlTemplatestringConditionalA URL with {{placeholders}}, one request per row in templateValues.
templateValuesarrayConditionalPlain values or objects that fill the placeholders. They also work in headers and the body.
curlCommandstring (secret)ConditionalOne or more curl commands to import as requests. Stored encrypted and hidden in saved tasks.
paginationModeenumNonone, pageNumber, offset, nextUrl or cursor.
maxPagesintegerNoPages to fetch per request when pagination is on.
pageParam, pageStart, pageSizestring, integerNoWhich parameter carries the page, where it starts and the offset step.
nextPagePath, stopWhenEmptyPathstringNoWhere to find the next link or cursor, and which list ends the paging when it is empty.
maxConcurrencyintegerNoRequests running at the same time.
requestsPerSecondintegerNoExtra rate limit on top of concurrency. 0 disables it.
dedupeRequestsbooleanNoSkip requests that repeat the same method, URL and body.
timeoutSecsintegerNoSeconds to wait per attempt.
maxRetriesintegerNoExtra attempts after a network error or retryable status.
retryOnStatusCodesarray of integersNoStatus codes worth retrying.
retryUnsafeMethodsbooleanNoAlso retry POST and PATCH after server errors. Off by default so nothing is sent twice.
followRedirects, maxRedirectsboolean, integerNoFollow redirects, and how many hops.
ignoreTlsErrorsbooleanNoAccept self-signed or expired certificates on trusted staging servers.
parseJsonbooleanNoParse JSON responses into a structured json field.
extractobjectNoMap output names to paths, such as {"title": "data.title"}.
bodyModeenumNoauto, none (status and timing only) or keyValueStore (always save the full body).
maxResponseBytesintegerNoInline body size before a body is cut.
saveOversizedBodyToKeyValueStorebooleanNoSave big and binary bodies instead of cutting them.
includeResponseHeadersbooleanNoAdd response headers to each row.
failOnErrorStatusbooleanNoFill the error field for non-2xx responses.
expectedStatusCodes, expectedBodyContainsarray, stringNoChecks that set assertionPassed on each row.
authTypeenumNonone, bearer or basic, applied to requests without their own Authorization header.
authBearerToken, authBasicUsername, authBasicPasswordstring (secret)NoCredentials for the default authentication.
secretHeadersobject (secret)NoHeaders with keys or tokens. Stored encrypted and masked in results.
proxyConfigurationobjectNoOptional Apify Proxy settings with groups and country. Off by default.
proxyRoutingenumNoalways, or fallback to try direct first and use the proxy only when blocked.
proxyRotationenumNoA new IP per request, or one IP for the whole run.
clientProfileenumNoWhich browser identity to present, or none to send only your headers.
callbackUrl, callbackHeadersstring, object (secret)NoPOST each row to your endpoint as it completes.

Single request

{
"url": "https://api.example.com/orders",
"method": "POST",
"secretHeaders": { "X-API-Key": "your-key" },
"data": { "orderId": 42 },
"rowId": "row-42",
"extract": { "status": "data.status" }
}

Rows from a template with pagination

{
"urlTemplate": "https://api.example.com/users/{{id}}/orders",
"templateValues": [{ "id": 1 }, { "id": 2 }, { "id": 3 }],
"paginationMode": "pageNumber",
"maxPages": 5,
"stopWhenEmptyPath": "results"
}

Curl import

{
"curlCommand": "curl -X POST https://api.example.com/orders -H 'Content-Type: application/json' -d '{\"orderId\":42}'"
}

๐Ÿ“ค Output

One row per response:

{
"lookupKey": "row-42",
"requestedUrl": "https://api.example.com/orders",
"finalUrl": "https://api.example.com/orders",
"method": "POST",
"statusCode": 200,
"ok": true,
"isBroken": false,
"contentType": "application/json",
"json": { "data": { "status": "shipped" } },
"extracted": { "status": "shipped" },
"bodyBytes": 31,
"bodyTruncated": false,
"durationMs": 214,
"attempts": 1,
"fetchedAt": "2026-10-22T09:00:43.126Z"
}

Three dataset views are ready in the Output tab: Responses for status and timing, Response Bodies for payloads and extracted fields, and Redirects & Errors for chains and failures. A run summary with success rate, status breakdown, failure reasons and average response time is saved next to your results. Requests that were refused before sending, such as a blocked address, are listed with the reason in the NOT-SENT record and are never charged.

Field reference

FieldTypeDescription
requestId, lookupKey, labelstringYour own identifiers, echoed back for joining results to source rows.
requestIndex, source, pageNumberinteger, stringPosition in your input, where the request came from, and the page for paginated rows.
requestedUrl, finalUrlstringThe URL you sent and the URL after any redirects. Secret-looking query values are masked.
methodstringHTTP method used.
statusCode, statusTextinteger, stringResponse status. Missing when no response arrived.
okbooleantrue for 2xx responses.
isBrokenbooleantrue for 4xx, 5xx, or no response.
isRedirect, redirectChain, redirectCountboolean, array, integerWhether the request redirected, and every hop.
contentType, responseHeadersstring, objectResponse type and headers.
body, bodyEncodingstringRaw text, or base64 for binary content.
json, extractedobjectParsed JSON and the fields you asked for.
bodyBytes, bodyTruncated, bodyStoredKeyinteger, boolean, stringSize, whether the inline copy was cut, and the link to the full body.
assertionPassedbooleanResult of your expected status and text checks.
durationMs, timings, attemptsinteger, objectTotal time, connection phases and attempts made.
usedProxybooleanWhether the request went through the proxy.
failureReason, errorType, errorMessage, errorstringWhy no response arrived: timeout, dns, connection, tls, blocked-target, too-many-redirects or invalid-request.
fetchedAtstringTimestamp the request completed.

๐Ÿ’ฐ Pricing

This Actor is pay per result. You are charged for each response row, whether the server answered with a success or an error. Requests refused before sending and empty runs cost nothing beyond the fixed start fee. There is no subscription, and larger Apify plans get lower rates.

Free Apify plans can send up to 250 requests per run. Paid plans have no run limit.

โญ Enjoying HTTP Request Runner?

โญ โญ โญ โญ โญ
If this Actor saved you from writing retry, paging and mapping code, leave a rating.
A 5-star rating takes 10 seconds and helps other pipeline builders and agent developers find it. Your feedback also tells us what to build next.
โ˜…ย ย Rate this Actor on Apify

๐Ÿ›ก๏ธ Tips and limits

  • Requests run up to maxConcurrency at a time. Add requestsPerSecond when a target rejects bursts even at low concurrency. A Retry-After header from the server is respected.
  • retryOnStatusCodes defaults to codes worth retrying (408, 425, 429, 500, 502, 503, 504). Other 4xx codes mean the request itself is wrong, so they are not retried.
  • POST and PATCH are only retried when the server clearly did not process them, so an order or payment is never sent twice by accident.
  • Private network, loopback and cloud-metadata addresses are refused, including after redirects. Only http and https URLs are accepted.
  • Response bodies are held in memory while they are read. At the default run memory, bodies up to a few megabytes are kept in full. Raise the run memory in the run options to keep larger files.
  • Residential proxy routing reads at most 64 KB of each response. Datacenter routing and direct calls have no such limit.
  • You are responsible for the APIs you call and for following their terms.

โ“ FAQ

Can I import a request straight from my browser or Postman?

Yes. Copy the curl command and paste it into curlCommand. Paste several commands one after another and each becomes its own request.

How do I use it from Clay, n8n or Make?

Map your row fields to url, headers, params and data, and set rowId to your row id. Each run returns the same lookupKey on the result so you can join it back. Set callbackUrl to receive rows on a webhook as they complete.

What happens when a request fails?

It retries according to maxRetries and retryOnStatusCodes. The row is still saved with isBroken: true, a failureReason and an errorMessage, so failures never disappear from your results.

Does a 404 or 500 fail the run?

No. The server's answer is a valid result and you get the status code back. A run only ends with a message instead of results when the input has no usable request, and that run costs nothing.

๐Ÿ”— Other actors