# Agent Docs

Generated detail reference from the gateway runtime contracts and the
central capability registry. This file is generated; do not hand-edit
generated sections.

## Discovery Flow

1. Read `/llms.txt` to find the machine-readable entrypoints.
2. Fetch `/mcp/manifest` for transport, auth and tool definitions.
3. Use `search_capabilities` for a compact shortlist.
4. Use `describe` before calling any capability.
5. Use `dry_run` when `describe.dry_run` is `required`; for paid actions
   also use it to obtain the estimate before the budget guard.
6. Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).

## Generated Snapshot

- Interface version: 1.0
- Registry snapshot: 147jae3
- Registry generated date: 2026-07-02
- Registry capabilities: 272
- Invocable contracts: 206

## Auth

- API keys use `Authorization: Bearer wr_ak_<prefix>.<secret>`.
- Bootstrap keys can only register/bootstrap and read catalog material.
- Installation keys carry scopes; scopes can restrict RLS visibility but never
  extend it.

## Access Quickstart

1. `POST /register` creates the Agent App and returns a bootstrap key;
   optionally include `agent_email` for a real agent mailbox.
2. `POST /organizations` creates the organization, installation, first
   installation key, owner OTP and, when `agent_email` is set, agent OTP
   with `agent_otp_delivery.correlation_id` and extraction hints. Store
   `owner_otp_delivery.next_action`; it tells you to submit the Owner-Code
   to `POST /owner-otp/claim` with the installation key.
3. If the owner OTP mail did not arrive, call `POST /owner-otp/resend` with the
   installation key before claiming.
4. The owner mail contains a copyable agent briefing. Accept a casually
   forwarded `Owner-Code: <OTP>` or `Code: <OTP>` and use the code as
   `{ "otp": "<OTP>" }` for `POST /owner-otp/claim`.
5. `POST /owner-otp/claim` legitimates the agent after the owner shared the OTP.
   Until all required OTPs are verified, `GET /org/current`, `/keys/rotate`
   and operational `/mcp/dry_run` or `/mcp/invoke` are expected to return
   HTTP 412 `precondition_failed`: owner or agent legitimation is still
   open. Do not treat this as a platform failure; complete the missing OTP.
6. If `agent_email` was set and the agent OTP mail did not arrive, expired
   or was invalidated after too many wrong attempts, call
   `POST /agent-otp/resend` with the installation key; it returns a fresh
   `agent_otp_delivery.correlation_id`.
7. Find the agent OTP mail by IMAP Subject containing
   `Ref: <correlation_id>`, then extract the OTP from the standalone body
   line `Code: <OTP>` with `^Code:\s*(?<otp>\S+)\s*$`.
8. `POST /agent-otp/verify` verifies that the agent
   can read its own mailbox. Owner-OTP and agent-OTP may be completed in either
   order; operational work stays blocked until both required OTPs are verified.
9. The same installation key receives the unlocked working scopes; store it and
   keep using it for the first work.
10. Poll `GET /org/current` with the same installation key until
   `installation.operator_approval_status` is `approved`.
11. Operational capabilities stay blocked until OTP verification and operator
   approval are active; while approval is pending, `/mcp/dry_run` and
   `/mcp/invoke` return HTTP 412.
12. Polling rule: first poll after 30 seconds, then at most once every 60
   seconds, for up to 15 minutes; if still `pending`, stop and hand over.
13. Key rotation is optional later hygiene; the newly issued cleartext key is
   shown once and must be stored immediately.

## Access Field Rules

- `/register`: send `Idempotency-Key`, `owner_email`, `app.slug` and
  `app.name`. Optional `agent_email` requests a real principal mailbox.
  Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).
  Repeat the same `owner_email` and, when present, the same `agent_email`
  during bootstrap.
- `/organizations`: authorize with the bootstrap key, send
  `Idempotency-Key`, `owner_email`, optional `agent_email` and
  `organization.name`; store the returned `installation_key.token` immediately
  because it is shown once. Also read `owner_otp_delivery.next_action`.
  If `agent_email` is set, read
  `agent_otp_delivery.correlation_id` and `agent_otp_delivery.extraction`.
  Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).
