/v1/meta
Spec
Try it live
10 free calls per day — no sign-up, no API key. Goes through the oanor gateway.
It works. Grab an API key and use it in your project.
Get an API keyCode snippets
curl "https://api.oanor.com/urlcanon-api/v1/meta" \ -H "x-oanor-key: oanor_test_..."
await fetch("https://api.oanor.com/urlcanon-api/v1/meta", {
headers: { "x-oanor-key": "oanor_test_..." }
});
$ch = curl_init("https://api.oanor.com/urlcanon-api/v1/meta");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-oanor-key: oanor_test_..."]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch);
import requests
requests.get(
"https://api.oanor.com/urlcanon-api/v1/meta",
headers={"x-oanor-key": "oanor_test_..."}
)
Example response
A real response from this endpoint, captured by the latest health check.
{
"data": {
"name": "URL Canonicalize API",
"notes": "Scheme and host are lower-cased and the default port dropped; the path is case-sensitive so it is left as-is unless lowercase_path is set. This canonicalizes the URL string locally — it does not fetch it or follow redirects (use a URL-unfurl/unshorten API for that). Nothing is stored.",
"version": "v1",
"endpoints": [
{
"path": "/v1/canonicalize",
"params": {
"url": "the URL (required, with scheme)",
"sort_query": "sort query parameters (default true)",
"lowercase_path": "lower-case the path (default false)",
"trailing_slash": "keep (default), add or remove",
"remove_fragment": "drop the #fragment (default false)",
"remove_tracking": "strip utm_*/gclid/fbclid… (default true)"
},
"returns": "the canonical URL, its components and the changes made"
},
{
"path": "/v1/compare",
"params": {
"a": "first URL (required)",
"b": "second URL (required)",
"…options": "same options as canonicalize"
},
"returns": "whether a and b are the same URL, with both canonical forms"
},
{
"path": "/v1/meta",
"params": [],
"returns": "this document"
}
],
"description": "Normalize URLs to a canonical form so you can deduplicate and compare them. The canonicalize endpoint lower-cases the scheme and host, removes the default port (80/443), resolves ./ and ../ path segments and fixes percent-encoding (all via the WHATWG URL parser), then applies the cleanups you want: strip marketing/analytics tracking parameters (utm_*, gclid, fbclid, msclkid and many more), sort the remaining query parameters, optionally drop the #fragment, and add or remove the trailing slash. It returns the canonical URL, the parsed components and exactly which changes were made. The compare endpoint canonicalizes two URLs and tells you whether they point to the same resource. Pure local, no network, no key."
},
"meta": {
"timestamp": "2026-06-03T09:24:58.563Z",
"request_id": "b7990b1b-f008-4d32-abca-9d199697c8d1"
},
"status": "ok",
"message": "Meta",
"success": true
}