For card, expense and travel platforms
Hotel folios in. Clean L3 JSON out. No OCR guesswork.
Your agents and OCR choke on hotel folio tables. Send the folio lines and get back an itemised, tax-split, currency-converted record that always balances — the same answer every time.
Endpoint
POST https://swiftinvoicepro.com/api/public/v1/folio-normalize curl -X POST https://swiftinvoicepro.com/api/public/v1/folio-normalize \ -H "Content-Type: application/json" \ -d @folio.json
Open evaluation endpoint, 60 requests/min per IP. Production keys, SLA and volume pricing on request. Send folio lines only — no guest names, card numbers or personal data are needed.
Try it live
Preview computed locally — press Run to call the live API.
{
"ok": true,
"schema": "swiftinvoicepro.l3.v1",
"folioId": "FOL-20261002-0412",
"poNumber": "PO-88213",
"property": {
"name": "Sample City Hotel Frankfurt",
"country": "Germany",
"currency": "EUR"
},
"stay": {
"checkIn": "2026-09-28",
"checkOut": "2026-10-01",
"nights": 3
},
"currency": {
"posting": "EUR",
"billing": "GBP",
"fxRate": 0.854701,
"fxNote": "Indicative rate"
},
"lineItems": [
{
"lineId": "FOL-20261002-0412-L1",
"date": "2026-09-28",
"description": "Room — corporate rate",
"category": "room",
"net": 165,
"taxes": [
{
"name": "USt (accommodation)",
"ratePct": 7,
"amount": 11.55
}
],
"gross": 176.55,
"source": {
"folioId": "FOL-20261002-0412",
"lineIndex": 0
}
},
{
"lineId": "FOL-20261002-0412-L2",
"date": "2026-09-29",
"description": "Room — corporate rate",
"category": "room",
"net": 165,
"taxes": [
{
"name": "USt (accommodation)",
"ratePct": 7,
"amount": 11.55
}
],
"gross": 176.55,
"source": {
"folioId": "FOL-20261002-0412",
"lineIndex": 1
}
},
{
"lineId": "FOL-20261002-0412-L3",
"date": "2026-09-30",
"description": "Room — corporate rate",
"category": "room",
"net": 165,
"taxes": [
{
"name": "USt (accommodation)",
"ratePct": 7,
"amount": 11.55
}
],
"gross": 176.55,
"source": {
"folioId": "FOL-20261002-0412",
"lineIndex": 2
}
},
{
"lineId": "FOL-20261002-0412-L4",
"date": "2026-09-29",
"description": "Dinner — restaurant",
"category": "restaurant",
"net": 48.5,
"taxes": [
{
"name": "USt (F&B)",
"ratePct": 19,
"amount": 9.22
}
],
"gross": 57.72,
"source": {
"folioId": "FOL-20261002-0412",
"lineIndex": 3
}
},
{
"lineId": "FOL-20261002-0412-L5",
"date": "2026-09-29",
"description": "Bar",
"category": "bar",
"net": 22,
"taxes": [
{
"name": "USt (F&B)",
"ratePct": 19,
"amount": 4.18
}
],
"gross": 26.18,
"source": {
"folioId": "FOL-20261002-0412",
"lineIndex": 4
}
},
{
"lineId": "FOL-20261002-0412-L6",
"date": "2026-09-30",
"description": "Parking",
"category": "other",
"net": 25,
"taxes": [
{
"name": "USt (F&B)",
"ratePct": 19,
"amount": 4.75
}
],
"gross": 29.75,
"source": {
"folioId": "FOL-20261002-0412",
"lineIndex": 5
}
}
],
"perNightLevies": [
{
"name": "City tax",
"perNight": 3,
"nights": 3,
"amount": 9
}
],
"taxSummary": [
{
"name": "USt (accommodation)",
"ratePct": 7,
"amount": 34.65
},
{
"name": "USt (F&B)",
"ratePct": 19,
"amount": 18.15
},
{
"name": "City tax",
"ratePct": null,
"amount": 9
}
],
"totals": {
"net": 590.5,
"tax": 61.8,
"gross": 652.3,
"grossInBillingCurrency": 557.52
},
"checks": {
"linesBalance": true,
"deterministic": true,
"stored": false
}
}Response fields
| schema | string | Always swiftinvoicepro.l3.v1 — versioned, never changes shape silently |
| lineItems[].net / gross | number | Per-line amounts, tax applied by category |
| lineItems[].taxes[] | array | Each tax with name, rate and amount (e.g. USt 7% on room, 19% on F&B) |
| lineItems[].source | object | folioId + lineIndex — every output line traces to an input line |
| perNightLevies[] | array | City / tourist taxes charged per room-night |
| taxSummary[] | array | Tax totals grouped by name and rate, ready for VAT reclaim |
| currency | object | Posting and billing currency with the FX rate used |
| totals | object | net, tax, gross and gross in billing currency |
| checks.linesBalance | boolean | Line totals + levies reconcile exactly to gross |
| checks.stored | boolean | Always false — the request is not kept |
Tax rates and FX in this evaluation endpoint come from a built-in reference table (UK, EU and other supported countries). In a live integration, each property's own tax codes and your contracted FX rate are used. Errors return validation_failed with field paths, or unsupported_country_or_currency.
Evaluate with real volume
Free 30-day technical evaluation with a dedicated key. Reply to my email or write to richardromero@swiftinvoicepro.com.