{"openapi":"3.0.3","info":{"title":"THEMIS API","version":"1.0.0","description":"Phase 1: authentication, request metering and webhooks. Keys are scoped to one practice and to sandbox or production."},"servers":[{"url":"https://www.themislaw.app/api/v1"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"thm_live_... (production) or thm_test_... (sandbox)"}}},"paths":{"/me":{"get":{"summary":"The key making this request","responses":{"200":{"description":"Key identity"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/matters":{"get":{"summary":"List matters","description":"Requires matters:read. Sandbox keys receive an empty list.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":100}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Matters"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/usage":{"get":{"summary":"Request counts, last 30 days","description":"Requires usage:read.","responses":{"200":{"description":"Usage"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/workspaces":{"get":{"summary":"Workspaces the key's creator belongs to","description":"Requires workspaces:read. Production keys only.","responses":{"200":{"description":"Workspaces"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/workspaces/{id}/work":{"get":{"summary":"Open tasks, document requests and approvals in a workspace","description":"Requires workspaces:read. Production keys only.","responses":{"200":{"description":"Work"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations":{"get":{"summary":"List simulations","description":"Requires simulations:read. Production keys only.","responses":{"200":{"description":"Simulations"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}},"post":{"summary":"Create a simulation and queue its analysis","description":"Requires simulations:write. Body: { description, title?, type?, classification? }. Send an Idempotency-Key header to make retries safe. Returns 202 with a job to poll.","responses":{"202":{"description":"Queued"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission, or a sandbox key"}}}},"/simulations/{id}":{"get":{"summary":"One simulation: scenario, variables, open gaps, legal dimensions","description":"Requires simulations:read. Query: version.","responses":{"200":{"description":"Simulation"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations/{id}/findings":{"get":{"summary":"Findings, with the wording and library passages they rely on","description":"Requires simulations:read. Query: version, scenario.","responses":{"200":{"description":"Findings"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations/{id}/risks":{"get":{"summary":"Risk register, with rating and evidence confidence kept separate","description":"Requires simulations:read.","responses":{"200":{"description":"Risks"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations/{id}/actions":{"get":{"summary":"Action plan","description":"Requires simulations:read.","responses":{"200":{"description":"Actions"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations/{id}/dependencies":{"get":{"summary":"The dependency graph, with the reason for each connection","description":"Requires simulations:read.","responses":{"200":{"description":"Dependencies"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations/{id}/history":{"get":{"summary":"Saved versions and recent events","description":"Requires simulations:read.","responses":{"200":{"description":"History"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations/{id}/compare":{"get":{"summary":"Compare scenarios (priority) or two versions (from, to)","description":"Requires simulations:read.","responses":{"200":{"description":"Comparison"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations/{id}/facts":{"post":{"summary":"Add a classified fact","description":"Requires simulations:write. Body: { statement, class?, source? }.","responses":{"201":{"description":"Recorded"}}}},"/simulations/{id}/assumptions":{"post":{"summary":"Add an assumption","description":"Requires simulations:write. Body: { statement, reason? }.","responses":{"201":{"description":"Recorded"}}}},"/simulations/{id}/documents":{"post":{"summary":"Link an existing Themis document","description":"Requires simulations:write. Body: { documentId, role }. Documents are never copied.","responses":{"201":{"description":"Linked"}}}},"/simulations/{id}/variables":{"patch":{"summary":"Change scenario variables","description":"Requires simulations:write. Body: { variables: { key: value }, scenario? }.","responses":{"200":{"description":"Updated"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/simulations/{id}/scenarios":{"post":{"summary":"Create an alternative scenario","description":"Requires simulations:write. Body: { name, from?, variables? }.","responses":{"201":{"description":"Created"}}}},"/simulations/{id}/recalculate":{"post":{"summary":"Recalculate and save a new version","description":"Requires simulations:write. Returns 202 with a job to poll. Only what depends on changed variables is recalculated.","responses":{"202":{"description":"Queued"}}}},"/simulations/{id}/report":{"post":{"summary":"Record a report for the current version","description":"Requires simulations:write. A report is a draft until a legal reviewer approves it.","responses":{"201":{"description":"Recorded"}}}},"/simulations/jobs/{jobId}":{"get":{"summary":"Status of a queued analysis, stage by stage","description":"Requires simulations:read.","responses":{"200":{"description":"Job"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}},"/webhooks":{"get":{"summary":"List webhook endpoints","description":"Requires workspaces:read.","responses":{"200":{"description":"Endpoints"},"401":{"description":"Missing, invalid or expired key"},"403":{"description":"Missing permission or address not allowed"},"429":{"description":"Rate limited"}}}}},"x-webhooks":{"events":["matter.opened","simulation.completed","workspace.document.added","workspace.document.version","workspace.task.completed","workspace.request.fulfilled","workspace.approval.decided","webhook.test"],"signing":"X-Themis-Signature is HMAC-SHA256 (hex) of `${X-Themis-Timestamp}.${body}` with the endpoint secret. Retries at 1, 5, 30 and 120 minutes, then the delivery is marked dead."}}