Sales API
This documentation is under development. Content and integration details may change as we continue internal discussions. Feedback is welcome.
The Sales API is used by accounting partners to retrieve sales context (orders, order lines, VAT, categories, customer identity when available).
This API is designed to be used together with the existing Report / Settlement API:
- The Sales API answers what was sold
- The Report API answers what happened to the money
To enable one-to-one and periodic bookkeeping, accounting partners must be able to:
- Retrieve orders with full sales context
- Reconcile those orders with captures, refunds, and fees from the Report API
This requires a stable and explicit mapping between the two APIs.
Descriptionβ
The Sales API exposes order-centric entries, where each entry represents one financial transaction on an order (capture or refund) enriched with sales context.
Each entry:
- Includes a stable order identifier (
reference)- Same field name as
referencein the Report API
- Same field name as
- Includes a transaction identifier (
pspReference)- Same field name as
pspReferencein the Report API
- Same field name as
- Includes sales amounts (gross, net, VAT) in minor units when available
- Includes order lines, VAT, categories, and customer identity when available
- Does not expose payment state or settlement correctness
The Sales API does not attempt to replace or duplicate the Report API.
Historical data availabilityβ
The Sales API has limited historical data currently available.
- mPOS data from 2026-03-09 12:45 UTC
- Vippsnummer variable amount from 2026-03-16 09:28 UTC
- Vippsnummer shopping basket from 2026-04-22 11:04 UTC
Get ledgersβ
Partners use the Report API to discover which ledger IDs they have access to:
GET /settlement/v1/ledgers
Get sales report by feedβ
Provides a continuous stream of sales data.
GET /sales/report/v1/ledgers/{ledgerId}
Query parametersβ
-
cursor Example:
cursor=2ScAAAAAAAA=- If not provided, the response starts from the first sale on the given
ledgerId. - Each response includes a
cursorindicating where the stream stopped. - Partners must persist the cursor and include it in subsequent requests to continue from the last checkpoint.
- If not provided, the response starts from the first sale on the given
-
pageSize Example:
pageSize=100- Limits the number of rows returned per request (default: 100, max: 1000).
- Used to control payload size and processing volume.
- Partners may request fewer rows than the default by specifying
pageSize.
Get sales report by dateβ
Returns sales data for a specific date.
GET /sales/report/v1/ledgers/{ledgerId}/dates/{ledgerDate}
If the number of sales exceeds the response limit:
- The response includes:
cursorhasMore = true
- Partners must repeat the request for the same date including the
cursorto retrieve remaining records.
Query parametersβ
-
cursor Example:
cursor=2ScAAAAAAAA=- If not provided, the response starts from the first sale on the given
ledgerId. - Each response includes a checkpoint cursor.
- Partners must store and reuse the cursor to continue retrieving remaining records.
- If not provided, the response starts from the first sale on the given
-
pageSize Example:
pageSize=100- Limits the number of rows returned per request (default: 100, max: 1000).
- Partners can request a smaller page size if desired.
Get sales report by referenceβ
Returns all captures and returns related to a specific reference.
GET /sales/report/v1/ledgers/{ledgerId}/references/{reference}
Get sales report by PSP referenceβ
Returns a specific capture or return using the PSP reference.
GET /sales/report/v1/ledgers/{ledgerId}/psp-references/{pspReference}
External payload shapeβ
{
"items": [
{
"entryType": "capture",
"time": "2026-01-19T12:45:00Z",
"pspReference": "35054310398",
"reference": "12494299492",
"currency": "NOK",
"paymentType": "CARD",
"classification": {
"solution": "MPOS",
"salesCategory": null
},
"amounts": {
"gross": 25000,
"net": 20000,
"vat": 5000
},
"lines": [
{
"lineId": "121772",
"name": "Product A",
"quantity": 2,
"unitPriceGross": 12500,
"unitPriceNet": 10000,
"discountTotal": 0,
"lineTotalGross": 25000,
"lineTotalNet": 20000,
"vatRate": 2500,
"vatAmount": 5000,
"category": "GOODS"
}
],
"customer": {
"email": "customer@example.com",
"phone": "+4712345678",
"name": "Ola Nordmann"
},
"completeness": {
"hasLineItems": true,
"hasVatBreakdown": true,
"hasCustomerIdentity": true
}
}
],
"cursor": "8gsAAAAAAAA=",
"hasMore": true
}
Field semanticsβ
Identifiers
reference- Identifies the order / sale
- Same field name as
referencein the Report API (equalsorderIdin the ePayment API) - Stable across captures, refunds, and fees
pspReference- Identifies one financial transaction
- Same field name as
pspReferencein the Report API - Unique per capture or refund.
nullfor payment methods without a PSP (e.g. cash)
paymentType
CARD | CASH | WALLET
Amounts
All monetary values are in minor units (e.g. ΓΈre for NOK). "Gross" means including VAT. "Net" means excluding VAT.
Line Items
unitPriceGrossβ Gross unit price before discount (including VAT)unitPriceNetβ Net unit price before discount (excluding VAT)discountTotalβ Total discount for this linelineTotalGrossβ Final gross line price after discount (incl. VAT)lineTotalNetβ Final net line price after discount (excluding VAT)vatRateβ VAT rate in basis points (e.g. 2500 = 25%)vatAmountβ VAT amount for this line
Invariants
unitPriceGross * quantity - discountTotal = lineTotalGrosssum(lines[].lineTotalGross) = amounts.grosssum(lines[].vatAmount) = amounts.vat
Completeness Flags
Completeness flags are required and allow consumers to distinguish:
- "not provided / not available"
- from "empty but known"
Report API mapping
| Sales API field | Report API field | Meaning |
|---|---|---|
reference | reference | Identifies the order |
pspReference | pspReference | Identifies the transaction |
Accounting partners are expected to:
- Fetch sales entries from the Sales API
- Fetch transactions (funds + fees) from the Report API
- Join on
reference(order-level) orpspReference(transaction-level)
Classification
Each entry may include a classification object with the following fields:
solutionβ Identifies the Vipps MobilePay solution used for the sale:VARIABLE_AMOUNTβ Open-amount Vippsnummer payment (no line items)MPOSβ mPOS / Kassa sale (card, cash, or wallet at terminal)
salesCategoryβ Merchant-defined category for the sale (nullable). Primarily relevant for open-amount Vippsnummer payments where line items are absent.