Two ways in for a program.
Reading a register is one address that returns CSV. Everything else, changes included, goes through the address an AI app uses.
Reading a register
One address returns a register as CSV:
curl "https://api.aktiebok.io/functions/v1/mcp/export?company=co_…&kind=cap_table" \ -H "Authorization: Bearer aktiebok_…"
company- The company's id. It is in the address bar when you open the company, and starts with
co_. kindledger(the share register),cap_table,history,holdersornotes.as_of- A date,
YYYY-MM-DD, for the holdings on that date. Left out, you get today's. include_personnummer- For full personnummer. For admins, with a token that is not limited to one company; otherwise a personnummer shows as the birth year.
The answer starts with a few lines about the file, then the rows:
# company,Blåsippan Robotics AB # org_nr,559832-8655 # generated_at,2026-10-04T20:22:31Z # register_version,2 # as_of,current holder,class,shares,votes,pct_capital,pct_votes,instrument_shares,fully_diluted,pct_fully_diluted,program Astrid Berg,A,30000,30000,60,60,0,30000,60, Johan Lind,A,14000,14000,28,28,0,14000,28, Sara Ek,A,6000,6000,12,12,0,6000,12,
register_version goes up by one with every entry, so a program can tell whether anything has changed since it last looked.
Tokens
Create a token under Your AI, Tokens. Read only is enough for everything above. A token can be limited to one company. It carries your access, so treat it like a password; you can revoke it there at any time.
Changing a register, and everything else
Changes are made through the address an AI app connects to. It takes a JSON message naming a tool and its arguments, and a program can send one as well as an AI can:
curl https://api.aktiebok.io/functions/v1/mcp \
-H "Authorization: Bearer aktiebok_…" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"get_cap_table","arguments":{"company":"co_…"}}}'The address speaks the Model Context Protocol: JSON-RPC over HTTP, one message in and one answer out. Send "method":"tools/list" to get every tool with its arguments. A change is a draft, as on the web: create_draft returns it with every holder before and after, update_draft changes it, and confirm_draft writes it.
This side is built for AI apps, which read the tool list each time they connect. Tools and arguments here can change, so a program that uses it should read the tool list rather than assume it.
Every tool
Reading the tool list…
Limits
A token may make 120 calls a minute. A refused call answers with a sentence saying why.
How the register itself works is in the Documentation.
Start your register. Export any time.
For Swedish limited companies that keep their own share register. Sign in with your email, and the first entry is minutes away.
