# HTTP Request Runner: Single or Bulk API Calls with curl Import (`getascraper/http-request-runner`) Actor

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.

- **URL**: https://apify.com/getascraper/http-request-runner.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 68 total users, 19 monthly users, 99.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.61 / 1,000 http responses

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

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

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#E6F5F3;border:1px solid #B8E0DB;border-top:4px solid #0F766E;color:#1C1917;border-radius:10px 10px 0 0">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">One API call or ten thousand, one clean row per response</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">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.</span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8E0DB;vertical-align:top;border-top:none;color:#1C1917;border-radius:0 0 0 10px">
<span style="font-size:15px;font-weight:800;color:#0B5A54">📋 curl in, request out</span><br>
<span style="font-size:12px;color:#57534E">Paste what DevTools or Postman gave you. Several commands at once work too.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8E0DB;border-left:none;vertical-align:top;border-top:none;color:#1C1917">
<span style="font-size:15px;font-weight:800;color:#0B5A54">🧩 Rows become requests</span><br>
<span style="font-size:12px;color:#57534E">Use a URL template, a lookup key and field extraction to join answers back to your table.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8E0DB;border-left:none;vertical-align:top;border-top:none;color:#1C1917">
<span style="font-size:15px;font-weight:800;color:#0B5A54">📄 Walks every page</span><br>
<span style="font-size:12px;color:#57534E">Page numbers, offsets, next links and cursors, with each page returned as its own row.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8E0DB;border-left:none;vertical-align:top;border-top:none;color:#1C1917;border-radius:0 0 10px 0">
<span style="font-size:15px;font-weight:800;color:#0B5A54">🛡️ Safe by default</span><br>
<span style="font-size:12px;color:#57534E">Private network and cloud-metadata addresses are always blocked, and tokens stay encrypted.</span>
</td>
</tr>
</table>

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

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0">
<tr>
<td style="padding:16px 14px;width:33%;background:#E6F5F3;border:1px solid #B8E0DB;border-radius:10px 0 0 10px;vertical-align:top;color:#1C1917">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Describe the call</span><br>
<span style="font-size:12px;color:#57534E">Fill the URL, paste curl commands, add a list of URLs, or use a template with rows.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#E6F5F3;border:1px solid #B8E0DB;border-left:none;vertical-align:top;color:#1C1917">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Set the rules</span><br>
<span style="font-size:12px;color:#57534E">Concurrency, retries, pagination, field extraction and proxy are all optional.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#E6F5F3;border:1px solid #B8E0DB;border-left:none;border-radius:0 10px 10px 0;vertical-align:top;color:#1C1917">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Read the rows</span><br>
<span style="font-size:12px;color:#57534E">Download JSON, CSV or Excel, call the API, or receive each row on your webhook.</span>
</td>
</tr>
</table>

### 📥 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.

