Base URL and authentication
Every endpoint lives under https://oprex.id/api/v1 and is authenticated with an API key you create in your workspace.
# create a key at https://member.oprex.id/panel/settings/api-keys curl https://oprex.id/api/v1/bugs \ -H "Authorization: Bearer oprex_pk_…"
Keys carry scopes and, optionally, a resource scope. A key with only read cannot perform any write method — this is enforced centrally on the HTTP method, so it covers every current and future endpoint. A key scoped to one group or project can only address that group or project; without a scope it is tenant-wide.
Rate limits. Each key has a per-minute request budget (120 by default). Exceeding it returns 429 with a Retry-After header and X-RateLimit-Limit. Back off rather than retrying immediately.
Shape of a response
Lists return { "data": [...] }; single objects return { "data": {...} }. Errors return { "error": { "code", "message" } } with a meaningful HTTP status. Messages are written to be shown to a human — if one is not, that is a bug worth reporting.
{ "data": [ { "id": "bug_9tK…", "seq": 42, "title": "Checkout retries create duplicate orders",
"severity": "critical", "status": "confirmed", "projectId": "prj_2mA…" } ] }
Resources
Each family supports the usual list, read, create, and update operations unless the object is inherently immutable. Query parameters filter by project, status, severity, assignee, and free text where it makes sense.
Lifecycle
| Resource | What it holds |
|---|---|
/requirements | Requirements — the what, versioned and owned |
/specifications | Specifications attached to requirements |
/tests | Test plans, test cases, and test runs |
/coverage | Requirement × test coverage matrix |
/release-plans | Planned releases and their contents |
/releases | Shipped releases and changelog entries |
Defects & work
| Resource | What it holds |
|---|---|
/bugs | Bugs with severity, status, and environment |
/bug-relations | Links between bugs, including across projects |
/tickets | Helpdesk tickets and categories |
/milestones | Milestones across projects |
/todos | Personal and assigned tasks |
Knowledge
| Resource | What it holds |
|---|---|
/memories | Long-form Memory documents for humans and agents |
/notes | Short notes attached to any object |
/kb | Knowledge base articles |
/comments | Threaded discussion on any object |
Platform
| Resource | What it holds |
|---|---|
/platform/groups | Groups — nestable namespaces |
/platform/projects | Projects inside a group |
/platform/context | Your tenant, role, groups, and projects |
/platform/entitlement | Current plan, effective limits, and usage |
/api-keys | Manage API keys programmatically |
Access control applies to the API too
An API key acts on behalf of the person who created it. If per-project access control is enabled for your tenant, the key sees exactly what that person sees — including in aggregate counts. A project you cannot read cannot leak its existence through a statistic.
OAuth 2.1
For tools that connect on a user's behalf rather than holding a static key, Oprex is its own OAuth 2.1 authorization server with PKCE and dynamic client registration. Tokens issued this way behave exactly like API keys — same scoping, same enforcement — so every endpoint on this page works with them unchanged.
Get a key and try it
Create a workspace, open Settings → API Keys, and the first request is one copy-paste away.
Create an API key Or connect over MCP