- `/owner-otp/claim`: authorize with the installation key, send
  `Idempotency-Key` and `otp`; `owner_verified_at` confirms owner
  legitimation, not operator approval.
  Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).
- Owner-OTP-Claim input may come from the owner's copyable briefing or from
  a casual chat message. Parse `Owner-Code: <OTP>` or `Code: <OTP>` and send
  only the OTP value in the claim body. This assumes the agent still has the
  installation key; key recovery remains a separate open decision.
- `/owner-otp/resend`: authorize with the installation key and send
  `Idempotency-Key`; it issues a fresh owner OTP, invalidates the previous
  owner OTP, resets owner OTP attempts and returns
  `owner_otp_delivery.next_action` again.
  Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).
- `/agent-otp/verify`: only required when `agent_email` is set. Authorize with
  the installation key and send `Idempotency-Key` plus `otp`; successful
  verification sets `agent_email_verified_at` and changes
  `agent_email_verification_status` from `pending` to `verified`. Verify
  checks only the OTP code; the correlation id is for mail discovery.
  Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).
- `/agent-otp/resend`: authorize with the installation key and send
  `Idempotency-Key`; it issues a fresh agent email OTP, invalidates the
  previous agent OTP, resets agent OTP attempts and returns a fresh
  `agent_otp_delivery.correlation_id`.
  Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).
- Agent OTP mail discovery: search the agent mailbox for an IMAP Subject that
  contains `Ref: <correlation_id>` and parse the standalone body line
  `Code: <OTP>` with `^Code:\s*(?<otp>\S+)\s*$`. Owner OTP mails never
  contain the correlation id.
- `/org/current`: before successful Owner-OTP claim, or before Agent-OTP
  verification when `agent_email` is set, HTTP 412 `precondition_failed` is
  expected. Complete the missing OTP, then retry the status read.
- `/org/current` after required OTPs: `operator_approval_status` is derived
  from operator facts: `blocked` means stop, `approved` means
  `operator_approved_at` is set and operational work may start, and
  `pending` means wait or hand over.
- `search_capabilities` returns `interface_version`, `results`, `total` and
  `next_cursor`; each result has `id`, `version`, `summary`, `domain`,
  `risk_level` and `access`.
- `describe` returns the runtime contract. Use `input_schema`,
  `output_schema`, `auth.required_scopes`, `policy`, `idempotency`,
  `dry_run`, `billing`, `execution`, `errors` and `examples` from that
  contract instead of guessing parameters.
- `dry_run` requests contain only `id` and `params`; do not send
  `idempotency_key` or `approval_token`.
- `dry_run` is mandatory exactly when `describe.dry_run` is `required`.
  `billing.preflight` and `billing.cost_class` tell you how to plan cost
  checks; they do not rename the `dry_run` requirement.
- When `dry_run.valid=false`, `violations[]` contains structured error bodies
  with `code`, `message`, `hint`, `retryable`, optional `schema_pointer` and
  optional `details[]`.
- `invoke` requests contain `id` and `params`; add `idempotency_key` for every
  contract with `mutation=true`.
  Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).

## Frischer-Leser-Gate

- Musstest du fuer den Quickstart irgendeinen Endpoint, ein Feld, einen Status
  oder den naechsten Schritt raten, inklusive Idempotency-Format?
  Erwartete Antwort: nein.
- Koenntest du dich aus jedem Fehlerzustand selbst erholen: falscher Code,
  abgelaufener Code, zu viele Fehlversuche oder mehrfache Code-Anforderung?
  Erwartete Antwort: ja; nutze `/owner-otp/resend` oder `/agent-otp/resend`.
- Findest du die Agent-Mail treffsicher? Erwartete Antwort: ja; nutze
  `agent_otp_delivery.correlation_id`, Subject-Filter `Ref: <ID>` und
  Body-Zeile `Code: <OTP>`.
