Reference
Sales
Sales per day and channel, for your own reporting.
GET /api/v1/sales
Sales per day and channel.
Daily totals for a date range: Panion sales by booking date per operator, and every other channel from your booking system, for every operator on the key or the one in partner_id.
Scope: finance:read.
Query parameters:
from(string, YYYY-MM-DD): First day (YYYY-MM-DD).to(string, YYYY-MM-DD): Last day, inclusive (YYYY-MM-DD). At most 366 days.currency(one ofEUR,NOK, optional, default "NOK"): Currency for other-channel figures.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):
from(string, YYYY-MM-DD)to(string, YYYY-MM-DD)panion(object): Sales made through Panion (by booking date), in booking currency, one row per day, currency and operator.days(array)- each item:
date(string, YYYY-MM-DD)revenue_minor(integer): Integer minor units (øre, cents).bookings(integer)currency(string): ISO 4217 code.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)
- each item:
totals(array)- each item:
currency(string): ISO 4217 code.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)
revenue_minor(integer): Integer minor units (øre, cents).bookings(integer)
- each item:
other_channels(object): Every other channel from your booking system (OTAs, desk, ...), converted.currency(string): ISO 4217 code.partners(array): The operators these figures cover. Operators sharing one booking system account are counted once, not once per operator.- each item:
id(string)name(string)
- each item:
available(boolean): False when the figures could not be read.days(array)- each item:
date(string, YYYY-MM-DD)revenue_minor(integer): Integer minor units (øre, cents).bookings(integer)
- each item:
channels(array)- each item:
label(string)revenue_minor(integer): Integer minor units (øre, cents).bookings(integer)participants(integer)
- each item:
totals(object)revenue_minor(integer): Integer minor units (øre, cents).bookings(integer)participants(integer)
Example: One day
curl "https://www.panion.travel/api/v1/sales?from=2026-11-01&to=2026-11-01¤cy=NOK" \
-H "Authorization: Bearer $PANION_API_KEY"{
"from": "2026-11-01",
"to": "2026-11-01",
"panion": {
"days": [
{
"date": "2026-11-01",
"revenue_minor": 359800,
"bookings": 1,
"currency": "NOK",
"partner": {
"id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
"name": "Arctic Tours"
}
}
],
"totals": [
{
"currency": "NOK",
"revenue_minor": 359800,
"bookings": 1,
"partner": {
"id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
"name": "Arctic Tours"
}
}
]
},
"other_channels": {
"currency": "NOK",
"partners": [
{
"id": "2b7e1516-28ae-4d2a-9f15-88094f3c4f3c",
"name": "Arctic Tours"
}
],
"available": true,
"days": [
{
"date": "2026-11-01",
"revenue_minor": 539700,
"bookings": 2
}
],
"channels": [
{
"label": "Desk",
"revenue_minor": 539700,
"bookings": 2,
"participants": 3
}
],
"totals": {
"revenue_minor": 539700,
"bookings": 2,
"participants": 3
}
}
}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)