Aller au contenu
ecdsa.com

JWT

Decode a JWT (no signature check)

POSThttps://ecdsa.com/api/v1/jwt/decode

Decodes a compact JWS token: header, payload, enriched exp/iat/nbf time claims and a classification of the algorithm. The signature is NOT verified — the response carries verified: false explicitly. Use /v1/jwt/verify to check ES* signatures.

Clé d’API
Facultative ; une clé doit avoir le scope api
Coût en quota avec une clé
1 unité par appel
Limite de requêtes
60 requêtes/min par IP

Requête

Corps JSON : JwtDecodeRequest

ChampTypeObligatoireDescription
tokenstringoui

Compact JWS token. A leading "Bearer " and whitespace are stripped.

Réponses

200The decoded token (signature not verified).

ChampTypeObligatoireDescription
headerobjectoui
  • noms de membres libres
payloadobjectoui
  • noms de membres libres
signaturePresentbooleanoui
signatureBytesintegeroui
  • au moins 0
timeClaimsobjectoui
timeClaims.expTimeClaimoui
timeClaims.iatTimeClaimoui
timeClaims.nbfTimeClaimoui
timeClaims.statusobject | nulloui

null when the token carries no usable exp or nbf.

timeClaims.status.kindstringoui
  • au choix : "expired", "not-yet-valid" ou "valid"
timeClaims.status.detailstringoui
algInfoAlgInfooui
verifiedbooleanoui

Always false — this operation never verifies.

  • toujours false
notestringoui

En-têtes : X-Request-Id · X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset · X-Quota-Limit · X-Quota-Remaining · X-Quota-Reset

StatutSignificationCodes
400Bad request. Input limits: a request body of at most 100 KB (a larger one is answered with 413) and arrays and objects nested at most 64 levels deep, JSON documents inside string fields included.
401Unauthorized.
403Forbidden.
404Not found.
405Method not allowed.
413Payload too large.
429Too many requests.
500Internal server error.
503Service unavailable.
504Gateway timeout.

Chaque réponse d’erreur porte l’enveloppe JSON ; le tableau des erreurs indique ce que signifie chaque code et que faire.

Exemple

An ES256 token

curl
curl -sS 'https://ecdsa.com/api/v1/jwt/decode' \
  -H 'content-type: application/json' \
  -d '{
  "token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImNvcHBlci1leGFtcGxlLTEifQ.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlLmNvbSIsInN1YiI6InVzZXJfNDIiLCJhdWQiOiJlY2RzYSIsImlhdCI6MTc4NzE0MDgwMCwiZXhwIjo0MDcwOTA4ODAwfQ.fQpTQxkahGRlZp-U71-xNk68mpZH23dhn9QoysMLmZfBx_e-vd9sCgh7sJ4eXu0-WbQSNqzmVPyUKErCJx4DHw"
}'
JavaScript (fetch)
const response = await fetch("https://ecdsa.com/api/v1/jwt/decode", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({
    "token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImNvcHBlci1leGFtcGxlLTEifQ.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlLmNvbSIsInN1YiI6InVzZXJfNDIiLCJhdWQiOiJlY2RzYSIsImlhdCI6MTc4NzE0MDgwMCwiZXhwIjo0MDcwOTA4ODAwfQ.fQpTQxkahGRlZp-U71-xNk68mpZH23dhn9QoysMLmZfBx_e-vd9sCgh7sJ4eXu0-WbQSNqzmVPyUKErCJx4DHw"
  }),
});
console.log(response.status, await response.json());
Python (httpx)
import httpx

