{
  "schema": "aaes/capability-pack/1",
  "provider": "airbase",
  "version": "1.0.0",
  "description": "Airbase Guided Procurement API scaffold: candidate reads for vendors, purchase orders, bills, cards, and subsidiaries. Operations remain unverified because the official reference is invite-only. Verify methods, paths, and responses before replacing the reserved host or enabling any capability.",
  "notes": "Do not enable this scaffold until the invite-only reference has been reviewed. The official developer portal documents the Guided Procurement API and grants API and documentation access through an Airbase Program Manager. The endpoint reference was unavailable to this review, so method support, public-API status, parameters, response shapes, pagination, and read semantics remain unverified. The pack remains in draft until those contracts are confirmed.\n\nThe reserved host airbase-docs-invite-only.invalid is a non-production RFC 2606 placeholder. After reviewing the invite-only reference, replace it with the verified API host and paths in every endpoint, resource locator, and egress allowlist entry. The allowlist matches exactly, so update all three together. An allowlisted placeholder is not a reviewed destination and must not be enabled as shipped.\n\nRoute observations dated 2026-09-21 do not establish operation semantics. The live api.airbase.io host returned an Authorization-header error, 401 for the candidate /v1/vendors/, /v1/purchase-orders/, /v1/bills/, /v1/cards/, and /v1/subsidiaries/ paths, and 404 for unknown paths. Authentication middleware can reject before method dispatch or application routing: those responses establish neither public GET support nor returned data. A 404 also does not establish that an operation is absent. The /v1/vendors path redirected to /v1/vendors/, explaining the candidate trailing slash; AAES does not follow redirects.\n\nRegistered scope: five candidate collection reads at R0, subject to confirmation. Single-record reads are excluded. Transaction and user reads could not be supported by the available route observations; no purchase-request route could be supported either. The pack also excludes approvals and approval actions, virtual card issuance and every other write, payments, reimbursements, and webhooks.\n\nAAES has not been certified by Airbase or Paylocity; this configuration is not a vendor guarantee.\n\nSource annotation for https://developer.airbase.io/ (retrieved 2026-09-21): portal landing page describing the invite-only Guided Procurement API; no endpoint reference available.\nSource annotation for https://api.airbase.io/ (retrieved 2026-09-21): route responses and missing-header error only; no operation contract established.\n\nRe-review on 2026-10-29: the web reader retrieved only the Paylocity portal shell from https://developer.airbase.io/. Candidate OpenAPI URLs were inaccessible through that tool; the vendor GitHub pages yielded no operation reference. The browser fallback was unavailable. No operation or credential contract was verified, and this pack remains draft. The invite-only access requirement is the earlier portal finding, not newly retrieved endpoint evidence.",
  "credential": {
    "secret_ref_id": "secret-ref-airbase-api-token",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "Authorization",
    "note": "An Airbase API credential held in the client’s own secret manager. The live host’s missing-Authorization-header error establishes the expected header name only. It establishes no issuance process, credential format, scheme, expiry, revocation, or permission model.\n\nStore the complete Authorization header value, including the scheme. Confirm its format against the invite-only reference before enabling. API access is granted through an Airbase Program Manager; confirm issuance, expiry, revocation, and permission behavior through that onboarding and reference. If an external process mints tokens, keep the underlying client secret with that process. An expired or revoked value must fail closed.\n\nLeast privilege: request only the permissions needed for the candidate vendor, purchase-order, bill, card, and subsidiary reads. Exclude write, approval, card-issuance, and payment permissions. Confirm the provider’s actual permission granularity rather than assuming separate read scopes exist.\n\nExecutor hygiene: keep the credential in executor memory only for the call’s lifetime. Never include it in logs, traces, diagnostics, or crash reports. The deployment owns the executor’s memory, logging, and crash-handling controls."
  },
  "capabilities": [
    {
      "capability_id": "airbase.vendors.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "airbase-docs-invite-only.invalid"
      ],
      "endpoint": "https://airbase-docs-invite-only.invalid/v1/vendors/",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-airbase-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "airbase-vendors",
      "description": "Candidate read of vendor master records. Named contacts may identify people, so the declared class is pii (personal data); the deployment may reclassify its vendor data under its own policy.\n\nOperation unverified: the official endpoint reference is invite-only. The dated 401/404 route responses do not establish method support, public-API status, or read semantics because authentication middleware can respond before routing. Confirm the contract before enabling. Replace the reserved host and verified path in the endpoint, resource locator, and egress allowlist together.\n\nScope: collection read only; single-record reads are excluded.",
      "requires_review": true
    },
    {
      "capability_id": "airbase.purchase-orders.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "financial",
      "egress_allowlist": [
        "airbase-docs-invite-only.invalid"
      ],
      "endpoint": "https://airbase-docs-invite-only.invalid/v1/purchase-orders/",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-airbase-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "airbase-purchase-orders",
      "description": "Candidate read of purchase orders, classified as financial data.\n\nOperation unverified: the official endpoint reference is invite-only. The dated 401/404 route responses do not establish method support, public-API status, or read semantics because authentication middleware can respond before routing. Confirm the contract before enabling. Replace the reserved host and verified path in the endpoint, resource locator, and egress allowlist together.\n\nScope: collection read only; single-record reads are excluded.",
      "requires_review": true
    },
    {
      "capability_id": "airbase.bills.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "financial",
      "egress_allowlist": [
        "airbase-docs-invite-only.invalid"
      ],
      "endpoint": "https://airbase-docs-invite-only.invalid/v1/bills/",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-airbase-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "airbase-bills",
      "description": "Candidate read of bills, classified as financial data.\n\nOperation unverified: the official endpoint reference is invite-only. The dated 401/404 route responses do not establish method support, public-API status, or read semantics because authentication middleware can respond before routing. Confirm the contract before enabling. Replace the reserved host and verified path in the endpoint, resource locator, and egress allowlist together.\n\nScope: collection read only; single-record reads are excluded. Bill payment is excluded.",
      "requires_review": true
    },
    {
      "capability_id": "airbase.cards.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "financial",
      "egress_allowlist": [
        "airbase-docs-invite-only.invalid"
      ],
      "endpoint": "https://airbase-docs-invite-only.invalid/v1/cards/",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-airbase-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "airbase-cards",
      "description": "Candidate read of cards, classified as financial data.\n\nOperation unverified: the official endpoint reference is invite-only. The dated 401/404 route responses do not establish method support, public-API status, or read semantics because authentication middleware can respond before routing. Confirm the contract before enabling. Replace the reserved host and verified path in the endpoint, resource locator, and egress allowlist together.\n\nScope: collection read only; single-record reads are excluded. Card issuance, freezing, and termination are excluded.",
      "requires_review": true
    },
    {
      "capability_id": "airbase.subsidiaries.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "airbase-docs-invite-only.invalid"
      ],
      "endpoint": "https://airbase-docs-invite-only.invalid/v1/subsidiaries/",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-airbase-api-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "airbase-subsidiaries",
      "description": "Candidate read of the organization’s subsidiary structure, classified as internal data.\n\nOperation unverified: the official endpoint reference is invite-only. The dated 401/404 route responses do not establish method support, public-API status, or read semantics because authentication middleware can respond before routing. Confirm the contract before enabling. Replace the reserved host and verified path in the endpoint, resource locator, and egress allowlist together.\n\nScope: collection read only; single-record reads are excluded.",
      "requires_review": true
    }
  ],
  "resources": [
    {
      "resource_id": "airbase-vendors",
      "kind": "api",
      "locator": "https://airbase-docs-invite-only.invalid/v1/vendors/",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "airbase-purchase-orders",
      "kind": "api",
      "locator": "https://airbase-docs-invite-only.invalid/v1/purchase-orders/",
      "data_class": "financial",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "airbase-bills",
      "kind": "api",
      "locator": "https://airbase-docs-invite-only.invalid/v1/bills/",
      "data_class": "financial",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "airbase-cards",
      "kind": "api",
      "locator": "https://airbase-docs-invite-only.invalid/v1/cards/",
      "data_class": "financial",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    },
    {
      "resource_id": "airbase-subsidiaries",
      "kind": "api",
      "locator": "https://airbase-docs-invite-only.invalid/v1/subsidiaries/",
      "data_class": "internal",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "draft",
    "date": "2026-10-29",
    "sources": [
      "https://developer.airbase.io/ (retrieved 2026-09-21)",
      "https://api.airbase.io/ (retrieved 2026-09-21)"
    ],
    "reviewer_id": "aaes-eng"
  }
}
