Payout Submissions

Suppliers submit a single payout report per month, broken down by product type (short-term tickets, contracts and EV sessions) and by parking lot. We use the submitted figures to generate the monthly SIE4 file that is imported into our ERP.

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. Submit with POST the first time, and use PUT to replace a submission until the period has been released as a SIE4 file.

An accepted submission has the status validated. Once the period has been released as a SIE4 file it becomes locked and can no longer be replaced.

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.

GET /api/v1/accounting/payouts

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": "validated",
      "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

Unauthorized

403 Token lacks the accounting.payouts.write scope or no payout supplier is linked

Forbidden
POST /api/v1/accounting/payouts

Submit a payout for a period

Send a payout submission for a closed reporting period. If a submission already exists for the period the response is 409 with code submission_exists — use PUT to replace it.

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
    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": "validated",
  "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 A submission already exists for this period

{
  "errors": [
    {
      "field": "period",
      "message": "A submission for period 2026-03 already exists. Use PUT to replace it.",
      "code": "submission_exists"
    }
  ]
}

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

Unauthorized

403 Token lacks the accounting.payouts.write scope or no payout supplier is linked

Forbidden
PUT /api/v1/accounting/payouts

Replace a payout submission

Idempotently create or replace the submission for a period. If a submission already exists it is replaced and the response is 200; if no submission exists yet for the period one is created and the response is 201.

Once the period has been released as a SIE4 file the submission is locked and cannot be replaced — in that case the response is 409 with the conflict reason in the code field.

The request body is identical to POST /api/v1/accounting/payouts — see that endpoint for the full parameter reference and invariants.

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.

Request Example

curl -X PUT '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-rev2",
    "currency": "SEK",
    "amount_unit": "ore",
    "sections": [
        {
            "product_type": "short_term",
            "totals": {
                "gross_amount": 1050000,
                "vat_output_amount": 210000,
                "net_amount": 840000,
                "fee_amount": 31500,
                "vat_input_amount": 7875,
                "refund_amount": 0,
                "refund_vat_amount": 0,
                "rounding_amount": 0,
                "total_paid_amount": 1010625
            },
            "lot_rows": [
                {
                    "parking_lot_id": 123,
                    "gross_amount": 1050000,
                    "vat_output_amount": 210000,
                    "net_amount": 840000,
                    "paid_amount": 1010625,
                    "ticket_count": 175
                }
            ]
        }
    ],
    "grand_totals": {
        "gross_amount": 1050000,
        "total_paid_amount": 1010625
    }
}'

200 Submission replaced

{
  "submission_id": 42,
  "period": "2026-03",
  "supplier_reference": "PAYOUT-2026-03-001-rev2",
  "status": "validated",
  "received_at": "2026-04-30T15:01:42+00:00",
  "grand_totals": {
    "gross_amount": 1050000,
    "total_paid_amount": 1010625,
    "processor_fee_amount": 0,
    "processor_refund_amount": 0,
    "processor_adjustment_amount": 0,
    "bank_payout_amount": 1010625
  }
}

201 Submission created (no prior submission for this period)

{
  "submission_id": 43,
  "period": "2026-04",
  "supplier_reference": "PAYOUT-2026-04-001",
  "status": "validated",
  "received_at": "2026-05-12T09:14:00+00:00",
  "grand_totals": {
    "gross_amount": 1100000,
    "total_paid_amount": 1058000,
    "processor_fee_amount": 0,
    "processor_refund_amount": 0,
    "processor_adjustment_amount": 0,
    "bank_payout_amount": 1058000
  }
}

409 Period is locked (already released as SIE4)

{
  "errors": [
    {
      "field": null,
      "message": "Period 2026-03 is locked \u2014 SIE4 has already been released.",
      "code": "sie4_already_released"
    }
  ]
}

409 The supplier_reference has already been used

{
  "errors": [
    {
      "field": null,
      "message": "supplier_reference PAYOUT-2026-03-001-rev2 has already been used.",
      "code": "duplicate_supplier_reference"
    }
  ]
}

422 Validation error

See POST /api/v1/accounting/payouts for the error shape (invalid_field, period_open).

401 Missing or invalid bearer token

Unauthorized

403 Token lacks the accounting.payouts.write scope or no payout supplier is linked

Forbidden