Developer Utilities
Tier 2 Ready
POST /v1/url-normalizer
Canonicalize URLs and strip 120+ ad-tracking and click-ID parameters for clean deduplication. Canonicalize URLs for deduplication and RAG indexing: strip 120+ tracking parameters (utm_*, fbclid, gclid, msclkid, mc_eid), sort query keys, and unshorten links.
POST /v1/url-normalizer){
"ok": true,
"data": {
"valid": true,
"original_url": "HTTPS://WWW.Example.com:443/blog/post/?utm_source=newsletter&fbclid=IwAR123&id=42#section-1",
"normalized_url": "https://www.example.com/blog/post?id=42",
"components": {
"scheme": "https",
"hostname": "www.example.com",
"port": null,
"pathname": "/blog/post",
"query": {
"id": "42"
},
"fragment": null
},
"is_shortener": false,
"unrolled": false,
"redirect_hops": 0,
"stripped_params": [
"utm_source",
"fbclid"
],
"ssrf_safe": true,
"error": null
},
"meta": {
"request_id": "req_url_01",
"ms": 1
}
}
curl -X POST "https://api.tinplate.dev/v1/url-normalizer" \
-H "Content-Type: application/json" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-d '{"url":"HTTPS://WWW.Example.com:443/blog/post/?utm_source=newsletter&fbclid=IwAR123&id=42#section-1"}'import { TinplateClient } from "@tinplate/sdk"; // npm install @tinplate/sdk
const tinplate = new TinplateClient({
rapidApiKey: process.env.RAPIDAPI_KEY!,
});
const { data, meta } = await tinplate.call("/v1/url-normalizer", {
"url": "HTTPS://WWW.Example.com:443/blog/post/?utm_source=newsletter&fbclid=IwAR123&id=42#section-1"
});
console.log(`[${meta.ms} ms]`, data);import requests
response = requests.post(
"https://api.tinplate.dev/v1/url-normalizer",
headers={
"Content-Type": "application/json",
"X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
},
json={
"url": "HTTPS://WWW.Example.com:443/blog/post/?utm_source=newsletter&fbclid=IwAR123&id=42#section-1"
}
)
print(response.json())const response = await fetch("https://api.tinplate.dev/v1/url-normalizer", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
},
body: JSON.stringify({
"url": "HTTPS://WWW.Example.com:443/blog/post/?utm_source=newsletter&fbclid=IwAR123&id=42#section-1"
}),
});
const result = await response.json();
console.log(result);{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tinplate_url_normalizer",
"arguments": {
"url": "HTTPS://WWW.Example.com:443/blog/post/?utm_source=newsletter&fbclid=IwAR123&id=42#section-1"
}
}
}POST /v1/url-normalizer)| Parameter | Type & Constraints | Description |
|---|---|---|
urlrequired |
stringminLen: 1, maxLen: 8192 |
URL to canonicalize and strip tracking parameters from. |
strip_trackingoptional |
booleandefault: true |
Strip UTM, click-ID (fbclid, gclid, msclkid, etc.), and email tracking parameters. |
custom_strip_paramsoptional |
string[] |
Additional query parameter names to remove (case-insensitive). |
sort_queryoptional |
booleandefault: true |
Sort remaining query parameters alphabetically by key. |
strip_fragmentoptional |
booleandefault: true |
Remove URL hash fragment (#...). |
strip_wwwoptional |
booleandefault: false |
Remove leading 'www.' subdomain. |
strip_trailing_slashoptional |
booleandefault: true |
Remove trailing slash from non-root paths (/blog/post/ -> /blog/post). |
force_httpsoptional |
booleandefault: false |
Upgrade http:// scheme to https://. |
resolve_shortenersoptional |
booleandefault: false |
If true, resolves redirects via the SSRF-isolated fetcher Worker before normalizing. |
data Object Fields (200 OK)| Field | Type | Description |
|---|---|---|
valid |
boolean |
Field 'valid' |
original_url |
string |
Field 'original_url' |
normalized_url |
string | null |
Field 'normalized_url' |
components |
object | null |
Field 'components' |
is_shortener |
boolean |
Field 'is_shortener' |
unrolled |
boolean |
Field 'unrolled' |
redirect_hops |
integer |
Field 'redirect_hops' |
stripped_params |
string[] |
Field 'stripped_params' |
ssrf_safe |
boolean |
Field 'ssrf_safe' |
error |
string | null |
Field 'error' |
Release Version: v1.0.7 ·
Last Verified / Benchmarked: 14 November 2026 ·
Latency Note: Sub-millisecond figures measure in-Worker V8 compute time (typical client HTTPS network RTT to the nearest Cloudflare PoP is 15โ65 ms) ·
See Full Portfolio Benchmarks & Corpora →
| Plan | Monthly Price | Included Requests | Rate Limit | Max Request Payload | Best For |
|---|---|---|---|---|---|
| BASIC | $0.00 / month | 500 / month (hard limit) | 10 req / min | 64 KB | Evaluation, local development & CI smoke tests |
| PRO | $9.99 / month | 15,000 / month | 60 req / min | 128 KB | Solo developers & production apps |
| ULTRA | $29.99 / month | 100,000 / month | 300 req / min | 256 KB | Growing SaaS & multi-agent pipelines |
| MEGA | $79.99 / month | 500,000 / month | 1,000 req / min | 256 KB | High-volume enterprise workloads |
Without stripping utm_*, fbclid, and gclid parameters, the same article URL gets indexed dozens of times under different cache keys.
Yes, only known analytics, ad-click, and email-tracking parameters are removed; functional parameters are preserved and sorted.
Yes, redirect unrolling uses the edgeguard-fetcher Worker with full RFC1918/metadata IP blocking.
Stateless in-memory URL normalization; zero logging.
Worker Zero-Logging Guarantee: Cloudflare Workers Observability and invocation logging are disabled in configuration
(observability.enabled = false, head_sampling_rate = 0, invocation_logs = false). Payloads are processed strictly in volatile V8 memory and never logged or stored by Tinplate.
Marketplace Proxies vs. Direct Bearer Key: Requests sent via RapidAPI or Zyla API Hub pass through those marketplaces' proxy infrastructure (subject to their respective privacy policies). Security-sensitive workloads requiring end-to-end zero-intermediary processing can connect directly to https://api.tinplate.dev using a Direct Bearer Key (Authorization: Bearer <API_KEY>).
Read our full Privacy Notice and OpenAPI 3.0.3 JSON Schema.
POST /v1/ssrf-firewall
Security & Secrets
Validate URLs and redirect chains against SSRF, private IPs, and cloud metadata targets.
POST /v1/html-to-markdown
Tier 1
Convert noisy web pages or raw HTML into clean, token-efficient Markdown for RAG.
POST /v1/robots-llms-analyzer
Developer Utilities
Audit which AI crawlers your robots.txt allows and generate a valid llms.txt file.