{
  "openapi": "3.1.0",
  "info": {
    "title": "Hi — agent capability API",
    "version": "2026.10.08+4caps.ae781fe",
    "termsOfService": "https://hirey.ai/usage-policy",
    "description": "The public, agent-facing API behind **HiRey Hi** — the same capability surface that powers\nHirey Hub and every Hi plugin (Claude / Codex / Hermes / OpenClaw / MCP).\n\n**This document is auto-generated from the live `/v1/capabilities` catalog on every deploy.**\nIt is never hand-edited, so it cannot drift from the backend. The one fixed entry point,\n`POST /v1/agents/api-keys`, is listed first.\n\n### One shape for everything\nEvery capability is invoked the same way:\n\n```\nPOST https://hi.hirey.ai/v1/capabilities/{capability_id}/call\nAuthorization: Bearer <api_key or access_token>\nContent-Type: application/json\n\n{ \"action\": \"...\", ... }\n```\n\nYou can always enumerate the live catalog at `GET /v1/capabilities`, and fetch a single\ncapability's schema at `GET /v1/capabilities/{capability_id}/schema`.\n\n### Auth\nGet an API key with one anonymous `POST https://hi.hirey.ai/v1/agents/api-keys` and send it as\n`Authorization: Bearer <api_key>`. OAuth access tokens from `https://hi.hirey.ai` (scope\n`hirey.agent`) also work. Until the user signs in once (phone, email or Google), the key can\nonly search people, explain matches and stage captures; writes return `verified_login_required`.\nThe full flow is documented at\nhttps://hirey.ai/auth.md.\n\n### Replies and inbound events\n**To check for replies, call `message.inbox` on `hi.workspace-workflows`** with the same API key\nor access token (the user must be signed in). `agent_message.list` reads the wider inbox.\n\nThe event queue is a delivery signal only and may be empty even when replies are waiting. Events\nare **pulled**: claim one, handle it, acknowledge it. No public URL is needed, and HiRey does not\npush events to a webhook URL.\n\n```\nPOST /v1/agent-events/claim      { \"idempotency_key\": \"<uuid>\" }\nGET  /v1/agent-events/{event_id}\nPOST /v1/agent-events/ack        { \"event_id\": \"...\", \"lease_token\": \"...\", \"outcome\": \"delivered\" }\n```\n\nA claim returns `{ \"result\": { \"event\": {...} | null, \"repeated\": false } }`; the event carries a\n`lease_token` (about 60 seconds). Acknowledge with `delivered`, or `failed` to have it offered again.\nThese routes need a signed access token after the user signs in, not the raw API key. Successful\nresponses are `{ \"result\": ... }`; errors are `{ \"error\": \"<code>\" }`.\n\nAn Agent can also store endpoint and topic records. Each `PUT` replaces the whole list; they do not\nchange delivery today:\n\n```\nPUT /v1/agents/me/endpoints       { \"endpoints\": [{ \"kind\": \"pull_stream\", \"profile\": \"<name>\" }] }\nPUT /v1/agents/me/subscriptions   { \"subscriptions\": [{ \"topic\": \"<topic>\" }] }\n```\n\nEndpoint `kind` is `webhook`, `http_api` or `pull_stream`; `url`, `auth`, `config` and `status` are\noptional. Full walkthrough in https://hirey.ai/auth.md (Step 5).\n\n### Errors\nEvery capability call that fails returns the **same envelope** — branch on `error_code`, not the\nHTTP status:\n\n```\n{ \"error_code\": \"phone_binding_required\",\n  \"message\": \"This write requires a phone-verified identity.\",\n  \"retryable\": false,\n  \"next\": { \"action\": \"verify_phone\", \"capability_id\": \"hi.phone-binding\" } }\n```\n\n`retryable` says whether retrying the same request can succeed (honor any `Retry-After`).\n`conflict` appears on 409 and describes the existing state blocking the write. `next` carries a\nsuggested follow-up action when the error is recoverable. Common codes: `phone_binding_required`,\n`token_expired` (refresh — don't re-bind), `invalid_token`, `forbidden`, `not_found`, `conflict`,\n`rate_limited`. The full schema is under `components/schemas/Error`.\n\n### Prefer an agent-native integration?\nUse the MCP server at `https://mcp.hirey.ai/mcp`, or install a plugin from https://hirey.ai/install.\n\n_Management, staff, and account-delegation capabilities are intentionally omitted from this\npublic reference._",
    "contact": {
      "name": "HiRey",
      "url": "https://hirey.ai"
    }
  },
  "externalDocs": {
    "description": "Auth & onboarding guide",
    "url": "https://hirey.ai/auth.md"
  },
  "servers": [
    {
      "url": "https://hi.hirey.ai",
      "description": "Hi production"
    }
  ],
  "tags": [
    {
      "name": "Getting started",
      "description": "Get an API key with one anonymous call, then call any capability with it."
    },
    {
      "name": "Core Workspace"
    },
    {
      "name": "Identity Binding"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "An API key from POST https://hi.hirey.ai/v1/agents/api-keys (`hi_ak_…`), or an OAuth access token from https://hi.hirey.ai (scope `hirey.agent`)."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Standard error envelope returned by every capability call when it fails. The same shape for 400/401/403/404/409/422/429/5xx — branch on `error_code`, not the HTTP status.",
        "required": [
          "error_code",
          "message"
        ],
        "properties": {
          "error_code": {
            "type": "string",
            "description": "Stable machine-readable code. Branch on this, not on prose. See the common-codes list below.",
            "examples": [
              "phone_binding_required",
              "token_expired",
              "not_found",
              "conflict",
              "rate_limited"
            ]
          },
          "message": {
            "type": "string",
            "description": "Human-readable explanation, safe to surface to the end user."
          },
          "retryable": {
            "type": "boolean",
            "description": "true when the same request may succeed if retried (e.g. rate_limited, transient 5xx). Honor any Retry-After."
          },
          "conflict": {
            "type": "object",
            "description": "Present on 409 conflicts. Describes the existing state that blocks the write so the caller can reconcile instead of blindly retrying.",
            "additionalProperties": true
          },
          "next": {
            "description": "When the error is recoverable by a follow-up action, the suggested next step — e.g. { \"action\": \"verify_phone\", \"capability_id\": \"hi.phone-binding\" } for phone_binding_required, or a refresh hint for token_expired.",
            "type": "object",
            "additionalProperties": true
          }
        },
        "examples": [
          {
            "error_code": "phone_binding_required",
            "message": "This write requires a phone-verified identity. Verify a phone number once, then retry.",
            "retryable": false,
            "next": {
              "action": "verify_phone",
              "capability_id": "hi.phone-binding"
            }
          }
        ]
      }
    },
    "responses": {
      "Error": {
        "description": "Request error — standard envelope (`error_code`, `message`, `retryable`, optional `conflict` / `next`). Common `error_code`s: `validation_error`, `invalid_action`, `missing_caller_agent_id`, `not_found`.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Missing, expired, or invalid bearer token. Common `error_code`s: `invalid_token`, `token_expired` (refresh, do not re-bind), `phone_binding_required` (writes need a phone-verified identity — see `next`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Forbidden": {
        "description": "Authenticated but not authorized for this capability / scope. Common `error_code`s: `forbidden`, `not_entitled`, `plan_limit`.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Conflict": {
        "description": "The write conflicts with existing state. The `conflict` object describes what already exists so you can reconcile instead of blindly retrying. Common `error_code`s: `conflict`, `already_exists`, `version_conflict`.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    }
  },
  "paths": {
    "/v1/agents/api-keys": {
      "post": {
        "operationId": "create_agent_api_key",
        "summary": "Get an API key (one anonymous call)",
        "description": "Creates a new pending Agent and returns a non-rotating `hi_ak_` API key. No user account, no\npersonal data, no cost, and no `Authorization` header. Send the key as\n`Authorization: Bearer <api_key>` on every capability call, or to the MCP endpoint\n`https://mcp.hirey.ai/mcp`.\n\n**Until the user signs in, the key can only call its `anonymous_operations`:** people search,\nmatch explanations and staged captures. Anything else returns `verified_login_required`. The person behind\nthe agent signs in once with phone (`hi.phone-binding`), email (`hi.email-binding`) or\nGoogle (`hi.google-link`), and the same key then keeps working. No reinstall.\n\nCreate one key per agent, store it privately and reuse it. An HTML 503 means you were\nrate-limited and nothing was created: wait 60 seconds and retry once.\n\nSend `device_name` (your agent's name, e.g. \"Muse\") so the user can tell this connection apart\non https://hirey.ai/me. The response may include Codex-only text (`setup.codex_config_toml`,\n\"relaunch Codex\") and MCP tool names in `login`; an agent calling over HTTPS ignores them.",
        "tags": [
          "Getting started"
        ],
        "security": [],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "display_name": {
                    "type": "string",
                    "description": "Your agent's name (e.g. \"Muse\"), kept with the key's credential; the first 200 characters are kept. Defaults to the named host's name, or `Agent` for any other agent. To name the connection the user sees on https://hirey.ai/me, also send `device_name`."
                  },
                  "agent_type": {
                    "type": "string",
                    "description": "Your host. `claude`, `codex`, `openclaw` and `hermes` name a known host; any other value (e.g. `muse`) registers a generic Agent and is kept as its software id."
                  },
                  "device_name": {
                    "type": "string",
                    "description": "The name the user sees for this connection on https://hirey.ai/me, next to its Agent type (e.g. \"Muse\" or \"Instinct\"). Send your agent's name."
                  }
                }
              },
              "examples": {
                "muse": {
                  "value": {
                    "display_name": "Muse",
                    "agent_type": "muse",
                    "device_name": "Muse"
                  }
                },
                "instinct": {
                  "value": {
                    "display_name": "Instinct",
                    "agent_type": "instinct",
                    "device_name": "Instinct"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Key created. Store `api_key` privately and reuse it.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "api_key",
                    "agent_id",
                    "agent_type",
                    "status"
                  ],
                  "properties": {
                    "api_key": {
                      "type": "string",
                      "pattern": "^hi_ak_",
                      "description": "Send as `Authorization: Bearer <api_key>`. Non-rotating; treat it like a password."
                    },
                    "agent_id": {
                      "type": "string",
                      "description": "The new Agent, e.g. `ag_…`."
                    },
                    "agent_type": {
                      "type": "string",
                      "enum": [
                        "claude",
                        "codex",
                        "openclaw",
                        "hermes",
                        "generic"
                      ],
                      "description": "Named host, or `generic` for any other agent."
                    },
                    "provider": {
                      "type": "string",
                      "description": "Provider of the named host, or `generic`."
                    },
                    "status": {
                      "type": "string",
                      "description": "`pending` until the user signs in."
                    },
                    "anonymous_operations": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "What the key may call before sign-in: `people.find`, `people.explain` and `capture.record` (a capture is staged until sign-in)."
                    },
                    "login": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      },
                      "description": "How the user signs in once to unlock writes: `google`, `phone`, `email`. The hints may name MCP tools (e.g. `google_link`); over HTTPS the same sign-in is `hi.google-link`, `hi.phone-binding` or `hi.email-binding`."
                    },
                    "mcp_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "MCP endpoint that also accepts this key."
                    },
                    "setup": {
                      "type": "object",
                      "additionalProperties": true,
                      "description": "Codex-only setup hints (`codex_config_toml`, \"relaunch Codex\"). Other agents ignore it."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed request body (`{\"error\":\"invalid_request\"}`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/capabilities/hi.email-binding/call": {
      "post": {
        "operationId": "call_hi_email_binding",
        "summary": "Email Binding",
        "description": "Bind this pending Agent to a verified Hi identity. Call bind with email, then verify with the code. It does not add a email to an identity. An Agent that is already signed in gets agent_already_signed_in; to use a different identity, reconnect through the host OAuth sign-in. When it returns verified with next, follow next.message: it says whether to offer introducing the owner on HiRey (https://hirey.ai/llms.txt#introduce-your-owner); publish their Page only after they say yes to the exact text.",
        "tags": [
          "Identity Binding"
        ],
        "x-hi-tool-name": "email_binding",
        "x-hi-scopes": [],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "bind",
                      "verify"
                    ]
                  },
                  "email": {
                    "type": "string"
                  },
                  "code": {
                    "type": "string"
                  },
                  "display_name": {
                    "type": "string"
                  }
                },
                "required": [
                  "action"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Capability result. The `result` shape varies by capability and `action`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "capability_id": {
                      "type": "string"
                    },
                    "tool_name": {
                      "type": "string"
                    },
                    "result": {}
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          }
        }
      }
    },
    "/v1/capabilities/hi.google-link/call": {
      "post": {
        "operationId": "call_hi_google_link",
        "summary": "Google Link",
        "description": "Bind this pending Agent to a verified Hi identity. Call start, open verification_url, then call poll. A new Google account creates a new identity. An Agent that is already signed in gets agent_already_signed_in; to use a different identity, reconnect through the host OAuth sign-in. When it returns verified with next, follow next.message: it says whether to offer introducing the owner on HiRey (https://hirey.ai/llms.txt#introduce-your-owner); publish their Page only after they say yes to the exact text.",
        "tags": [
          "Identity Binding"
        ],
        "x-hi-tool-name": "google_link",
        "x-hi-scopes": [],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "start",
                      "poll"
                    ]
                  }
                },
                "required": [
                  "action"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Capability result. The `result` shape varies by capability and `action`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "capability_id": {
                      "type": "string"
                    },
                    "tool_name": {
                      "type": "string"
                    },
                    "result": {}
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          }
        }
      }
    },
    "/v1/capabilities/hi.phone-binding/call": {
      "post": {
        "operationId": "call_hi_phone_binding",
        "summary": "Phone Binding",
        "description": "Bind this pending Agent to a verified Hi identity. Call bind with phone, then verify with the code. It does not add a phone to an identity. An Agent that is already signed in gets agent_already_signed_in; to use a different identity, reconnect through the host OAuth sign-in. When it returns verified with next, follow next.message: it says whether to offer introducing the owner on HiRey (https://hirey.ai/llms.txt#introduce-your-owner); publish their Page only after they say yes to the exact text.",
        "tags": [
          "Identity Binding"
        ],
        "x-hi-tool-name": "phone_binding",
        "x-hi-scopes": [],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "bind",
                      "verify"
                    ]
                  },
                  "phone": {
                    "type": "string"
                  },
                  "code": {
                    "type": "string"
                  },
                  "display_name": {
                    "type": "string"
                  }
                },
                "required": [
                  "action"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Capability result. The `result` shape varies by capability and `action`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "capability_id": {
                      "type": "string"
                    },
                    "tool_name": {
                      "type": "string"
                    },
                    "result": {}
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          }
        }
      }
    },
    "/v1/capabilities/hi.workspace-workflows/call": {
      "post": {
        "operationId": "call_hi_workspace_workflows",
        "summary": "Workspace Workflows",
        "description": "Canonical Agent access to HiRey Person, Workspace, Moment, Page, Need, People and Message workflows. Use action=catalog to inspect the implemented operations and action=describe with payload.operation to inspect one machine-readable payload/result/error contract. Authority always comes from the authenticated Account, Person, Workspace, Agent and Agent Session; payload identity fields are ignored. Every write or external-effect payload requires a stable idempotency_key, reused only for an exact retry. Choosing a search flow: people.retrieve is the default; it makes no HiRey model call and you judge fit. To have HiRey read and rank instead, explicitly call assisted Find: people.find with a nonempty query (verified login may add include_private=true for the owner’s authorized private records) or, public only, people.find.start then people.find.get. Assisted Find interprets the query, recalls candidates, has HiRey’s model read their evidence and orders them by suitability with short evidence-cited reasons and unmet conditions; find_metadata.read_status=lexical_only means that reading did not happen. Choose it when the user asks HiRey to rank or explain, or when you cannot read the evidence yourself. Both flows are read-only, share identity and permission checks, and take the caller class from authentication, never from the payload. For progressive public search, call people.find.start and, if pending, poll people.find.get with the returned find_run_id and continuation_secret after retry_after_ms until complete or expired. An exact start retry uses the same idempotency_key, query, limit and continuation_secret. If start reports find_run_unavailable, use legacy people.find and do not promise a later result. Use people.retrieve to scan evidence, then read authorized detail before judging suitability. The default evidence_mode=bounded_source_text returns up to 6000 evidence bytes per Person; verified Agents may explicitly choose evidence_mode=summary for a 1500-byte source-text prefix. Follow each candidate’s evidence_read_actions: people.explain for public evidence and people.detail for authorized private detail. These read actions grant no authority. Missing or omitted evidence is unknown; term matches mean lexical presence and stable ordering is not a suitability rank. If summary reports evidence_limited_candidates > 0 or truncated evidence and cannot support selection or rejection, restart with evidence_mode=bounded_source_text and no cursor, then read detail. No summary hits does not mean no suitable people. Preserve negation and historical context when judging. Verified login defaults to 20 results and allows up to 50 per call. pagination.next_cursor returns more people, not more detail for the current Person; pass it as payload.cursor with the same criteria, scope and evidence_mode. The initial verified allowance is 120 calls/minute and 4 concurrent calls, shared across the same Person’s Agents, sessions, workspaces, REST and MCP calls. Follow the server-reported limits; on retrieval_rate_limited, wait retry_after_seconds before retrying. Verified Agents can call people.discover_connectors with mode=named_connector and an exact connector_person_id, or mode=known_connectors to use people they know. Pass either criteria or query, not both; results default to 5 and cap at 10. Core returns candidates and possible helpers separately. A public story is not a confirmed relationship, a lexical match is not professional suitability, and a requestable route is not agreement. Partial or empty coverage never proves there is nobody suitable in a Connector’s private network. Follow the exact evidence_read_actions. Keep a named Connector choice even when direct contact is available; do not silently broaden or send. For an eligible route, preserve its contact.intent selectors and Page revisions, then add the authorized purpose and idempotency_key. For a helper, recommendation.request saves a private draft (work_id may be omitted for a real scoped Work). Read recommendation.get, review the exact recipient and disclosure, and send only its message_draft payload with a stable message.send key and applicable send authorization. The pointer contains no private purpose or context. Only the selected Connector can read and answer a submitted request. Use recommendation.sources for Core-owned exact-target source selectors, then recommendation.share with only the explicitly authorized name, reason and sources. Sharing grants no original-source access, sends nothing to the target and does not fulfill the underlying Need. Use recommendation.list/get for recovery and current access; withdraw or decline through their typed operations. Queued, read, agreed and fulfilled remain separate facts. A pending Agent installation credential may use catalog, describe, people.find, people.find.start, people.find.get, people.explain, people.retrieve with public scope only, and staged capture.record. Pending retrieval keeps its default 5 and maximum 10 results, with bounded_source_text only and no pagination. Private or public_and_private retrieval requires verified login. A media.job.request or interview.request_processing with job_kind=research is paid outside research and needs the same explicit confirmation. If the host itself rejects a call before it reaches HiRey (Codex: \"MCP tool call requires approval, but approval policy is never\"), it is a host permission setting, not a login or binding problem; do not retry. Tell the user: \"Codex blocked HiRey because this chat's permissions never ask for approval. Set this chat's permissions to Ask for approval or Full access, then try again.\"",
        "tags": [
          "Core Workspace"
        ],
        "x-hi-tool-name": "workspace_workflows",
        "x-hi-scopes": [
          "hirey.agent"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "catalog",
                      "describe",
                      "identity.me",
                      "workspace.focused",
                      "workspace.list",
                      "workspace.focus",
                      "workspace.members",
                      "workspace.company.create",
                      "workspace.team.create",
                      "workspace.member.invitations",
                      "workspace.member.invite",
                      "workspace.member.decide",
                      "workspace.member.capability_events",
                      "workspace.member.capabilities.update",
                      "workspace.member.revoke",
                      "workspace.announcement.draft",
                      "workspace.announcement.preview",
                      "workspace.announcement.publish",
                      "workspace.announcement.list",
                      "workspace.announcement.get",
                      "workspace.announcement.archive",
                      "identity.update_display_name",
                      "identity.claim_routed_person",
                      "phone_route.upsert",
                      "phone_route.list",
                      "phone_route.revoke",
                      "phone_call.list",
                      "phone_call.get",
                      "capture.record",
                      "capture.list",
                      "capture.get",
                      "moment.create",
                      "moment.list",
                      "moment.get",
                      "moment.evidence",
                      "moment.withdraw",
                      "diary.sync",
                      "diary.snapshot",
                      "diary.publish_moment",
                      "diary.withdraw_public_moment",
                      "person.observe",
                      "person.observe_contact",
                      "person.brief",
                      "person.network.save",
                      "person.note.add",
                      "person.note.delete",
                      "person.tag.add",
                      "person.tag.remove",
                      "person.follow_up.set",
                      "person.private_contact.set",
                      "person.private_contact.remove",
                      "person.archive",
                      "person.display_name.set",
                      "person.introduced_by.set",
                      "person.introduced_by.remove",
                      "person.import.preview",
                      "person.import.get",
                      "person.import.commit",
                      "commitment.create",
                      "commitment.snooze",
                      "commitment.complete",
                      "commitment.cancel",
                      "commitment.list",
                      "commitment.get",
                      "commitment.due",
                      "people.find_private",
                      "people.resolve_capture_subject",
                      "people.snapshot.private",
                      "people.explain_private",
                      "people.detail",
                      "enrichment.request",
                      "enrichment.list",
                      "enrichment.decide",
                      "page.create",
                      "page.mine",
                      "page.compose",
                      "page.draft",
                      "page.grant_connector",
                      "page.grant_owner",
                      "page.authorize",
                      "page.publish",
                      "page.withdraw",
                      "page.withdrawal_request",
                      "page.recovery.start",
                      "page.recovery.list",
                      "page.recovery.get",
                      "page.recovery.preview",
                      "page.recovery.accept",
                      "page.dispute.raise",
                      "page.dispute.list",
                      "claim.credential",
                      "claim.invite",
                      "claim.preview",
                      "claim.execute",
                      "need.create",
                      "need.list",
                      "need.get",
                      "need.change_status",
                      "discovery.find_for_need",
                      "people.find",
                      "people.explain",
                      "match.record",
                      "match.select",
                      "match.dismiss",
                      "pairing.create",
                      "pairing.list",
                      "pairing.get",
                      "pairing.decide",
                      "pairing.close",
                      "contact.policy",
                      "contact.intent",
                      "contact.list",
                      "contact.get",
                      "contact.reject",
                      "contact.block",
                      "message.send",
                      "outreach.draft",
                      "outreach.prepare",
                      "outreach.edit",
                      "outreach.get",
                      "outreach.list",
                      "outreach.send",
                      "outreach.mark_relayed",
                      "message.reply",
                      "message.deliver_after_claim",
                      "message.withdraw",
                      "message.inbox",
                      "actions.overview",
                      "message.read",
                      "message.acknowledge",
                      "agent_message.send",
                      "agent_message.reply",
                      "agent_message.list",
                      "agent_message.claim",
                      "agent_message.complete",
                      "agent_message.fail",
                      "contact.introduction_decide",
                      "reach.policy",
                      "reach.set_contact_policy",
                      "reach.set_connector_availability",
                      "reach.route.plan",
                      "reach.route.get",
                      "reach.route.decide",
                      "reach.route.revalidate",
                      "meeting.propose",
                      "meeting.decide",
                      "meeting.cancel",
                      "meeting.reschedule",
                      "meeting.occurred",
                      "meeting.outcome",
                      "meeting.list",
                      "meeting.get",
                      "meeting.calendar",
                      "meeting.policy.get",
                      "meeting.policy.update",
                      "meeting_link.create",
                      "meeting_link.list",
                      "meeting_link.get",
                      "meeting_link.revise",
                      "meeting_link.respond",
                      "meeting_link.cancel",
                      "relationship.confirm",
                      "relationship.list",
                      "relationship.revoke",
                      "followup.list",
                      "product_signal.submit",
                      "product_signal.list",
                      "product_signal.get",
                      "product_signal.draft.list",
                      "product_signal.draft.get",
                      "product_signal.draft.update",
                      "product_signal.triage",
                      "product_signal.daily_summary",
                      "product_signal.verify_repair",
                      "repair.case.create",
                      "repair.case.list",
                      "repair.case.get",
                      "repair.case.link_signal",
                      "repair.case.update_analysis",
                      "repair.case.add_evidence",
                      "repair.grant.create",
                      "repair.grant.list",
                      "repair.grant.revoke",
                      "repair.run.claim",
                      "repair.run.heartbeat",
                      "repair.run.finish",
                      "repair.run.list",
                      "repair.release.advance",
                      "media.create",
                      "media.list",
                      "media.get",
                      "media.access.grant",
                      "media.access.revoke",
                      "media.access.list",
                      "media.asset.attach",
                      "media.retention.change",
                      "media.request_review",
                      "media.review_decide",
                      "media.authorize",
                      "media.publish",
                      "media.withdraw",
                      "media.job.request",
                      "media.job.list",
                      "media.job.get",
                      "media.job.cancel",
                      "media.candidate.list",
                      "media.candidate.decide",
                      "media.revision.rollback",
                      "media.series.create",
                      "media.series.list",
                      "media.series.get",
                      "media.series.add_item",
                      "media.series.remove_item",
                      "media.series.reorder",
                      "media.series.archive",
                      "agentic_media.work.create",
                      "agentic_media.upload.describe",
                      "agentic_media.upload.complete",
                      "agentic_media.upload.cancel",
                      "agentic_media.work.list",
                      "agentic_media.work.status",
                      "agentic_media.work.revise",
                      "agentic_media.release.freeze",
                      "agentic_media.publish",
                      "agentic_media.withdraw",
                      "interview.create",
                      "interview.list",
                      "interview.get",
                      "interview.set_subject",
                      "interview.bind_page",
                      "interview.unbind_page",
                      "interview.transcript.revise",
                      "interview.qa.decide",
                      "interview.request_processing",
                      "interview.subject.object",
                      "interview.subject.objection.list",
                      "watch.create",
                      "watch.list",
                      "watch.change_status",
                      "brief.settings",
                      "brief.set_status",
                      "connector_policy.get",
                      "connector_policy.update",
                      "watch.suppressions",
                      "watch.suppress_person",
                      "watch.allow_person",
                      "watch.record_hit",
                      "watch.inbox",
                      "watch.mark_hit",
                      "inbound.record",
                      "external_source.authorize",
                      "external_source.list",
                      "external_source.revoke",
                      "notification.settings",
                      "notification.update_settings",
                      "notification.list",
                      "notification.mark",
                      "work.create",
                      "work.list",
                      "work.ask.list",
                      "work.ask.get",
                      "work.get",
                      "work.transition",
                      "work.ask",
                      "work.answer",
                      "task.create",
                      "task.list",
                      "task.get",
                      "task.transition",
                      "task.assign",
                      "task.takeover",
                      "task.worker.request",
                      "task.proposal.list",
                      "task.proposal.decide",
                      "company.official_record.get",
                      "company.domain.begin",
                      "company.domain.verify",
                      "company.domain.list",
                      "company.official_record.draft",
                      "company.official_record.publish",
                      "company.official_record.withdraw",
                      "resource.register",
                      "resource.list",
                      "resource.get",
                      "resource.share",
                      "resource.revoke",
                      "product.create",
                      "product.list",
                      "product.get",
                      "product.draft",
                      "product.publish",
                      "product.withdraw",
                      "product.public_list",
                      "product.public_get",
                      "product.try",
                      "integration.list",
                      "integration.x.begin",
                      "integration.x.complete",
                      "integration.google.begin",
                      "integration.google.complete",
                      "integration.zoom.begin",
                      "integration.zoom.complete",
                      "integration.revoke",
                      "distribution.publish",
                      "distribution.list",
                      "distribution.get",
                      "distribution.withdraw",
                      "lead.list",
                      "lead.assign",
                      "lead.change_status",
                      "people.retrieve",
                      "people.discover_connectors",
                      "recommendation.request",
                      "recommendation.get",
                      "recommendation.list",
                      "recommendation.share",
                      "recommendation.decline",
                      "recommendation.withdraw",
                      "recommendation.sources",
                      "media.credit.add",
                      "media.credit.withdraw",
                      "media.credit.list",
                      "agent_instance.binding.begin",
                      "agent_instance.binding.finish",
                      "agent_instance.current",
                      "agent_instance.list",
                      "agent_instance.proof.begin",
                      "agent_instance.recovery.begin",
                      "agent_instance.rename",
                      "agent_instance.revoke",
                      "agent_message.history",
                      "capture.bind_diary_source",
                      "capture.diary_public_status",
                      "capture.publish_photo_moment",
                      "claim.connect",
                      "contact.block.list",
                      "contact.reply_permission.get",
                      "contact.reply_permission.withdraw",
                      "contact.unblock",
                      "delegation.approve",
                      "delegation.check",
                      "delegation.decline",
                      "delegation.list",
                      "delegation.request",
                      "delegation.revoke",
                      "delegation.scopes_replace",
                      "delivery.choice.clear",
                      "delivery.choice.list",
                      "delivery.choice.set",
                      "diary.photo_visibility",
                      "diary.public_status",
                      "diary.set_photo_visibility",
                      "event.find",
                      "event.get",
                      "event.leave",
                      "event.link_moments",
                      "event.merge",
                      "event.rename_slug",
                      "event.unlink_moments",
                      "event.unmerge",
                      "identity.update_timezone",
                      "inbox.action.record",
                      "inbox.get",
                      "inbox.reminder.begin",
                      "interview.request_review",
                      "interview.subject.confirm",
                      "interview.subject.preview",
                      "introduction.group.cancel",
                      "introduction.group.decide",
                      "introduction.group.get",
                      "introduction.group.list",
                      "introduction.group.propose",
                      "match.get",
                      "match.list",
                      "media.publication.get",
                      "media.publication.list",
                      "media.publication.withdraw",
                      "media.upload.prepare",
                      "meeting.confirm_met",
                      "meeting_share.invite",
                      "meeting_share.revoke",
                      "message.archive",
                      "message.human_reply",
                      "message.presentation.decide",
                      "message.presentation.decide_batch",
                      "message.presentation.list",
                      "message.requests.decline",
                      "message.requests.get",
                      "message.requests.let_through",
                      "message.requests.list",
                      "message.summary.list",
                      "message.summary.publish",
                      "message.unarchive",
                      "moment.delete",
                      "moment.make_private",
                      "moment.photo_visibility",
                      "moment.publish",
                      "need.find_people",
                      "need.matches",
                      "need.people",
                      "need.set_visibility",
                      "page.change_address",
                      "page.compose_status",
                      "page.research",
                      "page.showcase.get",
                      "page.showcase.set",
                      "page.subject.edit_live",
                      "page.suggest",
                      "page.suggestion.decide",
                      "page.suggestions.list",
                      "people.find.get",
                      "people.find.start",
                      "people.impact",
                      "person.merge",
                      "person.merge.close_source_cards",
                      "person.merge.fold_records",
                      "person.merge.inventory",
                      "person.merge.mark_merged",
                      "person.merge.move_moments",
                      "person.merge.repoint_relationships",
                      "person.merge.run",
                      "person.merge.start",
                      "person.merge.withdraw_source_page",
                      "person.merge_preview",
                      "person.note.suggestion.decide",
                      "private_handoff.inbox",
                      "private_handoff.mark_read",
                      "private_handoff.send",
                      "private_handoff.sent",
                      "product.move",
                      "product.support",
                      "product.support_withdraw",
                      "product.supporter_removal_lift",
                      "product.supporter_remove",
                      "product.supporters_list",
                      "product.supports_mine",
                      "requirement.raise",
                      "work.update",
                      "workspace.diagram.archive",
                      "workspace.diagram.create",
                      "workspace.diagram.get",
                      "workspace.diagram.list",
                      "workspace.diagram.update"
                    ],
                    "description": "catalog, describe, or one exact implemented Core operation."
                  },
                  "payload": {
                    "type": "object",
                    "description": "Operation payload. Do not include authority identifiers.",
                    "additionalProperties": true
                  },
                  "confirmation": {
                    "type": "object",
                    "description": "Required when the operation catalog requires explicit user confirmation. A clear user instruction authorizes that exact action; do not ask again for the same recipient, content and scope. Agent-initiated actions or material changes need approval.",
                    "properties": {
                      "approved": {
                        "type": "boolean"
                      },
                      "operation": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "approved",
                      "operation"
                    ]
                  }
                },
                "required": [
                  "action"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Capability result. The `result` shape varies by capability and `action`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "capability_id": {
                      "type": "string"
                    },
                    "tool_name": {
                      "type": "string"
                    },
                    "result": {}
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          }
        }
      }
    }
  }
}
