Menu

Company registers

Bolaget: the aktiebok (share register) as of any date with its dated history, the share classes and their förbehåll, the board, VD, firmatecknare and revisor over time, the firmateckning, and the verkliga huvudmän derived from the aktiebok. Entries are permanent: a rattelse entry voids one. A personnummer is never sent or answered. The meetings (stämmor, styrelsemöten, per capsulam) with their decisions and minutes; an adopted election changes the roles when a person signs the minutes in Accounted.

Endpoints


GET /api/v1/companies/:companyId/beneficial-owners

beneficial-owners.get · scope companies:read

Read the verkliga huvudmän: the proposal from the aktiebok, the confirmed set and the record of assessments.

The proposal names every natural person with more than 25 % of the votes (LRVH 1:3) and lists companies above 25 % for investigation. Close family holdings (1:5) and control by agreement are for the company to confirm. differs is true when a new assessment is due.

Use when: A bank asks for the company's beneficial owners, or ownership has changed.

Don't use for: Filing with Bolagsverket: that is done in Bolagsverket's e-service (filing_url) by an authorised representative.

Pitfalls

  • The proposal is not the answer: a person confirms it with gnubok_confirm_beneficial_owners.

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

Query parameters

NameTypeRequiredDescription
as_ofstringnoThe day the answer is for (YYYY-MM-DD). Default today.

Response fields

NameTypeDescription
proposalobject
confirmedobject[]
assessmentsobject[]
differsbooleanThe proposal names other persons than those confirmed: a new assessment is due.
filing_urlstring

Example response

