Variables & placeholders
Write {userId} in the path or query and {{userName}} in the body. Placeholders are detected automatically, collected into a Variables tab, URL-encoded where they belong, and stored in history as a template — so replaying only needs new values.

Two placeholders detected from the path, filled in — and the resolved URL above showing exactly what will be sent.
A request against /users/42/posts?since=2025-01-01 is a request you’ll want to
make again with a different user and a different date. Copying it and editing
the URL by hand gives you six near-identical entries in your history and no idea
which is which.
Writing a placeholder
Put a token in braces where the value goes:
/users/{userId}/posts?since={since}
In the body, use double braces, so placeholders don’t collide with JSON’s own braces:
{"name": "{{userName}}", "role": "{{role}}"}
That’s the whole syntax. There’s nothing to declare in advance.
The Variables tab
Placeholders are detected as you type and collected into a Variables tab next to Headers and Body. Each one is listed with a value field and a note of where it’s used — path, query or body — so a name you used in two places is obviously the same variable, and a typo shows up as a stray extra row.
The tab carries a badge with the number of placeholders, and warns when some are
still unfilled, which is the failure mode this feature exists to prevent:
sending /users/{userId} literally, getting a 404, and spending five minutes
wondering why.
Above the tabs, the resolved-URL preview shows the substituted result live —
/users/42/posts?since=2025-01-01 — so you can confirm the substitution before
committing to it.
Encoding rules
The two contexts are treated differently, on purpose:
- Path and query values are URL-encoded. A value with a space, a slash or a
&in it produces a valid URL rather than a mangled one. - Body values are substituted raw. The body is your document — JSON, XML, whatever — and escaping it for you would corrupt it. What you type is what gets sent.
Templates in history and collections
This is where it pays off. What’s stored in history and in collections is the template plus the values, not the substituted result. Two consequences:
- Replays are cheap. Load a past attempt, put in a new
userId, send. - History stays grouped. Attempts group by the template path, so twenty
replays with twenty different ids remain one tidy
/users/{userId}group instead of twenty separate entries.
A saved request in a collection works the same way: it’s a parameterised call, not a frozen one.