net_amount frozen in each quote). This page is the money
model your finance team needs.
The cycle
- Throughout the month you create bookings; each carries a
paid_amount_net. - At month end Safariat aggregates your bookings, refunds, and adjustments into one settlement.
- The settlement moves to
ISSUED; asettlement.issuedwebhook fires and a PDF invoice becomes available. - You pay the
net_dueby bank transfer beforedue_at. - A Safariat admin marks it
PAIDonce the transfer is received.
settlement_id is null until it is invoiced, then points at the
settlement that included it.
Amounts
MAD, 2-decimal
string). SettlementDetail exposes the per-line breakdown:
Invoice numbering
Live settlements are numberedINV-PRT-<year>-<sequence>, for example INV-PRT-2026-000042.
The sandbox does not issue settlements, so you will not retrieve any with a sk_test_* key. Should Safariat produce one for internal verification, it is numbered in a separate series, INV-PRT-TEST-<year>-<sequence>, carries a test banner on its PDF and test_mode: true on its payload. The two series never collide, so a verification document can never be mistaken for an accounting one.
Status lifecycle
Endpoints
GET /settlements— list (paginated;DRAFTis never returned).GET /settlements/{id}— detail withlines.GET /settlements/{id}/invoice.pdf— redirect to the pre-signed invoice PDF.
Sandbox (
sk_test_*) never issues a settlement — bookings are flagged
test_mode=true. Use the response examples to model
your reconciliation logic, and validate it end to end only against production.