Shareholder Register Report
The Shareholder Register Report API allows you to preview, review, and submit shareholder register reports (aksjonaerregisteroppgaven / RF-1086) to the Norwegian tax authorities (Skatteetaten). The submission process uses Maskinporten authentication and submits both the main form (1086H) and individual shareholder sub-forms (1086U).
Endpoints
Preview Report
GET /api/v2/shareholder-register-report/preview
Generates a preview of the shareholder register report with auto-populated data from the company’s equity transactions. Use this to review data and identify validation issues before submission.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | ID of the client account |
| reporting_year | integer | Yes | The fiscal year to report for |
Response
Returns a plain JSON object (not wrapped in data/meta). Share counts come from the equity transactions positions at the end of the previous and the reporting year; share capital and share premium come from the balances on accounts 2000 (Aksjekapital) and 2020 (Overkurs). Dividends are the year’s debits to accounts 8920 (Avsatt utbytte) and 8921 (Tilleggsutbytte), the declaration side of the resultatdisponering; credits to 2800 alone are not picked up. Every journal entry that is not cancelled counts, drafts included. The total is split by shares held at year end, with withholding tax worked out for foreign shareholders. is_foreign, shareholder_country, withholding_tax_rate and withholding_tax_amount are only filled in when the year has a dividend; otherwise they are false, null, 0 and 0. Amounts are in the client account’s accounting currency and truncated to whole units, so the per-shareholder dividend_amount values can add up to slightly less than total_dividend.
{
"company": {
"organization_number": "123456789",
"name": "Eksempel AS",
"address": "Storgata 1",
"postal_code": "0155",
"city": "Oslo"
},
"share_capital": {
"share_type": "01",
"previous_share_capital": 30000,
"current_share_capital": 30000,
"previous_class_capital": 30000,
"current_class_capital": 30000,
"previous_par_value": 30.0,
"current_par_value": 30.0,
"previous_num_shares": 1000,
"current_num_shares": 1000,
"previous_paid_capital": 30000,
"current_paid_capital": 30000,
"previous_premium": 0,
"current_premium": 0,
"total_dividend": 10000,
"validation_issues": []
},
"shareholders": [
{
"business_partner_id": 56,
"name": "Ola Nordmann",
"is_person": true,
"id_number": "01019012345",
"id_number_valid": true,
"previous_shares": 1000,
"current_shares": 1000,
"transactions": [],
"dividend_amount": 10000,
"is_foreign": false,
"shareholder_country": "NO",
"withholding_tax_rate": 0.0,
"withholding_tax_amount": 0,
"validation_issues": []
}
],
"summary": {
"total_shareholders": 1,
"shareholders_with_issues": 0,
"can_submit": true,
"validation_issues": []
}
}
id_number is the national identity number for a person and the organization number for a company. Each shareholder’s transactions lists the acquisitions and sales in the reporting year:
| Field | Type | Description |
|---|---|---|
| type | string | acquisition or sale |
| quantity | integer | Number of shares |
| acquisition_type | string | Acquisitions only: S (founding) or K (purchase) |
| sale_type | string | Sales only: S (sale) |
| date | date | Transaction date |
| cost | integer | Acquisitions only: quantity × price per share |
| value | integer | Sales only: quantity × price per share |
A validation issue has field, code and message; in summary.validation_issues shareholder issues also carry shareholder_id. can_submit is true only when there are no issues.
| Code | Description |
|---|---|
MISSING_ID_NUMBER |
The shareholder has no identity or organization number |
INVALID_ID_NUMBER |
The identity or organization number fails validation |
NEGATIVE_SHARES |
The shareholder’s share count at year end is negative |
SHARE_MISMATCH |
The shareholders’ shares don’t add up to the total number of shares (reported under share_capital) |
List Submissions
GET /api/v2/shareholder-register-report/submissions
Retrieves a paginated list of shareholder register report submissions, newest first.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer or comma-separated list | No | Client account(s) to list. Defaults to every client account the user can access |
| reporting_year | integer | No | Filter by reporting year |
| order_by | string | No | Sort as field:direction, e.g. reporting_year:desc. Default created_at:desc |
| page | integer | No | Page number (default: 1) |
| page_size | integer | No | Items per page (default: 100) |
Response
{
"data": [
{
"id": 1,
"created_at": "2024-03-15T10:00:00Z",
"updated_at": "2024-03-15T10:05:00Z",
"created_by_id": 7,
"client_account_id": 7,
"reporting_year": 2023,
"main_form_reference": "RF-1086H-2023-001",
"main_form_submitted_at": "2024-03-15T10:01:00Z",
"sub_forms_count": 3,
"sub_forms_submitted_at": "2024-03-15T10:03:00Z",
"confirmation_dialog_id": "dialog-123",
"confirmation_shipment_id": "shipment-456",
"confirmed_at": "2024-03-15T10:05:00Z",
"status": "CONFIRMED",
"error_message": null
}
],
"meta": {
"page": 1,
"pages": 1,
"per_page": 100,
"records": 1
}
}
Submit Report
POST /api/v2/shareholder-register-report/submissions
Submits a complete shareholder register report to Skatteetaten in one call:
- Creates a draft report
- Submits the main form (RF-1086H) with the share capital
- Submits a sub-form (RF-1086U) for each shareholder
- Confirms the submission
The share_capital object and the shareholders array take the shape returned by Preview Report: fetch the preview, fix any validation issues, and send its share_capital and shareholders back. Dividends are not read from the request; they are recalculated from the year’s debits to accounts 8920 (Avsatt utbytte) and 8921 (Tilleggsutbytte), split between shareholders by their shares at year end.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | The client account ID |
| reporting_year | integer | Yes | The fiscal year to report for |
| contact_business_partner_id | integer | Yes | Business partner in the same client account whose email is used as the contact for the submission. It must have an email address |
| share_capital | object | Yes | Share capital, as in the preview’s share_capital |
| shareholders | array | Yes | At least one shareholder, as in the preview’s shareholders |
The fields read from share_capital are share_type (default 01), previous_share_capital, current_share_capital, previous_class_capital, current_class_capital, previous_par_value, current_par_value, previous_num_shares, current_num_shares, previous_paid_capital, current_paid_capital, previous_premium and current_premium. Missing numbers are sent as 0.
The fields read from each shareholder are business_partner_id, is_person (default true), id_number, previous_shares, current_shares and transactions. Every shareholder needs a valid id_number.
Example Request
{
"client_account_id": 7,
"reporting_year": 2023,
"contact_business_partner_id": 56,
"share_capital": {
"share_type": "01",
"previous_share_capital": 30000,
"current_share_capital": 30000,
"previous_class_capital": 30000,
"current_class_capital": 30000,
"previous_par_value": 30.0,
"current_par_value": 30.0,
"previous_num_shares": 1000,
"current_num_shares": 1000,
"previous_paid_capital": 30000,
"current_paid_capital": 30000,
"previous_premium": 0,
"current_premium": 0
},
"shareholders": [
{
"business_partner_id": 56,
"is_person": true,
"id_number": "01019012345",
"previous_shares": 1000,
"current_shares": 1000,
"transactions": []
}
]
}
Response
Returns the submission with status 200 OK and status: "CONFIRMED", in the same shape as a list item.
Attributes
| Attribute | Type | Description |
|---|---|---|
| id | integer | Unique identifier (read-only) |
| created_at | datetime | Creation timestamp (read-only) |
| updated_at | datetime | Last update timestamp (read-only) |
| created_by_id | integer | ID of the user who created the submission (read-only) |
| client_account_id | integer | ID of the client account |
| reporting_year | integer | The fiscal year reported |
| main_form_reference | string | Reference number for the main form |
| main_form_submitted_at | datetime | When the main form was submitted (read-only) |
| sub_forms_count | integer | Number of shareholder sub-forms submitted (read-only) |
| sub_forms_submitted_at | datetime | When sub-forms were submitted (read-only) |
| confirmation_dialog_id | string | Dialogporten dialog ID for confirmation (read-only) |
| confirmation_shipment_id | string | Dialogporten shipment ID for confirmation (read-only) |
| confirmed_at | datetime | When the submission was confirmed (read-only) |
| status | string | DRAFT, MAIN_FORM_SUBMITTED, SUB_FORMS_SUBMITTED, CONFIRMED or REJECTED (read-only) |
| error_message | string | Error details if submission failed (read-only) |
Relationships
| Relationship | Type | Description |
|---|---|---|
| created_by | User | The user who created the submission |
Authentication Requirements
Submission requires Maskinporten system user authentication. The company must have an accepted system user registration in Altinn. If not configured, the API returns a 400 error with code shareholder_register_report.system_user_not_registered.
Error Responses
| Status Code | Error code | Description |
|---|---|---|
| 400 | shareholder_register_report.reporting_year_required |
Missing reporting_year (preview and submit) |
| 400 | shareholder_register_report.json_body_required |
Submit without a JSON body |
| 400 | shareholder_register_report.contact_business_partner_required |
Submit without contact_business_partner_id |
| 400 | shareholder_register_report.contact_business_partner_not_found |
Contact business partner not found in the client account |
| 400 | shareholder_register_report.contact_email_missing |
Contact business partner has no email address |
| 400 | shareholder_register_report.share_capital_required |
Submit without share_capital |
| 400 | shareholder_register_report.shareholders_required |
Submit without shareholders |
| 400 | shareholder_register_report.preview_failed |
The preview could not be built (the message says why) |
| 400 | shareholder_register_report.submission_failed |
A shareholder with a missing or invalid id_number, or Skatteetaten rejected the main form, a sub-form or the confirmation (the message says which) |
| 400 | shareholder_register_report.system_user_not_registered |
System user not registered |
| 403 | shareholder_register_report.client_account_access_denied |
Missing client_account_id, or no access to the client account |
Example Error Response
{
"error": {
"code": "shareholder_register_report.system_user_not_registered",
"message": "System user not registered for this client account.",
"request_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab"
}
}