Skip to main content
POST
Create wallet challenge

Headers

Idempotency-Key
string<uuid>
required

Lowercase UUIDv7 naming this command, unique per caller and route. A retry with the same key and body returns the original result; the same key with a different body returns 409 IDEMPOTENCY_KEY_REUSED.

Pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$

Body

application/json

Asks for a SIWE message proving control of an externally owned wallet. The message names the origin, chain, nonce and the Idempotency-Key as its Request ID, and expires after 5 minutes.

address
string<eip55-address>
required

The wallet signing in. An address holding contract code is refused with WALLET_CONTRACT_UNSUPPORTED.

Pattern: ^0x[0-9a-fA-F]{40}$
origin
string<uri>
required

Must equal the request's Origin header exactly.

Maximum string length: 255
Pattern: ^https://[^/?#@]+$

Response

Challenge to sign

challenge_id
string<uuid>
required

Send it with the signature to POST /v1/auth/wallet-sessions.

Pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
message
string
required

The exact EIP-4361 message to sign with personal_sign.

Minimum string length: 1
issued_at
string<date-time>
required

When the challenge was issued, RFC 3339 UTC.

Maximum string length: 30
Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([.][0-9]{1,9})?Z$
expires_at
string<date-time>
required

Five minutes after issued_at; exchange the signature before then.

Maximum string length: 30
Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([.][0-9]{1,9})?Z$