Remove tracking parameters from a URL
Two UTM tags gone, the id parameter kept and nothing else in the link touched: paste a link to strip known tracking parameters and get a list of every name and value removed, so the change can be checked. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Web address
- https://a.com/p?utm_source=x&utm_medium=y&id=3
- Clean URL
- https://a.com/p?id=3
- Items removed
- 2
- Cleaning policy
- Conservative
A shared link often carries advertising and analytics identifiers long after they have served their original purpose. The result keeps the surviving query parameters in their original order and reports every removed name, value and classification so that the change can be audited rather than trusted blindly.
Clean a link without silently rewriting it
Many URL tools parse a link and then serialize it again. That can alter letter case, escaping, a trailing slash or the order of repeated query fields even when those details were unrelated to tracking. This cleaner validates the address but edits the submitted text narrowly: it removes only query segments whose decoded names appear in the reviewed tracking catalogue.
The scheme, host, port, path and fragment remain as supplied, and surviving parameters keep both their raw spelling and relative order. When every query parameter is removed, the question mark disappears as well. This conservative reconstruction makes the output suitable for links where repeated fields or unusual encoding carry meaning.
Choose an explainable policy and keep exceptions
The conservative policy is the default. It covers high-confidence campaign tags and click identifiers created for analytics, advertising, email or social attribution. The aggressive policy adds a second reviewed set whose names are also widely used for attribution but can overlap with a functional integration.
Use it only when you understand the destination. A keep list overrides either policy, which is useful when a particular service relies on a parameter that normally looks like tracking.
Read the inventory before sharing the result
The output is intentionally more than a cleaned string. Each removed item includes its parameter name, decoded value and catalogue group, in the same order in which it appeared. This gives reviewers evidence for a privacy or content workflow and makes an unexpected classification easy to challenge.
Nothing is fetched from the link, no redirect is followed and no safety claim is made about the site. URLs containing embedded user credentials are rejected so a password is not echoed in a result. If a parameter name cannot be decoded safely, it is kept.
When uncertain, the tool removes less rather than risk changing how the destination behaves.
What you can do with it
Privacy-aware link sharing
Remove advertising and analytics identifiers before placing a link in a message, document or public post, while retaining a reviewable record.
Editorial cleanup
Prepare source links for articles, knowledge bases and newsletters without disturbing functional query fields or anchor fragments.
FAQ
Which tracking parameters are removed?
The conservative policy removes reviewed UTM, advertising click, email campaign and social attribution identifiers. Aggressive mode adds a separate set of lower-confidence attribution names. The versioned catalogue and its review date are part of the capability source.
Are parameter names case-sensitive?
The inventory retains the spelling found in the submitted URL.
Does the cleaner visit or verify the destination?
No. It performs local parsing only. It does not follow redirects, test availability, inspect content or decide whether a site is safe.
Why are URLs with a username or password rejected?
Echoing a URL with embedded credentials could expose a secret in output, logs or copied text. Remove the userinfo before cleaning the link.
Is the URL cleaner free on desktop and mobile?
The page runs locally and free in desktop and mobile browsers.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/dev/url-clean \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/article?utm_source=newsletter&id=3"}'const res = await fetch("https://api.kit.forhosting.com/dev/url-clean", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"url": "https://example.com/article?utm_source=newsletter&id=3"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/url-clean",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"url": "https://example.com/article?utm_source=newsletter&id=3"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/url-clean", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"url":"https://example.com/article?utm_source=newsletter&id=3"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://example.com/article?utm_source=newsletter&id=3"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/url-clean", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"url": "https://example.com/article?utm_source=newsletter&id=3"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.url_clean",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_url_chars | 8192 |
max_params | 200 |
max_keep_params | 100 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Paste one absolute HTTP or HTTPS URL to remove known tracking parameters without visiting the destination.
Choose an explainable policy and keep exceptions
Name matching is case-insensitive, so UTM_SOURCE is treated like utm_source, while the removal record preserves the spelling that actually appeared in the URL.
Integration use cases
Automated URL hygiene
Call the API in an ingestion or publishing workflow and store the structured removal inventory next to the cleaned link.
Technical questions
Can I prevent one parameter from being removed?
Yes. Add its name to keep_params. That exception takes priority over conservative and aggressive policy and applies to every occurrence of the name.