Menu

Capabilities

Which building blocks (the modules behind the OpenAPI tags) a company can use right now, each with a status, the reasons behind it and a resolution sentence. Read-only: the per-company module switch arrives later.

Endpoints


GET /api/v1/companies/:companyId/capabilities

capabilities.get · scope companies:read

Which building blocks this company can use, and why not.

Lists every module (the OpenAPI tags) for the company with a status, the reasons behind it and a resolution sentence, like Stripe account capabilities. Statuses: active (usable now); needs_plan (the paid plan does not include it: upgrade, or on a self-hosted instance add a connector key); off (turned off for this company); unsupported (not offered for this company: its country, or its legal form, such as payroll for an enskild firma that has not said it pays salaries). Reasons, the deciding one first: unsupported_country, unsupported_legal_form, needs_plan, disabled_by_company, dependency_unavailable (a module it needs is unsupported or off; it then takes that status). Kernels (platform, ledger) are always active. profile names the company profile (sole-trader, limited-company-no-employees, limited-company-with-employees, retail, association, or standard, every package on): the starting point for which packages the app menu and the MCP tool list show. A module in a package the profile leaves off is hidden there but keeps its status and still answers when called. A company without a stored profile has standard (source implicit). This is a read-only report: nothing here changes a profile or a module.

Use when: At the start of an integration or agent session, before calling endpoints of an optional module (bank feed, payroll, Skatteverket filing, collections, the AI agent), or to explain to a user why something is unavailable.

Don't use for: Turning a module on or off, or changing the profile: nothing here writes. API key scopes are a separate axis (GET /api/v1/api-key); a module can be active while the key lacks the scope for its endpoints.

Pitfalls

  • A status is a snapshot: a plan change or a settings change moves it. Re-read it rather than caching it for a session.
  • needs_plan only covers the paid parts of a module; the module's free endpoints keep answering. The resolution says what unlocks it.
  • Modules, statuses and reasons may gain values as the product grows (module ids are experimental, like the OpenAPI tags): treat an unknown status as not active.

Risk: low · Idempotent: yes · Reversible: no · Dry-run supported: no

Response fields

NameTypeDescription
jurisdictionstringISO 3166-1 alpha-2 country whose law the books follow. Only SE today.
ledger_currencystringISO 4217 currency of the ledger. Only SEK today.
profileobjectThe company profile: the starting point that decides which packages its menus and tool list show. Read-only here.
modulesobject[]Every module, kernels first, in the order of the OpenAPI tags.

Example response

{
  "data": {
    "jurisdiction": "SE",
    "ledger_currency": "SEK",
    "profile": {
      "id": "standard",
      "version": 1,
      "name": "Standard (everything on)",
      "name_sv": "Standard (allt på)",
      "source": "implicit"
    },
    "modules": [
      {
        "id": "ledger",
        "kind": "kernel",
        "name": "Ledger",
        "name_sv": "Bokföring",
        "summary": "Double-entry bookkeeping under Bokföringslagen: journal entries and corrections, ...",
        "depends_on": [
          "platform"
        ],
        "status": "active",
        "reasons": [],
        "resolution": null
      },
      {
        "id": "bank-feed",
        "kind": "block",
        "name": "Bank feed",
        "name_sv": "Bankkoppling",
        "summary": "Reading the company bank through PSD2 aggregators and Open Payments, ...",
        "depends_on": [
          "transactions"
        ],
        "status": "needs_plan",
        "reasons": [
          "needs_plan"
        ],
        "resolution": "Upgrade the plan to use Bank feed."
      },
      {
        "id": "payroll",
        "kind": "block",
        "name": "Payroll",
        "name_sv": "Lön",
        "summary": "Swedish payroll: the employee register, salary runs from calculation to booking, ...",
        "depends_on": [],
        "status": "unsupported",
        "reasons": [
          "unsupported_legal_form"
        ],
        "resolution": "Payroll is on for every legal person; an enskild firma turns it on by setting pays_salaries in the company tax profile."
      }
    ]
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "2026-05-12"
  }
}