v1.0
Enterprise API
All systems operational

SwiftInvoice Pro — Aggregate Invoice API

One POST. Multi-PMS ingestion (Mews, Oracle Opera, SkyTouch). A branded corporate invoice in under a second. Designed to seamlessly normalize fragmented hotel folio data streams into structured enterprise payloads — no middleware to maintain.

P50 latency
420 ms
Batch limit
500 invoices / call
Residency
Isolated UK region

Overview

The aggregate-invoices endpoint accepts one normalized payload per stay, assembled from your PMS folio (Mews, Oracle Opera or SkyTouch), POS / Ancillary Systems Data (F&B, incidentals), and the corporate billing terms held for Enterprise B2B Ledgers (Choice Direct Pay / TreviPay compatible payloads). It returns a signed invoice download URL per stay. Read-only: nothing is written back.

Multi-PMS folio source
Mews, Oracle Opera (OHIP), SkyTouch. SkyTouch mapping is confirmed during pilot.
POS / Ancillary Systems Data
F&B, bar and incidental charges as posted to the PMS folio or exported by the outlet system.
Enterprise B2B Ledgers
Corporate account, PO and billing terms — Choice Direct Pay / TreviPay compatible payloads. We never touch payment rails.

Reference architecture

A thin read-only orchestration layer (your iPaaS or a scheduled export job) is the only thing you build. It reads each PMS folio once, composes the normalized payload, and POSTs. Settlement stays with your existing B2B ledger.

  ┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐
  │      Mews        │   │  Oracle Opera    │   │    SkyTouch      │
  │  (PMS — folio)   │   │  (PMS — folio)   │   │ (PMS — pilot)    │
  └────────┬─────────┘   └────────┬─────────┘   └────────┬─────────┘
           │ Connector API       │ OHIP REST          │ Folio export
           │ (read-only)         │ (read-only)        │ (read-only)
           ▼                     ▼                    ▼
       ┌─────────────────────────────────────────────────────┐
       │  Folio lines incl. POS / Ancillary Systems Data     │
       │  · Map vendor fields → SwiftInvoicePro schema       │
       └────────────────────────────┬────────────────────────┘
                                    │  HTTPS POST (Bearer)
                                    ▼
       ┌─────────────────────────────────────────────────────┐
       │  POST /api/public/aggregate-invoices                │
       │  SwiftInvoicePro — stateless normalizer, UK region  │
       │  · Validate · Normalize · Tax split · Render        │
       └────────────────────────────┬────────────────────────┘
                                    │  structured L3 invoice payload
                                    ▼
       Enterprise B2B Ledgers (Choice Direct Pay / TreviPay
       compatible payloads) · Finance / AP

Authentication

All requests require a bearer token issued to your corporate account. Tokens are scoped per environment and rotate on demand.

HTTP
Authorization: Bearer sip_live_••••••••••••••••••••••••
Never expose the key from a browser. Call the endpoint server-to-server from your orchestrator. We reject requests with a browser Origin header.

Endpoint reference

POST
https://swiftinvoicepro.com/api/public/aggregate-invoices
JSON
{
  "corporateAccountId": "acc_demo_group_0192",
  "templateId": "tmpl_corporate_standard",
  "batchItems": [
    {
      "invoiceNumber": "SIP-2026-9941",
      "pmsData": {
        "roomNumber": "304",
        "guestName": "Jane Doe",
        "checkIn": "2026-06-10",
        "checkOut": "2026-06-13",
        "roomCharges": 270.00
      },
      "posData": {
        "restaurantCharges": 45.50,
        "barTab": 18.00,
        "terminalId": "POS-BAR-02"
      },
      "crmData": {
        "corporateDiscountCode": "CORP_RATE_10",
        "discountPercentage": 10,
        "billingAddress": "1 Example Street, London, EC1A 1AA",
        "poNumber": "PO-99481-X"
      }
    }
  ]
}

Top-level fields

FieldTypeDescription
corporateAccountIdstringYour tenant ID (e.g. your hotel group).
templateIdstringBranded invoice template per brand or property group.
batchItems[]array (1–500)One entry per stay/invoice. Processed concurrently.

Quickstart

Edit the payload — the cURL, Python, and Go snippets regenerate live with your values inlined.

Live request builder

POST
https://swiftinvoicepro.com/api/public/aggregate-invoices

Valid JSON — snippets updated live

Runs against a live key-less sandbox using the same aggregation engine as production. Nothing is stored; max 25 invoices per batch.

