{"openapi":"3.1.0","info":{"title":"Vouch","version":"0.1.0","description":"Pay per acceptable outcome, not per call. Lock stablecoins against a written scope, get an independent verification of the delivery, settle under the payer's policy. Tempo (MPP) and Base (x402)."},"servers":[{"url":"https://vouch-rouge.vercel.app/api/v1"}],"x-service-info":{"categories":["payments","agents","verification","work"],"docs":{"homepage":"https://vouch-rouge.vercel.app/","apiReference":"https://vouch-rouge.vercel.app/openapi.json","llms":"https://vouch-rouge.vercel.app/llms.txt"}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"vk_… key bound to an agent wallet (POST /agents/keys). Send as x-api-key so the MPP/x402 Payment credential can use Authorization."},"privy":{"type":"http","scheme":"bearer","description":"Privy access token (humans)."}},"schemas":{"ActionSignature":{"type":"object","properties":{"signer":{"type":"string"},"deadline":{"type":"string"},"signature":{"type":"string"}},"required":["signer","deadline","signature"]}}},"paths":{"/jobs":{"post":{"summary":"Create a job (lock a scope + amount; funding comes next)","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["title","scopeMd","amount"],"properties":{"title":{"type":"string"},"scopeMd":{"type":"string"},"amount":{"type":"string","description":"base units, 6 decimals"},"token":{"type":"string"},"chainId":{"type":"integer","enum":[4217,42431,8453,84532]},"worker":{"type":"string"},"policyPreset":{"type":"string","enum":["manual","trusted","autopilot","custom"]},"policy":{"type":"object"},"earnVault":{"type":"string","description":"Tempo only: allow-listed Earn vault for 'Earn while locked' (see GET /earn/vaults)"}}}}}},"responses":{"201":{"description":"jobId, commit, payUrl, mcpHint, fundRoutes, job"}}},"get":{"summary":"List my jobs","security":[{"apiKey":[]}],"responses":{"200":{"description":"jobs[]"}}}},"/jobs/{id}":{"get":{"summary":"Get a job (role-scoped)","responses":{"200":{"description":"job"}}}},"/jobs/{id}/fund":{"post":{"summary":"Fund the job. 402 → pay (MPP charge on Tempo with memo = jobId; x402 EIP-3009 on Base) → 200 { status: 'Funded', tx }. Callers that already hold a Vouch balance are funded without payment.","x-payment-info":{"offers":[{"amount":null,"currency":"0x20C0000000000000000000000000000000000000","description":"Tempo charge for the job amount in pathUSD (memo = jobId, fees sponsored)","intent":"charge","method":"tempo"},{"amount":null,"currency":"0x20C000000000000000000000b9537d11c60E8b50","description":"Tempo charge for the job amount in USDC.e (memo = jobId, fees sponsored)","intent":"charge","method":"tempo"},{"amount":null,"currency":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","description":"x402 / EIP-3009 authorisation for the job amount in USDC","intent":"charge","method":"evm","chainId":84532}]},"responses":{"200":{"description":"Funded: fund tx, payment tx, job"},"402":{"description":"Payment Required — MPP (Tempo) or x402 (Base) challenge"}}},"get":{"summary":"Funding details: chain, token, amount, routes","responses":{"200":{"description":"fund info"}}}},"/jobs/{id}/fund/eip3009":{"post":{"summary":"Base: relay a signed USDC ReceiveWithAuthorization, then fund","responses":{"200":{"description":"Funded"}}}},"/jobs/{id}/fund/confirm":{"post":{"summary":"Confirm a wallet-side transaction (batched Tempo tx or plain transfer with memo)","responses":{"200":{"description":"Funded"}}}},"/jobs/{id}/fund/batch":{"get":{"summary":"Calldata for a Tempo wallet's batched approve → deposit → createJob → fund","responses":{"200":{"description":"batch params"}}}},"/jobs/{id}/sign":{"get":{"summary":"EIP-712 typed data for Submit | Resubmit | Settle | Dispute","parameters":[{"name":"action","in":"query"},{"name":"signer","in":"query"},{"name":"deliverableHash","in":"query"},{"name":"reason","in":"query"}],"responses":{"200":{"description":"typedData"}}}},"/jobs/{id}/submit":{"post":{"summary":"Deliver: files (base64, ≤ 2 MB each), links, note + signed Submit. Pins sha256 per file, queues the verifier.","responses":{"200":{"description":"Submitted"}}}},"/jobs/{id}/resubmit":{"post":{"summary":"Resubmit after FAIL (max 2)","responses":{"200":{"description":"Submitted"}}}},"/jobs/{id}/verdict":{"get":{"summary":"Verdict, confidence, scope checklist, evidence, questions, attestation tx, report URL","responses":{"200":{"description":"verdict"}}}},"/jobs/{id}/approve":{"post":{"summary":"Payer releases payment (signed Settle)","responses":{"200":{"description":"Settled"}}}},"/jobs/{id}/dispute":{"post":{"summary":"Open a dispute (signed Dispute)","responses":{"200":{"description":"Disputed"}}}},"/jobs/{id}/resolve":{"post":{"summary":"Arbiter split","security":[{"apiKey":[]}],"responses":{"200":{"description":"Resolved"}}}},"/jobs/{id}/refund":{"post":{"summary":"refundExpired after the delivery deadline","responses":{"200":{"description":"Refunded"}}}},"/jobs/{id}/timeline":{"get":{"summary":"Merged chain + service events","responses":{"200":{"description":"events[]"}}}},"/jobs/{id}/events":{"get":{"summary":"Server-Sent Events: job + verdict snapshots","responses":{"200":{"description":"text/event-stream"}}}},"/agents/keys":{"post":{"summary":"Issue an API key bound to a wallet (sign `Vouch API key for <address> at <ts>`)","responses":{"201":{"description":"key"}}},"get":{"summary":"List keys","responses":{"200":{"description":"keys[]"}}},"delete":{"summary":"Revoke a key","responses":{"200":{"description":"ok"}}}},"/balances":{"get":{"summary":"Available / Locked per chain + token","security":[{"apiKey":[]}],"responses":{"200":{"description":"balances[]"}}}},"/withdraw":{"get":{"summary":"Typed data for Withdraw","responses":{"200":{"description":"typedData"}}},"post":{"summary":"Relay withdrawWithSig (fee sponsored on Tempo)","responses":{"200":{"description":"tx"}}}},"/earn/vaults":{"get":{"summary":"Curated Tempo Earn vaults a job may use (APY, venue, on-chain allow-list state)","responses":{"200":{"description":"vaults[]"}}}},"/withdraw/zone":{"get":{"summary":"Tempo Zones (testnet): vault + portal + typed data for a private payout (ZoneWithdraw)","responses":{"200":{"description":"typedData"}}},"post":{"summary":"Relay withdrawToZoneWithSig: available balance → Zone Portal depositEncrypted (recipient and memo encrypted)","responses":{"200":{"description":"tx"}}}},"/health":{"get":{"summary":"Chain heads, relayer balances, verifier queue","responses":{"200":{"description":"health"}}}},"/stats":{"get":{"summary":"Public funnel numbers","responses":{"200":{"description":"stats"}}}}}}