- Kannst du Owner-Codes ohne Vorkontext verarbeiten? Erwartete Antwort: ja;
  nutze `owner_otp_delivery.next_action`, den Owner-Mail-Block und
  `POST /owner-otp/claim`.
- Musst du bei HTTP 412 `precondition_failed` von `/org/current` vor
  Abschluss aller erforderlichen OTPs raten? Erwartete Antwort: nein;
  es ist erwartete fehlende Owner- oder Agent-Legitimation, also den
  fehlenden OTP-Schritt abschliessen.
- Musst du bei Budget-Caps mit Wert 0 raten? Erwartete Antwort: nein;
  0 bedeutet kein aktives Cap in diesem Fenster; nur Werte > 0 begrenzen.

## Safety

- Idempotency-Key: String, 16-128 Zeichen, pro Mutation eindeutig (z.B. UUID).
- External effects are declared in contracts and guarded by the gateway egress
  policy.
- Dry-runs are side-effect free and still auditable.
- Development and test runs must not send external email, real letters, real
  calls or real payments.

## Doku-Sync

- Gateway discovery is the machine source of truth for the agent flow:
  `/llms.txt`, `/mcp/manifest`, `/capabilities`, `/openapi.json` and this
  generated detail reference.
- `https://docs.webrichtung.de/agents-betreiber/` is the human-readable
  mirror and recovery guide. When it differs from generated discovery, trust
  generated discovery for runtime contracts and fix the mirror.
- Proposed durable check: compare the rendered webr-docs Quickstart and
  Concepts against this reference for required markers: idempotency key format,
  agent email correlation protocol, OTP resend endpoints, operator approval
  status, `/org/current` 412 before required OTPs, credits unit,
  `estimated_cost_credits` and cap-0 semantics.

## Budget Guard

- `wallet.agent_budget.guard.check` is a free, read-only safety check for wallet
  balance, task cap, hourly burn-rate cap, daily/monthly caps and kill-switch
  state in the owner organization.
- Before a priced invoke, call `dry_run` for the target capability and send
  `estimated_cost.amount_max` as `estimated_cost_credits` together with the target
  `capability_id` to `wallet.agent_budget.guard.check`.
- A successful guard invoke returns the normal invoke envelope with
  `status=succeeded`; its `result` contains `allowed`, `organization_id`,
  `wallet_balance_credits`, `estimated_cost_credits`, `policy` and
  `ledger`. Policy caps are `task_cap_credits`, `daily_cap_credits`,
  `monthly_cap_credits` and `burn_rate_hourly_cap_credits`; ledger fields are
  `hour_cost_credits`, `today_cost_credits` and `month_cost_credits`.
- Cap semantics are exact: a cap is active only when its numeric value is
  greater than 0. A value of 0 means no active cap for that window.
- If the guard succeeds with `result.allowed=true`, the target invoke may
  proceed; the invoke pipeline still performs the final atomic wallet debit.
- If the guard returns `budget_exceeded`, do not retry the target invoke
  unchanged. Ask the owner to top up via `wallet.topup.create`, lower the
  operation cost, or adjust the policy cap.
- If the guard returns `precondition_failed`, fail closed. The gateway could not
  prove owner-wallet or policy state, so priced capabilities must not be invoked
  until the guard configuration is fixed.
- If the guard returns `capability_disabled`, the active policy kill-switch is
  on; only the owner/operator can re-enable agent spending.

## First Priced Action

- For `documents.document.upload`, read `describe` first and use exactly the
  listed MIME type enum.
- Send `file_name`, `mime_type` and raw-file `content_base64` without a
  `data:` prefix; optional `content_sha256` is the raw-file SHA-256 hex.
- Allowed upload MIME types: application/pdf, application/msword,
  application/vnd.openxmlformats-officedocument.wordprocessingml.document,
  application/vnd.ms-excel,
  application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
  application/vnd.ms-powerpoint,
  application/vnd.openxmlformats-officedocument.presentationml.presentation,
  application/vnd.oasis.opendocument.text,
  application/vnd.oasis.opendocument.spreadsheet, application/vnd.ms-outlook,
  message/rfc822, image/jpeg, image/png, image/tiff, image/webp, text/plain,
  text/markdown, text/html, text/xml, application/xml.