bash
curl -X POST https://swiftinvoicepro.com/api/public/aggregate-invoices \
  -H "Authorization: Bearer $INVOICE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "corporateAccountId": "3f8b1c42-9d6e-4a17-b8f0-51c9a2e7d403",
  "templateId": "tmpl_corporate_standard",
  "batchItems": [
    {
      "invoiceNumber": "SIP-2026-9941",
      "pmsData": {
        "roomNumber": "304",
        "guestName": "Jane Doe",
        "checkIn": "2026-06-10",
        "checkOut": "2026-06-13",
        "roomCharges": 270
      },
      "posData": {
        "restaurantCharges": 45.5,
        "barTab": 18,
        "terminalId": "POS-BAR-02"
      },
      "crmData": {
        "corporateDiscountCode": "CORP_RATE_10",
        "discountPercentage": 10,
        "billingAddress": "1 Example Street, London, EC1A 1AA",
        "poNumber": "PO-99481-X"
      }
    }
  ]
}'

Edit the payload on the left — the shell snippet regenerates instantly with your values embedded.

Vendor field mapping

Drop-in folio field references for the three PMS platforms we normalize. POS / Ancillary charges and B2B ledger fields arrive via the same folio. Build this map once in your iPaaS; you never touch it again.

SwiftInvoice fieldMewsOracle Opera (OHIP)SkyTouch (pilot scope)
pmsData.roomNumberReservation.AssignedResourceId → Resource.NameRESERVATION.ROOM_NO (OHIP /rsv/v1/reservations)Confirmed during pilot
pmsData.guestNameCustomer.FirstName + LastNameNAME.FIRST_NAME + NAME.LAST_NAMEConfirmed during pilot
pmsData.checkIn / checkOutReservation.StartUtc / EndUtcRESERVATION.ARRIVAL_DATE / DEPARTURE_DATEConfirmed during pilot
pmsData.roomChargesOrderItem.Amount where Type = SpaceOrderFOLIO.TRX_AMOUNT where TRX_CODE = 'RM'Confirmed during pilot
posData.restaurantCharges (POS / Ancillary Systems Data)OrderItem.Amount where AccountingCategory = F&BFOLIO.TRX_AMOUNT where TRX_CODE in F&B groupConfirmed during pilot
posData.barTab (POS / Ancillary Systems Data)OrderItem.Amount where AccountingCategory = BarFOLIO.TRX_AMOUNT where TRX_CODE in Bar groupConfirmed during pilot
posData.terminalId (POS / Ancillary Systems Data)OrderItem.ServiceIdFOLIO.CASHIER_ID / outlet codeConfirmed during pilot
crmData.corporateDiscountCode (Enterprise B2B Ledgers)Reservation.RateId → Rate.CodePROFILE.NEGOTIATED_RATE_CODEConfirmed during pilot
crmData.discountPercentage (Enterprise B2B Ledgers)Derived from rate vs. base rateDerived from rate vs. rack rateConfirmed during pilot
crmData.billingAddress (Enterprise B2B Ledgers)Company.AddressPROFILE.ADDRESS (type = BILLING)Confirmed during pilot
crmData.poNumber (Enterprise B2B Ledgers)Reservation.Notes / Bill.PurchaseOrderNumberRESERVATION.PURCHASE_ORDERConfirmed during pilot
Oracle Opera Cloud
Pull folio + reservation via OHIP REST (/rsv/v1/reservations, /csh/v1/folios). Webhook on RESERVATION_CHECKED_OUT.
Mews
Read-only Connector API: reservations, order items and bills. HMAC-verified webhooks on reservation close.
SkyTouch
Folio export mapped during a pilot (not yet connected). Output feeds Enterprise B2B Ledgers — Choice Direct Pay / TreviPay compatible payloads.

Error codes

HTTPCodeMeaning
400VALIDATION_FAILEDPayload didn't match the schema. See details[].
401UNAUTHORIZEDMissing or invalid bearer token.
409DUPLICATE_INVOICE_NUMBERinvoiceNumber already used for this account.
422AGGREGATION_FAILEDSource totals couldn't reconcile (e.g. negative net).
429RATE_LIMITEDExceeded 50 req/s. Retry with exponential backoff.
500INTERNALInternal error. Safe to retry idempotently.

SLA & compliance

Uptime
99.95% measured monthly; service credits per MSA.
Data residency
UK-South isolated tenancy. No data leaves region.
Retention
Payloads purged 24h after successful PDF generation.
Standards
GDPR/UK-GDPR aligned; card data stays in Stripe's PCI scope (no PAN stored). Not yet SOC 2 or ISO 27001 certified.
Encryption
TLS 1.3 in transit, AES-256 at rest (KMS-managed).
Audit log
Every batchId is queryable for 7 years via /audit.

FAQ

Ready for a 30-minute integration review?

We'll map your Mews, Opera or SkyTouch folio schema live and produce a working sandbox key the same day.