Access Model & Scopes
AutoCISO API tokens are deny-by-default. A token is not a general-purpose key to your workspace: it opens four specific surfaces, each guarded by its own scopes, and only for the features your organisation’s plan includes. This page is the single reference for all three gates.
Three gates on every call
Every request made with an API token passes three checks:
- Allowlist. Is the path one of the four surfaces below? If not:
403 FORBIDDEN, whatever the token carries. - Scope. Does the token carry the scope the route needs? If not:
403 INSUFFICIENT_SCOPE, naming the scope. - Plan. Does your organisation’s plan include the feature? If not:
402 FEATURE_GATED, naming the lowest plan that does. Over MCP, tools for features outside your plan are simply not listed.
The allowlist is always checked first. The scope and plan checks run in a surface-specific order: on the
supply-chain and questionnaire routes the plan is checked before the scope, on the lifecycle routes the scope comes
first. A request that fails both therefore gets 402 on the former and 403 on the latter.
A few actions inside an allowlisted surface additionally refuse every token with 403 HUMAN_APPROVAL_REQUIRED —
see Human-only actions. No scope, plan or role widens any of these gates.
The four surfaces
| Surface | Path | What it is | Plan |
|---|---|---|---|
| Supply chain security | /api/v1/sscs/* |
13 REST endpoints — SBOMs, components, findings, vendors | The Growth |
| Supplier questionnaire authoring | /api/v1/supplier-assessment-templates/* |
22 REST endpoints — read, create, clone, translate and edit a questionnaire draft up to submitting it | The Growth |
| Employee lifecycle (read-only) | /api/v1/jml/* |
8 REST endpoints — leaver and joiner cases and their reconciled items | The Seed |
| MCP | /mcp |
The Model Context Protocol endpoint for AI clients — 66 tools (61 read-only, 5 write) | Per tool |
Every other path returns 403 FORBIDDEN when called with an API token:
{
"data": null,
"error": {
"code": "FORBIDDEN",
"message": "API tokens are not permitted on this endpoint"
}
}
The check runs during authentication, before routing and before scopes are evaluated.
What stays closed, and why
Interactive endpoints — employees, access reviews, ISO projects, evidence, billing, settings — answer only to a signed-in user, so that every change carries a real person’s identity in the audit trail. In particular:
- The lifecycle and employee endpoints (
/api/v1/lifecycle/*and/api/v1/employees/*) stay closed to tokens. Off-boarding and on-boarding data reaches a token only through the purpose-built/api/v1/jml/endpoints, which never return the raw employee record. - Tokens cannot manage tokens.
GET,POSTandDELETEon/api/v1/tokens(endpoint reference) reject API-token authentication, so a leaked token cannot mint replacements for itself. /api/v1/payloadlog/*explicitly denies API tokens.
For programmatic read access to risk, ISO, access intelligence, supplier, compliance, monitoring, privacy or audit data, use MCP — not REST.
The eight scopes
These eight are the original scopes: they reach the supply-chain, MCP, supplier-questionnaire and lifecycle surfaces described below. Nine newer read scopes are covered in Read scopes for platform data.
| Scope | Grants | Implies | Expiry |
|---|---|---|---|
sbom:read |
Read SBOMs, components, findings, vendors | — | Optional |
sbom:write |
Create, upload, update and delete supply-chain records | sbom:read |
Optional |
mcp:read |
The 56 general read-only MCP tools — those your plan includes | — | Optional |
mcp:write |
Everything mcp:read grants, plus the risk_create_draft and iso_audit_simulate MCP tools |
mcp:read |
Optional |
supplier_template:read |
Supplier-questionnaire templates over REST and the 3 MCP read tools (supplier_questionnaire_list/get/validate), including scoring fields (weight, risk value, finding severity) no other scope exposes |
— | Optional |
supplier_template:write |
Create, clone, translate, edit, submit and withdraw a questionnaire draft over REST, and the 3 MCP write tools (supplier_questionnaire_clone/update_question/update_option) |
supplier_template:read |
Required |
jml:read |
Read-only off-boarding and on-boarding reconciliation over REST (/api/v1/jml/): leaver and joiner cases and their items, without names or emails. Created by an Owner or Manager |
— | Required, at most 365 days |
pii:read |
The employee_resolve MCP tool — real names and emails for explicitly requested employee IDs — and, on a token that also holds jml:read, the name and email fields of the off-boarding and on-boarding case endpoints. Owner only, every use audited |
— | Required, at most 90 days |
Implication is one-directional: a token with sbom:write can read, but a token with sbom:read cannot write. The
families are independent:
sbom:writegrants nothing over MCP, andmcp:writegrants nothing over REST.mcp:writegrants neithersupplier_template:readnorsupplier_template:write. The questionnaire tools return scoring fields no other tool exposes, so they sit behind their own scope pair.mcp:writedoes not implypii:read, andpii:readimplies nothing. On its ownpii:readgrants nothing over REST and unlocks exactly two MCP tools; a token with onlypii:readsees two tools intools/list. Combined withjml:readit adds names and emails to the case endpoints — see Employee identity.jml:readimplies nothing and grants nothing over MCP. A token holdingjml:readtogether withpii:readmust expire within 90 days.
Scopes are fixed when a token is created. To change them, create a new token and revoke the old one — see Rotating a token.
Read scopes for platform data
Nine more scopes give a token read-only access to platform data over REST. They are live: a token that holds one can call the operations listed below, and nothing else. The create-token dialog marks a scope Not live for your organisation yet only if its endpoints are switched off for your organisation, and you can still select it.
| Scope | Data | Operations | Who may grant it | Longest expiry |
|---|---|---|---|---|
asset:read |
Assets, their owners, classification and status | List assets | Owner or Manager | 365 days |
risk:read |
The risk register and its statuses | List risk records, get one | Owner or Manager | 365 days |
supplier:read |
Suppliers, their agreements and assessments | List suppliers, get one, agreements, assessments | Owner or Manager | 365 days |
iso:read |
ISO 27001 projects, gap controls, policies, readiness, roadmap and Statement of Applicability | List ISO projects and the project operations under it | Owner or Manager | 365 days |
compliance:read |
Compliance posture, control reliability states and continuous monitoring status | Compliance overview, control states, project monitoring | Owner or Manager | 365 days |
evidence:read |
Evidence metadata collected for a project’s controls | List evidence | Owner or Manager | 365 days |
access_review:read |
The access inventory, one row per grant | List the access inventory | Owner only | 365 days |
employee:read |
Employee records and their access history | List employees, access history | Owner only | 180 days |
audit_log:read |
Audit trail entries: ids, codes and chain fields only | List audit trail entries | Owner only | 180 days |
Employee names and emails are not part of employee:read. They are returned only to a token that also holds
pii:read, which is a separate Owner-granted scope with its own limits (see above). Every read that discloses
identities, and every read of the audit trail, is recorded in your organisation’s Audit Trail.
Rules that apply to every scope in this table:
- Always read-only. None of them implies another scope, and none can write.
- An expiry is required. Pick a date no later than the longest expiry in the table. If the token also holds
another scope with a shorter ceiling, the lowest ceiling wins:
jml:readis 365 days, and any token that holdspii:readis 90 days. See Expiry rules. - Granting is checked when the token is created. Owner-only scopes are refused for a Manager with
403 OWNER_REQUIRED; a scope your role may not grant gets403 INSUFFICIENT_ROLE. - The creator must stay qualified. If the person who created a token later loses the role the token’s scopes
need, or leaves the organisation, AutoCISO suspends the token. A suspended token is refused like a revoked one and
is not resumed; the token list shows
suspendedAtandsuspendedReason. Create a replacement. - A plan can still say no. A scope never unlocks a feature your plan lacks;
the call returns
402 FEATURE_GATEDnaming the lowest plan that includes it. - At most 40 scopes per token, as explicit names. A wildcard such as
asset:*, or a preset name, is refused with400 SCOPE_INVALID.
Audit trail integrity: audit_log:verify
One more read-only scope lets a token run the Audit Trail integrity check
(Verify the audit trail hash chain) and nothing else: it does not read audit
entries, implies no other scope and is implied by none. Reading the entries needs audit_log:read, above.
| Scope | What it grants | Who may grant it | Longest expiry | Plan |
|---|---|---|---|---|
audit_log:verify |
Run the audit chain integrity check | Owner only | 180 days | The Growth and above (Audit Trail) |
The expiry rules and the other rules above apply. What the result shows a token, and how fresh it is, is described in Audit Trail Integrity.
Presets
The create-token dialog offers two presets that only tick boxes for you; the token stores the individual scope
names, never the preset. Neither preset includes pii:read or any of the original eight scopes. BI read-only does not include audit_log:verify.
| Preset | What it selects |
|---|---|
| Read everything | All nine scopes in the table above, plus audit_log:verify |
| BI read-only | The six scopes a Manager may grant: asset:read, risk:read, supplier:read, iso:read, compliance:read, evidence:read |
To see exactly which scopes your role may grant, and whether their endpoints are live, open API Tokens and click
Create Token; the dialog reads the same list from GET /api/v1/tokens/scopes
(reference).
Suspended organisations
While an organisation is suspended, a token of that organisation is refused with 403 ORG_SUSPENDED on every
surface a token can reach: supply chain, supplier templates, lifecycle, the MCP endpoint and the read endpoints for
the scopes above once they are published. The token itself is unchanged: calls work again as soon as the
organisation is reactivated. The refusal carries no plan or organisation details. The suspension can take up to
30 seconds to take effect.
REST scope matrix
All paths are relative to https://api.autociso.io/api/v1.
Supply chain — sbom:*
Requires the Supply Chain Security feature (The Growth plan or higher). Reference: Supply chain API; per-endpoint pages for SBOMs, findings and vendors.
| Method | Path | Scope |
|---|---|---|
GET |
/sscs/sboms |
sbom:read |
GET |
/sscs/sboms/{sbomId} |
sbom:read |
GET |
/sscs/sboms/{sbomId}/components |
sbom:read |
POST |
/sscs/sboms |
sbom:write |
POST |
/sscs/sboms/upload |
sbom:write |
DELETE |
/sscs/sboms/{sbomId} |
sbom:write |
GET |
/sscs/findings |
sbom:read |
GET |
/sscs/findings/summary |
sbom:read |
PATCH |
/sscs/findings/{findingId}/status |
sbom:write |
GET |
/sscs/vendors |
sbom:read |
GET |
/sscs/vendors/risk-summary |
sbom:read |
POST |
/sscs/vendors |
sbom:write |
PUT |
/sscs/vendors/{vendorId} |
sbom:write |
Supplier questionnaires — supplier_template:*
Requires the Supply Chain Security feature (The Growth plan or higher). Reference: Supplier questionnaires API.
| Method | Path | Scope |
|---|---|---|
GET |
/supplier-assessment-templates |
supplier_template:read |
GET |
/supplier-assessment-templates/{templateId} |
supplier_template:read |
GET |
/supplier-assessment-templates/{templateId}/versions/{version} |
supplier_template:read |
GET |
/supplier-assessment-templates/{templateId}/versions/{version}/diff/{otherVersion} |
supplier_template:read |
POST |
/supplier-assessment-templates/{templateId}/validate |
supplier_template:read |
POST |
/supplier-assessment-templates/{templateId}/publish/preview |
supplier_template:read |
POST |
/supplier-assessment-templates |
supplier_template:write |
POST |
/supplier-assessment-templates/clone |
supplier_template:write |
POST |
/supplier-assessment-templates/translate |
supplier_template:write |
POST |
/supplier-assessment-templates/{templateId}/draft |
supplier_template:write |
PATCH |
/supplier-assessment-templates/{templateId}/meta |
supplier_template:write |
POST |
/supplier-assessment-templates/{templateId}/sections |
supplier_template:write |
PATCH |
/supplier-assessment-templates/{templateId}/sections/{sectionId} |
supplier_template:write |
DELETE |
/supplier-assessment-templates/{templateId}/sections/{sectionId} |
supplier_template:write |
POST |
/supplier-assessment-templates/{templateId}/questions |
supplier_template:write |
PATCH |
/supplier-assessment-templates/{templateId}/questions/{questionId} |
supplier_template:write |
DELETE |
/supplier-assessment-templates/{templateId}/questions/{questionId} |
supplier_template:write |
POST |
/supplier-assessment-templates/{templateId}/questions/{questionId}/options |
supplier_template:write |
PATCH |
/supplier-assessment-templates/{templateId}/questions/{questionId}/options/{optionId} |
supplier_template:write |
DELETE |
/supplier-assessment-templates/{templateId}/questions/{questionId}/options/{optionId} |
supplier_template:write |
POST |
/supplier-assessment-templates/{templateId}/submit |
supplier_template:write |
POST |
/supplier-assessment-templates/{templateId}/withdraw |
supplier_template:write |
Employee lifecycle — jml:read
Read-only. Requires the Employee lifecycle feature (The Seed plan or higher). Limited to 5 requests per second per token, burst of 30 — see Errors & rate limits. References: Off-boarding API, On-boarding API.
| Method | Path | Scope | Employee name and email |
|---|---|---|---|
GET |
/jml/offboarding/cases |
jml:read |
With pii:read |
GET |
/jml/offboarding/cases/{caseId} |
jml:read |
With pii:read |
GET |
/jml/offboarding/cases/{caseId}/items |
jml:read |
Never (employee ID only) |
GET |
/jml/offboarding/items |
jml:read |
Never (employee ID only) |
GET |
/jml/onboarding/cases |
jml:read |
With pii:read |
GET |
/jml/onboarding/cases/{caseId} |
jml:read |
With pii:read |
GET |
/jml/onboarding/cases/{caseId}/items |
jml:read |
Never (employee ID only) |
GET |
/jml/onboarding/items |
jml:read |
Never (employee ID only) |
The lifecycle API is switched on per deployment; where it is not enabled, these paths answer 403 FORBIDDEN.
MCP scope matrix
Over /mcp, scope decides which tools appear in tools/list. A tool the token may not use is filtered out of the
listing rather than failing at call time. The server registers 66 tools in total (61 read-only, 5 write); which of
them a token sees depends on its scopes and on the organisation’s plan — a scope never unlocks a feature the plan
does not include (see Scope is not entitlement). Counts
below are for an organisation on The Scale:
| Scope | Tools visible |
|---|---|
mcp:read |
56 read-only tools (Free 3, Seed 10, Growth 44, Scale 56) |
mcp:write |
57 tools (adds risk_create_draft and iso_audit_simulate) |
supplier_template:read |
3 supplier-questionnaire read tools |
supplier_template:write |
6 supplier-questionnaire tools (adds the 3 write tools) |
pii:read |
2 tools, employee_resolve and employee_lookup — absent from tools/list for every token without the scope |
A token needs mcp:write and supplier_template:write together to see all 5 write tools, and pii:read on top to
see all 66. Every write tool has a second gate: it is hidden unless MCP writes are enabled for the deployment. A token
holding every write scope against a deployment with writes disabled sees only the
61 read tools (59 without pii:read). employee_resolve and employee_lookup are likewise registered only where employee identity access is enabled.
Human-only actions
Inside the questionnaire-authoring surface, a supplier_template:write token can open a draft, edit it and call
submit, moving it to Awaiting approval. It cannot go further: publish, reject (the “send back” action in the
console), archive, unarchive, default and DELETE /{templateId} refuse every API token with
403 HUMAN_APPROVAL_REQUIRED, whatever scope it holds. Publishing changes how every new supplier assessment is scored,
with no recall, so it always needs a person — there is no supplier_template:publish scope.
Edits made through a token count as edits by the person who created the token, so a token cannot be used to get around the second approver. See Supplier questionnaires.
Access revocation follows the same rule. Marking an audit upload as a complete snapshot of an asset
(is_complete_snapshot=true on the console upload) is accepted from a signed-in person only: an API token that sends it
gets 403 HUMAN_APPROVAL_REQUIRED. A complete snapshot never revokes anything by itself. Once it has no pending review
tasks and is large enough (at least 3 rows and at least 20% of the asset’s current active grants), active grants that it
does not list become possible revocations, and an Owner or Manager approves or keeps each one in the console, on the
Access page. This review is available to signed-in people only, never to API tokens.
When a gate refuses
| Status | Code | Meaning | Fix |
|---|---|---|---|
403 |
FORBIDDEN |
The path does not accept API tokens, or the lifecycle API is not enabled for your deployment | Use a signed-in session or MCP. Adding scopes will not help. |
403 |
INSUFFICIENT_SCOPE |
The path accepts tokens, but this token lacks the scope named in the message | Create a token with that scope |
403 |
HUMAN_APPROVAL_REQUIRED |
The action is human-only | Do it in the console |
403 |
OWNER_REQUIRED |
A Manager tried to create a pii:read token |
Ask an Owner |
402 |
FEATURE_GATED |
Your plan does not include the feature; error.args.minTierName names the plan that does |
Upgrade in user menu → Billing & Subscription |
{
"data": null,
"error": {
"code": "INSUFFICIENT_SCOPE",
"message": "this API token does not have the required scope: sbom:write"
}
}
The full list of status codes and rate limits is in Errors & rate limits.
Was this page helpful?