Step-by-Step Integration
Questi contenuti non sono ancora disponibili nella tua lingua.
This guide walks you through the complete process of integrating the fiskaly SIGN SE API for Swedish fiscal compliance, using a combination of the fiskaly HUB and API requests. By the end, you will have a fully working System with Records being signed and registered with the Swedish TCS (Tax Compliance System).
Before diving into the setup, here is what you will configure:
Organization
- AccountHUB-generated
Top-level entity in fiskaly HUB. Cannot be nested inside another Account.
- GroupHUB-generated
Intermediate layer organizing Units into logical clusters (e.g. one per country).
- UnitAPI-generated
Merchant / Taxpayer operating within the Group.
API Key & Secret
- Group levelHUB-generated
Generated in HUB for the Organization
GROUP. Used to authenticate in the SIGN SE API to create Organization Units and their API Keys. - Unit levelAPI-generated
Generated via API (
createSubjectendpoint) for the Organization UNIT. Used to authenticate for all unit-level operational calls.
Taxpayer
Entity registered with the Swedish Tax Agency (Skatteverket) and subject to Swedish cash register regulations (SFS 2007:592).
- COMPANY
Legal entity (aktiebolag, handelsbolag, etc.)
- INDIVIDUAL
Natural person (enskild firma)
Location
- HEAD_OFFICE
Auto-created on Taxpayer creation, shares the same UUID. Coincides with the legal address.
- BRANCH
Each shop, store, or other operational business location where the cash register (kassaregister) is physically located.
System
- FISCAL_DEVICE
Abstraction of a cash register. Commissioning enrolls the system and generates the unique 16-character tillverkningsnummer.
Record
Each business operation carried out in the System. Requires two subsequent calls:
- INTENTION
Identifies the intention to record a transaction in the System.
- TRANSACTION
The fiscal receipt sent to TCS for signing. Returns a control code (avstämningskod) on success.
Prerequisites
Section titled “Prerequisites”You need a fiskaly Account and access to the fiskaly HUB. If you do not have an Account yet, sign up here.
You will also need a tool to make HTTP requests — for example cURL (command line), Postman, or your own application code.
API Keys generated in the TEST environment will create TEST resources, while those from the LIVE environment will create LIVE resources. For further details, refer to our article on TEST and LIVE environments.
The merchant must register their kontrollenhet and cash register with Skatteverket within 14 days of the system being put into use (SFS 2007:592 §7). The POS provider is responsible for communicating the following to the merchant:
- The 16-character tillverkningsnummer (kassabeteckning)
- The TCS Control Server ID:
ISTCSKS0000000011
The merchant completes registration via Skatteverket’s online portal using BankID. See the Skatteverket Registration Guide for step-by-step instructions.
Integration Workflow
Section titled “Integration Workflow”The diagram below illustrates the workflow and highlights the essential steps necessary to successfully complete your integration.
Steps marked in yellow must be completed directly on HUB, while the remaining steps must be handled via the API. Performing each action in the right context is an important step toward a successful integration.
Step-by-Step Setup
Section titled “Step-by-Step Setup”Register on HUB
Begin by registering on the fiskaly HUB.
Creating a fiskaly Account is the first step, after which you can proceed with setting up the first organizational structure for your business and generating your API Key.
📘Video tutorialTake a look at our video for a step-by-step explanation on how to set up your Account and first Organization.
Create Account & Group
Continue with creating your Account and first Group using the HUB. In the SIGN SE API, the GROUP is a required intermediate layer within your ACCOUNT, used to organize your UNIT organizations.
Create API Key
The next step is to generate an API Key for your organization via the HUB. This API Key and Secret pair is required to create your Organization(s) of type
UNIT(Step 5).⚠️Store your credentials safelyThe API Secret is only shown once. Make sure to copy and store it in a secure location before closing the dialog.
Starting from the next step, you will be utilizing our SIGN SE API.
Create Token (Management)
Begin using the SIGN SE API through the createToken endpoint. You will need to create a token to authenticate for the next steps.
curl -X POST https://test.api.fiskaly.com/api/v1/auth/token \ -H "Content-Type: application/json" \ -d '{ "api_key": "YOUR_API_KEY", "api_secret": "YOUR_API_SECRET" }'const response = await fetch( "https://test.api.fiskaly.com/api/v1/auth/token", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ api_key: "YOUR_API_KEY", api_secret: "YOUR_API_SECRET", }), } ); const { access_token } = await response.json();Example response (200 OK)
{"content": {"id": "tok_abc123","authentication": {"type": "JWT","bearer": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...","expires_at": "2026-03-02T12:00:00Z"},"organization": {"id": "YOUR_GROUP_ORG_ID"},"subject": {"id": "sub_abc123"}},"metadata": {"trace_identifier": "trace_abc123"}}Create Organization UNIT
Continue with creating an Organization of type
UNITthrough the createOrganization endpoint. You will need to create one OrganizationUNITfor each of your taxpayer representations.When creating an Organization of type
UNIT, ensure it is associated to the Organization of typeGROUPyou previously created via the HUB. To do this, use the token generated from the API keys created for your Organization of typeGROUP. This reflects the hierarchical structure where the Organization of typeUNITis nested under your Organization of typeGROUP.curl -X POST https://test.api.fiskaly.com/api/v1/organizations \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID" \ -H "X-Scope-Identifier: YOUR_GROUP_ORG_ID" \ -d '{ "type": "UNIT", "name": "My UNIT Organization", "parent_id": "YOUR_GROUP_ORG_ID" }'const response = await fetch( "https://test.api.fiskaly.com/api/v1/organizations", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_GROUP_ORG_ID", }, body: JSON.stringify({ type: "UNIT", name: "My UNIT Organization", parent_id: "YOUR_GROUP_ORG_ID", }), } ); const organization = await response.json();Example response (201 Created)
{"content": {"id": "org_unit_abc123","state": "ENABLED","type": "UNIT","name": "My UNIT Organization","organization": {"id": "YOUR_GROUP_ORG_ID"}},"metadata": {"trace_identifier": "trace_abc123"}}Create Subject API Key
Create a Subject of type
API_KEYthrough the createSubject endpoint. The connection between the Organization of typeUNITand the API Key is established via theX-Scope-Identifier(using theidof the newly created Organization).curl -X POST https://test.api.fiskaly.com/api/v1/subjects \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "type": "API_KEY" }'const response = await fetch( "https://test.api.fiskaly.com/api/v1/subjects", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ type: "API_KEY", }), } ); const subject = await response.json(); const { api_key, api_secret } = subject.content.credentials;Example response (201 Created)
{"content": {"id": "sub_abc123","state": "ENABLED","type": "API_KEY","credentials": {"api_key": "fsk_unit_abc123","api_secret": "secret_only_shown_once"}},"metadata": {"trace_identifier": "trace_abc123"}}Create Token (UNIT)
Next, create a token that will be used to create resources within the corresponding Organization of type
UNIT.curl -X POST https://test.api.fiskaly.com/api/v1/auth/token \ -H "Content-Type: application/json" \ -d '{ "api_key": "YOUR_UNIT_API_KEY", "api_secret": "YOUR_UNIT_API_SECRET" }'const response = await fetch( "https://test.api.fiskaly.com/api/v1/auth/token", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ api_key: "YOUR_UNIT_API_KEY", api_secret: "YOUR_UNIT_API_SECRET", }), } ); const { access_token } = await response.json();Example response (200 OK)
{"content": {"id": "tok_unit_abc123","authentication": {"type": "JWT","bearer": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...","expires_at": "2026-03-02T12:00:00Z"},"organization": {"id": "org_unit_abc123"},"subject": {"id": "sub_abc123"}},"metadata": {"trace_identifier": "trace_abc123"}}Create Taxpayer
Now you’re ready to create the operational parts required for fiscalization in Sweden. Use the createTaxpayer endpoint to create the representation of a taxpayer:
- Set the Taxpayer as type
COMPANY(legal entity) orINDIVIDUAL(natural person). In both cases, thenameandaddressmust be provided. - Within the Swedish
fiscalizationinformation, provide:type:"SE"— identifies the Swedish fiscalization schemetax_id_number: Swedish organisation number (organisationsnummer, 10 digits) or personal identity number (personnummer, 12 digits) registered with Skatteverket
Once created, the Taxpayer
stateis set toACQUIRED. Update it toCOMMISSIONEDusing the updateTaxpayer endpoint.💡No portal credentials requiredThe Swedish integration does not require tax portal credentials. The merchant registers directly with Skatteverket using BankID after system commissioning.
# Create Taxpayer curl -X POST https://test.api.fiskaly.com/api/v1/taxpayers \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "type": "COMPANY", "name": "Min Butik AB", "address": { "street": "Storgatan 1", "postal_code": "111 23", "city": "Stockholm", "country_code": "SE" }, "fiscalization": { "type": "SE", "tax_id_number": "5561234567" } }' # Commission Taxpayer curl -X PATCH https://test.api.fiskaly.com/api/v1/taxpayers/YOUR_TAXPAYER_ID \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "state": "COMMISSIONED" }'// Create Taxpayer const createResponse = await fetch( "https://test.api.fiskaly.com/api/v1/taxpayers", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ type: "COMPANY", name: "Min Butik AB", address: { street: "Storgatan 1", postal_code: "111 23", city: "Stockholm", country_code: "SE", }, fiscalization: { type: "SE", tax_id_number: "5561234567", }, }), } ); const taxpayer = await createResponse.json(); // Commission Taxpayer await fetch( `https://test.api.fiskaly.com/api/v1/taxpayers/${taxpayer.content.id}`, { method: "PATCH", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ state: "COMMISSIONED", }), } );- Set the Taxpayer as type
Create Location
For each operating business location, create a
Locationof typeBRANCHvia the createLocation endpoint. This address will be used for the cash register registration with Skatteverket.Once created, the Location
stateis set toACQUIRED. Update it toCOMMISSIONEDusing the updateLocation endpoint.# Create Location curl -X POST https://test.api.fiskaly.com/api/v1/locations \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "type": "BRANCH", "address": { "street": "Storgatan 1", "postal_code": "111 23", "city": "Stockholm", "country_code": "SE" } }' # Commission Location curl -X PATCH https://test.api.fiskaly.com/api/v1/locations/YOUR_LOCATION_ID \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "state": "COMMISSIONED" }'// Create Location const createResponse = await fetch( "https://test.api.fiskaly.com/api/v1/locations", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ type: "BRANCH", address: { street: "Storgatan 1", postal_code: "111 23", city: "Stockholm", country_code: "SE", }, }), } ); const location = await createResponse.json(); // Commission Location await fetch( `https://test.api.fiskaly.com/api/v1/locations/${location.content.id}`, { method: "PATCH", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ state: "COMMISSIONED", }), } );Create System
The createSystem endpoint allows you to create an abstraction of every device you use to issue receipts. Each cash register or POS needs to be provided as a new System of type
FISCAL_DEVICE.- A System will be connected to a specific, previously created
Locationof typeBRANCH. - Provide
producerdetails (MPN type, number, and product name/brand) andsoftwareinformation (name and version) as top-level fields.
Once created, the System
stateis set toACQUIRED. Update it toCOMMISSIONEDusing the updateSystem endpoint. Commissioning triggers enrollment, which generates the unique 16-character tillverkningsnummer and binds the POS to the signing service.⚠️14-day registration windowCommissioning starts the 14-day legal window (SFS 2007:592 §7) within which the merchant must register the cash register with Skatteverket. Make sure to retrieve and communicate the tillverkningsnummer to the merchant promptly.
# Create System curl -X POST https://test.api.fiskaly.com/api/v1/systems \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "type": "FISCAL_DEVICE", "location": "YOUR_LOCATION_ID", "producer": { "type": "MPN", "number": "POS-1000", "details": { "name": "My POS Terminal", "brand": "My POS Brand" } }, "software": { "name": "My POS Software", "version": "1.0.0" } }' # Commission System (triggers TCS enrollment) curl -X PATCH https://test.api.fiskaly.com/api/v1/systems/YOUR_SYSTEM_ID \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "state": "COMMISSIONED" }' # Retrieve compliance artifact (tillverkningsnummer) curl -X GET "https://test.api.fiskaly.com/api/v1/records/YOUR_RECORD_ID?compliance-artifact" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID"// Create System const createResponse = await fetch( "https://test.api.fiskaly.com/api/v1/systems", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ type: "FISCAL_DEVICE", location: "YOUR_LOCATION_ID", producer: { type: "MPN", number: "POS-1000", details: { name: "My POS Terminal", brand: "My POS Brand", }, }, software: { name: "My POS Software", version: "1.0.0", }, }), } ); const system = await createResponse.json(); // Commission System (triggers TCS enrollment) await fetch( `https://test.api.fiskaly.com/api/v1/systems/${system.content.id}`, { method: "PATCH", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ state: "COMMISSIONED", }), } ); // Retrieve compliance artifact from a record const artifactResponse = await fetch( `https://test.api.fiskaly.com/api/v1/records/${recordId}?compliance-artifact`, { headers: { "Authorization": `Bearer ${accessToken}`, "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, } ); const artifact = await artifactResponse.json(); // artifact contains the compliance data including tillverkningsnummer- A System will be connected to a specific, previously created
Startup Check (INTENTION::OPENING)
Before issuing any receipts, the POS must perform a mandatory startup check. This verifies system enrollment and signing service connectivity.
Send an
INTENTION::OPENINGrecord at every POS startup. The response includes the system status — the POS must only proceed to sales mode ifSTATUS_OKis returned.⚠️Mandatory before first saleA POS that begins issuing receipts without first performing the
INTENTION::OPENINGcheck is non-compliant with SKVFS 2020:9. This step must be performed at every startup, not just the first time.# Startup check — INTENTION::OPENING curl -X POST https://test.api.fiskaly.com/api/v1/records \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "type": "INTENTION::OPENING", "system_id": "YOUR_SYSTEM_ID" }'// Startup check — INTENTION::OPENING const openingResponse = await fetch( "https://test.api.fiskaly.com/api/v1/records", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ type: "INTENTION::OPENING", system_id: "YOUR_SYSTEM_ID", }), } ); const opening = await openingResponse.json(); // Verify TCS status before proceeding to sales // opening.content.compliance.status should be STATUS_OKAt the end of the business day, send an
INTENTION::CLOSINGrecord to mark the register as closed:# End of day — INTENTION::CLOSING curl -X POST https://test.api.fiskaly.com/api/v1/records \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "type": "INTENTION::CLOSING", "system_id": "YOUR_SYSTEM_ID" }'// End of day — INTENTION::CLOSING await fetch( "https://test.api.fiskaly.com/api/v1/records", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ type: "INTENTION::CLOSING", system_id: "YOUR_SYSTEM_ID", }), } );Create Record
Creating a Record in SIGN SE requires two subsequent calls:
- Part A) INTENTION — at the beginning of the sale process
- Part B) TRANSACTION — after the payment process
The TRANSACTION payload requires:
entries— each item with per-entry VAT information usingVAT_RATEtype (withcode,percentage,amount,exclusive,inclusive) orVAT_EXEMPTIONtype (with an exemptioncode)breakdown— a VAT breakdown array with one entry per VAT rate used in the transactiontotals— transaction-level VAT totals (amount,exclusive,inclusive)payments— at least one payment method
# Part A) Create Record — INTENTION curl -X POST https://test.api.fiskaly.com/api/v1/records \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID_1" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "type": "INTENTION::TRANSACTION", "system_id": "YOUR_SYSTEM_ID" }' # Part B) Create Record — TRANSACTION (RECEIPT) curl -X POST https://test.api.fiskaly.com/api/v1/records \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: YOUR_UNIQUE_UUID_2" \ -H "X-Scope-Identifier: YOUR_UNIT_ORG_ID" \ -d '{ "type": "TRANSACTION::RECEIPT", "intention_id": "YOUR_INTENTION_RECORD_ID", "document": { "number": "K-2026-0001" }, "entries": [ { "type": "SALE", "data": { "type": "ITEM", "text": "Product A", "unit": { "type": "PIECE", "quantity": "1.00" }, "value": { "amount": "100.00" }, "vat": { "type": "VAT_RATE", "code": "STANDARD", "percentage": "25.00", "amount": "25.00", "exclusive": "100.00", "inclusive": "125.00" } }, "details": { "concept": "GOODS" } } ], "breakdown": [ { "type": "VAT_RATE", "code": "STANDARD", "percentage": "25.00", "amount": "25.00", "exclusive": "100.00", "inclusive": "125.00" } ], "totals": { "vat": { "amount": "25.00", "exclusive": "100.00", "inclusive": "125.00" } }, "payments": [ { "type": "CASH", "amount": "125.00" } ], "details": { "creators": [{ "type": "CASHIER", "name": "Anna" }] } }'// Part A) Create Record — INTENTION const intentionResponse = await fetch( "https://test.api.fiskaly.com/api/v1/records", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ type: "INTENTION::TRANSACTION", system_id: "YOUR_SYSTEM_ID", }), } ); const intention = await intentionResponse.json(); // Part B) Create Record — TRANSACTION (RECEIPT) const transactionResponse = await fetch( "https://test.api.fiskaly.com/api/v1/records", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "X-Idempotency-Key": crypto.randomUUID(), "X-Scope-Identifier": "YOUR_UNIT_ORG_ID", }, body: JSON.stringify({ type: "TRANSACTION::RECEIPT", intention_id: intention.content.id, document: { number: "K-2026-0001", }, entries: [ { type: "SALE", data: { type: "ITEM", text: "Product A", unit: { type: "PIECE", quantity: "1.00" }, value: { amount: "100.00" }, vat: { type: "VAT_RATE", code: "STANDARD", percentage: "25.00", amount: "25.00", exclusive: "100.00", inclusive: "125.00", }, }, details: { concept: "GOODS" }, }, ], breakdown: [ { type: "VAT_RATE", code: "STANDARD", percentage: "25.00", amount: "25.00", exclusive: "100.00", inclusive: "125.00", }, ], totals: { vat: { amount: "25.00", exclusive: "100.00", inclusive: "125.00", }, }, payments: [ { type: "CASH", amount: "125.00" }, ], details: { creators: [{ type: "CASHIER", name: "Anna" }], }, }), } ); const transaction = await transactionResponse.json(); // transaction.content.compliance contains the control code (avstämningskod)Once the record is properly created, the data is sent to the TCS which returns a control code (avstämningskod) that must be printed on the customer receipt.
💡Supported record typesSIGN SE P1 supports five record types: receipt (kassakvitto), correction/cancellation (returkvitto), duplicate (kvittokopia), pro_forma_invoice (pro forma-kvitto), and training (övningskvitto). See the Process Overview for details on each type.
💡Automate the setupThis entire sequence of requests can be integrated into a “one-click” provisioning solution that requires no manual user interaction. The implementation details are up to you.
Next Steps
Section titled “Next Steps”Process Overview
Understand the Swedish fiscal document types, TCS counters, VAT structure, and offline handling.
Receipt Compliance
Mandatory receipt fields, per-document-type printing requirements, and formatting rules.
Skatteverket Registration
Step-by-step guide for merchant registration of kontrollenhet and cash register.
Glossary
Key terms and definitions for the Swedish fiscal compliance system.
Was this page helpful?