← SwiftInvoicePro

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.

92,110
events in 5 min (measured)
0.00%
failures (measured)
319 ms
p99 folio to invoice (measured)
0
bytes stored per request

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.

Response (swiftinvoicepro.l3.v1)
{
  "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

schemastringAlways swiftinvoicepro.l3.v1 — versioned, never changes shape silently
lineItems[].net / grossnumberPer-line amounts, tax applied by category
lineItems[].taxes[]arrayEach tax with name, rate and amount (e.g. USt 7% on room, 19% on F&B)
lineItems[].sourceobjectfolioId + lineIndex — every output line traces to an input line
perNightLevies[]arrayCity / tourist taxes charged per room-night
taxSummary[]arrayTax totals grouped by name and rate, ready for VAT reclaim
currencyobjectPosting and billing currency with the FX rate used
totalsobjectnet, tax, gross and gross in billing currency
checks.linesBalancebooleanLine totals + levies reconcile exactly to gross
checks.storedbooleanAlways 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.