v1.0
Enterprise API
All systems operational

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.

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

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.

PMS source
Oracle Opera Cloud, Mews, Cloudbeds, Protel.
POS source
Oracle Micros Simphony, Lightspeed, Toast, Square.
CRM source
Salesforce, HubSpot, SAP S/4HANA, Dynamics 365.

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 email

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_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

FieldTypeDescription
corporateAccountIdstringYour tenant ID (e.g. Whitbread group).
templateIdstringBranded 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

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_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 fieldOracle Opera (PMS)Micros Simphony (POS)Salesforce (CRM)
pmsData.roomNumberRESERVATION.ROOM_NO (OPERA Cloud REST /rsv/v1/reservations)
pmsData.guestNameNAME.FIRST_NAME + NAME.LAST_NAMEAccount.Name (fallback)
pmsData.checkIn / checkOutRESERVATION.ARRIVAL_DATE / DEPARTURE_DATE
pmsData.roomChargesFOLIO.TRX_AMOUNT where TRX_CODE = 'RM'
posData.restaurantChargesCHECK_DETAIL.TTL_DUE where REVENUE_CENTER = 'REST'
posData.barTabCHECK_DETAIL.TTL_DUE where REVENUE_CENTER = 'BAR'
posData.terminalIdWORKSTATION.WS_NAME
crmData.corporateDiscountCodePROFILE.NEGOTIATED_RATE_CODEContract.DiscountCode__c
crmData.discountPercentageContract.Discount_Percent__c
crmData.billingAddressPROFILE.ADDRESS (type = BILLING)Account.BillingAddress
crmData.poNumberRESERVATION.PURCHASE_ORDEROpportunity.PO_Number__c
Oracle Opera Cloud
Pull folio + reservation via OHIP REST (/rsv/v1/reservations, /csh/v1/folios). Webhook on RESERVATION_CHECKED_OUT.
Micros Simphony
Use Transaction Services 2.0 GetGuestCheck SOAP / mTLS REST. Filter by check_close_time since last batch.
Salesforce / SAP
Salesforce Composite API or SAP OData. Cache Contract + Account once per day; corporate metadata rarely changes.

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
SOC 2 Type II, ISO 27001, PCI-DSS SAQ-A (no PAN data stored).
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 Opera + Micros + Salesforce schema live and produce a working sandbox key the same day.