{"openapi":"3.0.0","paths":{"/api/v1/ping":{"get":{"description":"Returns the organization the key belongs to and its granted scopes. Not counted against the monthly quota.","operationId":"PublicApiController_ping","parameters":[],"responses":{"200":{"description":"The key is valid."},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"The organization's plan no longer includes API access."}},"security":[{"apiKey":[]}],"summary":"Verify an API key","tags":["Public API v1"]}},"/api/v1/assets":{"get":{"description":"Paginated when `page` is supplied. WITHOUT `page` this returns a bare array of up to 10,000 assets for backwards compatibility — always send `page`.","operationId":"ApiV1Controller_listAssets","parameters":[{"name":"status","required":false,"in":"query","description":"active | maintenance | retired | lost | stolen","schema":{}},{"name":"search","required":false,"in":"query","description":"Free-text match on name, SKU or tag.","schema":{}},{"name":"pageSize","required":false,"in":"query","description":"Rows per page, 1–200. Default 50.","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"1-based page number. Omitting it returns an unpaged array.","schema":{"type":"number"}}],"responses":{"200":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"List assets","tags":["Public API v1"]},"post":{"description":"Requires the `write` scope. Counts against the plan asset limit.","operationId":"ApiV1Controller_createAsset","parameters":[],"responses":{"201":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"Create an asset","tags":["Public API v1"]}},"/api/v1/assets/{id}":{"get":{"description":"Includes category, location, custody and custom fields.","operationId":"ApiV1Controller_getAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"Fetch one asset","tags":["Public API v1"]},"patch":{"description":"Requires the `write` scope. Omitted fields are left unchanged.","operationId":"ApiV1Controller_updateAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"Update an asset","tags":["Public API v1"]}},"/api/v1/people":{"get":{"description":"Optionally filtered by `search`.","operationId":"ApiV1Controller_listPeople","parameters":[{"name":"search","required":false,"in":"query","description":"Free-text match on name, email or employee number.","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"List people","tags":["Public API v1"]},"post":{"description":"Requires the `write` scope. Counts against the plan people limit.","operationId":"ApiV1Controller_createPerson","parameters":[],"responses":{"201":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"Create a person","tags":["Public API v1"]}},"/api/v1/people/{id}":{"get":{"description":"Includes department, location and current holdings.","operationId":"ApiV1Controller_getPerson","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"Fetch one person","tags":["Public API v1"]},"patch":{"description":"Requires the `write` scope. Setting status to `inactive` fires `employee.offboarded`.","operationId":"ApiV1Controller_updatePerson","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"Update a person","tags":["Public API v1"]}},"/api/v1/members":{"get":{"description":"Logins, not people records.","operationId":"ApiV1Controller_listMembers","parameters":[],"responses":{"200":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"List workspace members","tags":["Public API v1"]},"post":{"description":"Requires the `write` scope. The key acts as `admin`, so it cannot create or promote owners.","operationId":"ApiV1Controller_inviteMember","parameters":[],"responses":{"201":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"Invite a member","tags":["Public API v1"]}},"/api/v1/members/{userId}":{"patch":{"description":"Requires the `write` scope. Bounded by the same role hierarchy as the console.","operationId":"ApiV1Controller_updateMember","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing, malformed or revoked API key."},"403":{"description":"Read-only key used on a write route, or the plan no longer includes API access."},"429":{"description":"Per-minute rate limit or monthly quota exceeded. Honour Retry-After."}},"security":[{"apiKey":[]}],"summary":"Change a member's role","tags":["Public API v1"]}}},"info":{"title":"Stackroom API","description":"Public REST API (v1). Authenticate with a tenant API key — `Authorization: Bearer sk_live_…` or `x-api-key: sk_live_…`. Create keys in Settings → API & Webhooks (Pro plan and above). Read keys may call GET routes; write keys may also create and update. Limits are per key and per plan; every response carries X-RateLimit-* and X-Quota-* headers.","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"apiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{}}}