Base URL: http://localhost:8787
All responses include requestId. Errors:
{
"error": { "code": "not_found", "message": "..." },
"requestId": "..."
}GET /api/healthGET /api/organizations/POST /api/organizations— multi-tenant orgsGET /api/organizations/:id/repositories— repos scoped to an orgGET /api/github/app— GitHub App metadata via App JWTPOST /api/github/app/installations/:id/token— mint/rotate installation token (diagnostics)POST /api/demo/bootstrap— opt-in demo fixture (requiresPROOFLOOP_DEMO_PATH; never falls back to bundled fixtures)GET /api/repositories— optional?organizationId=filterPOST /api/repositoriesGET /api/repositories/:id/runsPOST /api/repositories/:id/runsGET /api/runs/:idGET /api/runs/:id/claimsGET /api/runs/:id/verificationsGET /api/runs/:id/impact-graphGET /api/runs/:id/evidence-packPOST /api/runs/:id/cancelPOST /api/runs/:id/claims/:claimId/confirm— human accept/reject (note required); refreshes GitHub Check/comment when availableGET /api/runs/:id/explain— facts vs inferences vs unknownsPOST /api/runs/:id/cancel— abort in-flight async runGET /api/repositories/:id/history— runs + metric eventsGET /api/repositories/:id/rulesPOST /api/repositories/:id/rules/preview— policy delta before savePUT /api/repositories/:id/rules— persists + merges into next check / proofloop.ymlPOST /api/github/webhookPOST /api/gitlab/webhook— MR open/update/reopen; commit status + MR note whenGITLAB_TOKENis set
Auth: set PROOFLOOP_API_TOKEN to require Authorization: Bearer … on mutating routes. Production requires webhook secrets (GITHUB_WEBHOOK_SECRET / GITLAB_WEBHOOK_SECRET).
Queue: set REDIS_URL to use BullMQ; without it, checks run in-process (in-memory). Health reports queue: "redis" | "memory".
OpenAPI machine-readable file: openapi.yaml