- Optional upload `link_context` is `{resource_kind, resource_id}` where
  `resource_kind` is `account`, `custom_entry` or `real_estate_object` and
  `resource_id` is a UUID.
- Call `dry_run` for the upload. Its `estimated_cost.currency` must be
  `credits`.
- Pass `dry_run.estimated_cost.amount_max` as numeric
  `estimated_cost_credits` to `wallet.agent_budget.guard.check`.
- Only invoke the upload when the guard invoke returns `status=succeeded`
  and `result.allowed=true`; otherwise stop before the paid action.
- Upload result `duplicate` and `raw` are opaque objects. Depend only on the
  documented top-level fields `outcome`, `job_id`, `status`, `content_hash`
  and `link_context`.
- Document job statuses are `pending`, `processing`, `completed` and `error`.
  Upload normally returns `pending`; the first paid action does not require
  waiting for `completed`.

## Invocable Capabilities

| Capability                                   | Version | Risk     | Mutation | Required Scopes                                     |
| -------------------------------------------- | ------- | -------- | -------- | --------------------------------------------------- |
| analytics.events.read                        | 1.0.0   | low      | no       | core:read                                           |
| analytics.stats.read                         | 1.0.0   | low      | no       | core:read                                           |
| assist.artifact.list                         | 1.0.0   | low      | no       | assist:read                                         |
| assist.artifact.read                         | 1.0.0   | low      | no       | assist:read                                         |
| billing.bank_account.save                    | 1.0.0   | medium   | yes      | billing.bank_accounts:write                         |
| billing.document.convert_order_to_invoice    | 1.0.0   | medium   | yes      | billing.documents:draft                             |
| billing.document.convert_quote_to_order      | 1.0.0   | medium   | yes      | billing.documents:draft                             |
| billing.document.create_draft                | 1.0.0   | medium   | yes      | billing.documents:draft                             |
| billing.document.facturx                     | 1.0.0   | medium   | no       | billing.documents:draft                             |
| billing.document.list                        | 1.0.0   | low      | no       | billing.documents:read                              |
| billing.document.pdf                         | 1.0.0   | low      | no       | billing.documents:draft                             |
| billing.document.read                        | 1.0.0   | low      | no       | billing.documents:read                              |
| billing.document.search                      | 1.0.0   | low      | no       | billing.documents:read                              |
| billing.document.xrechnung                   | 1.0.0   | medium   | no       | billing.documents:draft                             |
| billing.item.search                          | 1.0.0   | low      | no       | billing.items:read                                  |
| billing.payment.list                         | 1.0.0   | low      | no       | billing.payments:read                               |
| billing.payment.record                       | 1.0.0   | high     | yes      | billing.payments:record                             |
| billing.profile.save                         | 1.0.0   | medium   | yes      | billing.profile:write                               |
| billing.reminder.list                        | 1.0.0   | low      | no       | billing.reminders:read                              |
| calendar.availability.manage                 | 1.0.0   | medium   | yes      | calendar:write                                      |
| calendar.booking_link_template.manage        | 1.0.0   | medium   | yes      | calendar:write                                      |
| calendar.booking_link.issue_secret           | 1.0.0   | medium   | yes      | calendar:write                                      |
| calendar.booking_link.manage                 | 1.0.0   | medium   | yes      | calendar:write                                      |
| calendar.booking.manage                      | 1.0.0   | medium   | yes      | calendar:write                                      |
| calendar.calendar.manage                     | 1.0.0   | medium   | yes      | calendar:write                                      |
| calendar.event_type.book                     | 1.0.0   | medium   | yes      | calendar:write                                      |
| calendar.event_type.manage                   | 1.0.0   | medium   | yes      | calendar:write                                      |
| calendar.slots.list                          | 1.0.0   | low      | no       | calendar:read                                       |
| communication.push.send                      | 1.0.0   | medium   | yes      | communication.push:send                             |
| core.account.read                            | 1.0.0   | low      | no       | core:read                                           |
| core.account.search                          | 1.0.0   | low      | no       | core:read                                           |
| core.account.upsert                          | 1.0.0   | medium   | yes      | core:write                                          |
| core.activity.read                           | 1.0.0   | low      | no       | core:read                                           |
| core.activity.search                         | 1.0.0   | low      | no       | core:read                                           |
| core.contact.delete                          | 1.0.0   | medium   | yes      | core:write                                          |
| core.contact.read                            | 1.0.0   | low      | no       | core:read                                           |
| core.contact.search                          | 1.0.0   | low      | no       | core:read                                           |
| core.contact.upsert                          | 1.0.0   | medium   | yes      | core:write                                          |
| core.custom_entity_type.create               | 1.0.0   | medium   | yes      | core:write                                          |
| core.custom_entity_type.delete               | 1.0.0   | high     | yes      | core:write                                          |
| core.custom_entity_type.list                 | 1.0.0   | low      | no       | core:read                                           |
| core.custom_entity_type.update               | 1.0.0   | medium   | yes      | core:write                                          |
| core.custom_entry.create                     | 1.0.0   | medium   | yes      | core:write                                          |
| core.custom_entry.delete                     | 1.0.0   | medium   | yes      | core:write                                          |
| core.custom_entry.read                       | 1.0.0   | low      | no       | core:read                                           |
| core.custom_entry.search                     | 1.0.0   | low      | no       | core:read                                           |
| core.custom_entry.update                     | 1.0.0   | medium   | yes      | core:write                                          |
| core.dashboard.overview                      | 1.0.0   | low      | no       | core:read                                           |
| core.deadline.delete                         | 1.0.0   | medium   | yes      | core:write                                          |
| core.deadline.search                         | 1.0.0   | low      | no       | core:read                                           |
| core.deadline.upsert                         | 1.0.0   | medium   | yes      | core:write                                          |
| core.deal.delete                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.deal.lead_feedback.submit               | 1.0.0   | medium   | yes      | core:write                                          |
| core.deal.read                               | 1.0.0   | low      | no       | core:read                                           |
| core.deal.search                             | 1.0.0   | low      | no       | core:read                                           |
| core.deal.upsert                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.inbox.item.act                          | 1.0.0   | medium   | yes      | core:write                                          |
| core.inbox.item.read                         | 1.0.0   | low      | no       | core:read                                           |
| core.inbox.item.search                       | 1.0.0   | low      | no       | core:read                                           |
| core.integration.analytics_goal.archive      | 1.0.0   | medium   | yes      | core:write                                          |
| core.integration.analytics_goal.create       | 1.0.0   | medium   | yes      | core:write                                          |
| core.integration.analytics_goal.list         | 1.0.0   | low      | no       | core:read                                           |
| core.integration.analytics_goal.update       | 1.0.0   | medium   | yes      | core:write                                          |
| core.integration.analytics_property.archive  | 1.0.0   | medium   | yes      | core:write                                          |
| core.integration.analytics_property.create   | 1.0.0   | medium   | yes      | core:write                                          |
| core.integration.analytics_property.list     | 1.0.0   | low      | no       | core:read                                           |
| core.integration.analytics_property.update   | 1.0.0   | medium   | yes      | core:write                                          |
| core.link.delete                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.link.read                               | 1.0.0   | low      | no       | core:read                                           |
| core.link.search                             | 1.0.0   | low      | no       | core:read                                           |
| core.link.upsert                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.memo.delete                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.memo.read                               | 1.0.0   | low      | no       | core:read                                           |
| core.memo.search                             | 1.0.0   | low      | no       | core:read                                           |
| core.memo.upsert                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.note.delete                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.note.read                               | 1.0.0   | low      | no       | core:read                                           |
| core.note.search                             | 1.0.0   | low      | no       | core:read                                           |
| core.note.upsert                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.org.billing_address.update              | 1.0.0   | medium   | yes      | org:manage                                          |
| core.org.configure                           | 1.0.0   | medium   | yes      | org:manage                                          |
| core.org.context.update                      | 1.0.0   | medium   | yes      | org:manage                                          |
| core.org.current.get                         | 1.0.0   | low      | no       | org:manage                                          |
| core.org.member.invite                       | 1.0.0   | medium   | yes      | org.members:invite                                  |
| core.org.member.reactivate                   | 1.0.0   | medium   | yes      | org.members:invite                                  |
| core.org.member.revoke                       | 1.0.0   | medium   | yes      | org.members:invite                                  |
| core.real_estate_object.create               | 1.0.0   | medium   | yes      | core:write                                          |
| core.real_estate_object.delete               | 1.0.0   | high     | yes      | core:write                                          |
| core.real_estate_object.link.create          | 1.0.0   | medium   | yes      | core:write                                          |
| core.real_estate_object.link.delete          | 1.0.0   | medium   | yes      | core:write                                          |
| core.real_estate_object.read                 | 1.0.0   | low      | no       | core:read                                           |
| core.real_estate_object.search               | 1.0.0   | low      | no       | core:read                                           |
| core.real_estate_object.update               | 1.0.0   | medium   | yes      | core:write                                          |
| core.task.delete                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.task.search                             | 1.0.0   | low      | no       | core:read                                           |
| core.task.upsert                             | 1.0.0   | medium   | yes      | core:write                                          |
| core.vendor.delete                           | 1.0.0   | medium   | yes      | core:write                                          |
| core.vendor.read                             | 1.0.0   | low      | no       | core:read                                           |
| core.vendor.search                           | 1.0.0   | low      | no       | core:read                                           |
| core.vendor.upsert                           | 1.0.0   | medium   | yes      | core:write                                          |
| documents.capability.get                     | 1.0.0   | low      | no       | documents:read                                      |
| documents.document_asset.download_url        | 1.0.0   | low      | no       | documents:read                                      |
| documents.document.archive                   | 1.0.0   | critical | yes      | documents:write                                     |
| documents.document.classify                  | 1.0.0   | medium   | yes      | documents:write                                     |
| documents.document.delete                    | 1.0.0   | critical | yes      | documents:write                                     |
| documents.document.download_url              | 1.0.0   | low      | no       | documents:read                                      |
| documents.document.link                      | 1.0.0   | medium   | yes      | documents:write                                     |
| documents.document.list                      | 1.0.0   | low      | no       | documents:read                                      |
| documents.document.read                      | 2.1.0   | low      | no       | documents:read                                      |
| documents.document.retention_extend          | 1.0.0   | high     | yes      | documents:write                                     |
| documents.document.search                    | 1.1.0   | low      | no       | documents:read                                      |
| documents.document.upload                    | 1.0.0   | medium   | yes      | documents:write                                     |
| documents.job.list                           | 1.0.0   | low      | no       | documents:read                                      |
| documents.job.retry                          | 1.0.0   | medium   | yes      | documents:write                                     |
| documents.transfer.credentials_view          | 1.0.0   | low      | no       | documents:read                                      |
| documents.transfer.password_reset            | 1.0.0   | high     | yes      | documents:write                                     |
| intake.flow.complete                         | 1.0.0   | medium   | yes      | org:manage, core:write, documents:read, phone:write |
| intake.flow.start                            | 1.0.0   | low      | no       | org:manage                                          |
| intake.flow.step                             | 1.0.0   | low      | no       | org:manage                                          |
| integrations.audio.speech_to_text            | 1.0.0   | high     | yes      | assist.speech:transcribe                            |
| integrations.audio.text_to_speech            | 1.0.0   | high     | yes      | studio.voice:sample                                 |
| integrations.audio.voice_list                | 1.0.0   | medium   | no       | studio.voice:read                                   |
| integrations.document.ocr                    | 1.0.0   | medium   | no       | media:interpret                                     |
| integrations.image.candidates_status         | 1.0.0   | medium   | no       | studio.production:write                             |
| integrations.image.generate_candidates       | 2.0.0   | high     | yes      | studio.production:write                             |
| integrations.research.answer                 | 1.0.0   | medium   | no       | integrations:read                                   |
| integrations.research.serp_search            | 1.0.0   | low      | no       | integrations:read                                   |
| integrations.video.image_generate            | 1.0.0   | high     | yes      | studio.production:write                             |
| integrations.video.status                    | 1.0.0   | medium   | no       | studio.production:write                             |
| integrations.video.text_generate             | 1.0.0   | high     | yes      | studio.production:write                             |
| integrations.web.crawl                       | 1.0.0   | medium   | no       | integrations:read                                   |
| mail.folder.list                             | 1.0.0   | medium   | no       | mail:read                                           |
| mail.mailbox.delete                          | 1.0.0   | high     | yes      | mail:write                                          |
| mail.mailbox.list                            | 1.0.0   | medium   | no       | mail:read                                           |
| mail.mailbox.save                            | 1.0.0   | high     | yes      | mail:write                                          |
| mail.mailbox.share                           | 1.0.0   | medium   | yes      | mail:write                                          |
| mail.message.list                            | 1.0.0   | high     | no       | mail:read                                           |
| mail.message.read                            | 1.0.0   | high     | no       | mail:read                                           |
| mdm.app.delete                               | 1.0.0   | high     | yes      | mdm:write                                           |
| mdm.app.search                               | 1.0.0   | low      | no       | mdm:read                                            |
| mdm.device.delete                            | 1.0.0   | critical | yes      | mdm:write                                           |
| mdm.device.get                               | 1.0.0   | low      | no       | mdm:read                                            |
| mdm.device.retire                            | 1.0.0   | high     | yes      | mdm:write                                           |
| mdm.device.search                            | 1.0.0   | low      | no       | mdm:read                                            |
| mdm.device.update                            | 1.0.0   | medium   | yes      | mdm:write                                           |
| mdm.enrollment_token.create                  | 1.0.0   | high     | yes      | mdm:write                                           |
| mdm.enrollment_token.revoke                  | 1.0.0   | medium   | yes      | mdm:write                                           |
| mdm.enrollment_token.search                  | 1.0.0   | low      | no       | mdm:read                                            |
| mdm.group.create                             | 1.0.0   | medium   | yes      | mdm:write                                           |
| mdm.group.delete                             | 1.0.0   | high     | yes      | mdm:write                                           |
| mdm.group.get                                | 1.0.0   | low      | no       | mdm:read                                            |
| mdm.group.policy.set                         | 1.0.0   | critical | yes      | mdm:write                                           |
| mdm.group.search                             | 1.0.0   | low      | no       | mdm:read                                            |
| mdm.group.update                             | 1.0.0   | medium   | yes      | mdm:write                                           |
| mdm.install.create                           | 1.0.0   | high     | yes      | mdm:write                                           |
| mdm.install.search                           | 1.0.0   | low      | no       | mdm:read                                            |
| mdm.policy.get                               | 1.0.0   | low      | no       | mdm:read                                            |
| mdm.policy.set                               | 1.0.0   | critical | yes      | mdm:write                                           |
| media.asset.delete                           | 1.0.0   | high     | yes      | media:write                                         |
| media.asset.download                         | 1.0.0   | low      | no       | media:read                                          |
| media.asset.gallery                          | 1.0.0   | low      | no       | media:read                                          |
| media.asset.interpret                        | 1.0.0   | high     | yes      | media:interpret                                     |
| media.asset.list                             | 1.0.0   | low      | no       | media:read                                          |
| media.asset.upload                           | 1.0.0   | medium   | yes      | media:write                                         |
| org.activity.digest                          | 1.0.0   | low      | no       | core:read                                           |
| org.brand_assets.list                        | 1.0.0   | low      | no       | core:read                                           |
| org.handover.escalate                        | 1.0.0   | medium   | yes      | org:manage                                          |
| org.handover.request_finalize                | 1.0.0   | medium   | yes      | org:manage                                          |
| org.media_interpretation_context.get         | 1.0.0   | low      | no       | org:manage                                          |
| org.media_interpretation_context.set         | 1.0.0   | medium   | yes      | org:manage                                          |
| org.skill.remember                           | 1.0.0   | medium   | yes      | studio.production:write                             |
| phone.agent_config.get                       | 1.0.0   | low      | no       | phone:read                                          |
| phone.agent_config.upsert                    | 1.0.0   | medium   | yes      | phone:write                                         |
| phone.call_log.read                          | 1.1.0   | low      | no       | phone:read                                          |
| phone.call.summary.read                      | 1.1.0   | low      | no       | phone:read                                          |
| phone.forwarding_rule.delete                 | 1.0.0   | medium   | yes      | phone:write                                         |
| phone.forwarding_rule.list                   | 1.0.0   | low      | no       | phone:read                                          |
| phone.forwarding_rule.upsert                 | 1.0.0   | high     | yes      | phone:write                                         |
| phone.provisioning.forwarding_guide.generate | 1.0.0   | low      | no       | phone.provisioning:read                             |
| phone.provisioning.job.get                   | 1.0.0   | low      | no       | phone.provisioning:read                             |
| phone.provisioning.number.assign             | 2.0.0   | medium   | yes      | phone.provisioning:manage                           |
| phone.provisioning.pool.check                | 1.0.0   | low      | yes      | phone.provisioning:read                             |
| phone.voice.catalog                          | 1.0.0   | low      | no       | phone:read                                          |
| phone.voice.select                           | 1.0.0   | medium   | yes      | phone:write                                         |
| platform.feedback.read                       | 1.0.0   | low      | no       | platform.feedback:read                              |
| platform.feedback.submit                     | 1.0.0   | low      | yes      | platform.feedback:write                             |
| skill.execution.start                        | 1.0.0   | medium   | yes      | studio.production:write                             |
| skill.execution.status                       | 1.0.0   | low      | no       | studio.production:write                             |
| skill.stage.report                           | 1.0.0   | medium   | yes      | studio.production:write                             |
| studio.asset.download                        | 1.0.0   | low      | no       | studio.production:write                             |
| studio.asset.register                        | 1.0.0   | medium   | yes      | studio.production:write                             |
| studio.asset.upload                          | 1.0.0   | medium   | yes      | studio.production:write                             |
| studio.production.create                     | 1.0.0   | medium   | yes      | studio.production:write                             |
| studio.render.status                         | 1.0.0   | low      | no       | studio.production:write                             |
| studio.thumbnail.render                      | 1.0.0   | medium   | yes      | studio.production:write                             |
| studio.video.render                          | 1.0.0   | high     | yes      | studio.production:write                             |
| wallet.agent_budget.guard.check              | 1.0.0   | medium   | no       | billing.wallet:read                                 |
| wallet.balance.get                           | 1.0.0   | low      | no       | billing.wallet:read                                 |
| wallet.topup.create                          | 1.0.0   | high     | yes      | billing.wallet:topup                                |
| workspace.artifact.delete                    | 1.0.0   | medium   | yes      | workspace:write                                     |
| workspace.artifact.download_url.create       | 1.0.0   | low      | no       | workspace:read                                      |
| workspace.artifact.list                      | 1.0.0   | low      | no       | workspace:read                                      |
| workspace.artifact.upload                    | 1.0.0   | medium   | yes      | workspace:write                                     |
| workspace.delivery.list                      | 1.0.0   | low      | no       | workspace:read                                      |
| workspace.delivery.update                    | 1.0.0   | medium   | yes      | workspace:write                                     |
| workspace.document.render                    | 1.0.0   | medium   | yes      | workspace:write                                     |

## Error Handling

All gateway errors use the shared envelope:

```json
{
  "error": {
    "audit_id": "audit-id",
    "code": "validation_error",
    "hint": "Call describe(id) and resend params matching input_schema.",
    "message": "Params violate the capability input schema.",
    "retryable": false
  }
}
```
