Agent ISSO
An organization-scoped API key that lets your own tooling — Claude Code, Codex, or a script — read a compliance package and make safe updates through the Bedrock CMMC API.
Agent ISSO is Bedrock CMMC's automation credential. It is an API key,
owned by your organization, that works on the /api/v1/* API and nowhere
else. You bring the intelligence — a Claude Code session, an OpenAI Codex
agent, a CI job, a Python script — and the key gives that tool a
tightly-scoped way to read your packages and record the kind of changes an
Information System Security Officer would make: mark an objective met, attach
evidence, open a POA&M.
Bedrock does not run a model on your behalf and does not bill you for one. Your tooling calls the API; the API enforces the scopes you granted and writes every change to the same audit trail your team sees in the app.
Keys never open the web app
An Agent ISSO key authenticates only against https://api.bedrock-cmmc.com/api/v1/*.
Presenting one to the web application, to /api/osc/*, or to any other route
is rejected. There is no way to sign in to a portal with a key.
What a key can and cannot do
The ceiling is fixed by the platform and cannot be raised by any scope: read everything in your packages, plus the writes an ISSO makes day to day.
A key with the right scopes can:
- List and read packages, controls, objectives, evidence, POA&Ms, assets, the ConMon schedule, the SSP, and the SPRS score.
- Set an objective's status (
MET,NOT_MET,NOT_APPLICABLE,NOT_ASSESSED) and its narrative fields — assessment notes, implementation statement, policy and procedure references. - Edit a control's implementation and assessment notes.
- Create an evidence record, upload the file, and link it to an objective or control.
- Create a POA&M and update its status, milestones, dates, and risk level.
No key, with any combination of scopes, can:
- Delete anything. There are no
*:deletescopes. - Create or delete a package.
- Approve or archive a System Security Plan.
- Invite, remove, or change team members, or manage roles.
- Touch billing, your plan, or organization settings.
- Enable Agent ISSO, or mint, rotate, or revoke keys — those are UI actions for humans.
Every write a key makes goes through the same validation as the same action in the web app, and the audit feed records it with actor type agent and the key's name, so you always know which automation did what.
Who can turn it on and who can mint keys
Agent ISSO follows your organization's roles:
| Action | Owner | Admin | User / Viewer |
|---|---|---|---|
| Enable or disable Agent ISSO for the organization | Yes | No | No |
| Create, rotate, or revoke a key | Yes | Yes | No |
| See the key table (names, prefixes, scopes, status) | Yes | Yes | Read-only |
Agent ISSO is off for every organization until an Owner turns it on. It is available on every paid Contractor and MSP plan. RP partner and Guest accounts cannot hold keys.
Enabling Agent ISSO
- Open Settings → Agent ISSO in the sidebar (MSPs: the same page in the MSP workspace's settings).
- In the Enable Agent ISSO row, flip the switch. The row records who enabled it and when.
Turning the switch off later does not delete your keys — it makes the
API reject all of them with AGENT_ISSO_DISABLED until an Owner turns it
back on, at which point existing keys work again without being re-issued.
That makes the switch a one-click kill switch for every automation at once.
Creating a key
Click New key. The dialog asks for three things:
- Name — describe the consumer, not the person:
claude-code (jane),ci-evidence-sync,quarterly-report (read-only). Names are unique within your organization and up to 64 characters. - Expires in — 30, 90, 180, or 365 days. Every key expires; there is no non-expiring option. Shorter is better for anything interactive; pick 365 only for a service you have a rotation habit for.
- Scopes — a grid of resources with Read and Write columns (see the scope table below). The Write box is disabled for resources that have no writes at all. Select all and Read-only preset fill the grid in one click. A key must have at least one scope.
Click Create. The token is shown once:
bcmmc_3f9a1c2e8b7d4650_Qm9vaGFuZ2VyLWlzLW5vdC1hLXJlYWwtc2VjcmV0Copy it into your secret manager or the environment variable your tool
reads (see Keep the key safe).
Close the dialog and the token is gone for good — the table shows only the
key's prefix (bcmmc_3f9a1c2e8b7d4650) so you can tell keys apart. If
you lose a token, rotate the key; nothing can recover the original.
One token, shown once
The platform stores only a SHA-256 hash of the secret half of the token. It cannot show it to you again, and support cannot retrieve it either. Treat the reveal dialog like a password reset link: copy it now, or start over.
Token format
bcmmc_<key id>_<secret>
16 hex 43 chars, base64url of 32 random bytesThe key id is public — it appears in the table as the prefix and is safe to paste into a support ticket. The secret half is never stored in the clear.
Scopes
Scopes are the only permission model a key has. Each API endpoint requires
exactly one scope; a request without it fails with 403 FORBIDDEN_SCOPE
before anything is read or written. The vocabulary is fixed — a key request
with any scope outside this list is rejected.
| Scope | Grants |
|---|---|
packages:read | List your organization's packages and read a package's profile. |
controls:read | List a package's controls with status, points, and objective progress; read a control's full detail (objectives, evidence links, ESP mappings). |
controls:write | Set an objective's status and narrative fields; edit a control's implementation and assessment notes. |
evidence:read | List a package's evidence records. |
evidence:write | Create an evidence record (returns a presigned upload URL) and link evidence to an objective or control. |
poams:read | List a package's POA&Ms with milestones and linked requirements. |
poams:write | Create a POA&M for a POA&M-eligible requirement; update status, milestones, dates, description, and risk level. |
assets:read | List a package's hardware, software, and network assets. |
conmon:read | Read the continuous-monitoring schedule and freshness of each control. |
ssp:read | Read the System Security Plan's sections and status (no diagram bytes). |
sprs:read | Read the package's SPRS score, family rollup, and certification blockers. |
Five resources — packages, assets, conmon, ssp, sprs — are read-only by design; the API has no write for them, so no write scope exists.
Two rules of thumb:
- A reporting agent needs only the
*:readscopes it touches. A script that posts your SPRS score to a dashboard needspackages:read sprs:readand nothing else. - An agent that does ISSO work — assessing objectives, filing evidence,
opening POA&Ms — needs
packages:read controls:read controls:write evidence:read evidence:write poams:read poams:write. That is the set the Claude Code quickstart uses.
GET /api/v1/me works with any key regardless of scopes, so an agent can
always discover what it has been granted before it plans a task.
The key table
| Column | Meaning |
|---|---|
| Name | The label you gave the key. |
| Prefix | bcmmc_ plus the key id — identification only, not a credential. |
| Scopes | The granted scopes as chips (collapsed to a count when there are many). |
| Expires | Relative time and date. Amber inside 14 days, red once expired. |
| Last used | When the key last authenticated a request (updated at most once a minute). |
| Status | Active, Expired, or Revoked. |
| Actions | Rotate and Revoke. |
An organization can hold 25 active keys at a time. Expired and revoked
keys do not count; a 26th mint fails with 409 AGENT_KEY_LIMIT until you
revoke one.
Rotating a key
Rotate mints a brand-new key with the same name and scopes and shows its token once. The old key keeps working until you revoke it, so you can re-point a consumer without an outage: mint, update the secret, confirm the new key shows a Last used time, then revoke the old one. Rotate whenever a token may have leaked, when the person who held it leaves, and before any 365-day key gets close to expiry.
Revoking a key
Revoke ends a key immediately and permanently — the next request with
it returns 401 KEY_REVOKED. Revoked keys stay in the table for the record.
There is no undo; mint a new key instead.
Audit trail
Enabling or disabling Agent ISSO and every mint, rotate, and revoke is
written to your organization's audit feed as
agent_isso.enabled, agent_isso.disabled, agent_isso.key_created,
agent_isso.key_rotated, or agent_isso.key_revoked, with the key name and
scopes. Changes the key itself makes appear as ordinary control, evidence,
and POA&M events with actor type agent and the key name as the actor.
Next steps
- API reference — every endpoint, error code, and the OpenAPI document.
- Claude Code quickstart — mint a key, verify it, and walk through a full assess → evidence → POA&M cycle, then hand the API to Claude Code.