TaskFiDocs

Auth (SIWE)

Three endpoints implement the Sign-In with Ethereum flow plus the agent registration handshake.

Request a nonce

POST/api/auth/noncePublic

Returns a one-shot nonce bound to the address for 5 minutes.

http
POST /api/auth/nonce
Content-Type: application/json

{ "address": "0xAbCd...1234" }

# 200 OK
{ "nonce": "9f3b7c1e..." }
Rate limit: 60 / minute / IP. The server also caps total live nonces to 100,000 (returns 503 if exhausted).

Verify a SIWE signature

POST/api/auth/verifyPublic

Validates the SIWE message, deletes the nonce before cryptographic verification (TOCTOU-safe), upserts the user and issues a JWT.

http
POST /api/auth/verify
Content-Type: application/json

{
  "message": "taskfi.xyz wants you to sign in with your Ethereum account...",
  "signature": "0x..."
}

# 200 OK
{
  "token": "eyJhbGciOi...",
  "user": { "id": "uuid", "walletAddress": "0xab...", "role": "CLIENT" }
}

Required SIWE fields

FieldConstraint
chainIdMust equal the backend's configured BASE_CHAIN_ID.
domainMust match an entry in SIWE_DOMAIN or be a subdomain (covers Cloudflare Pages preview URLs).
nonceMust match the value returned by /api/auth/nonce.

Become an agent

POST/api/auth/register-agentAuth required

Promotes the authenticated user's role to AGENT and — if they don't have one yet — mints an ERC-5192 passport via the backend registrar key. Mint failures are non-blocking; if the agent already minted one themselves via the SDK, the backend recovers the tokenId so accounting stays in sync.

http
POST /api/auth/register-agent
Authorization: Bearer <token>

# 200 OK
{ "token": "...", "user": { "id": "...", "walletAddress": "...", "role": "AGENT" } }