Menu
Cookbooks
API reference
- Overview
- Companies
- Capabilities
- Measures
- Packages
- Unexplained
- Liquidity forecast
- Portfolio
- Customers
- Invoices
- Collections
- Articles
- Set-offs
- Suppliers
- Supplier invoices
- Supplier payment files
- Bank payments
- Expense claims
- Transactions
- Reconciliation
- Bank accounts
- POS sales
- Webshop orders
- Journal entries
- Voucher gap explanations
- Fiscal periods
- Accounts
- Accrual schedules
- Agreements and commitments
- Tax loss carry-forwards
- Fixed assets
- Documents
- Signing requests
- Company registers
- Capital events
- Owner tax
- Inbox items
- Dimensions
- Employees
- Salary runs
- Reports
- Budgets
- Imports
- Compliance check
- Skatteverket
- Peppol
- Webhooks
- Operations
- Pending operations
- Health
- API key
- Service accounts
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: Which building blocks this company can use, and why not.
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
| Name | Type | Description |
|---|---|---|
jurisdiction | string | ISO 3166-1 alpha-2 country whose law the books follow. Only SE today. |
ledger_currency | string | ISO 4217 currency of the ledger. Only SEK today. |
profile | object | The company profile: the starting point that decides which packages its menus and tool list show. Read-only here. |
modules | object[] | 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"
}
}