# HTTP Request

Send an HTTP request to a public API or webhook.

## When to use it

Use this for a direct call to a service that accepts a URL, headers, and a request body. Build values from earlier results with [flow tags](/documentation/flowcrafter/building/using-flow-tags/). For reusable authentication and connection profiles, [GC API Alchemist](https://gravitywiz.com/documentation/gravity-connect-api-alchemist/) extends this node's capabilities.

![HTTP Request connected to Form Submitted in an inactive workflow](/documentation/flowcrafter/screenshots/action-http-request-workflow.png)

## Settings

![HTTP Request settings with an example.org webhook and a JSON body](/documentation/flowcrafter/screenshots/action-http-request-settings.png)

| Setting | What it controls |
| --- | --- |
| URL | The destination. Supports flow tags. |
| Method | **GET**, **POST** (default), **PUT**, **PATCH**, or **DELETE**. |
| Headers | Key/value request headers. Values support flow tags. With no headers, Flowcrafter adds `Content-Type: application/json`. |
| Body Template | The request body. Supports flow tags. A body entered for GET or HEAD is dropped. |

## Output and branches

The step has one output with **HTTP status code**, **Response headers**, and **Response body**. JSON objects and arrays become data that later steps can inspect; other responses remain text.

## Troubleshooting

- A `4xx` or `5xx` response is still a completed request. The step succeeds and exposes the status and body so a [Condition (data)](/documentation/flowcrafter/nodes/logic/condition-data/) can handle it.
- DNS, connection, and timeout failures return an error — use the step's retry policy, and fail the run after the allowed attempts are exhausted.

:::caution[Network limits]
Requests use WordPress's safe HTTP client. Localhost, private networks, and reserved addresses are blocked unless a developer explicitly allows them. The timeout is capped to protect the workflow queue. Retried requests can repeat side effects, so use an idempotency key when the API supports one.
:::

## Example

Send each new form submission to your CRM with a POST request. Include the entry ID in the request body:

`{"entry_id":"{{ "Form Submitted".id }}"}`

Then, use a [Condition (data)](/documentation/flowcrafter/nodes/logic/condition-data/) node to check the CRM’s **HTTP status code**. For a successful response (`200–299`), continue the workflow. For any other status, add a note to the entry so the failed sync is easy to identify and troubleshoot.

![An HTTP Request sends the entry to a CRM, then branches on the response status and records the result](/documentation/flowcrafter/screenshots/action-http-request-example.png)
