Verify a request signature (self-test)

Rebuilds the canonical string from what you send and verifies the detached JWS against the **caller's own** public keys. Use it to get your signing implementation right before the first real transaction. Always answers `200` (except on a malformed body), including when the signature is invalid: a `401` here would be indistinguishable from "your token expired" and would send you debugging the wrong thing. Creates nothing and moves nothing.

Authentication

AuthorizationBearer

Bearer authentication of the form Bearer <token>, where token is your auth token.

Headers

X-Tenant-IdstringRequired
Tenant context used for authorization and routing.
Idempotency-KeystringOptional

Optional client-generated idempotency token (recommended for safe retries).

X-Request-TimestampstringRequired

Unix seconds. Required on the signed host; tolerance is 300s either way (403 request_timestamp_skew).

X-Content-SHA256stringRequired

Lowercase hex SHA-256 of the body. An empty body hashes the empty string, so the header is always present. Mismatch returns 400 body_hash_mismatch.

X-Request-SignaturestringRequired

Detached JWS (<protected>..<signature>, ES256 or PS256) over METHOD\nPATH?QUERY\nTIMESTAMP\nIDEMPOTENCY_KEY_OR_EMPTY\nX_CONTENT_SHA256.

Request

This endpoint expects an object.
pathstringRequired
Path including the query string, no host.
methodstringOptional

HTTP method of the hypothetical request. Defaults to POST.

timestampstringOptional

Unix seconds, same value as X-Request-Timestamp.

idempotencyKeystringOptional

Value of Idempotency-Key, or empty when the route has none.

contentSha256stringOptional

Lowercase hex SHA-256 of the body. Omit and we compute it from body — that is the step most integrators get wrong.

bodystringOptional
Raw body of the hypothetical request, as a string.
signaturestringOptional

Detached JWS <protected>..<signature>.

Response

Verification result (including failures).

validboolean
canonicalStringstring
The exact string the server signed over. Compare it with yours.
reasonstringOptional

Present only when valid is false. One of request_signature_invalid, request_timestamp_skew, unknown_kid, body_hash_mismatch, signature_missing, no_credential, no_public_key.

messagestringOptional
expectedContentSha256stringOptional
signedHoststringOptional
maxSkewSecondsintegerOptional
usableKidslist of stringsOptional

Keys currently usable by this credential (past their grace period).

kidstringOptional
algenumOptional

Errors

400
Bad Request Error
500
Internal Server Error