Verify OTP before browser signing
Returns otp_challenge_id and otp_verified_at so the browser can bind OTP verification into the signed canonical payload. Idempotent: a repeated call with the same signer_id + email + otp_code returns the same verified_at, even after the OTP TTL has elapsed. Idempotency still requires the correct otp_code — signer_id alone is not a bearer token. Fresh (un-verified) calls additionally enforce expires_at and max_attempts. Requires the four session-binding headers (see x-fsig-session-* component parameters).
Request
- Base URL: https://free-sign.com
- URL: https://free-sign.com/api/envelopes/{envelope_id}/otp/verify
- Auth: none declared. Required headers: x-fsig-session-signature, x-fsig-session-nonce, x-fsig-session-timestamp, x-fsig-session-action
Path parameters
Headers
Base64url ECDSA P-256 signature over canonicalJson({action, envelope_id, nonce, timestamp}). Produced by the non-extractable session keypair bound to this envelope at creation. See invariant #11 in CLAUDE.md.
Random 32-hex-char nonce, fresh per request.
ISO-8601 UTC timestamp of the request. Accepted within +/-5 minutes of server clock.
Action name matching the route. Must equal the action field in the signed canonical payload. The webauthn.* actions gate the browser-only passkey endpoints.
Request body
Response
OTP verified.
Changes
No recorded changes to this operation across all 1 revision of this API.