Security & Secrets
Tier 2 Ready
POST /v1/jwt-jwk-inspector
Audit JWT tokens and JWK sets against RFC 8725 for alg:none, weak secrets, and leaked keys. Stateless JWT, JWS, and JWK security linter that audits tokens and JWKS against RFC 8725 & RFC 7518: detects alg:none, jku/kid injection, weak HMAC secrets, and leaked private keys.
POST /v1/jwt-jwk-inspector){
"ok": true,
"data": {
"verdict": "fail",
"security_score": 10,
"grade": "F",
"decoded_header": {
"alg": "HS256",
"typ": "JWT"
},
"decoded_payload": {
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
},
"signature_present": true,
"signature_verified": true,
"weak_secret_cracked": "your-256-bit-secret",
"token_status": "missing_exp",
"findings": [
{
"category": "weak_hmac_secret",
"severity": "critical",
"rfc_reference": "RFC 8725 §3.5",
"description": "JWT is signed with a well-known weak secret ('your-256-bit-secret') and can be forged offline",
"remediation": "Immediately rotate the HMAC signing key to at least 256 bits of CSPRNG entropy."
},
{
"category": "claim_lifetime_hygiene",
"severity": "high",
"rfc_reference": "RFC 8725 §3.8",
"description": "JWT payload omits the 'exp' (Expiration Time) claim, creating a non-expiring bearer token",
"remediation": "Always include an 'exp' claim and enforce short access-token TTLs."
},
{
"category": "claim_lifetime_hygiene",
"severity": "low",
"rfc_reference": "RFC 8725 §3.8–3.9",
"description": "JWT omits standard scoping claims (iss, aud), weakening cross-service confused-deputy defenses",
"remediation": "Include and validate 'iss' (issuer), 'aud' (audience), and 'sub' (subject) on every token."
}
]
},
"meta": {
"request_id": "req_jwt_01",
"ms": 2
}
}
curl -X POST "https://api.tinplate.dev/v1/jwt-jwk-inspector" \
-H "Content-Type: application/json" \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-d '{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}'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/jwt-jwk-inspector", {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
});
console.log(`[${meta.ms} ms]`, data);import requests
response = requests.post(
"https://api.tinplate.dev/v1/jwt-jwk-inspector",
headers={
"Content-Type": "application/json",
"X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
},
json={
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
)
print(response.json())const response = await fetch("https://api.tinplate.dev/v1/jwt-jwk-inspector", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
},
body: JSON.stringify({
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}),
});
const result = await response.json();
console.log(result);{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tinplate_jwt_jwk_inspector",
"arguments": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
}
}POST /v1/jwt-jwk-inspector)| Parameter | Type & Constraints | Description |
|---|---|---|
tokenoptional |
stringmaxLen: 65536 |
Compact JWS / JWT string (header.payload.signature) to decode, verify, and audit against RFC 8725. |
hmac_secretoptional |
stringmaxLen: 4096 |
Optional HMAC secret to verify HS256/HS384/HS512 signatures and check RFC 7518 key entropy requirements. |
jwkoptional |
object |
Optional JWK or JWKS ({ keys: [...] }) object to audit for leaked private key parameters (d, p, q, k) and key strength. |
reference_time_unixoptional |
integermin: 0 |
Optional Unix epoch timestamp (seconds) for deterministic exp/nbf/iat validation. |
max_ttl_secondsoptional |
integermin: 0, default: 86400 |
Maximum recommended token lifetime (exp - iat) in seconds before flagging long-lived access tokens. |
data Object Fields (200 OK)| Field | Type | Description |
|---|---|---|
verdict |
"pass" | "warn" | "fail" |
Field 'verdict' |
security_score |
integer |
Field 'security_score' |
grade |
"A" | "B" | "C" | "D" | "F" |
Field 'grade' |
decoded_header |
object | null |
Field 'decoded_header' |
decoded_payload |
object | null |
Field 'decoded_payload' |
signature_present |
boolean |
Field 'signature_present' |
signature_verified |
boolean | null |
Field 'signature_verified' |
weak_secret_cracked |
string | null |
Field 'weak_secret_cracked' |
token_status |
"valid_window" | "expired" | "not_yet_valid" | "missing_exp" | "not_provided" |
Field 'token_status' |
findings |
object[] |
Field 'findings' |
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 |
Yes, for HS256/HS384/HS512 tokens it automatically tests the signature against common weak default secrets ('secret', 'your-256-bit-secret', 'password', 'jwt_secret', etc.).
Misconfigured auth servers occasionally serialize full keypairs into /.well-known/jwks.json. Passing your JWKS to POST /v1/jwt-jwk-inspector immediately flags any exposed private key parameters (d, p, q, k).
Never. Workers Observability and invocation logs are disabled, and all inspection happens in ephemeral isolate memory.
Tokens and JWK sets are inspected in memory and never logged or stored.
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/secret-scanner
Tier 1
Detect and mask leaked API keys, JWTs, and private keys in logs, diffs, and prompts.
POST /v1/consent-tokens/issue
Email & Domain
Issue and verify stateless HMAC unsubscribe tokens and RFC 8058 List-Unsubscribe headers.
POST /v1/webhook-verify
Security & Secrets
Verify Stripe, GitHub, Slack, Shopify, and Svix HMAC webhook signatures and timestamps.