| Field | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| `url` | string | Conditional | The address to call for a single request. |
| `method` | enum | No | `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `HEAD` or `OPTIONS`. A body with `GET` selected is sent as `POST`. |
| `headers` | object (secret) | No | Request headers for every request in the run. Stored encrypted and hidden in saved tasks. |
| `params` | object | No | Query-string parameters added to the URL. |
| `data` | object | No | JSON body, or a form body when the content type says so. |
| `rowId` | string | No | An identifier echoed back on the result row as `lookupKey`. |
| `requests` | array | Conditional | Request objects with `id`, `label`, `url`, `method`, `headers`, `params`, `data`, `expectedStatusCodes` and `expectedBodyContains`. |
| `urls` | array of URLs | Conditional | A list of URLs to fetch, typed, pasted or uploaded as a text file. |
| `urlTemplate` | string | Conditional | A URL with `{{placeholders}}`, one request per row in `templateValues`. |
| `templateValues` | array | Conditional | Plain values or objects that fill the placeholders. They also work in headers and the body. |
| `curlCommand` | string (secret) | Conditional | One or more curl commands to import as requests. Stored encrypted and hidden in saved tasks. |
| `paginationMode` | enum | No | `none`, `pageNumber`, `offset`, `nextUrl` or `cursor`. |
| `maxPages` | integer | No | Pages to fetch per request when pagination is on. |
| `pageParam`, `pageStart`, `pageSize` | string, integer | No | Which parameter carries the page, where it starts and the offset step. |
| `nextPagePath`, `stopWhenEmptyPath` | string | No | Where to find the next link or cursor, and which list ends the paging when it is empty. |
| `maxConcurrency` | integer | No | Requests running at the same time. |
| `requestsPerSecond` | integer | No | Extra rate limit on top of concurrency. `0` disables it. |
| `dedupeRequests` | boolean | No | Skip requests that repeat the same method, URL and body. |
| `timeoutSecs` | integer | No | Seconds to wait per attempt. |
| `maxRetries` | integer | No | Extra attempts after a network error or retryable status. |
| `retryOnStatusCodes` | array of integers | No | Status codes worth retrying. |
| `retryUnsafeMethods` | boolean | No | Also retry `POST` and `PATCH` after server errors. Off by default so nothing is sent twice. |
| `followRedirects`, `maxRedirects` | boolean, integer | No | Follow redirects, and how many hops. |
| `ignoreTlsErrors` | boolean | No | Accept self-signed or expired certificates on trusted staging servers. |
| `parseJson` | boolean | No | Parse JSON responses into a structured `json` field. |
| `extract` | object | No | Map output names to paths, such as `{"title": "data.title"}`. |
| `bodyMode` | enum | No | `auto`, `none` (status and timing only) or `keyValueStore` (always save the full body). |
| `maxResponseBytes` | integer | No | Inline body size before a body is cut. |
| `saveOversizedBodyToKeyValueStore` | boolean | No | Save big and binary bodies instead of cutting them. |
| `includeResponseHeaders` | boolean | No | Add response headers to each row. |
| `failOnErrorStatus` | boolean | No | Fill the `error` field for non-2xx responses. |
| `expectedStatusCodes`, `expectedBodyContains` | array, string | No | Checks that set `assertionPassed` on each row. |
| `authType` | enum | No | `none`, `bearer` or `basic`, applied to requests without their own Authorization header. |
| `authBearerToken`, `authBasicUsername`, `authBasicPassword` | string (secret) | No | Credentials for the default authentication. |
| `secretHeaders` | object (secret) | No | Headers with keys or tokens. Stored encrypted and masked in results. |
| `proxyConfiguration` | object | No | Optional Apify Proxy settings with groups and country. Off by default. |
| `proxyRouting` | enum | No | `always`, or `fallback` to try direct first and use the proxy only when blocked. |
| `proxyRotation` | enum | No | A new IP per request, or one IP for the whole run. |
| `clientProfile` | enum | No | Which browser identity to present, or `none` to send only your headers. |
| `callbackUrl`, `callbackHeaders` | string, object (secret) | No | POST each row to your endpoint as it completes. |

#### Single request

```json
{
    "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

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

#### Curl import

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

### 📤 Output

One row per response:

```json
{
    "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

| Field | Type | Description |
| :--- | :--- | :--- |
| `requestId`, `lookupKey`, `label` | string | Your own identifiers, echoed back for joining results to source rows. |
| `requestIndex`, `source`, `pageNumber` | integer, string | Position in your input, where the request came from, and the page for paginated rows. |
| `requestedUrl`, `finalUrl` | string | The URL you sent and the URL after any redirects. Secret-looking query values are masked. |
| `method` | string | HTTP method used. |
| `statusCode`, `statusText` | integer, string | Response status. Missing when no response arrived. |
| `ok` | boolean | `true` for 2xx responses. |
| `isBroken` | boolean | `true` for 4xx, 5xx, or no response. |
| `isRedirect`, `redirectChain`, `redirectCount` | boolean, array, integer | Whether the request redirected, and every hop. |
| `contentType`, `responseHeaders` | string, object | Response type and headers. |
| `body`, `bodyEncoding` | string | Raw text, or base64 for binary content. |
| `json`, `extracted` | object | Parsed JSON and the fields you asked for. |
| `bodyBytes`, `bodyTruncated`, `bodyStoredKey` | integer, boolean, string | Size, whether the inline copy was cut, and the link to the full body. |
| `assertionPassed` | boolean | Result of your expected status and text checks. |
| `durationMs`, `timings`, `attempts` | integer, object | Total time, connection phases and attempts made. |
| `usedProxy` | boolean | Whether the request went through the proxy. |
| `failureReason`, `errorType`, `errorMessage`, `error` | string | Why no response arrived: `timeout`, `dns`, `connection`, `tls`, `blocked-target`, `too-many-redirects` or `invalid-request`. |
| `fetchedAt` | string | Timestamp 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?

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0">
<tr>
<td style="padding:20px 24px 14px;background:#E6F5F3;border:1px solid #B8E0DB;border-left:5px solid #0F766E;border-radius:10px 10px 0 0;color:#1C1917">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">If this Actor saved you from writing retry, paging and mapping code, leave a rating.</span><br>
<span style="font-size:14px;color:#57534E">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.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#0F766E;border:1px solid #0F766E;border-left:5px solid #0F766E;border-top:none;border-radius:0 0 10px 10px;text-align:center;color:#FFFFFF">
<a href="https://apify.com/getascraper/http-request-runner/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 🛡️ 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

- [Bulk HTTP Status Checker: Redirects, SSL Expiry and Run Changes](https://apify.com/getascraper/http-status-intelligence-monitor) ↗ - Check a list of URLs for status, redirects and certificate expiry.
- [Google Lens OCR API: Image to Text with Word Boxes and Standby](https://apify.com/getascraper/google-lens-ocr) ↗ - Batch image to text extraction with bounding boxes.
- [Bulk Image Downloader: Crawl Sites, Dedupe Photos, Export ZIP](https://apify.com/getascraper/bulk-image-downloader) ↗ - Download image batches with metadata and hashes.
- [arXiv Scraper for RAG: Papers as Chunked JSON](https://apify.com/getascraper/arxiv-rag-extractor) ↗ - Research papers as chunked JSON for retrieval pipelines.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/http-request-runner/changelog.md

# Actor input Schema

## `url` (type: `string`):

The address to call, including https://. For one request this is all you need. Private network and cloud-metadata addresses are always blocked.

## `method` (type: `string`):

Method for this request, and the default for every batch request that does not set its own. If you add a body and leave GET selected, POST is used.

## `headers` (type: `object`):

Request headers as key-value pairs, applied to every request in the run. A batch request can override single keys. Headers often carry tokens, so this field is stored encrypted and hidden in saved tasks.

## `params` (type: `object`):

Query-string parameters added to the URL. Parameters already in the URL are kept, and a key set here replaces the same key in the URL.

## `data` (type: `object`):

JSON body for POST, PUT and PATCH. It is sent as JSON, or as a form when you set the content-type header to application/x-www-form-urlencoded.

## `rowId` (type: `string`):

Any identifier you want echoed back on the result row as lookupKey, so you can join the response to the row it came from in Clay, n8n, Make or Sheets.

## `requests` (type: `array`):

Array of request objects: id (or lookupKey), label, url, method, headers, params, data, expectedStatusCodes, expectedBodyContains. Only url is required. Run-level method, headers, params and data act as defaults.

## `urls` (type: `array`):

URLs to fetch with the run-level method, headers and settings. Add them one by one, paste many, or upload a text file.

## `urlTemplate` (type: `string`):

A URL with {{placeholders}}, for example https://api.example.com/users/{{id}}. One request is created for every row in Template values. Values are URL-encoded automatically.

## `templateValues` (type: `array`):

Rows that fill the template. Use plain values (available as {{value}}) or objects such as {"id": 42, "name": "Ada"}. Placeholders also work inside headers and the request body.

## `curlCommand` (type: `string`):

Paste one or more curl commands copied from browser DevTools, Postman or a terminal. Each one becomes a request. Stored encrypted and hidden in saved tasks, because curl commands often contain tokens and cookies.

## `paginationMode` (type: `string`):

How to reach the next page: increase a page number, increase an offset, follow a next URL from the response (or a Link header), or pass a cursor from the response.

## `maxPages` (type: `integer`):

Stop after this many pages per request. Set 1 to fetch only the first page.

## `pageParam` (type: `string`):

Query parameter that carries the page number, offset or cursor. Defaults to page, offset or cursor depending on the pagination type.

## `pageStart` (type: `integer`):

Value of the page parameter on the first request. Leave empty to start at 1 for page numbers and at 0 for offsets.

## `pageSize` (type: `integer`):

How much the offset grows per page. Match the page size your API returns.

## `nextPagePath` (type: `string`):

Path to the next URL or cursor in the JSON response, for example next or meta.nextCursor. For Next URL pagination, leave empty to use the Link header.

## `stopWhenEmptyPath` (type: `string`):

Path to the list of items in the JSON response, for example results or data.items. Pagination stops at the first page where this list is empty, and that empty page is not returned.

## `maxConcurrency` (type: `integer`):

Maximum number of requests running at the same time. Lower it if the target API rejects bursts.

## `requestsPerSecond` (type: `integer`):

Extra rate limit on top of concurrency, applied to every attempt including retries. 0 means no throttle.

## `dedupeRequests` (type: `boolean`):

Drop requests that repeat the same method, URL, parameters and body, so you are not charged twice for the same call.

## `timeoutSecs` (type: `integer`):

Seconds to wait for a complete response before the attempt counts as failed.

## `maxRetries` (type: `integer`):

Extra attempts after a network error or a retryable status, with exponential backoff. A Retry-After header from the server is respected.

## `retryOnStatusCodes` (type: `array`):

Response status codes that trigger a retry. Other 4xx codes mean the request itself is wrong and are not retried.

## `retryUnsafeMethods` (type: `boolean`):

By default POST and PATCH are only retried when the server clearly did not process them (429, 503, connection refused), so an order or payment is never sent twice. Turn on to retry them like other methods.

## `followRedirects` (type: `boolean`):

Automatically follow HTTP redirects. Every hop is checked against the private-network block.

## `maxRedirects` (type: `integer`):

Maximum redirect hops to follow per request.

## `ignoreTlsErrors` (type: `boolean`):

Accept expired, self-signed or mismatched certificates. Use only for staging servers you trust.

## `parseJson` (type: `boolean`):

Parse JSON responses into a structured json field you can read directly, instead of only raw text.

## `extract` (type: `object`):

Pull values out of JSON responses into an extracted object. Map a name to a path, for example {"title": "data.title", "ids": "data.items\[*].id"}. Supports dots, \[0], \[*] and quoted keys.

## `bodyMode` (type: `string`):

Auto keeps the body in the row, None returns only status and timing, and Key-value store saves every full body to storage and links it from the row.

## `maxResponseBytes` (type: `integer`):

Bodies larger than this are cut in the row. Combine with the option below to keep the full content in storage.

## `saveOversizedBodyToKeyValueStore` (type: `boolean`):

Store bodies that are too large or binary (images, PDFs, archives) in the key-value store and link them in bodyStoredKey instead of cutting them.

## `includeResponseHeaders` (type: `boolean`):

Add the response headers to every row. Turn off to keep rows small on large batches.

## `failOnErrorStatus` (type: `boolean`):

Also fill the error field when the response is not 2xx. The row is returned either way.

## `expectedStatusCodes` (type: `array`):

If set, every response is checked against this list and the row gets assertionPassed. Useful for uptime and contract checks. A per-request list overrides it.

## `expectedBodyContains` (type: `string`):

If set, the response body must contain this text for assertionPassed to be true.

## `authType` (type: `string`):

Adds an Authorization header to all requests that do not already set one.

## `authBearerToken` (type: `string`):

Used when Default authentication is Bearer token.

## `authBasicUsername` (type: `string`):

Used when Default authentication is Basic auth.

## `authBasicPassword` (type: `string`):

Used when Default authentication is Basic auth.

## `secretHeaders` (type: `object`):

Same as Headers, kept for existing tasks: headers that carry keys or tokens, for example {"X-API-Key": "..."}. Stored encrypted, hidden in saved tasks, and masked in result rows.

## `proxyConfiguration` (type: `object`):

Choose proxy groups and a country for geo-specific responses. Residential routing reads at most 64 KB of each response.

## `proxyRouting` (type: `string`):

Always sends everything through the proxy. Only when blocked tries each request directly first and switches to the proxy after a 403, 429 or network failure.

## `proxyRotation` (type: `string`):

A new IP for every request, or one sticky IP for the whole run (useful when an API ties a session to an address).

## `clientProfile` (type: `string`):

Which browser's default headers and TLS behaviour to present. Auto lets the client choose. None sends only the headers you set.

## `callbackUrl` (type: `string`):

Each result row is POSTed to this URL as JSON as soon as it completes. Private network addresses are not allowed.

## `callbackHeaders` (type: `object`):

Headers sent with every callback, for example an authorization header for your webhook. Stored encrypted.

## Actor input object example

```json
{
  "url": "https://jsonplaceholder.typicode.com/todos/1",
  "method": "GET",
  "params": {},
  "data": {},
  "rowId": "",
  "requests": [],
  "urls": [],
  "urlTemplate": "",
  "templateValues": [],
  "paginationMode": "none",
  "maxPages": 1,
  "pageParam": "",
  "pageSize": 100,
  "nextPagePath": "",
  "stopWhenEmptyPath": "",
  "maxConcurrency": 10,
  "requestsPerSecond": 0,
  "dedupeRequests": false,
  "timeoutSecs": 30,
  "maxRetries": 2,
  "retryOnStatusCodes": [
    408,
    425,
    429,
    500,
    502,
    503,
    504
  ],
  "retryUnsafeMethods": false,
  "followRedirects": true,
  "maxRedirects": 5,
  "ignoreTlsErrors": false,
  "parseJson": true,
  "extract": {},
  "bodyMode": "auto",
  "maxResponseBytes": 1000000,
  "saveOversizedBodyToKeyValueStore": true,
  "includeResponseHeaders": true,
  "failOnErrorStatus": false,
  "expectedStatusCodes": [],
  "expectedBodyContains": "",
  "authType": "none",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "proxyRouting": "always",
  "proxyRotation": "perRequest",
  "clientProfile": "auto",
  "callbackUrl": ""
}
```

# Actor output Schema

## `responses` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `storedBodies` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "url": "https://jsonplaceholder.typicode.com/todos/1",
    "method": "GET",
    "params": {},
    "data": {},
    "rowId": "",
    "requests": [],
    "urls": [],
    "urlTemplate": "",
    "templateValues": [],
    "paginationMode": "none",
    "maxPages": 1,
    "pageParam": "",
    "pageSize": 100,
    "nextPagePath": "",
    "stopWhenEmptyPath": "",
    "maxConcurrency": 10,
    "requestsPerSecond": 0,
    "dedupeRequests": false,
    "timeoutSecs": 30,
    "maxRetries": 2,
    "retryOnStatusCodes": [
        408,
        425,
        429,
        500,
        502,
        503,
        504
    ],
    "retryUnsafeMethods": false,
    "followRedirects": true,
    "maxRedirects": 5,
    "ignoreTlsErrors": false,
    "parseJson": true,
    "extract": {},
    "bodyMode": "auto",
    "maxResponseBytes": 1000000,
    "saveOversizedBodyToKeyValueStore": true,
    "includeResponseHeaders": true,
    "failOnErrorStatus": false,
    "expectedStatusCodes": [],
    "expectedBodyContains": "",
    "authType": "none",
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "proxyRouting": "always",
    "proxyRotation": "perRequest",
    "clientProfile": "auto",
    "callbackUrl": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/http-request-runner").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "url": "https://jsonplaceholder.typicode.com/todos/1",
    "method": "GET",
    "params": {},
    "data": {},
    "rowId": "",
    "requests": [],
    "urls": [],
    "urlTemplate": "",
    "templateValues": [],
    "paginationMode": "none",
    "maxPages": 1,
    "pageParam": "",
    "pageSize": 100,
    "nextPagePath": "",
    "stopWhenEmptyPath": "",
    "maxConcurrency": 10,
    "requestsPerSecond": 0,
    "dedupeRequests": False,
    "timeoutSecs": 30,
    "maxRetries": 2,
    "retryOnStatusCodes": [
        408,
        425,
        429,
        500,
        502,
        503,
        504,
    ],
    "retryUnsafeMethods": False,
    "followRedirects": True,
    "maxRedirects": 5,
    "ignoreTlsErrors": False,
    "parseJson": True,
    "extract": {},
    "bodyMode": "auto",
    "maxResponseBytes": 1000000,
    "saveOversizedBodyToKeyValueStore": True,
    "includeResponseHeaders": True,
    "failOnErrorStatus": False,
    "expectedStatusCodes": [],
    "expectedBodyContains": "",
    "authType": "none",
    "proxyConfiguration": { "useApifyProxy": False },
    "proxyRouting": "always",
    "proxyRotation": "perRequest",
    "clientProfile": "auto",
    "callbackUrl": "",
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/http-request-runner").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "url": "https://jsonplaceholder.typicode.com/todos/1",
  "method": "GET",
  "params": {},
  "data": {},
  "rowId": "",
  "requests": [],
  "urls": [],
  "urlTemplate": "",
  "templateValues": [],
  "paginationMode": "none",
  "maxPages": 1,
  "pageParam": "",
  "pageSize": 100,
  "nextPagePath": "",
  "stopWhenEmptyPath": "",
  "maxConcurrency": 10,
  "requestsPerSecond": 0,
  "dedupeRequests": false,
  "timeoutSecs": 30,
  "maxRetries": 2,
  "retryOnStatusCodes": [
    408,
    425,
    429,
    500,
    502,
    503,
    504
  ],
  "retryUnsafeMethods": false,
  "followRedirects": true,
  "maxRedirects": 5,
  "ignoreTlsErrors": false,
  "parseJson": true,
  "extract": {},
  "bodyMode": "auto",
  "maxResponseBytes": 1000000,
  "saveOversizedBodyToKeyValueStore": true,
  "includeResponseHeaders": true,
  "failOnErrorStatus": false,
  "expectedStatusCodes": [],
  "expectedBodyContains": "",
  "authType": "none",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "proxyRouting": "always",
  "proxyRotation": "perRequest",
  "clientProfile": "auto",
  "callbackUrl": ""
}' |
apify call getascraper/http-request-runner --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/http-request-runner"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4XZRbY5NyS1teiQre/builds/FH1Y15GEADn7G6Gg7/openapi.json
