Skip to main content
Your workspace has members, an audit log and usage counts. API keys with dedicated scopes read and manage them, so your own tools can automate team and compliance work. management alone does not grant any of these routes. Only an owner with access to both environments can issue the members and members_manage scopes. members_manage requires a service key. Scopes lists every scope. A key without the scope answers 403 workspace_forbidden. A key acts only in its own workspace and environment. A test key on a team route, or a key on the other environment, answers 404 not_found.

Roles

Each member holds one role. A role is a built-in set of capabilities. Two more fields narrow a role:
  • environments limits the member to ["live"], ["test"] or both. An invitation grants both when you omit it. Owners always keep both.
  • denied_actions takes away up to three capabilities from the role: evidence.read (detailed evidence and submitted identifiers), exports.read (exports) and policy.publish (active policy publication). An empty array clears the exclusions.
A change to a member’s role, environments or denied_actions applies to the next request. It also revokes the personal keys of that member.

Members

List members
The answer lists active members, oldest first. Each member has a stable id that starts with mem_, its external_user_id at the identity provider of the console, role, environments and denied_actions. PATCH /v1/workspaces/{workspace_id}/members/{member_id} changes a non-owner member. The body must have role. An omitted environments or denied_actions keeps its current value.
Make a member an investigator with test access only
DELETE /v1/workspaces/{workspace_id}/members/{member_id} revokes the workspace access of a non-owner member and answers 204. The member loses access at once. A later invitation restores the member with the same mem_ id. API keys cannot make, change or invite owners, or revoke their access. An owner as the target answers 404 not_found.

Invitations

An invitation lets a person join the workspace with a role. Its lifecycle has four calls.
1

Create the invitation

POST /v1/workspaces/{workspace_id}/invites answers 201 with the invitation and its secret token. NoResponse shows the token once.
Invite a developer
email is for your records. NoResponse does not match it against the person who accepts. Set external_user_id instead to let only that user accept.
2

Deliver the token

This call sends no email. Give the token to the person through a secure channel. The token works once and expires after seven days.
3

List pending invitations

GET /v1/workspaces/{workspace_id}/invites lists pending non-owner invitations, oldest first, without tokens.
4

Revoke or reissue

DELETE /v1/workspaces/{workspace_id}/invites/{invite_id} revokes an invitation and answers 204. Its token stops working.POST /v1/workspaces/{workspace_id}/invites/{invite_id}/resend with an empty body {} replaces the token and renews the seven-day expiry. It also renews an expired invitation. The invitation keeps its id and grants. The old token stops working at once. Each call makes a new token. An accepted or revoked invitation answers 404 not_found.
The invited person accepts the invitation in the NoResponse console. API keys cannot accept invitations. A workspace has at most 100 active members and 50 pending invitations. More answers 409 member_limit_reached. An invitation with the external_user_id of an active member answers 409 already_member.

Audit events

The audit log records each privileged change in your workspace: its actor, action, target, outcome and time. A successful change and its audit event commit together. Events hold no secrets and no submitted identifiers.
Get denied key changes from the last day
All filters are optional and apply before paging: Each page holds up to limit events, from 1 to 100, with a default of 20. Events arrive newest first. When another page exists, the answer has next_cursor. Send it as cursor and keep every filter the same. Each event has actor.type user or api_key. affected_environment is workspace for member and invitation changes. Only console members with access to both environments read these workspace-wide events. An API key reads only the events of its own environment. request_id links the event to the X-Request-ID of the request.

Audit retention

Each environment keeps audit events for retention_days, from 1 to 365. The default is 365. The live policy also covers workspace-wide events.
Read test audit retention
The answer has retention_days and oldest_available_at. oldest_available_at does not prove that capture was complete before that time. A test key with audit_manage changes test retention with PATCH and a body such as { "retention_days": 90 }. Change live retention in the NoResponse console, as a member with both environment grants and audit administration access.
A shorter retention hides expired events at once and invalidates the audit exports of that environment. A shorter live retention also invalidates the workspace-wide audit exports. A longer retention does not restore deleted events.

Audit streams

An audit stream sends each new audit event to one of your webhook endpoints as a signed audit.event webhook. Use it to keep the audit log in your own SIEM or compliance store.
You need a registered and verified webhook endpoint in the same environment. See Webhooks.
1

Configure the stream

POST /v1/workspaces/{workspace_id}/streams/{environment} creates or updates the subscription for one endpoint. A key uses the environment of the key. The workspace environment streams workspace-wide events, and only a console member with access to both environments can use it.
Stream key and member changes
actions takes up to 32 action names. An empty array sends every action in that environment.
2

Receive audit.event

The stream starts at subscription creation. For earlier events, use an audit export. Verify the signature before you parse the body. Deliveries can repeat and arrive out of order, so deduplicate on the webhook id. See audit.event.
3

Check delivery health

GET /v1/workspaces/{workspace_id}/streams/{environment} lists up to 10 subscriptions. Each has endpoint_state (unverified, verified or disabled), last_attempt_at and last_delivered_at.
To send one event again, call POST /v1/workspaces/{workspace_id}/streams/{environment}/{endpoint_id}/replay with { "event_id": "evt_..." }. The body and event id stay the same, with a new signature. The current subscription, action filter and retention must still permit the event. Audit deliveries stay replayable for at most 30 days. The ordinary webhook replay route refuses audit events. DELETE /v1/workspaces/{workspace_id}/streams/{environment}/{endpoint_id} stops the stream and cancels its queued deliveries. The endpoint stays registered for other event types.

Usage

GET /v1/workspaces/{workspace_id}/usage answers daily usage counts for the environments that you can access. A key with usage reads its own environment. The counts have no prices.
Get usage for October
from and to are UTC days as YYYY-MM-DD. NoResponse includes the to day. It cannot be later than today. Without from and to, the range is the 30 days that end today. With only one of them, the range is the 30 days that start or end on that day. A range is at most 366 days.
200 response
object[]
One item for each environment, day, metric, flow and depth with a count above 0. Live comes first.
  • assessments counts admitted assessments, with flow and depth.
  • webhook_deliveries counts one delivery for each event and endpoint. Retries and replays add nothing.
  • key_usage_events counts accepted key-usage events.
  • screenings counts one unit for each person that a screening screens. A screening counts each person one time. A person that a screening could not cover counts nothing.
A count does not change when you later delete the assessment, account or workspace.
object
The daily cap on the assessments that members make in the live console playground. used is the lookups spent since the last reset. limit is the lookups allowed per UTC day. resets_at is the next midnight UTC, when used returns to 0. API keys spend no lookups. At the cap, the next console lookup answers 429 lookup_limit_reached.It is present only when the caller can read the live environment and the API enforces the cap. A test key or a member with test access only does not get it. from and to do not change it.

Assessment budgets

Your workspace can have an assessment allowance for each billing period and a hard budget. A member with the billing role sets the budget in the NoResponse console. When a new assessment would exceed either, POST /v1/assessments answers 429 assessment_budget_exhausted. The refused assessment does not spend a usage unit. Compare the assessments counts in your usage with your allowance to see how close you are to the limit.

Screening budgets

The billing period and its budgets apply to assessments. The screenings units count in the billing period and its settlements, but they have no price there. The spend of screenings has its own limit for each day: the screening_daily_cap setting of each environment.