# Check and sign a session challenge Read the [custody, availability, and limit rules](README.md) first. Read `GET /llms.txt` for the current legal version and terms URLs. Agree to those terms before requesting creation. Save the exact challenge request as **request.json**. The public key below is the shared public test vector (seed byte 7 repeated 32 times). It is public test material, never an account to use. ```http POST /v1/session/challenge HTTP/1.1 Host: mpp.uno.fun Content-Type: application/json {"public_key":"ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c","legal_acceptance_version":"2026-07-09"} ``` An optional `username` is sent unchanged on both calls. Save the full successful response envelope as **challenge.json**. Its `data` contains `challenge`, `issuer`, `audience`, `kit_audience`, `expires_at`, and `signing_bytes`. Public key and challenge are lowercase hex. `signing_bytes` is standard padded base64. In a private working directory outside the upload tree, select the key file you already provisioned, or name an environment variable your secret provider populated: ```sh umask 077 node sign-session.mjs request.json challenge.json --key-file "$ACCOUNT_SEED_FILE" > session-proof.json # Alternative: name the variable, never put its value on the command line. node sign-session.mjs request.json challenge.json --key-env ACCOUNT_SEED_HEX > session-proof.json ``` Use one of those commands. Node needs to support Ed25519 (Node 22 or later is sufficient). The script checks all nine decoded UTF-8 statement lines, with no trailing LF: fixed tag, pinned issuer, pinned audience, pinned Kit audience, response challenge, requested public key, encoded username, encoded legal version, and response expiry. It refuses any mismatch before reading the key. It also checks that the key matches the requested public key. It signs the exact decoded bytes with pure Ed25519, without hashing or JSON serialization. The output signature is standard padded base64. Send the exact contents of **session-proof.json** as the JSON body: ```http POST /v1/session HTTP/1.1 Host: mpp.uno.fun Content-Type: application/json ``` A successful envelope has `data.account_id`, `data.kit_token`, and `data.credential_expires_at`. Keep the token private. It is Kit-only authority, not an Uno session or refresh token, and lasts at most 300 seconds. Unused challenges last 120 seconds. A lost exchange response requires the same proof body; exact replay recovers the original token and expiry. It does not renew it. For `PROOF_RESULT_EXPIRED`, or credential renewal, request a fresh challenge with the same account key and sign again. A fresh proof keeps the account identity. After verification the key entry point refuses with `account_verified`; use verified CLI or MCP sign-in to keep using the same Agent plan.