{
  "schema": "aaes/capability-pack/1",
  "provider": "quickbooks",
  "version": "1.0.0",
  "description": "QuickBooks Online accounting: read customers, vendors, invoices, payments and company info.",
  "notes": "REALM_ID, CUSTOMER_ID, VENDOR_ID, INVOICE_ID and PAYMENT_ID are placeholders to replace before enabling. REALM_ID is Intuit's company id and scopes every path under /v3/company. The registered host is the production API host quickbooks.api.intuit.com; Intuit documents the sandbox host sandbox-quickbooks.api.intuit.com as the alternative base URL, and substituting it — with the egress allowlist kept in step — is a supported review outcome for a sandbox deployment. Every read registered here is a RECORD read on the entity's own path with its Id (the operation Intuit's SDK exposes as FindById); the reads are not collection reads.\n\nThe collection surface is the query endpoint (GET /v3/company/{realmId}/query with a SQL-like select statement), and this pack does not register it: an open query endpoint would read any entity the credential can reach, which is a broader permission than the per-entity record reads a reviewer can see here. This pack also does not register the batch endpoint, change data capture (/cdc), reports, PDF download, or any update, delete or void operation.\n\nInvoice creation is NOT registered: the invoice write surface is a single shared POST to /v3/company/{realmId}/invoice, and Intuit's official QuickBooks V3 PHP SDK implements update as POST.../invoice?operation=update, delete as POST.../invoice?operation=delete and void as POST.../invoice?operation=void on that same path — with caller-controlled query and body values, registering 'create' on this route cannot be separated from update, void and delete (delete is irreversible at the minimum R3 tier), and this pack registers no mechanism that restricts the query string or body.\n\nInvoice creation returns only when a demonstrable deployment-level restriction confines the route to creation, or as a capability that honestly declares every reachable effect at its floor. This pack does not register the invoice send operation (Intuit supports emailing an invoice; a send cannot be recalled after delivery and would carry the send action at R3) and does not register payment creation — and note what a payment is here: a QuickBooks Accounting API Payment entity records a payment received against invoices in the ledger, a bookkeeping record, not an instruction that moves funds; actual money movement happens through the business's bank and payment rails outside this API.\n\nRecording such a payment is still a financial write this pack leaves out. The developer.intuit.com entity reference pages require a JavaScript browser to render; this review verified the exact HTTP routes — the per-entity FindById GETs, the companyinfo route GET /v3/company/{realmId}/companyinfo/{realmId}, and the shared POST operation variants above — against the route construction in Intuit's official QuickBooks Online V3 PHP SDK source instead. AAES has not been certified by Intuit; the endpoints here are configuration to review and test; the vendor has not endorsed it.",
  "credential": {
    "secret_ref_id": "secret-ref-quickbooks-access-token",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "Authorization",
    "note": "An OAuth2 access token for the QuickBooks Online Accounting API, held in the client's own secret manager under this reference. Intuit issues tokens through the OAuth2 authorization-code flow against the client's own developer app, and access tokens are short-lived (Intuit's SDK carries the access token and the refresh token as separate configuration): the refresh token and the app's client credentials stay with an external token process, which performs the refresh and stores the FRESH access token under this reference — the executor and the agent never see the refresh token, and this pack does not store one.\n\nThe stored material must be the complete Authorization header value (scheme included: 'Bearer <access-token>'). Choose the least-privilege scope at Intuit that covers these endpoints (the accounting scope); if the connection is revoked or the refresh token lapses, the external process must re-authorize before this reference serves again. At execution time the resolved bearer material exists in the executor process's memory for the moment of injection only — the deployment owns the executor's memory, log and crash hygiene; the agent never receives it."
  },
  "capabilities": [
    {
      "capability_id": "quickbooks.customers.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "quickbooks.api.intuit.com"
      ],
      "endpoint": "https://quickbooks.api.intuit.com/v3/company/REALM_ID/customer/CUSTOMER_ID",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-quickbooks-access-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "quickbooks-company",
      "description": "Read one customer record by Id: names, addresses, email and phone, which are personal data. CUSTOMER_ID and REALM_ID are placeholders to replace before enabling. Collection queries go through the /query endpoint, which this pack does not register.",
      "requires_review": true
    },
    {
      "capability_id": "quickbooks.vendors.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "quickbooks.api.intuit.com"
      ],
      "endpoint": "https://quickbooks.api.intuit.com/v3/company/REALM_ID/vendor/VENDOR_ID",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-quickbooks-access-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "quickbooks-company",
      "description": "Read one vendor record by Id: names, addresses, email and phone, which are personal data. VENDOR_ID and REALM_ID are placeholders to replace before enabling. Collection queries go through the /query endpoint, which this pack does not register.",
      "requires_review": true
    },
    {
      "capability_id": "quickbooks.invoices.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "financial",
      "egress_allowlist": [
        "quickbooks.api.intuit.com"
      ],
      "endpoint": "https://quickbooks.api.intuit.com/v3/company/REALM_ID/invoice/INVOICE_ID",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-quickbooks-access-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "quickbooks-company",
      "description": "Read one invoice record by Id: line items, amounts, tax and balance — financial data. INVOICE_ID and REALM_ID are placeholders to replace before enabling. Collection queries go through the /query endpoint, which this pack does not register.",
      "requires_review": true
    },
    {
      "capability_id": "quickbooks.payments.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "financial",
      "egress_allowlist": [
        "quickbooks.api.intuit.com"
      ],
      "endpoint": "https://quickbooks.api.intuit.com/v3/company/REALM_ID/payment/PAYMENT_ID",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-quickbooks-access-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "quickbooks-company",
      "description": "Read one payment record by Id: amounts and the transactions the payment is linked to — financial data. PAYMENT_ID and REALM_ID are placeholders to replace before enabling. Collection queries go through the /query endpoint, which this pack does not register.",
      "requires_review": true
    },
    {
      "capability_id": "quickbooks.companyinfo.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "quickbooks.api.intuit.com"
      ],
      "endpoint": "https://quickbooks.api.intuit.com/v3/company/REALM_ID/companyinfo/REALM_ID",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-quickbooks-access-token",
      "inject": "header",
      "inject_name": "Authorization",
      "actions": [
        "read"
      ],
      "resource_id": "quickbooks-company",
      "description": "Read the company record for the realm: company name, addresses (company, customer-communication and legal), the business's contact email, web address and subscription metadata. This is not exclusively internal metadata: the record carries the business's contact email and addresses, and for a sole proprietor those company contact details are the proprietor's own personal data — treat the response as pii. REALM_ID is a placeholder to replace before enabling.",
      "requires_review": true
    }
  ],
  "resources": [
    {
      "resource_id": "quickbooks-company",
      "kind": "api",
      "locator": "https://quickbooks.api.intuit.com/v3/company/REALM_ID",
      "data_class": "financial",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "library",
    "date": "2026-09-22",
    "sources": [
      "https://raw.githubusercontent.com/intuit/QuickBooks-V3-PHP-SDK/master/docs/_sources/quickstart.rst.txt (retrieved 2026-09-21)",
      "https://raw.githubusercontent.com/intuit/QuickBooks-V3-PHP-SDK/master/docs/_sources/configuration.rst.txt (retrieved 2026-09-21)",
      "https://raw.githubusercontent.com/intuit/QuickBooks-V3-PHP-SDK/master/src/DataService/DataService.php (retrieved 2026-09-21)",
      "https://raw.githubusercontent.com/intuit/QuickBooks-V3-PHP-SDK/master/src/Core/CoreConstants.php (retrieved 2026-09-21)"
    ],
    "reviewer_id": "aaes-eng"
  }
}
