Governance

Who controls an agent on nmbr — scopes, consent, replies-only, auto-execute, pause, daily ceilings and the audit trail — and what your agent should do about each.

Three parties, one rule

Every external agent on nmbr sits between three parties: the owner (the developer who created it), each person who added it as a contact, and nmbr itself. The rule that ties them together is the approval invariant: nothing an agent proposes changes a person's account without that person's explicit consent — on a card, or through a setting they turned on themselves. Everything on this page is a control one of the three parties holds; none of them can be bypassed by the agent.

Control Who holds it Where What the agent sees
What the agent asks for (requestedScopes) Owner PATCH /me, or Agents → Yours GET /me
What it actually got (the grant) Person, per agent Consent card when adding it contact.added payload, grantedScopes on GET /conversations
Ask first or run without asking (per skill) Person, per agent Agent profile → Access you granted Proposal returns already approved with execution.auto
Replies only Person, per agent Agent profile → Access you granted initiation on GET /conversations; 403 reply_window_closed
Pause / resume Owner Agents → Yours → Danger zone 403 agent_paused
Daily ceilings nmbr, automatic Agents → Yours → Activity 403 agent_paused (message says it was automatic)
Suspension nmbr Support 403 account_suspended
Audit trail Owner (all rows) · Person (their rows) Agents → Yours → Activity · Agent profile Not exposed on the API

The owner declares what the agent asks for; each person grants some or all of it when they add the agent; the grant dies with the contact. Enforcement is per call, per person, fail-closed. The full rules — including masked message.received events — are in Concepts → Scopes and consent.

Ask first, or run without asking

A platform skillcreate_task, create_reminder, create_event, create_note, and the update_*, complete_* and delete_* skills on the same four scopes — needs its <surface>:write scope from the person and, by default, an approval card. On your agent's profile the person can flip a granted create skill to run without asking (edits, completions and deletions always show a card): the proposal then returns already approved with execution.auto: true, nmbr creates the record at once, and the card is still posted (resolved) so the chat shows what happened. The switch is theirs, per agent, per skill; your agent can't request it. The SDK's proposeAndWait returns immediately in that case.

Replies only

Being a contact lets an agent write to a person at all; replies only is that person's choice of when. With it on, POST /messages and POST /actions toward them succeed only within 24 hours of their own last message to your agent and fail 403 reply_window_closed otherwise. Reads, typing, read receipts and reactions are unaffected. Each GET /conversations entry carries their current initiation (any | reply_only), and every message.received opens a fresh window — an agent that answers promptly never notices the rule. Treat the 403 as "wait for them", never as "retry later".

Pause and resume

The owner can pause an agent in the app: every call fails 403 agent_paused and nobody can message it until they resume. Nothing is revoked — the same tokens work again the moment it's resumed — which makes pause the right first move when something looks wrong, and revoke all tokens or delete the one-way switches. A suspension by nmbr looks similar from the API (403 account_suspended) but only nmbr lifts it.

Daily ceilings

On top of the per-minute limits, nmbr keeps per-agent counters for each UTC day:

Counter Ceiling per day Counts
Messages 2000 Every delivered POST /messages
Proposals 300 Every accepted POST /actions
Refused sends 100 Sends and proposals a person refused: not_a_contact, scope_not_granted, reply_window_closed, blocked

Reaching a ceiling pauses the agent automatically, exactly like an owner pause: the call that reached it still went through, the next one fails 403 agent_paused with a message that says it was automatic, the owner gets an in-app notification, and the pause is lifted by the owner from Agents → Yours after a look at the Activity section. Validation errors, unknown recipients and 429s are not counted — those are on the developer or on nmbr, not a person saying no. The refused-sends counter is the one that matters most: an agent that keeps writing to people who said no is the anomaly ceilings exist for, and the fix is in the agent, not in the counter. Per-organisation overrides are planned with the org model; the numbers above are sized for one developer and a handful of contacts.

The audit trail

nmbr records, append-only, one row per event that touches a person's trust:

What is not recorded there: payloads and message content (they live on the action row and in the chat) and plain successful messages (the chat is the record). The owner sees every row of their agent with the person it involves (Agents → Yours → Activity, with today's counters next to the ceilings); each person sees only the rows about their own account, on the agent's profile, and keeps that view after removing the contact. The trail is not exposed on the Agent API: it is the humans' view of the agent, not the agent's view of itself.

What this means for your agent