Payout Submissions
Suppliers submit payout reports per month, broken down by product type (short-term tickets, contracts and EV sessions) and by parking lot. Each submission is exported to its own SIE4 file that is imported into our ERP.
Every POST creates a new, independent submission — you may send more than one submission
for the same period (for example a later supplement or a correction). Submissions are never replaced in
place; instead, send another submission and, when it corrects an earlier one, flag it with
intent and corrects_reference. To withdraw a submission that has not yet been
locked, use DELETE.
All amounts are integers in öre (1/100 SEK) and the only accepted currency is SEK.
A submission must cover a fully closed month in YYYY-MM format.
A freshly accepted submission has the status received. After a grace window it is automatically
locked and exported to its own SIE4 file, becoming locked (or export_failed if the
export could not be produced). A locked submission can no longer be cancelled. A submission cancelled with
DELETE has the status cancelled. There is no manual release step.
Authentication uses a bearer token issued to your integration user, sent as
Authorization: Bearer {token}.
The integration user must have the accounting.payouts.write scope and be linked to a
payout supplier on our side.
List your payout submissions
Returns the payout submissions previously sent by your supplier, ordered by most recently received first. Optionally filter to a single period.
Headers
-
- Name
- Authorization
- Type
- Bearer Required
- Description
-
Bearer token issued to your integration user.
-
- Name
- Accept
- Type
- application/json
- Description
-
Tell the server that you want to receive JSON responses.
Query parameters
-
- Name
- period
- Type
- string
- Description
-
Filter by reporting period. Must match the format YYYY-MM.
Request Example
curl -X GET 'https://upab.parkeraisverige.com/api/v1/accounting/payouts?period=2026-03' \
-H 'Authorization: Bearer {token}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
200 List of submissions
{
"data": [
{
"submission_id": 42,
"period": "2026-03",
"supplier_reference": "PAYOUT-2026-03-001",
"status": "received",
"received_at": "2026-04-15T10:30:00+00:00",
"grand_totals": {
"gross_amount": 1000000,
"total_paid_amount": 962500,
"processor_fee_amount": 0,
"processor_refund_amount": 0,
"processor_adjustment_amount": 0,
"bank_payout_amount": 962500
}
}
]
}
400 Invalid period format
{
"errors": [
{
"field": "period",
"message": "period must match YYYY-MM.",
"code": "invalid_period"
}
]
}
401 Missing or invalid bearer token
403 Token lacks the accounting.payouts.write scope or no payout supplier is linked
Submit a payout for a period
Send a payout submission for a closed reporting period. Every call creates a new, independent
submission and returns 201 — there is no replace semantics. You may submit more than
one report for the same period; use intent and corrects_reference to mark a
submission that supplements or corrects an earlier one. The only uniqueness constraint is on
supplier_reference, which must not have been used before for your supplier.
The submission consists of one or more sections, one per product type
(short_term, contract, ev_session), each with section totals
and a per parking lot breakdown. Several arithmetic invariants are enforced
— see the parameter notes below.
Headers
-
- Name
- Authorization
- Type
- Bearer Required
- Description
-
Bearer token issued to your integration user.
-
- Name
- Content-Type
- Type
- application/json Required
- Description
-
Request body must be JSON.
-
- Name
- Accept
- Type
- application/json
- Description
-
Tell the server that you want to receive JSON responses.
Body
-
- Name
- period
- Type
- string Required
- Description
-
Reporting period in YYYY-MM format. Must be a fully closed month.
-
- Name
- supplier_reference
- Type
- string Required
- Description
-
Your own unique reference for this submission. Maximum 120 characters.
-
- Name
- currency
- Type
- string Required
- Description
-
Currency code. Must be SEK.
- Possible values
- SEK
-
- Name
- amount_unit
- Type
- string Required
- Description
-
Unit for all integer amounts. Must be ore (1/100 SEK).
- Possible values
- ore
-
- Name
- intent
- Type
- string
- Description
-
Why this submission is being sent. supplement (the default) is a normal or additional report for the period; correction marks it as correcting an earlier submission. Informational only — it does not alter how the figures are exported.
- Possible values
- supplement correction
-
- Name
- corrects_reference
- Type
- string
- Description
-
The supplier_reference of an earlier submission that this one corrects or supplements. For your own traceability. Maximum 120 characters.
-
- Name
- sections
- Type
- array Required
- Description
-
One section per product type. At least one section is required and each product_type may appear at most once.
-
- Name
- product_type
- Type
- string Required
- Description
-
The product type covered by the section.
- Possible values
- short_term contract ev_session
-
- Name
- totals
- Type
- object Required
- Description
-
Section level totals. Must satisfy: net_amount = gross_amount - vat_output_amount, and total_paid_amount = gross_amount - refund_amount - fee_amount - vat_input_amount + rounding_amount.
-
- Name
- gross_amount
- Type
- int Required
- Description
-
Total gross revenue for the section, in öre. Must be >= 0.
-
- Name
- vat_output_amount
- Type
- int Required
- Description
-
Output VAT charged to customers, in öre. Must be >= 0.
-
- Name
- net_amount
- Type
- int Required
- Description
-
Net revenue (gross_amount - vat_output_amount), in öre.
-
- Name
- fee_amount
- Type
- int Required
- Description
-
Service fees deducted by your platform, in öre. Must be >= 0.
-
- Name
- vat_input_amount
- Type
- int
- Description
-
Input VAT on deducted expenses, in öre. Must be >= 0.
-
- Name
- refund_amount
- Type
- int
- Description
-
Refunded amounts in the period, in öre. Must be >= 0.
-
- Name
- refund_vat_amount
- Type
- int
- Description
-
VAT included in refunds, in öre. Must be >= 0.
-
- Name
- rounding_amount
- Type
- int
- Description
-
Rounding adjustment applied when computing total_paid_amount, in öre. Can be negative.
-
- Name
- total_paid_amount
- Type
- int Required
- Description
-
Net amount paid out to us for the section, in öre.
-
- Name
- lot_rows
- Type
- array Required
- Description
-
Per parking lot breakdown. At least one row required. Sum of lot_rows.gross_amount must equal totals.gross_amount exactly. Sum of lot_rows.paid_amount must be within 50 öre of totals.total_paid_amount.
-
- Name
- parking_lot_id
- Type
- int Required
- Description
-
Our identifier for the parking lot.
-
- Name
- gross_amount
- Type
- int Required
- Description
-
Gross revenue contributed by this lot, in öre.
-
- Name
- vat_output_amount
- Type
- int Required
- Description
-
Output VAT contributed by this lot, in öre.
-
- Name
- net_amount
- Type
- int Required
- Description
-
Net revenue contributed by this lot, in öre.
-
- Name
- paid_amount
- Type
- int Required
- Description
-
Paid out amount contributed by this lot, in öre.
-
- Name
- refund_amount
- Type
- int
- Description
-
Refunds attributable to this lot, in öre.
-
- Name
- ticket_count
- Type
- int
- Description
-
Number of tickets / parking events for this lot. Must be >= 0.
-
- Name
- grand_totals
- Type
- object Required
- Description
-
Totals across all sections. gross_amount and total_paid_amount must equal the sum of the corresponding fields on sections.totals. The processor_* fields disclose batch-level deductions taken by the payment processor from the gross payout; they are not product-attributable. bank_payout_amount, when provided, must equal total_paid_amount minus the three processor_* values.
-
- Name
- gross_amount
- Type
- int Required
- Description
-
Sum of sections.totals.gross_amount, in öre.
-
- Name
- total_paid_amount
- Type
- int Required
- Description
-
Sum of sections.totals.total_paid_amount, in öre.
-
- Name
- processor_fee_amount
- Type
- int
- Description
-
Batch-level processor fee withheld from the payout, in öre. Defaults to 0.
-
- Name
- processor_refund_amount
- Type
- int
- Description
-
Batch-level processor refund deducted from the payout, in öre. Defaults to 0.
-
- Name
- processor_adjustment_amount
- Type
- int
- Description
-
Batch-level processor adjustment (disputes, FX, chargebacks), in öre. Defaults to 0.
-
- Name
- bank_payout_amount
- Type
- int
- Description
-
The actual amount deposited to your bank account, in öre. If omitted it is derived as total_paid_amount − processor_fee_amount − processor_refund_amount − processor_adjustment_amount. If provided, must equal that value.
-
- Name
- metadata
- Type
- object
- Description
-
Optional free form key/value data stored with the submission for your own use.
Request Example
curl -X POST 'https://upab.parkeraisverige.com/api/v1/accounting/payouts' \
-H 'Authorization: Bearer {token}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"period": "2026-03",
"supplier_reference": "PAYOUT-2026-03-001",
"currency": "SEK",
"amount_unit": "ore",
"sections": [
{
"product_type": "short_term",
"totals": {
"gross_amount": 1000000,
"vat_output_amount": 200000,
"net_amount": 800000,
"fee_amount": 30000,
"vat_input_amount": 7500,
"refund_amount": 0,
"refund_vat_amount": 0,
"rounding_amount": 0,
"total_paid_amount": 962500
},
"lot_rows": [
{
"parking_lot_id": 123,
"gross_amount": 600000,
"vat_output_amount": 120000,
"net_amount": 480000,
"paid_amount": 577500,
"refund_amount": 0,
"ticket_count": 100
},
{
"parking_lot_id": 124,
"gross_amount": 400000,
"vat_output_amount": 80000,
"net_amount": 320000,
"paid_amount": 385000,
"refund_amount": 0,
"ticket_count": 67
}
]
}
],
"grand_totals": {
"gross_amount": 1000000,
"total_paid_amount": 962500
}
}'
201 Submission accepted
{
"submission_id": 42,
"period": "2026-03",
"supplier_reference": "PAYOUT-2026-03-001",
"status": "received",
"received_at": "2026-04-30T14:22:18+00:00",
"grand_totals": {
"gross_amount": 1000000,
"total_paid_amount": 962500,
"processor_fee_amount": 0,
"processor_refund_amount": 0,
"processor_adjustment_amount": 0,
"bank_payout_amount": 962500
}
}
400 Malformed JSON body
{
"errors": [
{
"field": null,
"message": "Malformed JSON body.",
"code": "invalid_json"
}
]
}
409 The supplier_reference has already been used
{
"errors": [
{
"field": null,
"message": "supplier_reference PAYOUT-2026-03-001 has already been used.",
"code": "duplicate_supplier_reference"
}
]
}
422 Validation error
{
"errors": [
{
"field": "sections.0.totals.net_amount",
"message": "net_amount must equal gross_amount - vat_output_amount (expected 800000, got 700000).",
"code": "invalid_field"
}
]
}
422 Period is not yet a closed month
{
"errors": [
{
"field": "period",
"message": "Period 2026-06 is not yet closed.",
"code": "period_open"
}
]
}
401 Missing or invalid bearer token
403 Token lacks the accounting.payouts.write scope or no payout supplier is linked
Cancel a payout submission
Cancel a submission you sent earlier. Use the submission_id returned when the submission was
created. On success the response is 200 with the submission in status
cancelled.
A submission can only be cancelled while it is still received. Once it has been locked and
exported to a SIE4 file (status locked or export_failed) it can no longer be
cancelled and the response is 409 with code submission_locked. To revise the
figures after that, send a new submission with intent = correction.
Headers
-
- Name
- Authorization
- Type
- Bearer Required
- Description
-
Bearer token issued to your integration user.
-
- Name
- Accept
- Type
- application/json
- Description
-
Tell the server that you want to receive JSON responses.
Path parameters
-
- Name
- submission
- Type
- int Required
- Description
-
The submission_id of the submission to cancel. Must belong to your supplier.
Request Example
curl -X DELETE 'https://upab.parkeraisverige.com/api/v1/accounting/payouts/42' \
-H 'Authorization: Bearer {token}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
200 Submission cancelled
{
"submission_id": 42,
"period": "2026-03",
"supplier_reference": "PAYOUT-2026-03-001",
"status": "cancelled",
"received_at": "2026-04-30T14:22:18+00:00",
"grand_totals": {
"gross_amount": 1000000,
"total_paid_amount": 962500,
"processor_fee_amount": 0,
"processor_refund_amount": 0,
"processor_adjustment_amount": 0,
"bank_payout_amount": 962500
}
}
409 Submission is locked and can no longer be cancelled
{
"errors": [
{
"field": null,
"message": "This submission is locked and can no longer be cancelled.",
"code": "submission_locked"
}
]
}
403 The submission belongs to a different supplier
{
"errors": [
{
"field": null,
"message": "You may not cancel this submission.",
"code": "forbidden"
}
]
}