Skip to Content
BuildAction StepsHTTP Request

HTTP Request

Call any public REST API from your automation with full control over the method, URL, headers, body, and pagination.

At a glanceVerified in app · Oct 29, 2026
Use it to
Send GET, POST, PUT, PATCH, or DELETE requests to any internet-accessible HTTP endpoint
Find it
Tools → Data → Dev tools → HTTP Request
Cost
1 Step credit per execution
Limits
Public internet URLs only (localhost and private IPs refused) · Built-in pagination & Retry-After
Output
{{ N.ret }} (response body; or statusCode, headers, body when Include Full Response is on)
Instead
A connected app's built-in action or Custom API request (to reuse saved OAuth credentials)
Tools → Data → Dev toolsHTTP Request Step
  • Calls any public internet endpoint where you configure headers or tokens yourself.
  • Supports built-in cursor, URL, Link-header, offset, and page-number pagination.
  • Blocks private-network and localhost addresses.
Connected app drawerCustom API request
  • Reuses a connected app's saved OAuth or API account without managing raw tokens.
  • Restricted to that integration's allowed API domains.
  • See Custom API request under How Integrations Work.

Check a connected app’s Custom API request first when calling a connected service. Searching Apps for “HTTP” shows a separate connector. Always add HTTP Request from Tools → Data → Dev tools.


How it fits in an automation

Enable Include Full Response and Ignore HTTP Status Errors to route 4xx and 5xx responses through Conditions using {{ 3.ret.status }}.

Setting it up

  • Method. Choose GET, POST, PUT, PATCH, DELETE, HEAD, or OPTIONS.
  • URL. Enter a full public URL (https://api.example.com/orders/{{ 1.order_id }}).
  • Query Parameters. Add as Fields or JSON (filter[status]=active or ids[]=1&ids[]=2). Do not add | url_encode here. Glow encodes values automatically and warns (url_encode_in_query_parameter) against double encoding.
  • Body Type (for POST, PUT, PATCH). Choose JSON (application/json), Form URL Encoded (a=1&b=2), Form Data (multipart/form-data text fields only), Text (text/plain), or None (Content-Length: 0). In JSON bodies, {{ 1.id }} resolves dynamically while literal braces need no escaping.

Skip the form: Import cURL

Click Import cURL and paste a curl command. Glow fills the method, URL, query parameters, headers, auth, and body (overwriting current step fields). Reopening the dialog shows a rebuilt command with <configured …> credential placeholders.

The Import cURL dialog with a POST command pasted in, showing its headers and JSON body across eight numbered lines.
Paste the command as the API's documentation gives it to you. Glow reads the method, URL, headers and body out of it.
curl -X POST https://api.example.com/v1/leads \ -H "Authorization: Bearer {{ $secret.API_KEY }}" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{"email": "[email protected]", "name": "Ada Lovelace"}'

What it passes on

The response sits under ret. When an API returns a JSON list (including a list with one entry), ret stays a list, so read the first item with an index such as {{ 3.ret.0.id }} (or {{ 3.ret.body.0.id }} when Include Full Response is on). An outbound summary sits under request ({ method, url, headerNames, bodyBytes }, without header values). When Pagination is enabled, {{ 3.ret }} holds the merged array and {{ 3.pagination }} reports { pagesFetched, totalItems, hasMore }.

Response ModeJSON Field PathRaw Text / Binary PathStatus & HeadersOutbound Request Summary
Default{{ 3.ret.id }}{{ 3.ret.data }}Not included{{ 3.request.method }}, {{ 3.request.url }}
Include Full Response{{ 3.ret.body.id }}{{ 3.ret.body }}{{ 3.ret.status }}, {{ 3.ret.headers }}{{ 3.request.method }}, {{ 3.request.url }}
{ "ret": { "id": 1042, "title": "Invoice #1042", "status": "paid" } }

Read fields as {{ 3.ret.id }} or {{ 3.ret.status }}.

Troubleshooting & Error Handling

Non-2xx status codes (400, 500) stop the Step by default:

Setting / CodeHow to Handle It
Ignore HTTP Status Errors (4xx/5xx)In Advanced Options: treats non-2xx responses as passing and populates ret. Pair with Include Full Response to branch.
Retry on fail / Error PathIn Test & Debug: retry transient network errors or route transport/timeout failures to an Error Path.
401 Unauthorized / 403 ForbiddenCheck your header credentials (401) or API resource permissions (403).
404 Not Found / 429 Too Many RequestsCheck dynamic URL tokens (404). For 429 waits over 15 seconds, reduce concurrency or enable Error Handling retries.

Top Real-World Recipes

Method: POST · URL: https://api.yourcompany.com/v1/leads · Auth: Bearer Token ({{ $secret.CRM_API_KEY }}).

{ "email": "{{ 1.email }}", "first_name": "{{ 1.first_name }}", "company": "{{ 1.company_name }}", "source": "glow_workflow" }
Verify it works
Run
Open Test & Debug on the HTTP Request Step and click Run step
You should see
The Output tab shows the parsed response under ret (and request metadata showing the sent method and URL with secrets masked).

What’s Next?

Last updated on

Search documentation

Start with a guide, or search by Step, task or error.