Parse a URL into its parts
Paste an address and every part appears below it, with the query string split into its parameters and decoded, and a clean copy of the link with its tracking parameters taken out. The browser does the parsing, so the URL stays in this tab.
The parts of a URL appear here once there is one to read.
How to use it#
- Paste the URL into the box. An address without https:// in front is read as if it had it, and a query string on its own, such as ?id=1&page=2, is split without one. The Read as row says which.
- Read the parts, and the query parameters listed one per row with their values decoded.
- Copy the clean link from the top row to share it without its UTM tags and click ids, or copy any single part from beside it, or the whole breakdown as JSON.
The parts of a URL, in order#
A URL reads left to right from the general to the specific. The scheme, such as https, says how to connect. Then comes an optional user name and password before an @, which browsers now warn about because it is a favourite trick for making a link look like it goes somewhere it does not. The host is the server, given as a domain name or an IP address. The port is which door on it, and the path is the resource on that server.
After a question mark comes the query string, a list of name and value pairs joined with ampersands. After a hash comes the fragment, which the browser keeps to itself: it is never sent to the server, which is why single-page apps once used it for routing and why a token placed there does not appear in server logs.
The origin is the scheme, host, and port together. It is the unit browsers use for security, so two pages with the same origin can read each other's data and two with different ones cannot. A change of port alone makes it a different origin.
How the query string is decoded#
Each value is shown decoded: %20 and + both become a space, and %C3%A9 becomes é. The plus is the older convention from HTML forms and is still what most servers expect in a query string, which is why it reads as a space here. In the path, a plus is just a plus.
A parameter given more than once, as in tag=a&tag=b, is listed once per value. In the JSON it becomes an array, because most server frameworks read a repeated key that way and keeping only one value would lose data. A parameter with no equals sign, such as ?debug, has an empty value rather than being dropped.
If you need to build or fix a value rather than read it, the URL encoder turns text into its escaped form and back.
Removing UTM and tracking parameters from a link#
A link copied from an email, an ad, or a social app often carries a tail of parameters that only say where the click came from: utm_source, utm_medium, and utm_campaign, the click ids ad networks add such as fbclid, gclid, and msclkid, and the ones email platforms add such as mc_eid and _hsenc. This page works as a link cleaner and gives you the same link without them. Taking them out makes a link shorter to share and stops it telling the next site which newsletter or ad you came from.
The clean link sits above the breakdown, with the parameters that went listed under it. Every utm_ parameter goes, in any case, so UTM_SOURCE is removed as well, along with the well-known click and campaign ids from Google, Meta, Microsoft, TikTok, X, LinkedIn, Mailchimp, HubSpot, Marketo, Yandex, and Adobe. Everything else stays exactly as it was typed: the order, the encoding, repeated keys, and the fragment. Parameters a page needs to show the right thing, such as id, page, q, or v, are never touched.
The ref parameter stays too. On many sites it is a referral or affiliate code that decides who gets credit for a sign-up, and on code hosts it picks the branch or tag being shown, so removing it can change what the link opens or who it pays. Take it out by hand if you know it only tracks.
When the browser reads it differently from you#
The parsing is done by the URL parser built into your browser, which follows the WHATWG URL standard. That is the same reading fetch, links, and the address bar use, so what you see here is what a browser will actually request. Server libraries do not always agree. A backslash is the classic case: a browser reads it as a slash in an http or https URL, and many server libraries treat it as an ordinary character.
The browser also tidies as it reads. A host name is lowercased, a default port is dropped from the written form, and path segments like /a/../b collapse to /b. The Path row shows the result after that tidying, which is sometimes the explanation for a request going somewhere unexpected.
Frequently asked questions#
Why does the host name start with xn--?
#
A host name with letters outside ASCII, such as bücher.example, is sent over the network in an ASCII form called punycode, which starts with xn--. The browser converts it as it parses, so the host shown here is the form a server and DNS actually see. Both spellings are the same address.
What if my URL has no https:// at the start?
#
It is read as if it had https:// in front, since example.com/page is how most people paste an address, and a Read as row says that was done. A string such as localhost:3000 is taken as a host and port rather than as a scheme called localhost.
Why is the port shown when my URL does not have one?
#
Every connection uses a port, and when a URL leaves it out the scheme's default applies: 443 for https and 80 for http. The row says when that is what happened. The JSON carries the port that would be used, so a script reading it does not have to know the defaults.
Can it parse a mailto or other non-web link?
#
Yes. mailto:, tel:, data:, and similar schemes parse too. They have no host, so the address or number is shown as the path, and any ?subject= style parameters appear under the query as usual.
Can I paste just the query string?
#
Yes. Anything that starts with a question mark, or with a name and an equals sign, such as utm_source=newsletter&utm_medium=email, is read as a query string on its own. The parameters are listed and decoded as usual, and the JSON holds just the query as an object, which makes this a query string to JSON converter as well. It is a quick way to read the UTM tags on a campaign link, or the parameters a form or a redirect sent along.
Does removing tracking parameters break the link?
#
Almost never. Analytics scripts read them and the page itself does not, so it opens the same without them. The clean link is the one you pasted with those parameters cut out and nothing re-encoded, so a %20 stays %20 and the fragment after the # is left alone, even when it looks like a query of its own. The one thing lost is credit: the site no longer learns which campaign sent you, which is usually why you wanted them gone.
Is the URL sent anywhere?
#
No. It is parsed in this tab and nothing is requested from it, so a signed download link or a URL holding a session token stays on your machine.