Postguy
Guide

HTTP requests

Build and send HTTP requests: URL and params, headers, body, settings, the send pipeline and the response viewer.

An HTTP request is a method, a URL, optional query parameters, path variables, headers and a body. It also has authorization, scripts, tests and per-request settings.

This page covers the builder tab, what Postguy sends, and how the response is shown and recorded.

Request tabs: Params, Authorization, Headers, Body, Scripts, Tests, Settings and Docs.

Send a request

The top row has the method menu, the URL field and the Send button.

  • Methods: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS. Any other method is rejected when the request is built.
  • Send: click Send, press Enter in the URL field, or press Cmd/Ctrl+Enter. The split button's menu has Send and Download. It also saves the body when the response arrives (see Save a response).
  • Cancel: while a request runs, Send becomes Cancel and a progress line runs over the URL bar. A cancel reports the phase it stopped in.
  • Save: press Cmd/Ctrl+S, or click Save. A dot beside it marks unsaved changes. Sending uses the current draft, so you do not have to save first.
  • cURL paste: paste a command that starts with curl into the URL field to import it into the request.
  • No scheme: a URL without a scheme is sent as http://<url>.

Sending uses the active environment from the selector at the end of the tab strip. See Variables.

Not available yet: examples (saved responses under a request), a JSONPath/XPath response filter and a visible resolved-URL preview.

URL, query params and path variables

The URL and the Params tab stay in sync:

  • Type ?a=1 in the URL to add a row.
  • Edit a row to update the URL.
  • The Path Variables table lists every :name segment in the URL path.
{{baseUrl}}/users/:userId/orders?status=open

When you send the request, Postguy does this:

  1. Resolves {{variables}} in the URL. An unresolved variable in the host is an error. Elsewhere it stays literal.
  2. Replaces :name segments with the value in the Path Variables table. A row with an empty value leaves :name in place.
  3. Merges enabled query rows into the URL. A row replaces a pair with the same key. Pairs that exist only in the URL are kept. Disabled rows are not sent.
  4. Converts the host to ASCII (IDNA). Values of enabled query rows and path variables are percent-encoded.

Turn off Encode URL automatically in the request Settings tab to skip percent-encoding of query and path values.

Bulk Edit turns the table into key: value lines.

Headers

The Headers tab has:

  • Editable rows. Disabled rows are not sent.
  • Bulk Edit.
  • A Presets menu with four built-in sets: JSON, XML, Form URL Encoded and No cache. Custom presets are not available yet.

Header names and values may contain {{variables}}.

A name with a space, a colon or a control character is refused before sending. So is a value with a line break.

Rows you add go on the wire first, in table order. Then Postguy adds the automatic headers below. It skips any header whose name you already set (names are compared case-insensitively).