{
  "data": {
    "proposal": {
      "owners": [
        {
          "name": "Anna Ek",
          "votes_pct": 60
        }
      ],
      "conclusion": "owners_identified"
    },
    "differs": true
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

GET /api/v1/companies/:companyId/company-roles

company-roles.list · scope companies:read

List the company's roles over time (board, VD, firmatecknare, revisor, verkliga huvudmän) and the firmateckning.

Every role with valid_from and valid_to, and whether it holds on as_of; the firmateckning text in force. The first read for a company without roles seeds them from the registry data Accounted already holds (no registry call).

Use when: You need who is on the board, who is VD, who signs for the company or who the beneficial owners are.

Don't use for: Shareholdings (GET /share-register).

Pitfalls

  • A role with source registry_tic came from the registry snapshot; check it against Bolagsverket before relying on it for a filing.

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

Query parameters

NameTypeRequiredDescription
as_ofstringnoThe day the answer is for (YYYY-MM-DD). Default today.

Response fields

NameTypeDescription
as_ofstring
signatory_rulestring | nullThe firmateckning in force on as_of.
rolesobject[]
signatory_rulesobject[]

Example response

{
  "data": {
    "as_of": "2026-10-29",
    "signatory_rule": "Firman tecknas av styrelsen",
    "roles": [
      {
        "company_role_id": "1f3c…",
        "name": "Anna Ek",
        "role": "styrelseledamot",
        "active": true
      }
    ]
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

GET /api/v1/companies/:companyId/corporate-meetings

corporate-meetings.list · scope companies:read

List the company's bolagsstämmor, styrelsemöten and per capsulam decisions, newest first.

Each meeting with its kind, date, place, status (draft, held, signed) and board minutes number (ABL 8:26). Filter by kind or fiscal year.

Use when: You need the company's meetings, the årsstämma for a year, or the latest board minutes.

Don't use for: The decisions and minutes of one meeting (GET /corporate-meetings/{id}).

Pitfalls

  • A draft is a plan; only held and signed meetings took place.

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

Query parameters

NameTypeRequiredDescription
kind"arsstamma" | "extra_stamma" | "styrelsemote" | "per_capsulam"noarsstamma, extra_stamma, styrelsemote or per_capsulam.
fiscal_period_idstringnoAn årsstämma's fiscal year.

Response fields

NameTypeDescription
meetings[].corporate_meeting_idstring
meetings[].kind"arsstamma" | "extra_stamma" | "styrelsemote" | "per_capsulam"
meetings[].kind_labelstring
meetings[].organ"bolagsstamma" | "styrelse"Whose decisions: bolagsstamma (shareholders) or styrelse (board).
meetings[].titlestring
meetings[].sequence_numbernumber | nullBoard minutes number (ABL 8:26), given when the meeting is held.
meetings[].meeting_datestring
meetings[].placestring | null
meetings[].is_digitalboolean
meetings[].status"draft" | "held" | "signed"draft, held (minutes open) or signed (frozen).
meetings[].fiscal_period_idstring | null
meetings[].signing_pendingboolean
meetings[].signed_atstring | null

Example response

{
  "data": {
    "meetings": [
      {
        "corporate_meeting_id": "4b1e…",
        "kind": "arsstamma",
        "title": "Årsstämma 2027-05-10",
        "status": "signed"
      }
    ]
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

GET /api/v1/companies/:companyId/corporate-meetings/:id

corporate-meetings.get · scope companies:read

Read one meeting: its minutes paragraph by paragraph, röstlängd, attendance, signers, effects on the roles and warnings.

Each decision with its terms (payload) and the sentence the minutes print; the röstlängd from the aktiebok on the meeting day (ABL 7:48); who signs (protokollförare, ordförande, justerare, or all shareholders per capsulam); the role changes an adopted election makes when the minutes are signed; and what a person should check (warnings).

Use when: You need what a stämma or the board decided, the dividend per share and betalningsdag, or what is missing before signing.

Don't use for: Signing the minutes: a person signs with BankID or uploads the signed copy in Accounted.

Pitfalls

  • Names only: no personnummer, no email addresses.
  • register_effects.planned is a preview until the minutes are signed.

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

Response fields

NameTypeDescription
corporate_meeting_idstring
kind"arsstamma" | "extra_stamma" | "styrelsemote" | "per_capsulam"
kind_labelstring
organ"bolagsstamma" | "styrelse"Whose decisions: bolagsstamma (shareholders) or styrelse (board).
titlestring
sequence_numbernumber | nullBoard minutes number (ABL 8:26), given when the meeting is held.
meeting_datestring
placestring | null
is_digitalboolean
status"draft" | "held" | "signed"draft, held (minutes open) or signed (frozen).
fiscal_period_idstring | null
signing_pendingboolean
signed_atstring | null
meeting_timestring | null
chairobject | null
secretaryobject | null
adjustersobject[]Justerare.
kallelse_datestring | null
kallelse_methodstring | null
kallelse_windowobject | nullWhen the kallelse is sent (ABL 7:18-20).
fiscal_periodobject | null
voting_listobject | nullRöstlängd: the aktiebok on the meeting day (ABL 7:48), names only.
presentobject | null
attendeesobject[]
notesstring | null
held_atstring | null
signature_namesstring | null
minutes_document_idstring | null
signed_document_idstring | null
signing_request_idstring | null
decisionsobject[]
justering"named" | "not_needed_holds_all_shares" | "not_needed_single_member_board" | "covered_by_board_signatures" | "not_applicable" | "missing"
signersobject[]
register_effectsobject
warningsobject[]
signingobject | null

Example response

{
  "data": {
    "corporate_meeting_id": "4b1e…",
    "kind": "arsstamma",
    "status": "held",
    "decisions": [
      {
        "item_number": 8,
        "kind": "faststallande_rr_br",
        "text_rendered": "Stämman fastställde resultaträkningen och balansräkningen för räkenskapsåret 2026-01-01 till 2026-12-31."
      }
    ]
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

GET /api/v1/companies/:companyId/share-register

share-register.get · scope companies:read

Read the aktiebok as of a date: holders with shares, votes and percent, share numbers, classes and notes.

The share register (ABL 5 kap.) replayed to as_of: every holder with masked identity, shares and votes, share of capital and votes, share-number ranges, and whether they are on the board or VD (ABL 8:45); the classes with their förbehåll; open notes (aktiebrev, pant, nyttjanderätt); and a check against company_settings.antal_aktier.

Use when: You need who owns the company, how much, or the number range of someone's shares.

Don't use for: The dated history of entries (GET /share-register/events) or the board (GET /company-roles).

Pitfalls

  • identity is masked; the full personnummer is never answered.
  • reconciliation.status mismatch means the register and company_settings.antal_aktier disagree; ask the person which is right.

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

Query parameters

NameTypeRequiredDescription
as_ofstringnoThe day the answer is for (YYYY-MM-DD). Default today.

Response fields

NameTypeDescription
as_ofstring
is_avstamningsbolagbooleanThe central securities depository keeps the aktiebok; this register takes no entries.
total_sharesnumber
total_votesnumber
next_free_share_numbernumberWhere the next issue starts.
classesobject[]
holdersobject[]
notesobject[]
reconciliationobject
incompleteobject
events_countnumber

Example response

{
  "data": {
    "as_of": "2026-10-29",
    "total_shares": 1000,
    "holders": [
      {
        "party_id": "9c1e…",
        "name": "Anna Ek",
        "shares": 1000,
        "capital_pct": 100,
        "votes_pct": 100
      }
    ]
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

GET /api/v1/companies/:companyId/share-register/events

share-register.events.list · scope companies:read

List every aktiebok entry in entry order, each with a Swedish sentence and whether a rättelse voided it.

The dated history of the share register (ABL 5:9): bildande, emissions, transfers with reason and price, cancellations, conversions, splits, aktiebrev, pledges, usufruct, notes and corrections. Entries are never changed; a rattelse entry voids one.

Use when: You need when and how ownership changed, or the entry to correct.

Don't use for: Current holdings (GET /share-register).

Pitfalls

  • An entry with voided true does not count; its correction is the later rattelse entry.

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

Response fields

NameTypeDescription
events[].share_register_event_idstring
events[].event_numbernumber
events[].event_datestring
events[].entered_atstring
events[].kind"bildande" | "nyemission" | "fondemission" | "overlatelse" | "indragning" | "omvandling" | "split" | "sammanlaggning" | "aktiebrev" | "pant" | "nyttjanderatt" | "anteckning" | "rattelse"
events[].kind_labelstring
events[].textstringThe entry as a Swedish sentence.
events[].voidedbooleanA later rattelse entry voided this one.
events[].corrects_event_idstring | null
events[].share_class_idstring | null
events[].from_party_idstring | null
events[].to_party_idstring | null
events[].counterparty_party_idstring | null
events[].range_startnumber | null
events[].range_endnumber | null
events[].transfer_reasonstring | null
events[].price_totalnumber | null
events[].rationumber | null
events[].aktiebrev_numberstring | null
events[].aktiebrev_action"issued" | "returned" | null
events[].note_status"open" | "closed" | null
events[].registered_onstring | null
events[].decision_idstring | null
events[].document_idstring | null
events[].journal_entry_idstring | null
events[].notestring | null

Example response

{
  "data": {
    "events": [
      {
        "share_register_event_id": "7a2b…",
        "event_number": 1,
        "event_date": "2020-01-10",
        "kind": "bildande",
        "text": "Bildande: aktie 1-1 000 (1 000 st, serie A) till Anna Ek",
        "voided": false
      }
    ]
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/beneficial-owners/assessments

beneficial-owners.confirm · scope companies:write

Record an assessment of the verkliga huvudmän (LRVH 2:1): who they are and why, or that there is none.

Keeps the dated record (basis, conclusion, family holdings checked, control agreements), brings the verklig_huvudman roles in line, and when the set changed adds a deadline to file the change with Bolagsverket without delay (LRVH 2:3). Dry-runnable.

Use when: After gnubok_get_beneficial_owners, once the person has confirmed the owners.

Don't use for: Filing with Bolagsverket: an authorised representative files in Bolagsverket's e-service.

Pitfalls

  • A verklig huvudman is always a natural person: a company party is refused.
  • owners must be empty for no_beneficial_owner and not empty for owners_identified.

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
assessed_onstringyesThe day of the investigation.
conclusion"owners_identified" | "no_beneficial_owner"yes
ownersobject[]yes
basisstring | nullnoWhat the assessment rests on; default "Aktieboken per <date>".
family_aggregation_checkedbooleanyesClose family holdings were counted together (LRVH 1:5).
family_notestring | nullno
control_agreementsbooleanyesControl by agreement or board appointment rights exists (LRVH 1:3-4).
control_notestring | nullno

Response fields

NameType
beneficial_owner_assessment_idstring
changedboolean
ended_role_idsstring[]
added_role_idsstring[]
deadline_source_keystring | null
filing_urlstring

Example request

{
  "assessed_on": "2026-10-29",
  "conclusion": "owners_identified",
  "owners": [
    {
      "party_id": "9c1e…"
    }
  ],
  "family_aggregation_checked": true,
  "control_agreements": false
}

Example response

{
  "data": {
    "beneficial_owner_assessment_id": "3e7f…",
    "changed": true,
    "ended_role_ids": [],
    "added_role_ids": [
      "8d2a…"
    ],
    "deadline_source_key": "bolaget:verklig-huvudman:3e7f…",
    "filing_url": "https://bolagsverket.se/…"
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/company-roles

company-roles.create · scope companies:write

Add a role from a date: board member, chair, suppleant, VD, vice VD, firmatecknare, revisor or contact person.

A role is end-dated, never deleted (POST /company-roles/{id}/end). The same person can hold several roles. A board change takes effect when Bolagsverket has the notice (ABL 8:13): registered_at records when. Dry-runnable.

Use when: The stämma elected a board member, the board appointed a VD, or a firmatecknare was added.

Don't use for: Verkliga huvudmän (POST /beneficial-owners/assessments records them with the LRVH 2:1 record).

Pitfalls

  • COMPANY_ROLE_DUPLICATE: the person already holds that role.
  • Filing the change with Bolagsverket is done at verksamt.se.

Risk: low · 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
party_idstring | nullnoThe person, when already in the register.
namestring | nullnoOr their name.
kind"person" | "company" | nullnoperson (default) or company (a revisionsbolag).
org_numberstring | nullnoA company's org number. Never a personnummer.
role"styrelseledamot" | "styrelseordforande" | "styrelsesuppleant" | "vd" | "vice_vd" | "sarskild_firmatecknare" | "revisor" | "huvudansvarig_revisor" | "revisorssuppleant" | "kontaktperson"yes
valid_fromstringyesFirst day in the role.
registered_atstring | nullnoWhen Bolagsverket registered it.
decision_idstring | nullno

Response fields

NameType
company_role_idstring
party_idstring
rolestring
valid_fromstring | null

Example request

{
  "name": "Bo Ek",
  "role": "styrelseledamot",
  "valid_from": "2026-06-15"
}

Example response

{
  "data": {
    "company_role_id": "1f3c…",
    "party_id": "9c1e…",
    "role": "styrelseledamot",
    "valid_from": "2026-06-15"
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/company-roles/:id/end

company-roles.end · scope companies:write

End a role on a date (the last day in it). The row is kept.

An ended role cannot be ended again; the history stays for the records. Dry-runnable.

Use when: A board member left, a VD resigned, a revisor was replaced.

Don't use for: Removing a wrongly entered role: end it on its start date and add the right one.

Pitfalls

  • COMPANY_ROLE_ALREADY_ENDED.

Risk: low · 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
valid_tostringyesLast day in the role.
end_reasonstring | nullnoWhy the role ended, kept on the role (e.g. avgick på egen begäran).

Response fields

NameType
company_role_idstring
valid_tostring

Example request

{
  "valid_to": "2026-06-14"
}

Example response

{
  "data": {
    "company_role_id": "1f3c…",
    "valid_to": "2026-06-14"
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/corporate-meetings

corporate-meetings.create · scope companies:write

Plan a meeting: an årsstämma (prefilled from the årsredovisning and the roles), an extra stämma, a styrelsemöte or a per capsulam decision.

Creates a draft with its agenda. An årsstämma gets fastställande of the resultat- and balansräkning, the disposition and proposed dividend from the årsredovisning, ansvarsfrihet for the board and VD in office during the year, re-election of the board and revisor, and fees (ABL 7:11). A stämma gets the röstlängd from the aktiebok on the meeting day. Deadlines follow (kallelse, minutes within two weeks). Dry-runnable.

Use when: The company is to hold a stämma or a board meeting, or the owners decide per capsulam.

Don't use for: Recording a decision on an existing meeting (POST /corporate-meetings/{id}/decisions).

Pitfalls

  • CORPORATE_MEETING_FISCAL_PERIOD_REQUIRED: an årsstämma needs fiscal_period_id.
  • BOLAGET_PERSONNUMMER_IN_APP_ONLY: a personnummer was sent; name the person.
  • A per capsulam stämma decision has no ABL rule; every shareholder signs it.

Risk: low · 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"arsstamma" | "extra_stamma" | "styrelsemote" | "per_capsulam"yesarsstamma, extra_stamma, styrelsemote or per_capsulam.
organ"bolagsstamma" | "styrelse" | nullnoper_capsulam only: bolagsstamma (all shareholders sign) or styrelse (all board members sign).
meeting_datestringyesThe meeting day (YYYY-MM-DD); may be in the future for a planned meeting.
is_digitalboolean | nullno
use_templateboolean | nullnoStart from the agenda (default true). An årsstämma is prefilled from the årsredovisning and the roles.
meeting_timestring | nullnoHH:MM.
placestring | nullno
chair_party_idstring | nullnoOrdförande, when in the register (party_id from gnubok_list_company_roles or the share register).
chair_namestring | nullnoOr the chair's name.
secretary_party_idstring | nullnoProtokollförare.
secretary_namestring | nullno
adjuster_party_idsstring[] | nullnoJusterare (replaces the list).
adjuster_namesstring[] | nullno
kallelse_datestring | nullnoThe day the kallelse was sent.
kallelse_methodstring | nullnoHow, e.g. "e-post till samtliga aktieägare".
fiscal_period_idstring | nullnoÅrsstämma: the fiscal year whose årsredovisning it adopts.
notesstring | nullno

Response fields

NameType
corporate_meeting_idstring
kind"arsstamma" | "extra_stamma" | "styrelsemote" | "per_capsulam"
organ"bolagsstamma" | "styrelse"
meeting_datestring
status"draft"
decisions_countnumber

Example request

{
  "kind": "arsstamma",
  "meeting_date": "2027-05-10",
  "fiscal_period_id": "7c2a…",
  "place": "Bolagets kontor"
}

Example response

{
  "data": {
    "corporate_meeting_id": "4b1e…",
    "kind": "arsstamma",
    "organ": "bolagsstamma",
    "meeting_date": "2027-05-10",
    "status": "draft",
    "decisions_count": 15
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/corporate-meetings/:id/decisions

corporate-meetings.decisions.record · scope companies:write

Add or change a decision (paragraph) in a meeting's unsigned minutes, with its terms per kind.

Kinds: faststallande_rr_br, resultatdisposition, utdelning, ansvarsfrihet, val_styrelse, val_revisor, arvoden, andrad_bolagsordning, nyemission, fondemission, minskning, optioner, aterbetalning_villkorat_tillskott, ovrigt. The payload is validated per kind. An adopted election changes the roles when the minutes are signed; capital decisions are booked separately. Dry-runnable.

Use when: The stämma or the board decided something to record in the minutes.

Don't use for: Booking a dividend or an emission (a voucher), or registering shares (POST /share-register/events).

Pitfalls

  • CORPORATE_DECISION_PAYLOAD_INVALID: the terms do not fit the kind; message names the fields.
  • CORPORATE_MEETING_LOCKED: signed minutes never change.
  • utdelning needs a payment_date (betalningsdag, ABL 18:3) before the minutes are signed; a warning says so.

Risk: low · 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
corporate_decision_idstring | nullnoChange this decision; omit to add one.
item_numbernumber | nullnoThe paragraph (§); a taken number moves the later ones down. Default: before the closing item.
kind"faststallande_rr_br" | "resultatdisposition" | "utdelning" | "ansvarsfrihet" | "val_styrelse" | "val_revisor" | "arvoden" | "andrad_bolagsordning" | "nyemission" | "fondemission" | "minskning" | "optioner" | "aterbetalning_villkorat_tillskott" | "ovrigt" | nullnoRequired for a new decision.
titlestring | nullno
textstring | nullnoThe decision as the minutes word it; null composes it from the payload.
payloadobject | nullnoTerms per kind, e.g. utdelning {amount_per_share, share_count, total_amount, payment_date}; val_styrelse {members:[{party_id|name, role}], term}; nyemission {share_count, price_per_share}. Names and party ids only.
outcome"bifallen" | "avslagen" | "bordlagd" | nullnobifallen (default), avslagen or bordlagd.
votes_fornumber | nullnoVotes (röster) for, when it went to a vote.
votes_againstnumber | nullno
votes_abstainednumber | nullno
reservationsstring | nullnoReservation or dissent to note (ABL 8:24).

Response fields

NameType
corporate_decision_idstring
corporate_meeting_idstring
item_numbernumber
kind"faststallande_rr_br" | "resultatdisposition" | "utdelning" | "ansvarsfrihet" | "val_styrelse" | "val_revisor" | "arvoden" | "andrad_bolagsordning" | "nyemission" | "fondemission" | "minskning" | "optioner" | "aterbetalning_villkorat_tillskott" | "ovrigt"

Example request

{
  "kind": "utdelning",
  "payload": {
    "amount_per_share": 50,
    "share_count": 1000,
    "total_amount": 50000,
    "payment_date": "2027-05-31"
  }
}

Example response

{
  "data": {
    "corporate_decision_id": "9f3d…",
    "corporate_meeting_id": "4b1e…",
    "item_number": 10,
    "kind": "utdelning"
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/corporate-meetings/:id/hold

corporate-meetings.hold · scope companies:write

Mark a meeting as held: a board meeting takes its minutes number, an årsstämma records its date on the årsredovisning.

Status draft to held, once the meeting day has come. Board minutes are numbered in sequence (ABL 8:26). An årsstämma that adopted the resultat- and balansräkning writes agm_date and the disposition outcome to the årsredovisning (the fastställelseintyg reads them). Deadlines follow: minutes available within two weeks (7:49), a Bolagsverket notice after a board change (8:44). The minutes stay open until signed in Accounted; elections change the roles then. Dry-runnable.

Use when: The meeting took place and its decisions are recorded.

Don't use for: Signing the minutes (a person, in Accounted).

Pitfalls

  • CORPORATE_MEETING_IN_FUTURE: the meeting day has not come.
  • CORPORATE_MEETING_ALREADY_HELD.
  • A held meeting is never deleted.

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.

Response fields

NameType
corporate_meeting_idstring
status"held"
sequence_numbernumber | null
agm_recordedboolean

Example response

{
  "data": {
    "corporate_meeting_id": "4b1e…",
    "status": "held",
    "sequence_number": null,
    "agm_recorded": true
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/share-classes

share-classes.create · scope companies:write

Add a share class with its votes per share and the förbehåll of the bolagsordning.

A class (aktieslag, ABL 4:2) such as A or B. One class may carry at most ten times the votes of another (4:5): a larger ratio answers a warning. Dry-runnable.

Use when: The bolagsordning has more than one class, or förbehåll to note.

Don't use for: Issuing shares (POST /share-register/events).

Pitfalls

  • SHARE_CLASS_DUPLICATE: the code exists.

Risk: low · 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
codestringyesShort code, e.g. A, B, Stam, Pref.
namestring | nullno
votes_per_sharenumberyesVotes per share, e.g. 1 or 10 (or 0.1).
forbehall_samtyckebooleannoSamtyckesförbehåll (ABL 4:8).
forbehall_forkopbooleannoFörköpsförbehåll (ABL 4:18).
forbehall_hembudbooleannoHembudsförbehåll (ABL 4:27).
forbehall_omvandlingbooleannoOmvandlingsförbehåll (ABL 4:6).
forbehall_inlosenbooleannoInlösenförbehåll (ABL 20:31).
forbehall_textstring | nullnoThe clause as the bolagsordning words it.
bolagsordning_referencestring | nullnoWhere in the bolagsordning, e.g. § 9.

Response fields

NameType
share_class_idstring
codestring
namestring | null
votes_per_sharenumber
forbehall_samtyckeboolean
forbehall_forkopboolean
forbehall_hembudboolean
forbehall_omvandlingboolean
forbehall_inlosenboolean
forbehall_textstring | null
bolagsordning_referencestring | null

Example request

{
  "code": "B",
  "votes_per_share": 1
}

Example response

{
  "data": {
    "id": "5d1c…",
    "code": "B",
    "votes_per_share": 1
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/share-register/events

share-register.events.create · scope companies:write

Add a dated entry to the aktiebok: an issue, a transfer, a cancellation, a conversion, a split, an aktiebrev, a pledge or a note.

Entries are kept forever (ABL 5:3) and numbered in sequence; a mistake is voided with kind rattelse and entered again. The register refuses an entry its history cannot hold: no share held twice, a transfer only of shares the transferor holds on that date. A new holder is named by to_name; their personnummer and address are completed in Accounted. Dry-runnable: the preview shows holdings before and after.

Use when: Shares were issued, sold, given, inherited, cancelled, split, pledged, or an aktiebrev was issued or returned.

Don't use for: Booking the money of an emission or a dividend (a voucher), or changing votes per share (PATCH /share-classes/{id}).

Pitfalls

  • SHARE_REGISTER_NOT_HELD: the from-holder does not hold all of the shares on event_date.
  • SHARE_REGISTER_RANGE_TAKEN: an issue overlaps shares already held; omit the range and send share_count.
  • BOLAGET_PERSONNUMMER_IN_APP_ONLY: a personnummer was sent; name the person and complete them in the app.
  • A transfer of a class with samtycke, förköp or hembud answers a warning until forbehall_cleared is true.

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"bildande" | "nyemission" | "fondemission" | "overlatelse" | "indragning" | "omvandling" | "split" | "sammanlaggning" | "aktiebrev" | "pant" | "nyttjanderatt" | "anteckning" | "rattelse"yesbildande, nyemission, fondemission, overlatelse, indragning, omvandling, split, sammanlaggning, aktiebrev, pant, nyttjanderatt, anteckning or rattelse.
event_datestringyesThe day the change took effect (YYYY-MM-DD); never in the future.
share_class_codestring | nullnoThe class, e.g. A. Optional when the company has one class; the first issue creates class A.
to_share_class_codestring | nullnoomvandling: the class the shares become.
from_party_idstring | nullnooverlatelse, indragning, omvandling: the current holder (party_id from gnubok_get_share_register).
to_party_idstring | nullnoIssues and overlatelse: the receiving party, when already in the register.
to_namestring | nullnoOr the receiver's name, for a new holder.
to_kind"person" | "company" | nullnoperson (default) or company.
to_org_numberstring | nullnoA company receiver's org number. Never a personnummer.
range_startnumber | nullnoFirst share number.
range_endnumber | nullnoLast share number.
share_countnumber | nullnoInstead of a range: issues take the next free numbers, transfers the holder's lowest block that fits.
transfer_reason"kop" | "gava" | "arv" | "testamente" | "bodelning" | "byte" | "apport" | "annat" | nullnooverlatelse: kop, gava, arv, testamente, bodelning, byte, apport or annat.
price_totalnumber | nullnoPrice or subscription amount in SEK, if any.
rationumber | nullnosplit: each share becomes ratio; sammanlaggning: ratio shares become one.
aktiebrev_numberstring | nullnoaktiebrev: its number.
aktiebrev_action"issued" | "returned" | nullnoaktiebrev: issued, or returned (makulerat).
counterparty_party_idstring | nullnopant: the pledgee; nyttjanderatt: the holder of the right.
counterparty_namestring | nullnoOr their name, when new.
counterparty_kind"person" | "company" | nullno
counterparty_org_numberstring | nullno
note_status"open" | "closed" | nullnopant, nyttjanderatt: open or end the note.
corrects_event_idstring | nullnorattelse: the entry it voids. Enter the correct entry separately.
registered_onstring | nullnoEmissions: the day Bolagsverket registered the decision.
decision_idstring | nullno
document_idstring | nullnoThe underlying document in the archive (avtal, protokoll).
notestring | nullnoFree text; required for anteckning and rattelse (the reason).
forbehall_clearedboolean | nullnooverlatelse: the class's samtycke, förköp or hembud has been handled.

Response fields

NameType
share_register_event_idstring
event_numbernumber
kind"bildande" | "nyemission" | "fondemission" | "overlatelse" | "indragning" | "omvandling" | "split" | "sammanlaggning" | "aktiebrev" | "pant" | "nyttjanderatt" | "anteckning" | "rattelse"
event_datestring
range_startnumber | null
range_endnumber | null
share_class_idstring | null
from_party_idstring | null
to_party_idstring | null

Example request

{
  "kind": "overlatelse",
  "event_date": "2026-10-01",
  "from_party_id": "9c1e…",
  "to_name": "Bo Ek",
  "share_count": 100,
  "transfer_reason": "gava"
}

Example response

{
  "data": {
    "share_register_event_id": "7a2b…",
    "event_number": 4,
    "kind": "overlatelse",
    "event_date": "2026-10-01",
    "range_start": 1,
    "range_end": 100
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

POST /api/v1/companies/:companyId/signatory-rules

signatory-rules.set · scope companies:write

Set the firmateckning from a date; the rule in force ends the day before.

The registered text, e.g. "Firman tecknas av styrelsen. Firman tecknas av två ledamöter i förening." (ABL 8:35-37). Dry-runnable.

Use when: The board changed who signs for the company.

Don't use for: Adding a särskild firmatecknare as a person (POST /company-roles).

Pitfalls

  • BOLAGET_DATES_INVALID: a rule already starts on or after valid_from.

Risk: low · 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

NameTypeRequired
rule_textstringyes
valid_fromstringyes
registered_atstring | nullno
decision_idstring | nullno

Response fields

NameType
signatory_rule_idstring
rule_textstring
valid_fromstring
ended_rule_idsstring[]

Example request

{
  "rule_text": "Firman tecknas av styrelsen",
  "valid_from": "2026-06-15"
}

Example response

{
  "data": {
    "signatory_rule_id": "2b9d…",
    "rule_text": "Firman tecknas av styrelsen",
    "valid_from": "2026-06-15",
    "ended_rule_ids": []
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

PATCH /api/v1/companies/:companyId/corporate-meetings/:id

corporate-meetings.update · scope companies:write

Change a meeting whose minutes are not signed: date, place, chair, protokollförare, justerare, kallelse, attendance or röstlängd presence.

Fields left out keep their value; null clears one. Moving the date takes the röstlängd from the aktiebok again. Signed minutes never change (CORPORATE_MEETING_LOCKED). Dry-runnable.

Use when: The kallelse was sent, the chair or justerare were chosen, or attendance is known.

Don't use for: Decisions (POST /corporate-meetings/{id}/decisions).

Pitfalls

  • CORPORATE_MEETING_SIGNING_PENDING: the minutes are out for BankID signing.

Risk: low · 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
meeting_datestringnoMoving the date takes the röstlängd from the aktiebok again.
is_digitalbooleanno
meeting_timestring | nullnoHH:MM.
placestring | nullno
chair_party_idstring | nullnoOrdförande, when in the register (party_id from gnubok_list_company_roles or the share register).
chair_namestring | nullnoOr the chair's name.
secretary_party_idstring | nullnoProtokollförare.
secretary_namestring | nullno
adjuster_party_idsstring[] | nullnoJusterare (replaces the list).
adjuster_namesstring[] | nullno
kallelse_datestring | nullnoThe day the kallelse was sent.
kallelse_methodstring | nullnoHow, e.g. "e-post till samtliga aktieägare".
fiscal_period_idstring | nullnoÅrsstämma: the fiscal year whose årsredovisning it adopts.
notesstring | nullno
presenceobject[] | nullnoRöstlängd: who was present or represented.
attendeesobject[] | nullnoOthers present (board, VD, revisor, guests); replaces the list.
refresh_voting_listboolean | nullnoTake the röstlängd from the aktiebok again.

Response fields

NameType
corporate_meeting_idstring
statusstring

Example request

{
  "kallelse_date": "2027-04-08",
  "kallelse_method": "e-post"
}

Example response

{
  "data": {
    "corporate_meeting_id": "4b1e…",
    "status": "draft"
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}

PATCH /api/v1/companies/:companyId/share-classes/:id

share-classes.update · scope companies:write

Change a share class's name, votes per share or förbehåll; its code stays.

Votes per share decide the votes percent and so the verkliga huvudmän: change them only after the bolagsordning changed. Every change is kept in the audit log. Dry-runnable.

Use when: The bolagsordning was amended, or a förbehåll was missing.

Don't use for: Converting shares between classes (an omvandling entry).

Pitfalls

  • SHARE_CLASS_NOT_FOUND: wrong share_class_id.

Risk: medium · Idempotent: yes · Reversible: yes · 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
namestring | nullno
votes_per_sharenumberno
forbehall_samtyckebooleannoSamtyckesförbehåll (ABL 4:8).
forbehall_forkopbooleannoFörköpsförbehåll (ABL 4:18).
forbehall_hembudbooleannoHembudsförbehåll (ABL 4:27).
forbehall_omvandlingbooleannoOmvandlingsförbehåll (ABL 4:6).
forbehall_inlosenbooleannoInlösenförbehåll (ABL 20:31).
forbehall_textstring | nullnoThe clause as the bolagsordning words it.
bolagsordning_referencestring | nullnoWhere in the bolagsordning, e.g. § 9.

Response fields

NameType
share_class_idstring
codestring
namestring | null
votes_per_sharenumber
forbehall_samtyckeboolean
forbehall_forkopboolean
forbehall_hembudboolean
forbehall_omvandlingboolean
forbehall_inlosenboolean
forbehall_textstring | null
bolagsordning_referencestring | null

Example request

{
  "share_class_id": "5d1c…",
  "votes_per_share": 10
}

Example response

{
  "data": {
    "id": "5d1c…",
    "code": "A",
    "votes_per_share": 10
  },
  "meta": {
    "request_id": "req_…",
    "api_version": "2026-05-12"
  }
}