{
  "schema": "aaes/capability-pack/1",
  "provider": "openai",
  "version": "1.0.0",
  "description": "OpenAI organization administration through the Admin API: projects, project API keys and service accounts, per-model rate limits, users, admin API keys, and usage and cost reports.",
  "notes": "Every endpoint is on api.openai.com under /v1/organization, the base the Admin API reference and its curl examples use. PROJECT_ID, API_KEY_ID, RATE_LIMIT_ID, USER_ID and KEY_ID are path placeholders to bind before enabling. Admin API keys work only for administration endpoints, so this credential cannot call models.\n\nTiers sit at the floor of the declared actions. Archiving a project is registered as delete because OpenAI documents that archived projects cannot be used or updated and publishes no unarchive operation. Creating a service account (with its default key) and creating an admin key declare share, because the response hands a live secret to the caller. Deletes are R3. Rate-limit and role changes are R2 by the action floor, and policy should raise them: a higher limit raises spend capacity and an owner role grants full control.\n\nRotating an admin key or a service-account key is two registered calls: create the replacement, then delete the old key. The project API keys reference has no create operation, so a key owned by a user cannot be replaced through this pack; only its deletion is registered.\n\nEvery other administration operation in the reference is excluded, among them invites, groups and roles, project retrieval and update, project users and groups, project API key retrieval and update, service account retrieval, update, deletion and listing, key creation for an existing service account, certificates, external storage, data retention, model and hosted tool permissions, spend alerts and spend limits, admin key and user retrieval, audit logs, and every usage endpoint other than completions. AAES has not been certified by OpenAI; these endpoints are configuration to review and test.",
  "credential": {
    "secret_ref_id": "secret-ref-openai-admin-key",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "Authorization",
    "note": "An OpenAI Admin API key held in the client's own secret manager. The stored material is the complete Authorization header value: 'Bearer ' followed by the key. Create the key on the organization's Admin API keys page in the OpenAI dashboard (or with the registered admin-key create capability) and set an expiry where your policy allows one. Rotate by creating a new key, storing it under this reference, then deleting the old one. Admin keys cannot be used for non-administration endpoints. The executor injects the stored value unchanged and performs no key lifecycle.\n\nThe value must live only in executor memory for a call and never in logs, traces, diagnostics or crash dumps; a deployment that cannot meet that bar must not enable the pack."
  },
  "capabilities": [
    {
      "capability_id": "openai.projects.list",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/projects",
      "method": "GET",
      "connector": "http",
      "actions": [
        "read"
      ],
      "resource_id": "openai-organization",
      "description": "List the organization's projects: id, name, status, residency and archived time. Archived projects are left out unless include_archived is true.",
      "requires_review": true
    },
    {
      "capability_id": "openai.project.create",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R2",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/projects",
      "method": "POST",
      "connector": "http",
      "actions": [
        "create"
      ],
      "resource_id": "openai-organization",
      "description": "Create a project in the organization. OpenAI documents that projects can be created and archived but not deleted.",
      "requires_review": true
    },
    {
      "capability_id": "openai.project.archive",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/projects/PROJECT_ID/archive",
      "method": "POST",
      "connector": "http",
      "actions": [
        "delete"
      ],
      "resource_id": "openai-organization",
      "description": "Archive a project. OpenAI documents that archived projects cannot be used or updated, and the reference has no unarchive operation, so the capability declares delete at R3. PROJECT_ID is a placeholder.",
      "requires_review": true
    },
    {
      "capability_id": "openai.project.api-keys.list",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/projects/PROJECT_ID/api_keys",
      "method": "GET",
      "connector": "http",
      "actions": [
        "read"
      ],
      "resource_id": "openai-organization",
      "description": "List a project's API keys with their redacted values, last-used times and owners. A user-owned key carries the owner's name and email address, so the read is pii. PROJECT_ID is a placeholder.",
      "requires_review": true
    },
    {
      "capability_id": "openai.project.api-key.delete",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/projects/PROJECT_ID/api_keys/API_KEY_ID",
      "method": "DELETE",
      "connector": "http",
      "actions": [
        "delete"
      ],
      "resource_id": "openai-organization",
      "description": "Delete one API key from a project, including a key owned by a service account. Requests using the key fail afterwards. PROJECT_ID and API_KEY_ID are placeholders.",
      "requires_review": true
    },
    {
      "capability_id": "openai.project.service-account.create",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/projects/PROJECT_ID/service_accounts",
      "method": "POST",
      "connector": "http",
      "actions": [
        "create",
        "share"
      ],
      "resource_id": "openai-organization",
      "description": "Create a service account in a project. By default the response returns an unredacted API key for it, so the capability declares share at R3. Set create_service_account_only to create the account without a key. Route any returned key straight to the secret manager. PROJECT_ID is a placeholder.",
      "requires_review": true
    },
    {
      "capability_id": "openai.project.rate-limits.list",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/projects/PROJECT_ID/rate_limits",
      "method": "GET",
      "connector": "http",
      "actions": [
        "read"
      ],
      "resource_id": "openai-organization",
      "description": "List a project's per-model rate limits: requests and tokens per minute, and the per-day, image, audio and batch limits where a model has them. PROJECT_ID is a placeholder.",
      "requires_review": true
    },
    {
      "capability_id": "openai.project.rate-limit.update",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R2",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/projects/PROJECT_ID/rate_limits/RATE_LIMIT_ID",
      "method": "POST",
      "connector": "http",
      "actions": [
        "update"
      ],
      "resource_id": "openai-organization",
      "description": "Change one per-model rate limit of a project. Raising a limit raises how fast the project can spend. PROJECT_ID and RATE_LIMIT_ID are placeholders.",
      "requires_review": true
    },
    {
      "capability_id": "openai.users.list",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/users",
      "method": "GET",
      "connector": "http",
      "actions": [
        "read"
      ],
      "resource_id": "openai-organization",
      "description": "List the organization's users with their names, email addresses and roles.",
      "requires_review": true
    },
    {
      "capability_id": "openai.user.update",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R2",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/users/USER_ID",
      "method": "POST",
      "connector": "http",
      "actions": [
        "update"
      ],
      "resource_id": "openai-organization",
      "description": "Change a user's organization role (owner or reader, or a role_id). Promoting a user to owner grants full administrative control, so policy should raise this tier. USER_ID is a placeholder.",
      "requires_review": true
    },
    {
      "capability_id": "openai.user.delete",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/users/USER_ID",
      "method": "DELETE",
      "connector": "http",
      "actions": [
        "delete"
      ],
      "resource_id": "openai-organization",
      "description": "Remove a user from the organization. USER_ID is a placeholder.",
      "requires_review": true
    },
    {
      "capability_id": "openai.admin-api-keys.list",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/admin_api_keys",
      "method": "GET",
      "connector": "http",
      "actions": [
        "read"
      ],
      "resource_id": "openai-organization",
      "description": "List the organization's admin API keys with redacted values, expiry, last-used time and the owning user's name.",
      "requires_review": true
    },
    {
      "capability_id": "openai.admin-api-key.create",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/admin_api_keys",
      "method": "POST",
      "connector": "http",
      "actions": [
        "create",
        "share"
      ],
      "resource_id": "openai-organization",
      "description": "Create an organization admin API key, optionally with expires_in_seconds. The response carries the full key value, shown only on create, so the capability declares share at R3. Route it straight to the secret manager.",
      "requires_review": true
    },
    {
      "capability_id": "openai.admin-api-key.delete",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/admin_api_keys/KEY_ID",
      "method": "DELETE",
      "connector": "http",
      "actions": [
        "delete"
      ],
      "resource_id": "openai-organization",
      "description": "Delete an organization admin API key. Deleting the key this pack's credential refers to cuts off every capability here. KEY_ID is a placeholder.",
      "requires_review": true
    },
    {
      "capability_id": "openai.usage.completions.get",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/usage/completions",
      "method": "GET",
      "connector": "http",
      "actions": [
        "read"
      ],
      "resource_id": "openai-organization",
      "description": "Read the organization's completions usage in time buckets (start_time required), optionally grouped by project, user, API key, model or batch.",
      "requires_review": true
    },
    {
      "capability_id": "openai.costs.get",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "financial",
      "egress_allowlist": [
        "api.openai.com"
      ],
      "endpoint": "https://api.openai.com/v1/organization/costs",
      "method": "GET",
      "connector": "http",
      "actions": [
        "read"
      ],
      "resource_id": "openai-organization-costs",
      "description": "Read the organization's costs in daily buckets (start_time required), optionally grouped by project, user, line item, API key or API source. This is spend data, registered at the read floor.",
      "requires_review": true
    }
  ],
  "resources": [
    {
      "resource_id": "openai-organization",
      "kind": "api",
      "locator": "https://api.openai.com/v1/organization",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "openai-organization-costs",
      "kind": "api",
      "locator": "https://api.openai.com/v1/organization/costs",
      "data_class": "financial",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "library",
    "date": "2026-10-22",
    "sources": [
      "https://developers.openai.com/api/docs/guides/admin-apis.md (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/administration/overview (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/projects/methods/list (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/projects/methods/create (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/projects/methods/archive (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/projects/subresources/api_keys/methods/list (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/projects/subresources/api_keys/methods/delete (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/projects/subresources/service_accounts/methods/create (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/projects/subresources/rate_limits/methods/list_rate_limits (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/projects/subresources/rate_limits/methods/update_rate_limit (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/users/methods/list (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/users/methods/update (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/users/methods/delete (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/admin_api_keys/methods/list (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/admin_api_keys/methods/create (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/admin_api_keys/methods/delete (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/usage/methods/completions (retrieved 2026-10-22)",
      "https://developers.openai.com/api/reference/resources/admin/subresources/organization/subresources/usage/methods/costs (retrieved 2026-10-22)"
    ],
    "reviewer_id": "owner-delegated"
  }
}
