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
Capital events
Bolaget: dividends from the stämma decision to the payout, split per holder from the aktiebok and checked against fritt eget kapital (ABL 17:3); the KU31 status per income year; aktieägartillskott; nyemission, fondemission and minskning av aktiekapitalet. Bookings post through the bookkeeping engine. The KU31 file is downloaded in Accounted only.
Endpoints
GET/api/v1/companies/:companyId/capital-events: Read the capital events: dividends with the split per holder, aktieägartillskott, and nyemission, fondemission and minskning.GET/api/v1/companies/:companyId/ku31/:year: Read the KU31 status of an inkomstår: who received a dividend, what is reported, what still blocks the file.POST/api/v1/companies/:companyId/capital-changes: Record a nyemission, fondemission or minskning av aktiekapitalet, with its allotment and its filing deadlines.POST/api/v1/companies/:companyId/capital-changes/:id/book: Book a capital change: a nyemission's payment (D bank / K 2082, 2097), or the registration of any change.POST/api/v1/companies/:companyId/dividends: Record a dividend decided by the bolagsstämma and split it over the holders of the aktiebok.POST/api/v1/companies/:companyId/dividends/:id/book: Book a decided dividend: D 2098 (or 2091) / K 2898 on the decision day, and freeze the split per holder.POST/api/v1/companies/:companyId/dividends/:id/pay: Mark a booked dividend paid: book D 2898 / K bank, or link the payout verifikat already booked from the bank.POST/api/v1/companies/:companyId/shareholder-contributions: Register and book an aktieägartillskott (villkorat or ovillkorat), or the repayment of a villkorat one.
GET /api/v1/companies/:companyId/capital-events
capital-events.get · scope companies:read
Read the capital events: dividends with the split per holder, aktieägartillskott, and nyemission, fondemission and minskning.
Every dividend from the stämma decision to the payout (status decided, booked, paid) with each holder's part from the aktiebok on the decisive day; every aktieägartillskott, villkorat or not, and its repayments; every change of aktiekapital with its registration. Names and masked identities only.
Use when: You need what was paid to whom, the dividends of a year, or whether an emission is registered and paid.
Don't use for: The aktiebok (GET /share-register) or the KU31 status of a year (GET /ku31/{year}).
Pitfalls
- A dividend with status decided is not booked yet: nothing is in the ledger.
- has_personnummer false means KU31 cannot be made until the personnummer is added in Accounted.
Risk: low · Idempotent: yes · Reversible: no · Dry-run supported: no
Response fields
| Name | Type |
|---|---|
dividends | object[] |
contributions | object[] |
capital_changes | object[] |
Example response
{
"data": {
"dividends": [
{
"dividend_id": "4d1e…",
"decided_on": "2026-05-01",
"status": "paid",
"total_amount": 100000,
"holders": [
{
"name": "Anna Ek",
"amount": 100000
}
]
}
],
"contributions": [],
"capital_changes": []
},
"meta": {
"request_id": "req_…",
"api_version": "2026-05-12"
}
}
GET /api/v1/companies/:companyId/ku31/:year
ku31.status.get · scope companies:read
Read the KU31 status of an inkomstår: who received a dividend, what is reported, what still blocks the file.
The dividends with a betalningsdag in the year (booked or paid), each recipient with the amount and the whole kronor field 574 reports, who is left out (Swedish legal persons), the fåmansföretag answer (field 061 or 062) and the blockers. The file itself is downloaded in Accounted by an owner or administrator: it carries personnummer.
Use when: Before 31 January, to see whether KU31 for last year can be filed and what is missing.
Don't use for: Getting the file: there is no machine door for it.
Pitfalls
- KU31_PERSONNUMMER_MISSING: the person's personnummer is added in Accounted (Ägare och aktiebok), never through the API.
Risk: low · Idempotent: yes · Reversible: no · Dry-run supported: no
Response fields
| Name | Type | Description |
|---|---|---|
income_year | number | |
deadline | string | |
schema_version | string | |
file_supported | boolean | Accounted makes the file for this inkomstår (Skatteverket schema 12.0 is for 2026). |
dividends | object[] | |
unbooked_dividends | number | |
recipients | object[] | |
famansforetag | boolean | null | The confirmed answer: field 061 (true) or 062 (false). Null until answered in Accounted. |
famansforetag_derivation | object | |
contact | object | |
last_generated_at | string | null | |
blockers | object[] | |
ready | boolean |
Example response
{
"data": {
"income_year": 2026,
"deadline": "2027-01-31",
"ready": false,
"blockers": [
{
"code": "KU31_FAMANS_UNANSWERED",
"message_sv": "Svara på om bolaget är ett fåmansföretag..."
}
]
},
"meta": {
"request_id": "req_…",
"api_version": "2026-05-12"
}
}
POST /api/v1/companies/:companyId/capital-changes
capital-changes.create · scope companies:write
Record a nyemission, fondemission or minskning av aktiekapitalet, with its allotment and its filing deadlines.
Records the decision and the change of aktiekapital (kvotvärde x shares when omitted). A nyemission's allotment goes into the aktiebok genast (ABL 13:18). Raises the deadlines: nyemission 6 months (13:27), fondemission genast (12:10), minskning 4 months (20:19) and the notice to the holders (20:18). Nothing is booked: POST /capital-changes/{id}/book. Dry-runnable.
Use when: The stämma (or the board under an authorisation) decided to change the aktiekapital.
Don't use for: A share transfer (POST /share-register/events) or a dividend (POST /dividends).
Pitfalls
- The allotment must add up to share_count.
- Fondemission and minskning shares are entered in the aktiebok after registration.
Risk: medium · Idempotent: yes · Reversible: no · Dry-run supported: yes · Stage for approval: yes (?stage=true)
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
dry_run | string | no | true (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits. |
stage | string | no | true stages the write for approval instead of committing it: 202 with the pending operation to approve via POST /pending-operations/{id}/approve. Absent or false commits; other values are 400. A reason in the body (why you propose it, at most 500 characters) is shown to the approver as agent_reason and kept with the decision. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
kind | "nyemission" | "fondemission" | "minskning" | yes | |
decided_on | string | yes | |
decided_by | "arsstamma" | "extra_stamma" | "styrelse" | yes | |
decision_id | string | null | no | |
document_id | string | null | no | |
share_class_id | string | null | no | The class; optional with one class. |
share_count | number | yes | New shares (emission) or cancelled shares (minskning); 0 when only the kvotvärde changes. |
share_capital_amount | number | null | no | The change of aktiekapital; kvotvärde x share_count when omitted. |
price_per_share | number | null | no | Nyemission: the subscription price per share. |
subscription_start | string | null | no | |
subscription_end | string | null | no | |
source_account | "2085" | "2086" | "2091" | "2097" | null | no | Fondemission: the fund (ABL 12:1); 2091 when omitted. |
purpose | "forlusttackning" | "aterbetalning" | "fri_fond" | null | no | Minskning: forlusttackning, aterbetalning or fri_fond (ABL 20:1). |
allotments | object[] | null | no | Nyemission: who was allotted how many shares. |
allotted_on | string | null | no | The allotment day; the decision day when omitted. |
note | string | null | no |
Response fields
| Name | Type |
|---|---|
capital_change_id | string |
kind | "nyemission" | "fondemission" | "minskning" |
share_capital_amount | number |
premium_amount | number |
share_register_event_ids | string[] |
Example request
{
"kind": "nyemission",
"decided_on": "2026-09-01",
"decided_by": "extra_stamma",
"share_count": 100,
"price_per_share": 1000,
"allotments": [
{
"party_id": "9c1e…",
"share_count": 100
}
]
}
Example response
{
"data": {
"capital_change_id": "5e6f…",
"kind": "nyemission",
"share_capital_amount": 2500,
"premium_amount": 97500,
"share_register_event_ids": [
"7a2b…"
]
},
"meta": {
"request_id": "req_…",
"api_version": "2026-05-12"
}
}
POST /api/v1/companies/:companyId/capital-changes/:id/book
capital-changes.book · scope bookkeeping:write
Book a capital change: a nyemission's payment (D bank / K 2082, 2097), or the registration of any change.
step payment (nyemission only): D bank / K 2082 Ej registrerat aktiekapital and 2097 Fri överkursfond. step registration on the Bolagsverket registration day: nyemission D 2082 / K 2081 (13:29; payment must be booked first, 13:28), fondemission D the fund / K 2081 (12:10), minskning D 2081 / K 2091 or 2890 (20:20). Dry-runnable.
Use when: The subscription money came in, or Bolagsverket registered the change.
Don't use for: Recording the decision (POST /capital-changes).
Pitfalls
- CAPITAL_CHANGE_NOT_PAID: book the payment before the registration.
Risk: high · Idempotent: yes · Reversible: no · Dry-run supported: yes · Stage for approval: yes (?stage=true)
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
dry_run | string | no | true (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits. |
stage | string | no | true stages the write for approval instead of committing it: 202 with the pending operation to approve via POST /pending-operations/{id}/approve. Absent or false commits; other values are 400. A reason in the body (why you propose it, at most 500 characters) is shown to the approver as agent_reason and kept with the decision. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
step | "payment" | "registration" | yes | |
date | string | yes | The payment day or the registration day. |
bank_account | string | null | no | Bank account (BAS 19xx). Default: the company's primary bank account. |
Response fields
| Name | Type |
|---|---|
capital_change_id | string |
step | "payment" | "registration" |
journal_entry_id | string |
status | "decided" | "registered" | "cancelled" |
Example request
{
"capital_change_id": "5e6f…",
"step": "registration",
"date": "2026-10-01"
}
Example response
{
"data": {
"capital_change_id": "5e6f…",
"step": "registration",
"journal_entry_id": "7a2b…",
"status": "registered"
},
"meta": {
"request_id": "req_…",
"api_version": "2026-05-12"
}
}
POST /api/v1/companies/:companyId/dividends
dividends.create · scope companies:write
Record a dividend decided by the bolagsstämma and split it over the holders of the aktiebok.
Records the decision (amount per share or a total, betalningsdag, which day decides the recipients) and one part per holder from the aktiebok on that day, rounded to the öre (a total is split by largest remainder). Checks it against fritt eget kapital on the last balance sheet less later transfers (ABL 17:3) and warns. Nothing is booked: book it with POST /dividends/{id}/book. Dry-runnable.
Use when: The stämma decided a dividend.
Don't use for: Booking (POST /dividends/{id}/book) or a dividend already in the ledger before the aktiebok existed (the "who received" step in Accounted).
Pitfalls
- DIVIDEND_NO_HOLDERS: the aktiebok has no holders on the decisive day; register the shares first.
- A warning DIVIDEND_EXCEEDS_FREE_EQUITY means booking will be refused (ABL 17:3).
Risk: medium · Idempotent: yes · Reversible: no · Dry-run supported: yes · Stage for approval: yes (?stage=true)
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
dry_run | string | no | true (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits. |
stage | string | no | true stages the write for approval instead of committing it: 202 with the pending operation to approve via POST /pending-operations/{id}/approve. Absent or false commits; other values are 400. A reason in the body (why you propose it, at most 500 characters) is shown to the approver as agent_reason and kept with the decision. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
decided_on | string | yes | The day the bolagsstämma decided the dividend (YYYY-MM-DD). |
decided_by | "arsstamma" | "extra_stamma" | yes | arsstamma or extra_stamma: only a stämma decides a dividend (ABL 18:1). |
decision_id | string | null | no | The stämma decision, when recorded in Accounted. |
document_id | string | null | no | The minutes in the archive. |
amount_per_share | number | null | no | Amount per share in SEK (ABL 18:3). Give this or total_amount. |
total_amount | number | null | no | Or the total to split in proportion to the shares. |
share_class_ids | string[] | null | no | The classes paid on; all when omitted. |
record_date_basis | "decision_date" | "payment_date" | "other" | null | no | Which day's aktiebok decides the recipients: decision_date (default), payment_date or other. |
record_date | string | null | no | With record_date_basis other: that day. |
payment_date | string | null | no | The betalningsdag the stämma set (ABL 18:3); the decision day when omitted. |
prudence_confirmed | boolean | null | no | The board assessed the försiktighetsregel (ABL 17:3 second paragraph). |
note | string | null | no |
Response fields
| Name | Type |
|---|---|
dividend_id | string |
status | "decided" | "booked" | "paid" | "cancelled" |
total_amount | number |
record_date | string |
payment_date | string |
distributions | object[] |
Example request
{
"decided_on": "2026-05-01",
"decided_by": "arsstamma",
"amount_per_share": 100,
"payment_date": "2026-05-15",
"prudence_confirmed": true
}
Example response
{
"data": {
"dividend_id": "4d1e…",
"status": "decided",
"total_amount": 100000,
"record_date": "2026-05-01",
"payment_date": "2026-05-15",
"distributions": [
{
"party_id": "9c1e…",
"share_count": 1000,
"amount": 100000
}
]
},
"meta": {
"request_id": "req_…",
"api_version": "2026-05-12"
}
}
POST /api/v1/companies/:companyId/dividends/:id/book
dividends.book · scope bookkeeping:write
Book a decided dividend: D 2098 (or 2091) / K 2898 on the decision day, and freeze the split per holder.
Posts the decision through the bookkeeping engine on the decision day: debit 2098 Vinst eller förlust från föregående år while it holds the amount, else 2091 Balanserat resultat, credit 2898 Outtagen vinstutdelning. The split is refreshed from the aktiebok once more and then frozen. Refused above the fritt eget kapital (ABL 17:3) and in a locked period. Dry-runnable.
Use when: A dividend is recorded with status decided.
Don't use for: The payout (POST /dividends/{id}/pay).
Pitfalls
- DIVIDEND_EXCEEDS_FREE_EQUITY: lower the dividend; the stämma must decide again.
- A locked or closed period refuses the posting; the decision day decides the period.
Risk: high · Idempotent: yes · Reversible: no · Dry-run supported: yes · Stage for approval: yes (?stage=true)
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
dry_run | string | no | true (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits. |
stage | string | no | true stages the write for approval instead of committing it: 202 with the pending operation to approve via POST /pending-operations/{id}/approve. Absent or false commits; other values are 400. A reason in the body (why you propose it, at most 500 characters) is shown to the approver as agent_reason and kept with the decision. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
source_account | "2091" | "2098" | null | no | 2098 or 2091; chosen from the balance on the decision day when omitted. |
prudence_confirmed | boolean | null | no | Confirms the försiktighetsregel assessment (ABL 17:3) now. |
Response fields
| Name | Type |
|---|---|
dividend_id | string |
status | "decided" | "booked" | "paid" | "cancelled" |
decision_entry_id | string |
source_account | "2091" | "2098" |
total_amount | number |
Example request
{
"dividend_id": "4d1e…"
}
Example response
{
"data": {
"dividend_id": "4d1e…",
"status": "booked",
"decision_entry_id": "7a2b…",
"source_account": "2098",
"total_amount": 100000
},
"meta": {
"request_id": "req_…",
"api_version": "2026-05-12"
}
}
POST /api/v1/companies/:companyId/dividends/:id/pay
dividends.pay · scope bookkeeping:write
Mark a booked dividend paid: book D 2898 / K bank, or link the payout verifikat already booked from the bank.
Posts the payout through the engine on paid_on (the betalningsdag when omitted), or, with journal_entry_id, links a posted verifikat that debits 2898 instead of booking a second one. The KU31 deadline for the year is raised. Dry-runnable.
Use when: The dividend left the bank.
Don't use for: A dividend not yet booked (POST /dividends/{id}/book first).
Pitfalls
- DIVIDEND_PAYOUT_ENTRY_INVALID: the linked verifikat is not posted or does not debit 2898.
Risk: high · Idempotent: yes · Reversible: no · Dry-run supported: yes · Stage for approval: yes (?stage=true)
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
dry_run | string | no | true (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits. |
stage | string | no | true stages the write for approval instead of committing it: 202 with the pending operation to approve via POST /pending-operations/{id}/approve. Absent or false commits; other values are 400. A reason in the body (why you propose it, at most 500 characters) is shown to the approver as agent_reason and kept with the decision. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
paid_on | string | null | no | The day the money left; the betalningsdag when omitted. |
bank_account | string | null | no | Bank account (BAS 19xx). Default: the company's primary bank account. |
journal_entry_id | string | null | no | A payout verifikat already posted (D 2898 / K bank) to link instead of booking. |
Response fields
| Name | Type |
|---|---|
dividend_id | string |
status | "decided" | "booked" | "paid" | "cancelled" |
payout_entry_id | string |
paid_on | string |
linked | boolean |
Example request
{
"dividend_id": "4d1e…",
"paid_on": "2026-05-15"
}
Example response
{
"data": {
"dividend_id": "4d1e…",
"status": "paid",
"payout_entry_id": "8c3d…",
"paid_on": "2026-05-15",
"linked": false
},
"meta": {
"request_id": "req_…",
"api_version": "2026-05-12"
}
}
POST /api/v1/companies/:companyId/shareholder-contributions
shareholder-contributions.create · scope bookkeeping:write
Register and book an aktieägartillskott (villkorat or ovillkorat), or the repayment of a villkorat one.
A tillskott is booked to balanserat resultat when promised (K2 15.5): D bank (or 1685 while only promised) / K 2093 Erhållna aktieägartillskott. A repayment of a villkorat tillskott (K2 15.6) books D 2093 / K bank and warns without a stämma decision or above fritt eget kapital. Name the shareholder by party_id or by name. Dry-runnable.
Use when: A shareholder put money into the company without shares or a loan, or a villkorat tillskott is repaid.
Don't use for: A loan from the owner (a liability on 2393/2893) or a nyemission (POST /capital-changes).
Pitfalls
- CONTRIBUTION_NOT_CONDITIONAL: only a villkorat tillskott is repaid.
- CONTRIBUTION_REPAYMENT_EXCEEDS: more than what is left of the tillskott.
Risk: high · Idempotent: yes · Reversible: no · Dry-run supported: yes · Stage for approval: yes (?stage=true)
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
dry_run | string | no | true (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits. |
stage | string | no | true stages the write for approval instead of committing it: 202 with the pending operation to approve via POST /pending-operations/{id}/approve. Absent or false commits; other values are 400. A reason in the body (why you propose it, at most 500 characters) is shown to the approver as agent_reason and kept with the decision. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
kind | "contribution" | "repayment" | null | no | contribution (default) or repayment. |
party_id | string | null | no | The shareholder (from gnubok_get_share_register). |
holder_name | string | null | no | Or the shareholder's name, when new. |
holder_kind | "person" | "company" | null | no | |
holder_org_number | string | null | no | A company shareholder's org number. Never a personnummer. |
promised_on | string | yes | Contribution: the day it was promised (utfästelse). Repayment: the payment day. |
amount | number | yes | |
conditional | boolean | null | no | Villkorat: may be repaid out of distributable equity. |
repays_contribution_id | string | null | no | Repayment: the villkorat tillskott repaid. |
decided_on | string | null | no | |
decided_by | "arsstamma" | "extra_stamma" | "styrelse" | null | no | |
decision_id | string | null | no | |
document_id | string | null | no | The tillskott agreement in the archive. |
counter_account | string | null | no | Bank account 19xx (default: the company's primary bank account), or 1685 while only promised. |
note | string | null | no |
Response fields
| Name | Type |
|---|---|
shareholder_contribution_id | string |
kind | "contribution" | "repayment" |
party_id | string |
amount | number |
journal_entry_id | string |
Example request
{
"party_id": "9c1e…",
"promised_on": "2026-03-01",
"amount": 50000,
"conditional": true
}
Example response
{
"data": {
"shareholder_contribution_id": "2f4a…",
"kind": "contribution",
"party_id": "9c1e…",
"amount": 50000,
"journal_entry_id": "7a2b…"
},
"meta": {
"request_id": "req_…",
"api_version": "2026-05-12"
}
}