Invoices
One invoice per calendar month per environment, listing the seats you were charged for. Read it with your API key, reconcile it against match results, and pay it by bank transfer.
What you are charged for
A seat is one player entering one paid match, charged per seat. Practice and free play are never charged, and neither is anything played with a test key.
Listing them
GET /partner/invoices
Authorization: Bearer pgs_live_…The environment comes from your key, so a live key never returns a sandbox invoice. from and to take the same yyyymmdd range as the usage meter and are optional for this list. Add status to filter — issued, paid or void.
{
"environment": "live",
"invoices": [
{
"invoiceId": "inv_01J8…",
"status": "issued",
"periodFromDay": "20260801",
"periodToDay": "20260831",
"currency": "USD",
"totalMicros": 1250000,
"seatCount": 50,
"issuedAt": 1756684800,
"dueAt": 1759276800
}
],
"nextCursor": null
}Pass nextCursor back as cursor for the next page.
Stop on a null cursor, never on an empty page. A page can come back with no invoices and a cursor still set — loop until nextCursor is null, or you will stop short of invoices that are there.
A …Micros field is micro-USD — millionths of a dollar. Divide by 1,000,000 for dollars: totalMicros: 1250000 above is $1.25. A …UsdCents field is plain cents. The fee on the $1 tier is 2.5¢, which no integer-cent field can hold — booking these as cents loses half of it on every seat.
One invoice
GET /partner/invoices/{invoiceId}The same fields plus the number and paymentReference — quote the reference on the transfer — and subtotalMicros, taxMicros, taxTreatment, taxRateBps, and seller and buyer — both parties’ registered name, address, country and VAT number as they stood when the invoice was issued. An address that changes afterwards does not rewrite an invoice you have already been sent.
The lines
GET /partner/invoices/{invoiceId}/linesOne row per seat, paginated by the same cursor, under the same stop rule. Each carries matchId, tierId, prizeUsdCents, feeUsdMicros and at. Join on matchId to reconcile a line against the match it came from.
As a spreadsheet
GET /partner/invoices/{invoiceId}/lines?format=csvThe same rows as text/csv, paginated the same way — the cursor for the next page comes back in the x-next-cursor response header, since a CSV body has nowhere to carry one. A response with no such header is the last page.
Only the first page carries the header row, so the pages concatenate into one file. Cells that would otherwise be read as a spreadsheet formula are prefixed with an apostrophe, so open the file rather than trusting a raw byte comparison against the JSON.
Which tiers earn what
A per-day, per-tier fold of the seats we recorded a fee for — the number to watch your own pricing against without waiting for a period to close.
GET /partner/seat-summary?from=20260801&to=20260831
Authorization: Bearer pgs_live_…
200 {
"environment": "live",
"fromDay": "20260801",
"toDay": "20260831",
"rows": [
{ "day": "20260801", "tierId": "usd_1", "seats": 42,
"theirStakeUsdCents": 2520, "theirStakeSeats": 42,
"feeUsdMicros": 1050000 }
]
}from and to take the same yyyymmdd range as the usage meter. Both are required here, and refuse with the same codes — see errors and limits. One row per day and tierId present in that fold; a day and tier with none was never written.
theirStakeSeats can be lower than seats. theirStakeUsdCents sums only the seats that recorded a price, and theirStakeSeats counts how many of seats are in that sum — read the two together, or a partial total reads as a complete one.
theirStakeUsdCents is cents; feeUsdMicros is micro-USD, as above. 2520 is $25.20; 1050000 is $1.05.
day is when the match was decided, not when the seat was taken. A match seated late on one day but decided the next lands in the next day’s bucket, not the one your own seat log would put it in — that is the seam to expect if you reconcile against seat time rather than match time. Reconcile a bill against the invoice lines above instead: an invoice is defined by the rows it claimed when it was issued, while this view is defined by whatever date range you hand it.
A window with too much history to fold in one call is refused, not answered short. Ask for a narrower from/to range rather than retrying the same one.
Paying
Bank transfer, quoting paymentReference — that is how a transfer is matched to an invoice. Payment is recorded against the invoice and status becomes paid; a partial payment leaves it issued until the balance arrives.
A void invoice has been cancelled and is not payable. It stays readable so a reference you hold can still be looked up.