SwiftInvoice Pro — Aggregate Invoice API
One POST. Three source systems (PMS, POS, CRM). A branded corporate invoice in under a second. Designed to drop straight into your existing Oracle Opera, Micros Simphony, and Salesforce stack — no middleware to maintain.
Overview
The aggregate-invoices endpoint accepts a unified payload assembled from the three systems that own a hospitality stay: the Property Management System (room nights, folios), the Point-of-Sale (F&B, incidentals), and the CRM (corporate contract, billing address, PO). It returns a signed PDF download URL per invoice.
Reference architecture
A thin orchestration layer (your iPaaS, an Azure Function, or a scheduled Opera Export Job) is the only thing you build. It calls each system once, composes the payload, and POSTs.
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ Oracle Opera │ │ Micros Simphony │ │ Salesforce │
│ (PMS — folio) │ │ (POS — F&B) │ │ (CRM — contract│
└────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘
│ OHIP REST │ Transaction │ REST / Bulk
│ /rsv/v1/... │ Services 2.0 │ /sobjects
▼ ▼ ▼
┌─────────────────────────────────────────────────────┐
│ Customer Orchestrator (iPaaS / Azure Function) │
│ · Map vendor fields → SwiftInvoice schema │
│ · Cache corporate contract metadata │
└────────────────────────────┬────────────────────────┘
│ HTTPS POST (Bearer)
▼
┌─────────────────────────────────────────────────────┐
│ POST /api/public/aggregate-invoices │
│ SwiftInvoice Pro — isolated UK region │
│ · Validate · Aggregate · Brand · Render PDF │
└────────────────────────────┬────────────────────────┘
│ signed downloadUrl
▼
Finance / AP / Guest emailAuthentication
All requests require a bearer token issued to your corporate account. Tokens are scoped per environment and rotate on demand.
Authorization: Bearer sip_live_••••••••••••••••••••••••Origin header.Endpoint reference
https://swiftinvoicepro.com/api/public/aggregate-invoices{
"corporateAccountId": "acc_whitbread_0192",
"templateId": "tmpl_premier_inn_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": "WHITBREAD_10",
"discountPercentage": 10,
"billingAddress": "Whitbread Court, Houghton Regis, LU5 5XE",
"poNumber": "PO-99481-X"
}
}
]
}Top-level fields
| Field | Type | Description |
|---|---|---|
| corporateAccountId | string | Your tenant ID (e.g. Whitbread group). |
| templateId | string | Branded PDF template (Premier Inn, ibis, etc.). |
| 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
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.
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_premier_inn_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": "WHITBREAD_10",
"discountPercentage": 10,
"billingAddress": "Whitbread Court, Houghton Regis, LU5 5XE",
"poNumber": "PO-99481-X"
}
}
]
}'Edit the payload on the left — the shell snippet regenerates instantly with your values embedded.
Vendor field mapping
Drop-in column references for the three systems we see most often in enterprise hospitality stacks. Build this map once in your iPaaS; you never touch it again.
| SwiftInvoice field | Oracle Opera (PMS) | Micros Simphony (POS) | Salesforce (CRM) |
|---|---|---|---|
| pmsData.roomNumber | RESERVATION.ROOM_NO (OPERA Cloud REST /rsv/v1/reservations) | — | — |
| pmsData.guestName | NAME.FIRST_NAME + NAME.LAST_NAME | — | Account.Name (fallback) |
| pmsData.checkIn / checkOut | RESERVATION.ARRIVAL_DATE / DEPARTURE_DATE | — | — |
| pmsData.roomCharges | FOLIO.TRX_AMOUNT where TRX_CODE = 'RM' | — | — |
| posData.restaurantCharges | — | CHECK_DETAIL.TTL_DUE where REVENUE_CENTER = 'REST' | — |
| posData.barTab | — | CHECK_DETAIL.TTL_DUE where REVENUE_CENTER = 'BAR' | — |
| posData.terminalId | — | WORKSTATION.WS_NAME | — |
| crmData.corporateDiscountCode | PROFILE.NEGOTIATED_RATE_CODE | — | Contract.DiscountCode__c |
| crmData.discountPercentage | — | — | Contract.Discount_Percent__c |
| crmData.billingAddress | PROFILE.ADDRESS (type = BILLING) | — | Account.BillingAddress |
| crmData.poNumber | RESERVATION.PURCHASE_ORDER | — | Opportunity.PO_Number__c |
Error codes
| HTTP | Code | Meaning |
|---|---|---|
| 400 | VALIDATION_FAILED | Payload didn't match the schema. See details[]. |
| 401 | UNAUTHORIZED | Missing or invalid bearer token. |
| 409 | DUPLICATE_INVOICE_NUMBER | invoiceNumber already used for this account. |
| 422 | AGGREGATION_FAILED | Source totals couldn't reconcile (e.g. negative net). |
| 429 | RATE_LIMITED | Exceeded 50 req/s. Retry with exponential backoff. |
| 500 | INTERNAL | Internal error. Safe to retry idempotently. |
SLA & compliance
FAQ
Ready for a 30-minute integration review?
We'll map your Opera + Micros + Salesforce schema live and produce a working sandbox key the same day.