Create, check out, cancel and refund orders.
GET
/api/v1/orders
#
The organisation's orders.
Right needed:
read
Parameters
-
Accept-Language
string
· as a header
· optional
The language of the translated fields, falling back to the organisation's language.
-
page[size]
integer
· in the url
· optional
Number per page, at most 100.
-
page[cursor]
string
· in the url
· optional
The next_cursor from the previous page.
-
sort
string
· in the url
· optional
Sort; a leading hyphen reverses the order.
Values:
created_at, -created_at, paid_at, -paid_at, total_cent, -total_cent, id, -id
-
filter[status]
string
· in the url
· optional
Filter on status.
-
filter[channel]
string
· in the url
· optional
Filter on channel.
-
filter[reference]
string
· in the url
· optional
Filter on reference.
-
filter[email]
string
· in the url
· optional
Filter on email.
-
filter[from]
string
· in the url
· optional
Filter on from.
-
filter[to]
string
· in the url
· optional
Filter on to.
-
filter[sandbox]
string
· in the url
· optional
Filter on sandbox.
-
include
string
· in the url
· optional
Include these relations: lines, tickets, payments, refunds.
Values:
lines, tickets, payments, refunds
Example call
curl
curl "https://passavo.eu/api/v1/orders" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/orders');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/orders", headers=headers)
data = response.json()["data"]
Responses
-
200
— The organisation's orders.
-
401
— This key is not valid.
-
403
— This key is not allowed to do that.
-
422
— The request is not valid.
-
429
— Too many calls. Try again in 60 seconds.
Example response
{
"data": [
{
"id": "string",
"reference": "string",
"status": "draft",
"channel": "online",
"venue_id": 1,
"buyer": {
"name": "string",
"email": "string",
"phone": "string",
"locale": "string"
},
"totals": {
"subtotal": {
"amount_cent": 1,
"currency": "EUR"
},
"discount": {
"amount_cent": 1,
"currency": "EUR"
},
"discount_code": {
"amount_cent": 1,
"currency": "EUR"
},
"voucher": {
"amount_cent": 1,
"currency": "EUR"
},
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"total": {
"amount_cent": 1,
"currency": "EUR"
}
},
"discount_code": "string",
"voucher_code": "string",
"reserved_until": "2026-09-21T14:00:00+02:00",
"sandbox": true,
"test": true,
"payment": {
"provider": "string",
"provider_ref": "string",
"redirect_url": "string",
"qr_code_url": "string"
},
"paid_at": "2026-09-21T14:00:00+02:00",
"cancelled_at": "2026-09-21T14:00:00+02:00",
"lines": [
{
"id": 1,
"product_id": 1,
"slot_id": 1,
"description": "string",
"quantity": 1,
"unit_price": {
"amount_cent": 1,
"currency": "EUR"
},
"line_total": {
"amount_cent": 1,
"currency": "EUR"
},
"vat_rate_bp": 1,
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"valid_on": "2026-09-21",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"tickets": [
{
"id": "9f1c0b4a-6b2f-4a1b-9c7e-1f2d3e4a5b6c",
"order_line_id": 1,
"order_id": "string",
"product_id": 1,
"slot_id": 1,
"description": "string",
"holder_name": "string",
"status": "valid",
"valid_on": "2026-09-21",
"is_scannable": true,
"used_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
],
"payments": [
{
"id": 1,
"provider": "string",
"provider_ref": "string",
"method": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "string",
"paid_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"refunds": [
{
"id": 1,
"payment_id": 1,
"provider": "string",
"provider_ref": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "pending",
"reason": "string",
"refunded_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
],
"meta": {
"next_cursor": "string"
}
}
POST
/api/v1/orders
#
A new order, with the places held.
Right needed:
write
This call sends a request body.
Parameters
-
Accept-Language
string
· as a header
· optional
The language of the translated fields, falling back to the organisation's language.
-
Idempotency-Key
string
· as a header
· required
Required. Without this key, a retry after a network error can create a second order or a second voucher.
Example call
curl
curl -X POST "https://passavo.eu/api/v1/orders" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'
PHP
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->withHeader('Idempotency-Key', (string) Str::uuid())
->post('https://passavo.eu/api/v1/orders', []);
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders', {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({}),
});
const { data } = await response.json();
Python
import uuid
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY", "Idempotency-Key": str(uuid.uuid4())}
response = requests.post("https://passavo.eu/api/v1/orders", headers=headers, json={})
data = response.json()["data"]
Responses
-
201
— A new order, with the places held.
-
401
— This key is not valid.
-
403
— This key is not allowed to do that.
-
404
— Not found.
-
409
— The time slot is full or has already started.
-
422
— The request is not valid.
-
429
— Too many calls. Try again in 60 seconds.
Example response
{
"data": {
"id": "string",
"reference": "string",
"status": "draft",
"channel": "online",
"venue_id": 1,
"buyer": {
"name": "string",
"email": "string",
"phone": "string",
"locale": "string"
},
"totals": {
"subtotal": {
"amount_cent": 1,
"currency": "EUR"
},
"discount": {
"amount_cent": 1,
"currency": "EUR"
},
"discount_code": {
"amount_cent": 1,
"currency": "EUR"
},
"voucher": {
"amount_cent": 1,
"currency": "EUR"
},
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"total": {
"amount_cent": 1,
"currency": "EUR"
}
},
"discount_code": "string",
"voucher_code": "string",
"reserved_until": "2026-09-21T14:00:00+02:00",
"sandbox": true,
"test": true,
"payment": {
"provider": "string",
"provider_ref": "string",
"redirect_url": "string",
"qr_code_url": "string"
},
"paid_at": "2026-09-21T14:00:00+02:00",
"cancelled_at": "2026-09-21T14:00:00+02:00",
"lines": [
{
"id": 1,
"product_id": 1,
"slot_id": 1,
"description": "string",
"quantity": 1,
"unit_price": {
"amount_cent": 1,
"currency": "EUR"
},
"line_total": {
"amount_cent": 1,
"currency": "EUR"
},
"vat_rate_bp": 1,
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"valid_on": "2026-09-21",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"tickets": [
{
"id": "9f1c0b4a-6b2f-4a1b-9c7e-1f2d3e4a5b6c",
"order_line_id": 1,
"order_id": "string",
"product_id": 1,
"slot_id": 1,
"description": "string",
"holder_name": "string",
"status": "valid",
"valid_on": "2026-09-21",
"is_scannable": true,
"used_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
],
"payments": [
{
"id": 1,
"provider": "string",
"provider_ref": "string",
"method": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "string",
"paid_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"refunds": [
{
"id": 1,
"payment_id": 1,
"provider": "string",
"provider_ref": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "pending",
"reason": "string",
"refunded_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
}
GET
/api/v1/orders/{id}
#
A single order.
Right needed:
read
Parameters
-
Accept-Language
string
· as a header
· optional
The language of the translated fields, falling back to the organisation's language.
-
id
string
· in the path
· required
The order's reference, e.g. ORD-AB12CD34EF.
-
include
string
· in the url
· optional
Include these relations: lines, tickets, payments, refunds.
Values:
lines, tickets, payments, refunds
Example call
curl
curl "https://passavo.eu/api/v1/orders/12" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/orders/12');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders/12', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/orders/12", headers=headers)
data = response.json()["data"]
Responses
-
200
— A single order.
-
401
— This key is not valid.
-
403
— This key is not allowed to do that.
-
404
— Not found.
-
422
— The request is not valid.
-
429
— Too many calls. Try again in 60 seconds.
Example response
{
"data": {
"id": "string",
"reference": "string",
"status": "draft",
"channel": "online",
"venue_id": 1,
"buyer": {
"name": "string",
"email": "string",
"phone": "string",
"locale": "string"
},
"totals": {
"subtotal": {
"amount_cent": 1,
"currency": "EUR"
},
"discount": {
"amount_cent": 1,
"currency": "EUR"
},
"discount_code": {
"amount_cent": 1,
"currency": "EUR"
},
"voucher": {
"amount_cent": 1,
"currency": "EUR"
},
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"total": {
"amount_cent": 1,
"currency": "EUR"
}
},
"discount_code": "string",
"voucher_code": "string",
"reserved_until": "2026-09-21T14:00:00+02:00",
"sandbox": true,
"test": true,
"payment": {
"provider": "string",
"provider_ref": "string",
"redirect_url": "string",
"qr_code_url": "string"
},
"paid_at": "2026-09-21T14:00:00+02:00",
"cancelled_at": "2026-09-21T14:00:00+02:00",
"lines": [
{
"id": 1,
"product_id": 1,
"slot_id": 1,
"description": "string",
"quantity": 1,
"unit_price": {
"amount_cent": 1,
"currency": "EUR"
},
"line_total": {
"amount_cent": 1,
"currency": "EUR"
},
"vat_rate_bp": 1,
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"valid_on": "2026-09-21",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"tickets": [
{
"id": "9f1c0b4a-6b2f-4a1b-9c7e-1f2d3e4a5b6c",
"order_line_id": 1,
"order_id": "string",
"product_id": 1,
"slot_id": 1,
"description": "string",
"holder_name": "string",
"status": "valid",
"valid_on": "2026-09-21",
"is_scannable": true,
"used_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
],
"payments": [
{
"id": 1,
"provider": "string",
"provider_ref": "string",
"method": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "string",
"paid_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"refunds": [
{
"id": 1,
"payment_id": 1,
"provider": "string",
"provider_ref": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "pending",
"reason": "string",
"refunded_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
}
POST
/api/v1/orders/{id}/cancel
#
Cancel and give the places back.
Right needed:
write
Parameters
-
Accept-Language
string
· as a header
· optional
The language of the translated fields, falling back to the organisation's language.
-
Idempotency-Key
string
· as a header
· optional
Repeat a call safely: the same key with the same content returns the same answer.
-
id
string
· in the path
· required
The order's reference, e.g. ORD-AB12CD34EF.
Example call
curl
curl -X POST "https://passavo.eu/api/v1/orders/12/cancel" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->post('https://passavo.eu/api/v1/orders/12/cancel');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders/12/cancel', {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.post("https://passavo.eu/api/v1/orders/12/cancel", headers=headers)
data = response.json()["data"]
Responses
-
200
— Cancel and give the places back.
-
401
— This key is not valid.
-
403
— This key is not allowed to do that.
-
404
— Not found.
-
409
— This order cannot be cancelled.
-
422
— The request is not valid.
-
429
— Too many calls. Try again in 60 seconds.
Example response
{
"data": {
"id": "string",
"reference": "string",
"status": "draft",
"channel": "online",
"venue_id": 1,
"buyer": {
"name": "string",
"email": "string",
"phone": "string",
"locale": "string"
},
"totals": {
"subtotal": {
"amount_cent": 1,
"currency": "EUR"
},
"discount": {
"amount_cent": 1,
"currency": "EUR"
},
"discount_code": {
"amount_cent": 1,
"currency": "EUR"
},
"voucher": {
"amount_cent": 1,
"currency": "EUR"
},
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"total": {
"amount_cent": 1,
"currency": "EUR"
}
},
"discount_code": "string",
"voucher_code": "string",
"reserved_until": "2026-09-21T14:00:00+02:00",
"sandbox": true,
"test": true,
"payment": {
"provider": "string",
"provider_ref": "string",
"redirect_url": "string",
"qr_code_url": "string"
},
"paid_at": "2026-09-21T14:00:00+02:00",
"cancelled_at": "2026-09-21T14:00:00+02:00",
"lines": [
{
"id": 1,
"product_id": 1,
"slot_id": 1,
"description": "string",
"quantity": 1,
"unit_price": {
"amount_cent": 1,
"currency": "EUR"
},
"line_total": {
"amount_cent": 1,
"currency": "EUR"
},
"vat_rate_bp": 1,
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"valid_on": "2026-09-21",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"tickets": [
{
"id": "9f1c0b4a-6b2f-4a1b-9c7e-1f2d3e4a5b6c",
"order_line_id": 1,
"order_id": "string",
"product_id": 1,
"slot_id": 1,
"description": "string",
"holder_name": "string",
"status": "valid",
"valid_on": "2026-09-21",
"is_scannable": true,
"used_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
],
"payments": [
{
"id": 1,
"provider": "string",
"provider_ref": "string",
"method": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "string",
"paid_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"refunds": [
{
"id": 1,
"payment_id": 1,
"provider": "string",
"provider_ref": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "pending",
"reason": "string",
"refunded_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
}
POST
/api/v1/orders/{id}/checkout
#
The payment link from the connected provider.
Right needed:
write
This call sends a request body.
Parameters
-
Accept-Language
string
· as a header
· optional
The language of the translated fields, falling back to the organisation's language.
-
Idempotency-Key
string
· as a header
· optional
Repeat a call safely: the same key with the same content returns the same answer.
-
id
string
· in the path
· required
The order's reference, e.g. ORD-AB12CD34EF.
Example call
curl
curl -X POST "https://passavo.eu/api/v1/orders/12/checkout" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'
PHP
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->withHeader('Idempotency-Key', (string) Str::uuid())
->post('https://passavo.eu/api/v1/orders/12/checkout', []);
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders/12/checkout', {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({}),
});
const { data } = await response.json();
Python
import uuid
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY", "Idempotency-Key": str(uuid.uuid4())}
response = requests.post("https://passavo.eu/api/v1/orders/12/checkout", headers=headers, json={})
data = response.json()["data"]
Responses
-
200
— The payment link from the connected provider.
-
401
— This key is not valid.
-
403
— This key is not allowed to do that.
-
404
— Not found.
-
409
— This organisation has no payment provider connected.
-
422
— The request is not valid.
-
429
— Too many calls. Try again in 60 seconds.
Example response
{
"data": {
"id": "string",
"reference": "string",
"status": "draft",
"channel": "online",
"venue_id": 1,
"buyer": {
"name": "string",
"email": "string",
"phone": "string",
"locale": "string"
},
"totals": {
"subtotal": {
"amount_cent": 1,
"currency": "EUR"
},
"discount": {
"amount_cent": 1,
"currency": "EUR"
},
"discount_code": {
"amount_cent": 1,
"currency": "EUR"
},
"voucher": {
"amount_cent": 1,
"currency": "EUR"
},
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"total": {
"amount_cent": 1,
"currency": "EUR"
}
},
"discount_code": "string",
"voucher_code": "string",
"reserved_until": "2026-09-21T14:00:00+02:00",
"sandbox": true,
"test": true,
"payment": {
"provider": "string",
"provider_ref": "string",
"redirect_url": "string",
"qr_code_url": "string"
},
"paid_at": "2026-09-21T14:00:00+02:00",
"cancelled_at": "2026-09-21T14:00:00+02:00",
"lines": [
{
"id": 1,
"product_id": 1,
"slot_id": 1,
"description": "string",
"quantity": 1,
"unit_price": {
"amount_cent": 1,
"currency": "EUR"
},
"line_total": {
"amount_cent": 1,
"currency": "EUR"
},
"vat_rate_bp": 1,
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"valid_on": "2026-09-21",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"tickets": [
{
"id": "9f1c0b4a-6b2f-4a1b-9c7e-1f2d3e4a5b6c",
"order_line_id": 1,
"order_id": "string",
"product_id": 1,
"slot_id": 1,
"description": "string",
"holder_name": "string",
"status": "valid",
"valid_on": "2026-09-21",
"is_scannable": true,
"used_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
],
"payments": [
{
"id": 1,
"provider": "string",
"provider_ref": "string",
"method": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "string",
"paid_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"refunds": [
{
"id": 1,
"payment_id": 1,
"provider": "string",
"provider_ref": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "pending",
"reason": "string",
"refunded_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
}
POST
/api/v1/orders/{id}/invoice-request
#
Ask for an invoice in someone's name.
Right needed:
write
This call sends a request body.
Parameters
-
Accept-Language
string
· as a header
· optional
The language of the translated fields, falling back to the organisation's language.
-
Idempotency-Key
string
· as a header
· optional
Repeat a call safely: the same key with the same content returns the same answer.
-
id
string
· in the path
· required
The order's reference, e.g. ORD-AB12CD34EF.
Example call
curl
curl -X POST "https://passavo.eu/api/v1/orders/12/invoice-request" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'
PHP
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->withHeader('Idempotency-Key', (string) Str::uuid())
->post('https://passavo.eu/api/v1/orders/12/invoice-request', []);
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders/12/invoice-request', {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({}),
});
const { data } = await response.json();
Python
import uuid
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY", "Idempotency-Key": str(uuid.uuid4())}
response = requests.post("https://passavo.eu/api/v1/orders/12/invoice-request", headers=headers, json={})
data = response.json()["data"]
Responses
-
201
— Ask for an invoice in someone's name.
-
401
— This key is not valid.
-
403
— This key is not allowed to do that.
-
404
— Not found.
-
409
— The order is not in a state that allows this.
-
422
— The request is not valid.
-
429
— Too many calls. Try again in 60 seconds.
Example response
{
"data": {
"order_id": "string",
"requested_at": "2026-09-21T14:00:00+02:00",
"company_name": "string",
"vat_number": "string",
"vat_number_valid": true,
"country": "string",
"invoice_number": "string"
}
}
POST
/api/v1/orders/{id}/mark-paid
#
Paid outside the provider (transfer, cash).
Right needed:
write
This call sends a request body.
Parameters
-
Accept-Language
string
· as a header
· optional
The language of the translated fields, falling back to the organisation's language.
-
Idempotency-Key
string
· as a header
· optional
Repeat a call safely: the same key with the same content returns the same answer.
-
id
string
· in the path
· required
The order's reference, e.g. ORD-AB12CD34EF.
Example call
curl
curl -X POST "https://passavo.eu/api/v1/orders/12/mark-paid" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'
PHP
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->withHeader('Idempotency-Key', (string) Str::uuid())
->post('https://passavo.eu/api/v1/orders/12/mark-paid', []);
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders/12/mark-paid', {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({}),
});
const { data } = await response.json();
Python
import uuid
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY", "Idempotency-Key": str(uuid.uuid4())}
response = requests.post("https://passavo.eu/api/v1/orders/12/mark-paid", headers=headers, json={})
data = response.json()["data"]
Responses
-
200
— Paid outside the provider (transfer, cash).
-
401
— This key is not valid.
-
403
— This key is not allowed to do that.
-
404
— Not found.
-
409
— The order is not in a state that allows this.
-
422
— The request is not valid.
-
429
— Too many calls. Try again in 60 seconds.
Example response
{
"data": {
"id": "string",
"reference": "string",
"status": "draft",
"channel": "online",
"venue_id": 1,
"buyer": {
"name": "string",
"email": "string",
"phone": "string",
"locale": "string"
},
"totals": {
"subtotal": {
"amount_cent": 1,
"currency": "EUR"
},
"discount": {
"amount_cent": 1,
"currency": "EUR"
},
"discount_code": {
"amount_cent": 1,
"currency": "EUR"
},
"voucher": {
"amount_cent": 1,
"currency": "EUR"
},
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"total": {
"amount_cent": 1,
"currency": "EUR"
}
},
"discount_code": "string",
"voucher_code": "string",
"reserved_until": "2026-09-21T14:00:00+02:00",
"sandbox": true,
"test": true,
"payment": {
"provider": "string",
"provider_ref": "string",
"redirect_url": "string",
"qr_code_url": "string"
},
"paid_at": "2026-09-21T14:00:00+02:00",
"cancelled_at": "2026-09-21T14:00:00+02:00",
"lines": [
{
"id": 1,
"product_id": 1,
"slot_id": 1,
"description": "string",
"quantity": 1,
"unit_price": {
"amount_cent": 1,
"currency": "EUR"
},
"line_total": {
"amount_cent": 1,
"currency": "EUR"
},
"vat_rate_bp": 1,
"vat": {
"amount_cent": 1,
"currency": "EUR"
},
"valid_on": "2026-09-21",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"tickets": [
{
"id": "9f1c0b4a-6b2f-4a1b-9c7e-1f2d3e4a5b6c",
"order_line_id": 1,
"order_id": "string",
"product_id": 1,
"slot_id": 1,
"description": "string",
"holder_name": "string",
"status": "valid",
"valid_on": "2026-09-21",
"is_scannable": true,
"used_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
],
"payments": [
{
"id": 1,
"provider": "string",
"provider_ref": "string",
"method": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "string",
"paid_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"refunds": [
{
"id": 1,
"payment_id": 1,
"provider": "string",
"provider_ref": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "pending",
"reason": "string",
"refunded_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
],
"created_at": "2026-09-21T14:00:00+02:00",
"updated_at": "2026-09-21T14:00:00+02:00"
}
}
POST
/api/v1/orders/{id}/refund
#
Refund in full or in part.
Right needed:
write
This call sends a request body.
Parameters
-
Accept-Language
string
· as a header
· optional
The language of the translated fields, falling back to the organisation's language.
-
Idempotency-Key
string
· as a header
· optional
Repeat a call safely: the same key with the same content returns the same answer.
-
id
string
· in the path
· required
The order's reference, e.g. ORD-AB12CD34EF.
Example call
curl
curl -X POST "https://passavo.eu/api/v1/orders/12/refund" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'
PHP
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->withHeader('Idempotency-Key', (string) Str::uuid())
->post('https://passavo.eu/api/v1/orders/12/refund', []);
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders/12/refund', {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({}),
});
const { data } = await response.json();
Python
import uuid
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY", "Idempotency-Key": str(uuid.uuid4())}
response = requests.post("https://passavo.eu/api/v1/orders/12/refund", headers=headers, json={})
data = response.json()["data"]
Responses
-
201
— Refund in full or in part.
-
401
— This key is not valid.
-
403
— This key is not allowed to do that.
-
404
— Not found.
-
409
— There is nothing (left) to refund.
-
422
— The request is not valid.
-
429
— Too many calls. Try again in 60 seconds.
Example response
{
"data": {
"id": 1,
"payment_id": 1,
"provider": "string",
"provider_ref": "string",
"amount": {
"amount_cent": 1,
"currency": "EUR"
},
"status": "pending",
"reason": "string",
"refunded_at": "2026-09-21T14:00:00+02:00",
"created_at": "2026-09-21T14:00:00+02:00"
}
}
GET
/api/v1/sandbox/payments/{reference}
#
The simulated payment page of the sandbox.
Right needed:
No key needed
Parameters
-
reference
string
· in the path
· required
The order's reference, e.g. ORD-AB12CD34EF.
-
signature
string
· in the url
· optional
The signature from the link; do not change it.
-
expires
integer
· in the url
· optional
When the link expires, as a timestamp.
-
return_url
string
· in the url
· optional
Where the buyer goes afterwards.
Example call
curl
curl "https://passavo.eu/api/v1/sandbox/payments/12" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->get('https://passavo.eu/api/v1/sandbox/payments/12');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/sandbox/payments/12', {
method: 'GET',
headers: {
Accept: 'application/json',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json"}
response = requests.get("https://passavo.eu/api/v1/sandbox/payments/12", headers=headers)
data = response.json()["data"]
Responses
-
200
— The simulated payment page of the sandbox.
-
302
— Back to the integration's return_url.
-
403
— This link is not valid or has expired.
-
404
— Not found.
POST
/api/v1/sandbox/payments/{reference}
#
Settle the simulated payment.
Right needed:
No key needed
Parameters
-
reference
string
· in the path
· required
The order's reference, e.g. ORD-AB12CD34EF.
-
signature
string
· in the url
· optional
The signature from the link; do not change it.
-
expires
integer
· in the url
· optional
When the link expires, as a timestamp.
-
return_url
string
· in the url
· optional
Where the buyer goes afterwards.
Example call
curl
curl -X POST "https://passavo.eu/api/v1/sandbox/payments/12" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->post('https://passavo.eu/api/v1/sandbox/payments/12');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/sandbox/payments/12', {
method: 'POST',
headers: {
Accept: 'application/json',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json"}
response = requests.post("https://passavo.eu/api/v1/sandbox/payments/12", headers=headers)
data = response.json()["data"]
Responses
-
200
— Settle the simulated payment.
-
302
— Back to the integration's return_url.
-
403
— This link is not valid or has expired.
-
404
— Not found.