Menu

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

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

NameType
dividendsobject[]
contributionsobject[]
capital_changesobject[]

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

NameTypeDescription
income_yearnumber
deadlinestring
schema_versionstring
file_supportedbooleanAccounted makes the file for this inkomstår (Skatteverket schema 12.0 is for 2026).
dividendsobject[]
unbooked_dividendsnumber
recipientsobject[]
famansforetagboolean | nullThe confirmed answer: field 061 (true) or 062 (false). Null until answered in Accounted.
famansforetag_derivationobject
contactobject
last_generated_atstring | null
blockersobject[]
readyboolean

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

NameTypeRequiredDescription
dry_runstringnotrue (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits.
stagestringnotrue 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

NameTypeRequiredDescription
kind"nyemission" | "fondemission" | "minskning"yes
decided_onstringyes
decided_by"arsstamma" | "extra_stamma" | "styrelse"yes
decision_idstring | nullno
document_idstring | nullno
share_class_idstring | nullnoThe class; optional with one class.
share_countnumberyesNew shares (emission) or cancelled shares (minskning); 0 when only the kvotvärde changes.
share_capital_amountnumber | nullnoThe change of aktiekapital; kvotvärde x share_count when omitted.
price_per_sharenumber | nullnoNyemission: the subscription price per share.
subscription_startstring | nullno
subscription_endstring | nullno
source_account"2085" | "2086" | "2091" | "2097" | nullnoFondemission: the fund (ABL 12:1); 2091 when omitted.
purpose"forlusttackning" | "aterbetalning" | "fri_fond" | nullnoMinskning: forlusttackning, aterbetalning or fri_fond (ABL 20:1).
allotmentsobject[] | nullnoNyemission: who was allotted how many shares.
allotted_onstring | nullnoThe allotment day; the decision day when omitted.
notestring | nullno

Response fields

NameType
capital_change_idstring
kind"nyemission" | "fondemission" | "minskning"
share_capital_amountnumber
premium_amountnumber
share_register_event_idsstring[]

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

NameTypeRequiredDescription
dry_runstringnotrue (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits.
stagestringnotrue 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

NameTypeRequiredDescription
step"payment" | "registration"yes
datestringyesThe payment day or the registration day.
bank_accountstring | nullnoBank account (BAS 19xx). Default: the company's primary bank account.

Response fields

NameType
capital_change_idstring
step"payment" | "registration"
journal_entry_idstring
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

NameTypeRequiredDescription
dry_runstringnotrue (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits.
stagestringnotrue 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

NameTypeRequiredDescription
decided_onstringyesThe day the bolagsstämma decided the dividend (YYYY-MM-DD).
decided_by"arsstamma" | "extra_stamma"yesarsstamma or extra_stamma: only a stämma decides a dividend (ABL 18:1).
decision_idstring | nullnoThe stämma decision, when recorded in Accounted.
document_idstring | nullnoThe minutes in the archive.
amount_per_sharenumber | nullnoAmount per share in SEK (ABL 18:3). Give this or total_amount.
total_amountnumber | nullnoOr the total to split in proportion to the shares.
share_class_idsstring[] | nullnoThe classes paid on; all when omitted.
record_date_basis"decision_date" | "payment_date" | "other" | nullnoWhich day's aktiebok decides the recipients: decision_date (default), payment_date or other.
record_datestring | nullnoWith record_date_basis other: that day.
payment_datestring | nullnoThe betalningsdag the stämma set (ABL 18:3); the decision day when omitted.
prudence_confirmedboolean | nullnoThe board assessed the försiktighetsregel (ABL 17:3 second paragraph).
notestring | nullno

Response fields

NameType
dividend_idstring
status"decided" | "booked" | "paid" | "cancelled"
total_amountnumber
record_datestring
payment_datestring
distributionsobject[]

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

NameTypeRequiredDescription
dry_runstringnotrue (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits.
stagestringnotrue 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

NameTypeRequiredDescription
source_account"2091" | "2098" | nullno2098 or 2091; chosen from the balance on the decision day when omitted.
prudence_confirmedboolean | nullnoConfirms the försiktighetsregel assessment (ABL 17:3) now.

Response fields

NameType
dividend_idstring
status"decided" | "booked" | "paid" | "cancelled"
decision_entry_idstring
source_account"2091" | "2098"
total_amountnumber

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

NameTypeRequiredDescription
dry_runstringnotrue (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits.
stagestringnotrue 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

NameTypeRequiredDescription
paid_onstring | nullnoThe day the money left; the betalningsdag when omitted.
bank_accountstring | nullnoBank account (BAS 19xx). Default: the company's primary bank account.
journal_entry_idstring | nullnoA payout verifikat already posted (D 2898 / K bank) to link instead of booking.

Response fields

NameType
dividend_idstring
status"decided" | "booked" | "paid" | "cancelled"
payout_entry_idstring
paid_onstring
linkedboolean

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

NameTypeRequiredDescription
dry_runstringnotrue (any case) previews the write without committing it, like the X-Dry-Run: true header. Any other value commits.
stagestringnotrue 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

NameTypeRequiredDescription
kind"contribution" | "repayment" | nullnocontribution (default) or repayment.
party_idstring | nullnoThe shareholder (from gnubok_get_share_register).
holder_namestring | nullnoOr the shareholder's name, when new.
holder_kind"person" | "company" | nullno
holder_org_numberstring | nullnoA company shareholder's org number. Never a personnummer.
promised_onstringyesContribution: the day it was promised (utfästelse). Repayment: the payment day.
amountnumberyes
conditionalboolean | nullnoVillkorat: may be repaid out of distributable equity.
repays_contribution_idstring | nullnoRepayment: the villkorat tillskott repaid.
decided_onstring | nullno
decided_by"arsstamma" | "extra_stamma" | "styrelse" | nullno
decision_idstring | nullno
document_idstring | nullnoThe tillskott agreement in the archive.
counter_accountstring | nullnoBank account 19xx (default: the company's primary bank account), or 1685 while only promised.
notestring | nullno

Response fields

NameType
shareholder_contribution_idstring
kind"contribution" | "repayment"
party_idstring
amountnumber
journal_entry_idstring

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"
  }
}