Standard Sale Object
The open integration spec for the EIS Bridge Vendor API — vendor-neutral, versioned, and validated by JSON Schema. Wrap this object in { "transaction": { ... } } when calling POST /transactions. Machine-readable schema: sale-object.schema.json.
Full example
{
"transaction_id": "POS-123456",
"transaction_datetime": "2026-06-07T14:23:55+08:00",
"merchant_code": "MRC123",
"branch_code": "BR001",
"pos_device_id": "POS01",
"invoice_type": "OR",
"currency": "PHP",
"customer": {
"name": "Juan Dela Cruz",
"tin": "123-456-789-000",
"address": "Quezon City",
"email": "juan@example.com",
"mobile": "09171234567"
},
"items": [
{
"line_no": 1,
"sku": "SKU001",
"barcode": "1234567890123",
"description": "Product A",
"qty": 2,
"unit": "PCS",
"unit_price": 100.0,
"discount": 0.0,
"vat_rate": 12.0,
"vat_exempt": false,
"zero_rated": false
}
],
"totals": {
"gross": 200.0,
"discount": 0.0,
"vatable_sales": 178.57,
"vat_amount": 21.43,
"vat_exempt_sales": 0.0,
"zero_rated_sales": 0.0,
"service_charge": 0.0,
"net": 200.0
},
"payment": {
"method": "CASH",
"amount": 200.0,
"details": {
"card_type": null,
"card_last4": null,
"reference_no": null,
"wallet_provider": null
}
},
"references": {
"original_transaction_id": null,
"return_or_void": false,
"return_reason": null
},
"metadata": {
"pos_version": "1.0.0",
"cashier_id": "C001",
"cashier_name": "Maria Santos"
}
}
Field reference
| Field | Type | Required | Description |
|---|---|---|---|
transaction_id |
string | Required | Unique per merchant + branch + device. Used for idempotency. |
transaction_datetime |
string (date-time) | Required | ISO 8601 datetime with timezone offset (e.g. 2026-06-07T14:23:55+08:00). |
merchant_code |
string | Required | EIS Bridge merchant identifier assigned during onboarding. |
branch_code |
string | Required | EIS Bridge branch identifier assigned during onboarding. |
pos_device_id |
string | Required | EIS Bridge POS device identifier assigned during onboarding. |
invoice_type |
string | Required | Invoice or receipt type (e.g. OR). |
currency |
string | Optional | ISO 4217 currency code. Default: PHP. |
customer |
object | Optional | Buyer details: name, tin, address, email, mobile. |
items[] |
array | Required | Minimum 1 line item. Each requires sku, description, qty, unit_price. |
items[].line_no |
integer | Optional | Line number (minimum 1). |
items[].sku |
string | Required | Product SKU. |
items[].barcode |
string | Optional | Product barcode. |
items[].description |
string | Required | Line item description. |
items[].qty |
number | Required | Quantity; must be > 0 (except return/refund scenarios). |
items[].unit |
string | Optional | Unit of measure (e.g. PCS). |
items[].unit_price |
number | Required | Unit price; minimum 0. |
items[].discount |
number | Optional | Line discount; minimum 0. |
items[].vat_rate |
number | Optional | VAT rate percentage; minimum 0. |
items[].vat_exempt |
boolean | Optional | Whether line is VAT-exempt. |
items[].zero_rated |
boolean | Optional | Whether line is zero-rated. |
totals |
object | Required | Transaction totals. Requires gross and net. |
totals.gross |
number | Required | Gross total; minimum 0. |
totals.net |
number | Required | Net total; minimum 0. |
totals.discount |
number | Optional | Total discount; minimum 0. |
totals.vatable_sales |
number | Optional | VATable sales amount. |
totals.vat_amount |
number | Optional | VAT amount. |
payment |
object | Required | Payment details. Requires method and amount. |
payment.method |
string | Required | Payment method: CASH, CARD, E-WALLET, SPLIT, etc. |
payment.amount |
number | Required | Payment amount; minimum 0. |
payment.details |
object | Optional | Card/wallet details: card_type, card_last4, reference_no, wallet_provider. |
references |
object | Optional | Void/return linkage: original_transaction_id, return_or_void, return_reason. |
metadata |
object | Optional | POS metadata: pos_version, cashier_id, cashier_name. |
Validation rules
- Date format:
transaction_datetimemust be ISO 8601 with timezone (e.g.2026-06-07T14:23:55+08:00). Formats like07/06/2026 14:23are rejected. - Numeric fields:
qtymust be > 0;unit_priceand totals must be ≥ 0. - Arrays:
itemsmust contain at least one entry. - Enums:
invoice_typeis typicallyOR(Official Receipt).payment.methodacceptsCASH,CARD,E-WALLET,SPLIT. - Email:
customer.emailmust be a valid email when provided. - Additional properties: Unknown top-level fields are rejected (
additionalProperties: false).
Idempotency & duplicates
transaction_id must be unique per merchant + branch + device combination. This prevents double-sending the same sale.
Identical resubmission
If the same transaction_id is sent again with identical data:
{
"status": "duplicate",
"transaction_id": "POS-123456",
"bridge_transaction_id": "EB-20260607-000001",
"message": "Transaction already processed."
}
Conflict (different data, same ID)
Re-submitting the same transaction_id with different items or totals returns HTTP 409 with error: "transaction_conflict".
Always generate transaction_id from your POS receipt/invoice number and scope it per merchant, branch, and device.