Free Query String Editor
Paste a link to see every parameter decoded, get it as JSON, or write plain name=value lines and build an encoded query.
What is a Query String Editor?
A query string is the part of a URL after the question mark, a list of name=value pairs joined by ampersands. This editor splits one into readable rows, converts it to JSON, or builds a correctly encoded query from plain lines you type.
It reads and writes queries with URL and URLSearchParams, the browser objects defined by the WHATWG URL Standard. That means a + is read as a space, percent escapes are decoded as UTF-8, and a broken escape such as %zz is kept as written, exactly as a browser or Node.js server sees it.
Key Features
Every Parameter on Its Own Row
Parse shows each name and decoded value as a row, in the order they appear. A forty-parameter tracking link becomes a table you can actually read.
Query String to JSON
To JSON turns the parameters into an object, and a name that repeats becomes an array. Paste the result straight into a test or a mock request.
Build From Plain Text
Type one name=value per line with spaces, accents and symbols left as they are. Build escapes each value separately, so an & inside a value can’t split it in two.
Any Starting Point
Paste a full URL, a path like /search?q=shoes, a query starting with ?, or a bare a=1&b=2. The fragment after # is dropped, just as browsers drop it from requests.
Links Aren’t Uploaded
Parsing runs on the URL objects built into your browser. Session tokens, OAuth codes and internal hostnames in a link stay on your machine.
Perfect for everyone
- Web developers debugging requests
- Marketers checking UTM links
- QA engineers testing filter pages
- Support teams reading redirect and callback URLs
How to Use the Query String Editor
Pick a mode, paste a link or type your parameters, and copy the result.
Choose Parse, To JSON or Build
Parse and To JSON read a URL or query you already have. Build goes the other way, from plain name=value lines to an encoded query string.
Paste a Link or Type Lines
For Parse and To JSON, paste the whole address or just the query. For Build, write one parameter per line, such as q=café au lait, without encoding anything yourself.
Check the Table and the Counts
The table lists every name and value. Parameters counts the rows and Distinct names counts unique names, so a gap between the two means some names repeat.
Copy or Download the Result
Copy the lines, the JSON or the built ?query into your code, test or browser. To edit a link, Parse it, change the lines, then switch to Build and copy the new query.
Real Queries Parsed and Built
Each input on the left went through the editor in the mode its chip names, and the right side is the text it produced, error lines included. Try predicting each one first.
“https://shop.example.com/search?q=running+shoes&size=10&color=blue”
“https://example.com/?utm_source=newsletter&utm_medium=email&utm_campaign=spring%20sale”
“?tag=red&tag=blue&tag=green&page=2”
“/login?returnTo=%2Fdashboard%3Ftab%3Dbilling”
“q=café au lait sort=price & rating include=a,b”
“discount=100% note=C++ & C#”
“?q=100%zz&flag”
“https://example.com/docs#section?x=1”
“https://exa mple.com/?q=1”
“q=shoes size 10”
How a Query String Is Put Together
The URL Standard gives a query only a few rules. Most bugs come from forgetting one of these ten.
The Question Mark Starts the Query
The first question mark ends the path, and everything up to # is the query. A second question mark is just part of a value.
“Where does the query string begin?”
Ampersands Separate Parameters
Each & starts a new name=value pair. An ampersand that belongs inside a value has to travel as %26.
“How is a literal & sent inside a value?”
The First Equals Sign Splits Name From Value
In r=x=y the name is r and the value is x=y, because later equals signs belong to the value. Encoding them as %3D avoids any doubt.
“In r=x=y, what is the value?”
Plus Means Space in a Query
Query strings use form encoding, where + stands for a space. A real plus sign has to be written %2B.
“How does q=a+b decode?”
Percent Escapes Carry Everything Else
Bytes outside the safe set travel as % plus two hex digits, with non-ASCII text turned into UTF-8 first. That is why é takes two escapes.
“How is é written in a built query?”
Names Can Repeat
Writing tag=red&tag=blue is legal and gives tag two values. Servers disagree on whether they keep the first, the last or both.
“How many values does tag have in tag=red&tag=blue?”
A Name Without a Value Is Allowed
Both ?flag and ?flag= mean a parameter whose value is the empty string. Build always writes the second form.
“What value does ?flag carry?”
The Fragment Ends the Query
Everything after # is the fragment, which the browser keeps to itself. A question mark inside the fragment doesn’t start a query.
“Does x=1 after a # reach the server?”
Order Is Kept
URLSearchParams keeps parameters in the order they were written, and so does this editor. Signing schemes such as AWS Signature Version 4 sort them by name before signing.
“Does reordering parameters change a signed URL?”
Brackets Are a Server Convention
To the URL Standard, items[]=1 and user[name]=Ada are ordinary names that contain brackets. PHP, Rails and the qs library turn them into arrays and objects.
“What is items[] to the URL itself?”
How Servers Read the Same Query
The URL is identical everywhere, but frameworks disagree about repeated names, blanks and brackets.
Browsers and Node.js
URLSearchParams in every browser and in Node.js follows the WHATWG URL Standard, the same parser this editor uses. Its get method returns the first value of a repeated name, and getAll returns every one.
PHP
$_GET keeps only the last value of a repeated name unless the name ends in [], as in tag[]=red. Dots and spaces in names are turned into underscores.
Python
urllib.parse.parse_qs gives a list for every name and drops blank values unless keep_blank_values is true. parse_qsl returns ordered pairs instead.
Express and the qs Library
Express 4 parses queries with qs by default, building nested objects from user[name]=Ada and arrays from repeated names. Express 5 made the simple parser the default.
Ruby on Rails
Rack reads user[name]=Ada as a nested hash and tag[]=red as an array. A repeated name without brackets keeps only its last value.
Java Servlets
request.getParameter returns the first value of a repeated name, and getParameterValues returns all of them. Query parameters and form fields from a POST end up in one map.
Query String Mistakes to Avoid
Most broken links come from string-gluing a query by hand, or from a server reading it differently than you expected.
Escape Values, Not the Whole Query
Gluing ?a=1&b=2 together by hand breaks as soon as a value contains & or =. Use Build here, or URLSearchParams in code, so each value is escaped on its own.
Don’t Paste Encoded Text Into Build
Build expects plain text, so q=a%20b comes out as q=a%2520b. Run Parse first when the values you have are already encoded.
Plus Signs Turn Into Spaces
A literal plus, as in C++, reads back as a space once the query is parsed. Build writes it as %2B, which every parser decodes correctly.
Repeated Names Mean Different Things
PHP keeps the last tag, Java the first, and Python all of them. Avoid repeats unless your server documents how it reads them.
Tokens in a Query Get Logged
Query values end up in server logs, proxy logs, browser history and analytics tools. Send API keys and session tokens in a header or a POST body instead.
Long Queries Get Rejected
Browsers accept very long URLs, but servers often don’t: nginx answers 414 when the request line outgrows its 8 KB header buffer. Move bulky filters into a POST body.
Signed URLs Can’t Be Edited
Presigned S3 links and similar URLs carry a signature computed over the query. Adding, changing or reordering a parameter makes the request fail with a signature error.
Names Are Case-Sensitive
Page=2 and page=2 are different parameters. A server that reads page silently ignores the capitalised one.
Where a Query String Editor Helps
Anywhere a link carries data you need to read, check or rewrite.
Checking a Campaign Link
Paste a UTM link before it goes out to confirm utm_source, utm_medium and utm_campaign are spelled right and decode cleanly. One typo splits a campaign across two rows in your reports.
Following a Sign-In Redirect
Parse returnTo, redirect_uri or next to see where users go after logging in. The nested address is decoded once, so its own path and query are readable.
Debugging a Filter Page
Copy the address of a filtered product list to see every filter, sort and page parameter as a row. Repeated filters appear as separate rows in order.
Writing an API Request
Type the parameters as plain lines, Build them, and append the result to the endpoint in curl or Postman. Spaces, ampersands and accents are encoded for you.
Turning a Query Into Test Data
To JSON gives an object you can paste into a unit test or a mocked request. Repeated names come out as arrays, which shows what a handler built on qs will receive.
Stripping Tracking Parameters
Parse a shared link, delete the fbclid, gclid and utm lines, then Build what’s left. Append the new query to the page address for a clean link.
Reading OAuth and Payment Callbacks
Callback URLs often carry code, state and error parameters. Parse them to read each value without decoding percent escapes by hand.