Reference
Finance
Payouts, commission statements, chargebacks, pay-later charges and invoices.
Needs the finance:read scope. Your own money records, scoped exactly as Oracle Reporting scopes them: never another operator's, never Panion's own. Pay-later charges and chargebacks belong to the operator of the booking's tour. Payouts and commission invoices belong to the legal entity whose payout account they went to, so operators of one company that share a payout account see the same ones. Statements are per operator.
No guest details and no card data appear here. Money is integer minor units with a currency; payouts are in NOK as the payment provider reports them. Invoice file links are signed and expire after 15 minutes: ask again for fresh ones.
GET /api/v1/finance/payouts
Payouts to your bank account.
The payment provider's settlement reports for the payout accounts of the key's operators (or the one in partner_id), newest first: sales, refunds, fees and the amount paid out, with every adjustment line (Panion's commission split, chargebacks, terminal fees). A payout belongs to the legal entity whose payout account it went to, so operators of one company sharing an account see the same payouts. Amounts are NOK, as the provider reports them.
Scope: finance:read.
Query parameters:
from(string, YYYY-MM-DD, optional): Settlement day on or after (YYYY-MM-DD).to(string, YYYY-MM-DD, optional): Settlement day on or before (YYYY-MM-DD). Withfrom, at most 366 days.limit(integer, optional, default 50): Rows per page (at most 100).cursor(string, optional):next_cursorof the last page.partner_id(string, optional): Only this operator: one of the key's operators (see GET /api/v1/me). Any other id answers 404. Omit for every operator on the key.
Response fields (200):
data(array)- each item:
partners(array): The key's operators paid through this payout account. Operators of one legal entity that share a payout account see the same payouts.- each item:
id(string)name(string)
- each item:
payout_id(string): The payment provider's payout reference.settlement_date(string, YYYY-MM-DD, nullable): Day the payout was settled.transactions_from(string, YYYY-MM-DD, nullable)transactions_to(string, YYYY-MM-DD, nullable)report_type(string, nullable): DAILY, WEEKLY or MONTHLY.currency(string): ISO 4217 code.sales_minor(integer): Integer minor units (øre, cents).refunds_minor(integer): Refunds in the payout, negative.fees_minor(integer): Integer minor units (øre, cents).fee_vat_minor(integer): Integer minor units (øre, cents).payout_minor(integer): Paid to your bank account, exactly as the payment provider reports it (not always sales + refunds - fees).adjustments(array): The adjustment lines of the settlement report.- each item:
type(string): The provider's line type, e.g. Service Provider Fee (Panion's commission split), Chargeback, Chargeback Fee, Partner Fee.description(string)date(string, YYYY-MM-DD, nullable)debit_minor(integer): Integer minor units (øre, cents).credit_minor(integer): Integer minor units (øre, cents).net_minor(integer): Integer minor units (øre, cents).
- each item:
- each item:
next_cursor(string, nullable): Pass ascursorfor the next page; null on the last page.
Example: The latest payout
curl "https://www.panion.travel/api/v1/finance/payouts?from=2026-10-01&to=2026-10-31&limit=1" \
-H "Authorization: Bearer $PANION_API_KEY"{
"data": [
{
"partners": [
{
"id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
"name": "Arctic Tours"
}
],
"payout_id": "ISX1example",
"settlement_date": "2026-10-15",
"transactions_from": "2026-10-14",
"transactions_to": "2026-10-14",
"report_type": "DAILY",
"currency": "NOK",
"sales_minor": 1259800,
"refunds_minor": -159800,
"fees_minor": 0,
"fee_vat_minor": 0,
"payout_minor": 1062206,
"adjustments": [
{
"type": "Service Provider Fee",
"description": "[10-14] - Service Provider Charges",
"date": "2026-10-15",
"debit_minor": 37794,
"credit_minor": 0,
"net_minor": -37794
}
]
}
],
"next_cursor": "eyJvIjoxfQ"
}Responses:
- 200: OK
- 400: Invalid request
- 401: Missing, invalid, expired or revoked key
- 403: The key lacks the scope
- 429: Rate limited (300 requests per minute per key)
GET /api/v1/finance/statements
Monthly commission statement per operator.
Panion's commission on each operator's sales in one month, line by line from the money ledger: every sale, every cancellation that gave commission back and every party difference collected later, with gross, commission rate, commission and Panion's share of pay-later reserve fees, per currency. A working statement for reconciliation; the commission invoice (GET /api/v1/finance/invoices) is the accounting document, with VAT. A statement is draft while entries behind it are still pending. A key over more than 6 operators answers too_many: true; ask per operator with partner_id.
Scope: finance:read.
Query parameters:
month(string, optional): Statement month (YYYY-MM, UTC). Defaults to last month.partner_id(string, optional): Only this operator: one of the key's operators (see GET /api/v1/me). Any other id answers 404. Omit for every operator on the key.
Response fields (200):
month(string)period_start(string, ISO 8601 date-time)period_end(string, ISO 8601 date-time): Exclusive.too_many(boolean): True when the key covers more operators than one answer can hold;statementsis then empty. Ask again withpartner_id.statements(array)- each item:
partner(object): The operator a row belongs to: one of the key's operators (the tour's operator for a booking).id(string)name(string)
number(string): Stable per operator and month, e.g. PS-202609-ARCTIC-TOURS.draft(boolean): True while any entry behind it is still pending: the figures can still change.sections(array)- each item:
currency(string): ISO 4217 code.sales(integer)cancellations(integer)differences(integer)gross_minor(integer): Integer minor units (øre, cents).commission_minor(integer): Integer minor units (øre, cents).reserve_fee_minor(integer): Integer minor units (øre, cents).entries_total(integer): Entries in the section.entries(array): Oldest first; at most 1000 (seeentries_total).
- each item:
- each item:
Example: September's statement
curl "https://www.panion.travel/api/v1/finance/statements?month=2026-09" \
-H "Authorization: Bearer $PANION_API_KEY"{
"month": "2026-09",
"period_start": "2026-09-01T00:00:00.000Z",
"period_end": "2026-10-01T00:00:00.000Z",
"too_many": false,
"statements": [
{
"partner": {
"id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
"name": "Arctic Tours"
},
"number": "PS-202609-ARCTIC-TOURS",
"draft": false,
"sections": [
{
"currency": "NOK",
"sales": 1,
"cancellations": 1,
"differences": 0,
"gross_minor": 359800,
"commission_minor": 0,
"reserve_fee_minor": 0,
"entries_total": 2,
"entries": [
{
"type": "sale",
"occurred_at": "2026-09-03T12:30:00.000Z",
"confirmation_code": "PNN-7K2Q9X",
"tour": "Northern Lights Chase",
"experience_date": "2026-11-14",
"gross_minor": 359800,
"commission_rate_percent": 3,
"commission_minor": 10794,
"reserve_fee_minor": 0
},
{
"type": "cancellation",
"occurred_at": "2026-09-20T08:00:00.000Z",
"confirmation_code": "PNN-7K2Q9X",
"tour": "Northern Lights Chase",
"experience_date": "2026-11-14",
"gross_minor": 0,
"commission_rate_percent": 3,
"commission_minor": -10794,
"reserve_fee_minor": 0
}
]
}
]
}
]
}Responses:
- 200: OK
- 400: Invalid request
- 401: Missing, invalid, expired or revoked key
- 403: The key lacks the scope
- 429: Rate limited (300 requests per minute per key)
GET /api/v1/finance/chargebacks
Chargebacks on your bookings.
Card disputes on bookings of the key's operators' tours (or the one in partner_id), newest first: the booking, the disputed amount and fee, the dispute's status, reason and reply deadline, and what was taken off your payouts once settled. A dispute the payment provider reports that cannot be matched to one of your bookings is not listed. Nothing here changes a booking or moves money.
Scope: finance:read.
Query parameters:
from(string, YYYY-MM-DD, optional): Day Panion recorded the chargeback (UTC) on or after (YYYY-MM-DD).to(string, YYYY-MM-DD, optional): Day Panion recorded the chargeback (UTC) on or before (YYYY-MM-DD). Withfrom, at most 366 days.limit(integer, optional, default 50): Rows per page (at most 100).cursor(string, optional):next_cursorof the last page.partner_id(string, optional): Only this operator: one of the key's operators (see GET /api/v1/me). Any other id answers 404. Omit for every operator on the key.
Response fields (200):
data(array)- each item:
id(string)partner(object): The operator a row belongs to: one of the key's operators (the tour's operator for a booking).id(string)name(string)
booking(object): The Panion booking (GET /api/v1/bookings/{id}).id(string)confirmation_code(string)experience_date(string, YYYY-MM-DD, nullable)status(string): CONFIRMED, CANCELLED or REFUNDED.
amount_minor(integer, nullable): The disputed amount.currency(string, nullable): ISO 4217 code.fee_minor(integer, nullable): The dispute fee.settled(object, nullable): What was taken off your payouts for it, once settled (NOK).currency(NOK)amount_minor(integer, nullable): Integer minor units (øre, cents).fee_minor(integer, nullable): Integer minor units (øre, cents).
dispute_reference(string, nullable)dispute_status(string, nullable): The dispute desk's status (for example triage, won, lost); null when only the settlement report knows of it.reason(string, nullable)transaction_date(string, YYYY-MM-DD, nullable)registered_at(string, nullable)respond_by(string, YYYY-MM-DD, nullable)settled_on(string, YYYY-MM-DD, nullable)first_seen_at(string, ISO 8601 date-time): When Panion recorded it.
- each item:
next_cursor(string, nullable): Pass ascursorfor the next page; null on the last page.
Example: One settled chargeback
curl "https://www.panion.travel/api/v1/finance/chargebacks?limit=50" \
-H "Authorization: Bearer $PANION_API_KEY"{
"data": [
{
"id": "6b1f0c2d-3e4a-4b5c-8d6e-7f8091a2b3c4",
"partner": {
"id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
"name": "Arctic Tours"
},
"booking": {
"id": "8f6d2c1e-4b7a-4e3f-9c2d-1a5b6c7d8e9f",
"confirmation_code": "PNN-7K2Q9X",
"experience_date": "2026-11-14",
"status": "CONFIRMED"
},
"amount_minor": 188200,
"currency": "NOK",
"fee_minor": 15000,
"settled": {
"currency": "NOK",
"amount_minor": 188200,
"fee_minor": 15000
},
"dispute_reference": "84a1b2c3d4e5f6070119",
"dispute_status": "lost",
"reason": "4837 No cardholder authorization",
"transaction_date": "2026-09-12",
"registered_at": "2026-10-02",
"respond_by": "2026-10-12",
"settled_on": "2026-10-06",
"first_seen_at": "2026-10-03T05:50:00.000Z"
}
],
"next_cursor": null
}Responses:
- 200: OK
- 400: Invalid request
- 401: Missing, invalid, expired or revoked key
- 403: The key lacks the scope
- 429: Rate limited (300 requests per minute per key)
GET /api/v1/finance/pay-later
Pay-later balance charges: upcoming, failed and collected.
The scheduled balance charges of pay-later bookings of the key's operators' tours (or the one in partner_id), by charge time: what is still to be charged and when, what failed (and whether Panion retries), what was collected, and what was cancelled. totals sums every matching charge per state and currency. No guest details and no card data.
Scope: finance:read.
Query parameters:
state(one ofupcoming,failed,collected,cancelled, optional): Only charges in this state. Omit for all.from(string, YYYY-MM-DD, optional): Charge day (UTC) on or after (YYYY-MM-DD).to(string, YYYY-MM-DD, optional): Charge day (UTC) on or before (YYYY-MM-DD). Withfrom, at most 366 days.limit(integer, optional, default 50): Rows per page (at most 100).cursor(string, optional):next_cursorof the last page.partner_id(string, optional): Only this operator: one of the key's operators (see GET /api/v1/me). Any other id answers 404. Omit for every operator on the key.
Response fields (200):
totals(array): Over every charge matching the filters, not only this page.- each item:
state(one ofupcoming,failed,collected,cancelled)currency(string): ISO 4217 code.charges(integer)amount_minor(integer): Integer minor units (øre, cents).
- each item:
data(array)- each item:
id(string)partner(object): The operator a row belongs to: one of the key's operators (the tour's operator for a booking).id(string)name(string)
booking(object): The Panion booking (GET /api/v1/bookings/{id}).id(string)confirmation_code(string)experience_date(string, YYYY-MM-DD, nullable)status(string): CONFIRMED, CANCELLED or REFUNDED.
tour(string, nullable)amount_minor(integer): Integer minor units (øre, cents).currency(string): ISO 4217 code.charge_at(string, ISO 8601 date-time): When the balance is (or was) due to be charged.state(one ofupcoming,failed,collected,cancelled): upcoming: not charged yet. failed: the charge failed (retryingsays whether Panion tries again). collected: charged. cancelled: will not be charged (booking cancelled) or refunded after it was.retrying(boolean)refunded(boolean)attempts(integer)last_attempt_at(string, ISO 8601 date-time, nullable)next_attempt_at(string, ISO 8601 date-time, nullable)failure_message(string, nullable): Why the last attempt failed, in plain words.final_deadline_at(string, ISO 8601 date-time): The last moment the balance can be charged before the booking is at risk.collected_at(string, ISO 8601 date-time, nullable)
- each item:
next_cursor(string, nullable): Pass ascursorfor the next page; null on the last page.
Example: Balances still to be charged
curl "https://www.panion.travel/api/v1/finance/pay-later?state=upcoming&from=2026-11-01&to=2026-11-30" \
-H "Authorization: Bearer $PANION_API_KEY"{
"totals": [
{
"state": "upcoming",
"currency": "NOK",
"charges": 1,
"amount_minor": 330800
}
],
"data": [
{
"id": "9e8d7c6b-5a49-4382-9716-05f4e3d2c1b0",
"partner": {
"id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
"name": "Arctic Tours"
},
"booking": {
"id": "8f6d2c1e-4b7a-4e3f-9c2d-1a5b6c7d8e9f",
"confirmation_code": "PNN-7K2Q9X",
"experience_date": "2026-11-14",
"status": "CONFIRMED"
},
"tour": "Northern Lights Chase",
"amount_minor": 330800,
"currency": "NOK",
"charge_at": "2026-11-07T18:00:00.000Z",
"state": "upcoming",
"retrying": false,
"refunded": false,
"attempts": 0,
"last_attempt_at": null,
"next_attempt_at": null,
"failure_message": null,
"final_deadline_at": "2026-11-12T18:00:00.000Z",
"collected_at": null
}
],
"next_cursor": null
}Responses:
- 200: OK
- 400: Invalid request
- 401: Missing, invalid, expired or revoked key
- 403: The key lacks the scope
- 429: Rate limited (300 requests per minute per key)
GET /api/v1/finance/invoices
Panion's commission invoices and credit notes.
The commission invoices and credit notes Panion issued to the legal entity of the key's operators (or of the one in partner_id), newest delivery month first, as Oracle Reporting lists them: number, period, totals, what was deducted from payouts and what is still payable, status, the invoice lines, the refund credits and cancellation fees booking by booking (with the original invoice a credit corrects), and signed links to the PDF and the CSV specification that expire after 15 minutes (ask again for fresh ones). Drafts never show.
Scope: finance:read.
Query parameters:
period_from(string, optional): Delivery month on or after (YYYY-MM).period_to(string, optional): Delivery month on or before (YYYY-MM).type(one ofinvoice,credit_note, optional)limit(integer, optional, default 24): Rows per page (at most 100).cursor(string, optional):next_cursorof the last page.partner_id(string, optional): Only this operator: one of the key's operators (see GET /api/v1/me). Any other id answers 404. Omit for every operator on the key.
Response fields (200):
data(array)- each item:
id(string)number(string)type(one ofinvoice,credit_note)period(string): Delivery month, YYYY-MM.period_label(string)document_date(string, YYYY-MM-DD)due_date(string, YYYY-MM-DD, nullable)buyer(string): Your legal entity, as invoiced.partners(array): The key's operators whose sales the document covers (one legal entity).- each item:
id(string)name(string)
- each item:
currency(string): ISO 4217 code.total_minor(integer): Integer minor units (øre, cents).settled_minor(integer): Already deducted from your payouts.payable_minor(integer): Still to be paid by bank transfer (0 when settled).vat_minor(integer, nullable): Null before Panion is VAT-registered.status(one ofsettled,to_pay,credited,credit_note): settled: nothing to pay. to_pay:payable_minoris due. credited: reversed by a credit note. credit_note: this is a credit note.credits_number(string, nullable): On a credit note: the invoice it reverses.summary(array)- each item:
brand(string)kind(one ofcommission,reserve_fee,cancellation_credit,cancellation_fee)label(string)settlement(one ofdeducted,payable)bookings(integer)amount_minor(integer): Integer minor units (øre, cents).
- each item:
credit_lines(array): The refund credits and cancellation fees on the document, one per booking.- each item:
kind(one ofcancellation_credit,cancellation_fee): cancellation_credit: commission given back on a refunded booking (also a refund owed that you marked refunded; negative). cancellation_fee: 25% of the booking value on an operator cancellation without a valid reason.booking_code(string)brand(string)tour(string, nullable)tour_date(string, YYYY-MM-DD, nullable)recognised_on(string, YYYY-MM-DD)amount_minor(integer): Integer minor units (øre, cents).text(string, nullable): The line's text on the invoice, naming the original invoice a credit corrects.original_invoices(array)
- each item:
files(object)pdf(object, nullable)url(string): A signed download link. Valid untilexpires_at.expires_at(string, ISO 8601 date-time)
csv(object, nullable)url(string): A signed download link. Valid untilexpires_at.expires_at(string, ISO 8601 date-time)
- each item:
next_cursor(string, nullable): Pass ascursorfor the next page; null on the last page.
Example: A settled invoice with a refund credit
curl "https://www.panion.travel/api/v1/finance/invoices?limit=24" \
-H "Authorization: Bearer $PANION_API_KEY"{
"data": [
{
"id": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"number": "2026-00012",
"type": "invoice",
"period": "2026-09",
"period_label": "September 2026",
"document_date": "2026-09-30",
"due_date": "2026-10-14",
"buyer": "ARCTIC TOURS AS",
"partners": [
{
"id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
"name": "Arctic Tours"
}
],
"currency": "NOK",
"total_minor": 21588,
"settled_minor": 21588,
"payable_minor": 0,
"vat_minor": null,
"status": "settled",
"credits_number": null,
"summary": [
{
"brand": "Arctic Tours",
"kind": "commission",
"label": "Commission, deducted by SagaPay",
"settlement": "deducted",
"bookings": 3,
"amount_minor": 32382
},
{
"brand": "Arctic Tours",
"kind": "cancellation_credit",
"label": "Commission credited on refunds",
"settlement": "deducted",
"bookings": 1,
"amount_minor": -10794
}
],
"credit_lines": [
{
"kind": "cancellation_credit",
"booking_code": "PNN-7K2Q9X",
"brand": "Arctic Tours",
"tour": "Northern Lights Chase",
"tour_date": "2026-11-14",
"recognised_on": "2026-09-20",
"amount_minor": -10794,
"text": "Credited commission, invoice 2026-00007, booking PNN-7K2Q9X",
"original_invoices": [
"2026-00007"
]
}
],
"files": {
"pdf": {
"url": "https://storage.example/commission-documents/2026-00012.pdf?token=signed",
"expires_at": "2026-10-17T10:15:00.000Z"
},
"csv": {
"url": "https://storage.example/commission-documents/2026-00012.csv?token=signed",
"expires_at": "2026-10-17T10:15:00.000Z"
}
}
}
],
"next_cursor": null
}Responses:
- 200: OK
- 400: Invalid request
- 401: Missing, invalid, expired or revoked key
- 403: The key lacks the scope
- 429: Rate limited (300 requests per minute per key)