response = httpx.post(
    "https://ecdsa.com/api/v1/jwt/decode",
    json={
        "token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImNvcHBlci1leGFtcGxlLTEifQ.eyJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlLmNvbSIsInN1YiI6InVzZXJfNDIiLCJhdWQiOiJlY2RzYSIsImlhdCI6MTc4NzE0MDgwMCwiZXhwIjo0MDcwOTA4ODAwfQ.fQpTQxkahGRlZp-U71-xNk68mpZH23dhn9QoysMLmZfBx_e-vd9sCgh7sJ4eXu0-WbQSNqzmVPyUKErCJx4DHw",
    },
    timeout=30.0,
)
print(response.status_code, response.json())
Réponse 200
{
  "header": {
    "alg": "ES256",
    "typ": "JWT",
    "kid": "copper-example-1"
  },
  "payload": {
    "iss": "https://issuer.example.com",
    "sub": "user_42",
    "aud": "ecdsa",
    "iat": 1787140800,
    "exp": 4070908800
  },
  "signaturePresent": true,
  "signatureBytes": 64,
  "timeClaims": {
    "exp": {
      "value": 4070908800,
      "utc": "2099-01-01 00:00:00 UTC",
      "relative": "in 72 years"
    },
    "iat": {
      "value": 1787140800,
      "utc": "2026-08-19 12:00:00 UTC",
      "relative": "61 days ago"
    },
    "nbf": null,
    "status": {
      "kind": "valid",
      "detail": "valid until 2099-01-01 00:00:00 UTC (in 72 years)"
    }
  },
  "algInfo": {
    "alg": "ES256",
    "kind": "ecdsa",
    "curve": "P-256",
    "hash": "SHA-256",
    "signatureBytes": 64,
    "verifiableHere": true,
    "summary": "ES256 is ECDSA on P-256 with SHA-256; the JWS signature is raw r‖s (64 bytes). POST /api/v1/jwt/verify can check it."
  },
  "verified": false,
  "note": "This endpoint decodes the token without checking the signature. Use POST /api/v1/jwt/verify (ES256/ES384/ES512) to verify it against a public key."
}

La réponse de l’API à cet exemple, générée pour cette page le 20 octobre 2026 ; les temps relatifs et les nombres de jours qu’elle contient se rapportent à ce jour-là.

Codes d’erreur

CodeStatutSignification
invalid_json400The body is not valid JSON or not a JSON object; or the input nests arrays and objects more than 64 levels deep (JSON documents inside string fields count too), or is too complex to inspect for private keys.
missing_field400A required field is absent or empty.
invalid_input400A field could not be parsed — the message explains exactly why.
private_key_rejected400The request contains private-key material (a PEM PRIVATE KEY block, an OpenSSH, SSH2 or PuTTY private key, or a JWK with "d"). Never send private keys anywhere.
unauthorized401The Authorization or X-API-Key header is malformed, the API key is not valid (wrong checksum, unknown, revoked or expired), or the operation needs a key.
forbidden_scope403The API key is valid but lacks a scope this operation requires; the message names it.
not_found404No operation exists at this path.
method_not_allowed405The path exists but does not accept this HTTP method; see the Allow header.
payload_too_large413The body exceeds 100 KB.
rate_limited429Too many requests — see Retry-After.
quota_exceeded429A daily or monthly quota of the API key's account is used up. X-Quota-Reset (and Retry-After) say when it starts over; retrying earlier cannot succeed.
internal_error500Unexpected server error.
service_unavailable503API keys cannot be verified right now (the key store is unreachable); retry shortly.
timeout504The operation did not finish within its time budget.

Schémas

TimeClaim

null when the claim is absent; {error} when it is malformed.

ChampTypeObligatoireDescription
Variante 1valuenumberoui

Seconds since the epoch.

Variante 1utcstringoui
Variante 1relativestringoui

For example "in 72 years" or "3 minutes ago".

Variante 2errorstringoui

AlgInfo

Classification of the header's alg value.

ChampTypeObligatoireDescription
algstring | nulloui
kindstringoui
  • au choix : "ecdsa", "none", "hmac", "rsa", "eddsa", "missing" ou "unknown"
curvestringnon
  • au choix : "P-256", "P-384", "P-521" ou "secp256k1"
hashstringnon
  • au choix : "SHA-256", "SHA-384" ou "SHA-512"
signatureBytesintegernon
  • au moins 0
verifiableHerebooleanoui

Whether POST /v1/jwt/verify can check this token.

summarystringoui

Error

The error envelope of every non-2xx response.

ChampTypeObligatoireDescription
errorobjectoui
error.codestringoui

Machine-readable error code. Each response lists the codes it can carry; new codes may be added within v1, so treat an unknown code by its HTTP status.

error.messagestringoui

Human-readable explanation (English).

error.requestIdstringnon

The X-Request-Id of this request — quote it when reporting a problem. Sent since v1.1.

error.detailobjectnon

Structured context for the error, such as the offending field; omitted when there is none.

  • noms de membres libres
error.docsstringnon

Where the error codes are explained. Sent since v1.1.

  • format uri

Toutes les opérations sont répertoriées dans la référence de l’API.