> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ingestly.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# HTTP

> Call an external HTTP endpoint and use the response in your pipeline.

The HTTP action node sends a request to an external HTTP endpoint and makes the response available to downstream nodes. Use it to enrich pipeline data with external APIs, trigger third-party services, or fetch reference data during processing.

## When to use HTTP action

* You need to **enrich** an extracted record with data from your own backend, a CRM, or a public API mid-pipeline.
* You want to **trigger an external workflow** before continuing (create a ticket, post a notification, kick off downstream processing in another system).
* You need to **fetch reference data** that varies per run (a customer ID, a tax rate, a currency conversion) and feed it into a downstream transform or validation step.
* Use the [callback output](/nodes/callback) instead when the goal is just to deliver final results at the end of the run; HTTP action is for mid-pipeline calls whose response you'll keep using.

## Configuration

| Field                    | Type           | Required | Description                                                                                                                                                                                                                                                                                                                                                                                                    |
| ------------------------ | -------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **URL**                  | text           | Yes      | The endpoint to call. Supports template expressions like `{{steps.extract.data.id}}`. When you select a Business Central connector and the URL field is still empty, the editor auto-fills the company base path (built from the connector's environment and company id) so you only append the resource segment such as `salesOrders`. It only seeds a blank URL and never overwrites a URL you already typed |
| **Method**               | select         | Yes      | HTTP method: `GET`, `POST`, `PUT`, `PATCH`, or `DELETE`. Default: `GET`                                                                                                                                                                                                                                                                                                                                        |
| **Headers**              | key-value list | No       | Custom headers to include in the request. Values support template expressions                                                                                                                                                                                                                                                                                                                                  |
| **Body format**          | select         | No       | `JSON` (default) sends the body as `application/json`. `OData Batch` sends a Business Central JSON `$batch` request with `Isolation: snapshot` (see the [Business Central guide](/guides/business-central) for the worked example). `Binary (base64)` sends the resolved body, which must be a Base64 string, as raw bytes (see [Binary body](#binary-body))                                                   |
| **Body template**        | JSON editor    | No       | Request body for `POST`, `PUT`, and `PATCH` requests. Supports template expressions and [row expansion with `$each` and `$when`](/guides/expressions#row-expansion-in-json-bodies-each-and-when). Defaults to `application/json`; set a `Content-Type` header to override                                                                                                                                      |
| **Timeout**              | number         | No       | Request timeout in seconds. The HTTP call is cancelled after this many seconds and **not** retried. Accepts 1 to 300 seconds. Leave blank to use the system default (45s)                                                                                                                                                                                                                                      |
| **Response path**        | string         | No       | Dot-path to extract a subset of the JSON response (e.g., `data.results`). When set, the extracted value lands at `payload`; if the path does not resolve, `payload` is `null`                                                                                                                                                                                                                                  |
| **Required result path** | string         | No       | A dot-path that must resolve to a record. If it is missing, `null`, or an empty array, the step fails with a no-records error (for example `value` for an OData list response). Leave blank to disable it                                                                                                                                                                                                      |
| **Response schema**      | schema editor  | No       | Define the expected response shape so downstream nodes can reference response fields under `payload.<field>`. `payload` is always available as an output container whether or not a schema is set; when a schema is set, its fields are nested beneath it as `payload.<field>`, not at the payload root. Use **Detect from response** to build the schema from a real request                                  |

### Template expressions

The URL, headers, and body fields support template expressions using the `{{expression}}` syntax. This lets you dynamically build requests using data from upstream nodes.

### Response path

If the API returns a large response and you only need part of it, use the response path to extract a subset. For example, if the response is `{ "data": { "results": [...] } }`, set the response path to `data.results` to pass only the array to downstream nodes as `payload`.

### Required result path

Required result path is a guardrail, not an extractor. Where **Response path** only narrows the output and yields `null` when it does not resolve, **Required result path** fails the step when no record is present at that path (missing, `null`, or an empty array). The two are independent and can be set together. For an OData list response shaped like `{ "value": [...] }`, set Required result path to `value` so a run with zero records fails fast with a no-records error instead of passing an empty result downstream.

### Detect from response

Next to the **Response Schema** field, use **Detect from response** to build the schema from a real request instead of typing it by hand. It sends an actual request and derives the schema from the response, prompting you for a test value for each dynamic token in the URL and body (headers are excluded). The detected schema populates the Response Schema editor so downstream nodes can reference fields under `payload`.

<Warning>**Detect from response** sends a real request. For non-GET methods (`POST`, `PUT`, `PATCH`, `DELETE`) this may create or modify real data on the target system.</Warning>

## Binary body

Set **Body format** to `Binary (base64)` to send the request body as raw bytes. The body template must resolve to a Base64 string, typically exactly `{{$document.file.base64}}` (the [source document](/guides/expressions#source-document-file)).

* Ingestly decodes the Base64 string and sends the bytes as the request body for `POST`, `PUT`, and `PATCH`. `GET` and `DELETE` never send a body.
* The content type defaults to `application/octet-stream`. Set a `Content-Type` header to override it.
* A resolved body that is not valid Base64 fails the step with a clear error.

The bytes are never persisted; the request history records a binary body as `[binary N bytes, type]`. To upload the source file to Business Central, see the [attachment recipe](/guides/business-central#5-attach-the-source-document-to-a-record).

## Inputs and outputs

**Allowed inputs:** All trigger nodes and all action nodes.

**Output:** The HTTP response. The node's data lives in `payload` and request-level fields are under `metadata.http`.

**`payload`** - the response body data:

| Field    | Description                                                                                                                                                                                                                                                                                                                                                                                                                  |
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| *(root)* | The parsed JSON response body (or the extracted subset when a Response path is configured). `payload` is always present as an output container whether or not a Response Schema is defined. When a Response Schema is set, its fields are accessible as `payload.<field>`. The value is `null` when the body is not JSON or the path did not resolve. Use this in downstream templates as `{{httpNodeName.payload.<field>}}` |

**`metadata.http`** - request-level information:

| Field                | Description                                                                           |
| -------------------- | ------------------------------------------------------------------------------------- |
| **statusCode**       | The HTTP response status code                                                         |
| **requestSucceeded** | Whether the request returned a 2xx status                                             |
| **url**              | The URL that was actually called (after template substitution and connector base URL) |
| **method**           | The HTTP method that was used (lowercase: `get`, `post`, etc.)                        |
| **attempts**         | The Temporal attempt number for this run                                              |

## Related

<CardGroup cols={2}>
  <Card title="Callback output" icon="webhook" href="/nodes/callback">
    Send final results to a webhook after processing
  </Card>

  <Card title="Extract action" icon="sparkles" href="/nodes/extract">
    Extract structured data before or after HTTP calls
  </Card>

  <Card title="Transform action" icon="arrows-rotate" href="/nodes/transform">
    Transform HTTP response data into a specific format
  </Card>

  <Card title="Webhooks and callbacks" icon="book" href="/guides/webhooks-and-callbacks">
    Guide to working with external integrations
  </Card>
</CardGroup>
