{"service":"liberty-agent-settlement","mode":"demo","money":false,"path":"/api/v0/validate","methods":["POST","OPTIONS"],"auth":{"required":false,"mode":"demo","headers":["Authorization: Bearer <key>","X-Liberty-Key"],"key_id":"sha256 hex prefix (k_ + 12 chars). Raw key is never stored.","missing":"key_optional"},"persistence":false,"dry_run":true,"actions":["create","fund","submit","release","dispute"],"note":"Dry-check of the same engine and JSON Schema as POST /api/v0/transition. Same request shape as quote and transition. Returns { ok: true } when the body would be accepted, or structured field errors. Does not apply fund/submit/release/dispute, mint a job id, persist, or move real money. Non-create actions must include the client-held job object the same way transition does — Liberty does not look jobs up. Schema errors are 400 (invalid_json, invalid_action, missing_field, invalid_field) with kind: schema. State errors are 409 (illegal_transition, insufficient_credits, hold_expired) with kind: state. Optional demo API key identifies the adapter; omit it and the route still works (key_optional). Not production auth.","idempotency":{"header":"Idempotency-Key","body":"idempotency_key","persistence":false,"replay":false,"note":"Optional. Echoed on success. Create stays dry-check / dry-run and still has no durable id. Liberty does not replay stored responses. No persistence. No SSRF. No real money."},"protocol":"/api/settlement.json","discovery":"/.well-known/agent.json","schema":"/api/schemas/transition.json","errors":"/api/errors.json","quote":"/api/v0/quote","commit":"/api/v0/transition","verify":"/api/v0/verify","simulate":"/api/v0/simulate","validate":"/api/v0/validate"}