HeaderValue
HostAuthority of the final URL
User-AgentPostguy/<version>
Accept*/*
Accept-Encodinggzip, deflate, br
Connectionkeep-alive
Cache-Controlno-cache, only while Settings › General › Send no-cache header is on
Content-TypeFrom the body mode (see below), only when the body mode sets one
Content-LengthBody size in bytes, only when the body is not empty
CookieAdded from the cookie jar. A Cookie row you set is merged in

Tick Show auto-generated headers in the Headers tab to see the generated rows. They are never saved with the request.

Header names go out in lowercase on HTTP/1, because the HTTP library does not keep the case you typed. The Console still lists them as they were built. This is a known gap. See Known gaps.

Body

Pick the mode from the Body type menu on the Body tab. Switching mode keeps the other modes' content until you save. Only the active mode is stored.

ModeWhat is sentContent-Type
NoneNo bodynone
form-dataMultipart with a generated boundary. Rows are text or file.multipart/form-data; boundary=postguy-boundary-...
x-www-form-urlencodedkey=value pairs joined with &, percent-encoded. Rows with an empty key and value are skipped.application/x-www-form-urlencoded
RawThe text as typedBy language (below)
BinaryThe bytes of one filenone (set it yourself in Headers)
GraphQLJSON {"query", "variables", "operationName"}application/json

Raw languages set a Content-Type when you have not set one yourself:

LanguageContent-Type
Texttext/plain
JSONapplication/json
JavaScriptapplication/javascript
HTMLtext/html
XMLapplication/xml

Beautify re-indents a JSON raw body.

form-data rows. A text row can have its own content type. A file row sends the file's name and application/octet-stream, unless the row has a content type.

GraphQL.

  • Variables must be a JSON object. Empty or invalid text is sent as {}, and a warning goes to the Console.
  • Operation name is sent only when it is not empty.
  • Refresh schema runs an introspection query against the URL and lists the types in the tab.

Variables and shortcodes. {{variables}} resolve in every body mode. Shortcodes such as {{% base64(file('lib/a.jpg')) %}} expand in raw, urlencoded, form-data text and GraphQL bodies.

Files and the working directory

Binary bodies and form-data file rows read a file from disk.

  • Relative paths resolve against the working directory. It is <workspace>/files unless you set another in Settings › General.
  • Files outside the working directory are refused, unless Read files outside the working directory is on.
  • A file is capped at 100 MiB.

A file row or binary path that is exactly {{% file('name') %}} reads name from the collection's assets instead of the disk. Any other shortcode in a file path is an error.

Per-request settings

The Settings tab holds the values below. A new request gets the defaults.

SettingDefaultNotes
HTTP versionAutoAuto, HTTP/1.x, HTTP/2. Auto follows the global setting.
Enable SSL certificate verificationon
Automatically follow redirectson
Follow original HTTP methodoffOff: 301 and 302 turn a POST into a GET. 303 always becomes a GET (HEAD stays HEAD). 307 and 308 keep the method.
Follow Authorization header on cross-host redirectsoffOff: Authorization is dropped when the scheme, host or port changes.
Remove referer header on redirectoff
Encode URL automaticallyon
Disable cookie jaroffStops both sending and storing cookies for this request.
Maximum redirects100 to 100 in the UI.
Request timeout (ms)00 = no timeout. Up to 3,600,000 in the UI.
Max response size (MB)500 = unlimited. Up to 1,024 in the UI.

Redirect and cookie behaviour is described in Cookies, proxy and certificates.

How global settings combine

Global values live in Settings. For each send, Postguy combines them with the request's values:

ValueRule
SSL verificationOn only if it is on globally and in the request. Off on either side wins.
Follow redirectsFollowed only if it is on in both.
Disable cookiesDisabled if the request or the global setting disables them.
TimeoutThe request's value if it is not 0. Otherwise the global Request timeout.
Max response sizeThe request's value if it differs from 50. Otherwise the global value.
HTTP versionThe request's value, or the global value when the request says Auto.
Other redirect rules, Encode URL automatically, Maximum redirectsRequest only.
50 means "default". So a request that wants exactly 50 MB while the global limit is different cannot say so.

The send pipeline

Every send runs the same twelve steps. This is true from the app, the runner or a tool.

#Step
1Find the request and load the variable scopes: globals, collection, folders, active environment, data row, runtime.
2Run pre-request scripts: collection, then folders outer to inner, then the request. A script can change the request or skip it.
3Resolve inherited authorization and its variables. An expired OAuth 2.0 token with a refresh token is refreshed.
4Build the URL: resolve variables, path variables, query rows, IDNA host, percent-encoding.
5Resolve header rows. Authorization is applied after the body is built, because OAuth 1.0, AWS Signature v4 and Hawk sign the body.
6Build the body and the automatic headers.
7Cookies: the jar's cookies first, then a manual Cookie row.
8Send through the proxy-aware client. Redirects are followed by hand and cookies are captured on every hop. A Digest 401 challenge is answered once.
9Save the cookie jar if a cookie was stored.
10Build the response model: status, headers, decoded body, sizes and timings.
11Run post-response scripts and tests. A failing script or test never discards the response.
12Record the History entry, the Console entries and, if enabled, the response body.

If Settings › Disable scripts is on, steps 2 and 11 are skipped and a warning is written to the Console.

Response viewer

The response pane has the tabs Body, Cookies, Headers and Test Results. After a test has run, the last one shows as Test Results (passed/total).

The status badge, size and time sit on the right. Hover them to see:

  • The HTTP version and redirect count.
  • The header and body sizes, and the wire size if the body was compressed.
  • The connect, wait (TTFB), download and total times.
FeatureNotes
Body viewsPretty, Raw, Preview, Hex.
Syntax colouringJSON, XML, HTML, JavaScript, YAML, chosen from the response.
Large bodiesAbove 5 MB, Pretty is disabled and the body opens in Raw with a banner.
SearchA search box with a match count. Matches are tinted in the body.
WrapWrap toggle.
CopyCopy body and Copy headers in the ... menu.
ClearClear response in the ... menu.
HeadersA two-column table.
CookiesThe parsed Set-Cookie headers of this response.
Not available yet: image preview, a JSONPath/XPath filter, a file picker for saving, examples and per-redirect timings.

Save a response

Save Response (or Save body to file in the ... menu) writes the decoded body to <workspace>/files/response-<tab id>.bin. The path shows in the status bar.

Send and Download does the same after the send completes.

History and Console

Each send is recorded, unless it comes from the collection runner.

  • History. The sidebar's History section lists sends newest first, with method, URL and time.
    • An entry stores the request as sent (secret values masked), the status, duration and size.
    • The newest 5,000 entries are kept.
    • Open or delete an entry from its context menu.
    • Response bodies are stored under .postguy/responses/ only when Save response bodies in history is on in Settings › General.
  • Console. Open it from the bottom bar. It logs each request as METHOD URL -> status · ms · bytes.
    • It shows expandable request headers, response headers and body (a body is cut at 1 MiB), the effective proxy, and any warnings.
    • Secret values are masked.
    • It keeps up to 5,000 entries for 24 hours.

See Workspace for where these files live.

  • request_create makes a request. request_update sets its definition.
  • request_send runs the full pipeline above and takes an optional environment id. request_cancel stops it.
  • Read the result with response_get, response_render_body and response_save.
  • Read the record with history_list, history_open, console_get and cookies_list.
  • snippet_generate produces code for a request.
  • variables_resolve previews a template.
Tools take ids, not names. See Automation tools.
Copyright © 2026