Spend
Subscribe to webhook events for bill, card expense, and reimbursement report status changes.
The following webhook events are available for your Spend integration.
Card expense webhooks
| Web app Label | Event Type | Description |
|---|---|---|
| Expenses -> Expense draft | spend.expense.draft | A card expense has been created. |
| Expenses -> Expense awaiting approval | spend.expense.awaiting_approval | A card expense has been submitted for approval, or has been approved but requires additional approvals. |
| Expenses -> Expense updated | spend.expense.updated | A card expense or its underlying card transaction has been updated. |
| Expenses -> Expense rejected | spend.expense.rejected | A card expense has been rejected. |
| Expenses -> Expense approved | spend.expense.approved | A card expense has been fully approved. |
| Expenses -> Expense archived | spend.expense.archived | A card expense has been archived. |
| Expenses -> Expense deleted | spend.expense.deleted | A card expense has been deleted. This occurs when a bill is paid using a card transaction that already has an associated card expense. |
For more details on card expense operations, see Card expenses via API.
Reimbursement report webhooks
| Web app Label | Event Type | Description |
|---|---|---|
| Reimbursement Reports -> Report draft | spend.reimbursement_report.draft | A reimbursement report has been created. |
| Reimbursement Reports -> Report awaiting approval | spend.reimbursement_report.awaiting_approval | A reimbursement report has been submitted for approval. |
| Reimbursement Reports -> Report awaiting payment | spend.reimbursement_report.awaiting_payment | A reimbursement report has been approved and is awaiting payment. |
| Reimbursement Reports -> Report rejected | spend.reimbursement_report.rejected | A reimbursement report has been rejected. |
| Reimbursement Reports -> Report payment in progress | spend.reimbursement_report.payment_in_progress | Payment for a reimbursement report is being processed. |
| Reimbursement Reports -> Report paid | spend.reimbursement_report.paid | A reimbursement report has been paid through Airwallex. |
| Reimbursement Reports -> Report marked as paid | spend.reimbursement_report.mark_as_paid | A reimbursement report has been marked as paid externally, outside Airwallex. |
| Reimbursement Reports -> Report deleted | spend.reimbursement_report.deleted | A reimbursement report has been deleted. |
| Reimbursement Reports -> Report updated | spend.reimbursement_report.updated | A reimbursement report has been updated. |
For more details on reimbursement operations, see Reimbursements via API.
Bill webhooks
| Web app Label | Event Type | Description |
|---|---|---|
| Bills -> Bill awaiting approval | spend.bill.awaiting_approval | A bill is submitted and is awaiting approval. |
| Bills -> Bill updated | spend.bill.updated | A bill has been edited. |
| Bills -> Bill awaiting payment | spend.bill.awaiting_payment | A bill is approved and is awaiting payment. |
| Bills -> Bill payment in progress | spend.bill.payment_in_progress | A bill payment is in progress. |
| Bills -> Bill paid | spend.bill.paid | A bill is fully paid. |
| Bills -> Bill rejected | spend.bill.rejected | A bill's approval is rejected. |
| Bills -> Bill scheduled | spend.bill.scheduled | A bill is scheduled for payment. |
| Bills -> Bill deleted | spend.bill.deleted | A bill is deleted. |
For more details on bill operations, see Bills via API.
Payload examples
Examples of different Spend event data objects are displayed below.
Card expense approved
When a card expense is fully approved, you receive a spend.expense.approved event with the following payload:
1{2 "id": "2a396f97-92f4-3075-98fa-43acf6e87412",3 "name": "spend.expense.approved",4 "org_id": "acct_t6nlGSCgPpWIBE-3ncOTxA",5 "data": {6 "account_id": "acct_--hXbQInMnenHjfxoO0mTg",7 "accounting_field_selections": [],8 "approvers": [],9 "attachments": [],10 "billing_amount": "50.00",11 "billing_currency": "AUD",12 "card_id": "2a6c461c-efdb-465f-8b0a-c2e7040a878e",13 "comments": [],14 "created_at": "2025-09-08T10:00:00.000000Z",15 "description": null,16 "id": "47725807-2085-443e-9c2c-ce9ca9627247",17 "legal_entity_id": "le_8CqerfacM_aSwB3G3SnAOw",18 "line_items": [19 {20 "accounting_field_selections": [],21 "description": null,22 "id": "09a60121-a387-39d4-b46e-f491b6efa6a0",23 "transaction_amount": "50.00"24 }25 ],26 "merchant": "Coffee Shop",27 "settled_at": "2025-09-08T10:02:00.000000Z",28 "status": "APPROVED",29 "sync_status": "NOT_SYNCED",30 "card_transaction": {31 "status": "CLEARED",32 "amount": "50.00",33 "currency": "AUD"34 },35 "updated_at": "2025-09-08T10:02:00.000000Z"36 },37 "created_at": "2026-02-06T10:10:29+0000",38 "version": "2025-11-11"39}
Key fields in the expense data object:
| Field | Description |
|---|---|
id | Unique identifier of the card expense. |
account_id | The Airwallex account ID. |
legal_entity_id | The legal entity associated with this expense. |
card_id | The card used for this transaction. |
billing_amount / billing_currency | The amount and currency billed to the card. |
card_transaction | Nested object containing the card transaction details: status (for example, CLEARED), amount, and currency. |
merchant | The merchant name. |
status | The expense approval status (for example, APPROVED). |
sync_status | Whether the expense has been synced to an external system (NOT_SYNCED, SYNCED). |
line_items | Array of line items, each with its own accounting_field_selections. |
attachments | Array of file attachments associated with the expense. |
approvers | Array of users who approved the expense. |
comments | Array of comments on the expense. |
settled_at | Timestamp when the card transaction was settled. |
Reimbursement report awaiting payment
When a reimbursement report is approved and awaiting payment, you receive a spend.reimbursement_report.awaiting_payment event with the following payload:
1{2 "id": "2a396f97-92f4-3075-98fa-43acf6e87412",3 "name": "spend.reimbursement_report.awaiting_payment",4 "org_id": "acct_t6nlGSCgPpWIBE-3ncOTxA",5 "data": {6 "accounting_field_selections": [],7 "approvers": [8 "[email protected]",10 ],11 "beneficiary_id": "a26d26ea-8b2c-4b5f-a7a6-24edcdf2cfa5",12 "billing_currency": "AUD",13 "comments": [],14 "created_at": "2025-09-08T10:00:00.000000Z",15 "created_by": "[email protected]",16 "id": "58d716bc-c03e-4c38-80c1-b030c602c8ae",17 "legal_entity_id": "e63bad9f-28e5-4ffa-a366-1fe20b8d5647",18 "name": "Q3 Marketing Campaign",19 "status": "AWAITING_PAYMENT",20 "sync_status": "NOT_SYNCED",21 "updated_at": "2025-09-08T10:05:20.000000Z"22 },23 "created_at": "2026-02-06T10:15:07+0000",24 "version": "2025-11-11"25}
Key fields in the reimbursement report data object:
| Field | Description |
|---|---|
id | Unique identifier of the reimbursement report. |
name | The report name (for example, Q3 Marketing Campaign). |
legal_entity_id | The legal entity associated with this report. |
beneficiary_id | The beneficiary who receives the reimbursement payment. |
billing_currency | The currency for the report. |
status | The report status (for example, AWAITING_PAYMENT). |
sync_status | Whether the report has been synced to an external system (NOT_SYNCED, SYNCED). |
approvers | Array of email addresses of users who approved the report. |
created_by | Email address of the user who created the report. |
Bill awaiting approval
When a bill is submitted and awaiting approval, you receive a spend.bill.awaiting_approval event with the following payload:
1{2 "id": "2a396f97-92f4-3075-98fa-43acf6e87412",3 "name": "spend.bill.awaiting_approval",4 "org_id": "acct_t6nlGSCgPpWIBE-3ncOTxA",5 "data": {6 "id": "985461d5-016f-4e1f-a387-5f1380b42d92",7 "legal_entity_id": "le_U3jlHqQRNHWn2zAKeeT8sg",8 "invoice_number": "INV-0001",9 "billing_amount": "551.00",10 "billing_currency": "USD",11 "status": "AWAITING_APPROVAL",12 "sync_status": "SYNCED",13 "sync_error_message": null,14 "tax_status": "TAX_EXCLUSIVE",15 "description": "Office supplies for Q1 2025.",16 "approvers": [17 "[email protected]",18 "[email protected]"19 ],20 "issued_date": "2025-01-01",21 "due_date": "2025-01-31",22 "vendor_id": "ba46f0ff-8081-4db6-8333-4e011fe9561d",23 "purchase_order_id": "1541e085-16e9-45e2-a236-5dd2308ff766",24 "bill_payments": [],25 "external_id": "BILL-EXT-001",26 "attachments": [27 {28 "id": "0fd62109-cfc0-4c94-86a5-d01c42506b76",29 "content_type": "application/pdf",30 "file_name": "invoice.pdf",31 "file_url": "https://files.airwallex.com/invoice.pdf",32 "created_at": "2025-01-01T00:00:00Z"33 }34 ],35 "line_items": [36 {37 "id": "a12fca5e-4aeb-4adb-85b0-428b4f078aba",38 "unit_price": "55.10",39 "quantity": "10",40 "description": "Printer paper (A4, 80gsm)",41 "total_amount": "551.00",42 "tax_amount": "51.00",43 "accounting_field_selections": [44 {45 "type": "GENERAL_LEDGER_ACCOUNT",46 "name": null,47 "external_id": "c9fcfdee-f943-45c9-abaa-45df1601ae04",48 "value": "Office Supplies",49 "value_label": "Office Supplies"50 }51 ],52 "purchase_order_line_item_id": "1541e085-16e9-45e2-a236-5dd2308ff766"53 }54 ],55 "created_at": "2025-01-01T00:00:00Z",56 "updated_at": "2025-02-02T00:00:00Z"57 },58 "created_at": "2026-02-06T10:20:15+0000",59 "version": "2025-08-29"60}
All bill lifecycle events use the same data object shape. Only the event name and data.status differ across events such as spend.bill.awaiting_payment, spend.bill.payment_in_progress, spend.bill.rejected, spend.bill.scheduled, and spend.bill.deleted.
Key fields in the bill data object:
| Field | Description |
|---|---|
id | Unique identifier of the bill. |
legal_entity_id | The legal entity associated with this bill. |
invoice_number | Invoice number associated with the bill. |
billing_amount / billing_currency | Total amount and currency of the bill. |
status | Bill status (for example, AWAITING_APPROVAL, AWAITING_PAYMENT, PAYMENT_IN_PROGRESS, PAID, REJECTED, or SCHEDULED, and DELETED on the deleted event). Handle unknown values gracefully. |
sync_status / sync_error_message | Sync status with external accounting systems (NOT_SYNCED, SYNCED, SYNC_FAILED) and any failure message. |
tax_status | Tax treatment of the bill (TAX_EXCLUSIVE, TAX_INCLUSIVE, UNSPECIFIED). |
vendor_id / purchase_order_id | Vendor and purchase order associated with the bill. |
bill_payments | Payments applied to the bill. Empty until payments exist. |
line_items | Line items on the bill, each with accounting_field_selections. |
attachments | File attachments associated with the bill. file_url requires authentication. |
external_id | External identifier for this bill in your system. |
approvers | Email addresses of users who can approve the bill. |
The data object matches the Get bill API response body.
Bill paid
When a bill is fully paid, you receive a spend.bill.paid event with the following payload. A paid bill can include a mix of payment types. The example below shows a TRANSFER payment alongside a CARD_TRANSACTION payment.
1{2 "id": "3b407a08-a3a5-4186-b99a-54bda1c98523",3 "name": "spend.bill.paid",4 "org_id": "acct_t6nlGSCgPpWIBE-3ncOTxA",5 "data": {6 "id": "985461d5-016f-4e1f-a387-5f1380b42d92",7 "legal_entity_id": "le_U3jlHqQRNHWn2zAKeeT8sg",8 "invoice_number": "INV-0001",9 "billing_amount": "551.00",10 "billing_currency": "USD",11 "status": "PAID",12 "sync_status": "SYNCED",13 "sync_error_message": null,14 "tax_status": "TAX_EXCLUSIVE",15 "description": "Office supplies for Q1 2025.",16 "approvers": [17 "[email protected]",18 "[email protected]"19 ],20 "issued_date": "2025-01-01",21 "due_date": "2025-01-31",22 "vendor_id": "ba46f0ff-8081-4db6-8333-4e011fe9561d",23 "purchase_order_id": "1541e085-16e9-45e2-a236-5dd2308ff766",24 "bill_payments": [25 {26 "id": "b1a1f0ff-8081-4db6-8333-4e011fe95611",27 "type": "TRANSFER",28 "amount": "551.00",29 "currency": "USD",30 "transfer": {31 "transfer_id": "c2b2f0ff-8081-4db6-8333-4e011fe95622",32 "account_id": "acct_a2y0pxz3m4k5hoZldn97hjzp",33 "multi_bill": false,34 "source_amount": "551.00",35 "source_currency": "USD",36 "transfer_date": "2025-01-15"37 },38 "card_transaction": null,39 "created_at": "2025-01-15T00:00:00Z"40 },41 {42 "id": "d3c3f0ff-8081-4db6-8333-4e011fe95633",43 "type": "CARD_TRANSACTION",44 "amount": "300.00",45 "currency": "USD",46 "transfer": null,47 "card_transaction": {48 "card_transaction_id": "e4d4f0ff-8081-4db6-8333-4e011fe95644",49 "card_id": "f5e5f0ff-8081-4db6-8333-4e011fe95655",50 "account_id": "acct_a2y0pxz3m4k5hoZldn97hjzp",51 "card_funding_type": "CREDIT",52 "source_amount": "300.00",53 "source_currency": "USD",54 "transacted_at": "2025-01-15T00:00:00Z"55 },56 "created_at": "2025-01-15T00:00:00Z"57 }58 ],59 "external_id": "BILL-EXT-001",60 "attachments": [61 {62 "id": "0fd62109-cfc0-4c94-86a5-d01c42506b76",63 "content_type": "application/pdf",64 "file_name": "invoice.pdf",65 "file_url": "https://files.airwallex.com/invoice.pdf",66 "created_at": "2025-01-01T00:00:00Z"67 }68 ],69 "line_items": [70 {71 "id": "a12fca5e-4aeb-4adb-85b0-428b4f078aba",72 "unit_price": "55.10",73 "quantity": "10",74 "description": "Printer paper (A4, 80gsm)",75 "total_amount": "551.00",76 "tax_amount": "51.00",77 "accounting_field_selections": [78 {79 "type": "GENERAL_LEDGER_ACCOUNT",80 "name": null,81 "external_id": "c9fcfdee-f943-45c9-abaa-45df1601ae04",82 "value": "Office Supplies",83 "value_label": "Office Supplies"84 }85 ],86 "purchase_order_line_item_id": "1541e085-16e9-45e2-a236-5dd2308ff766"87 }88 ],89 "created_at": "2025-01-01T00:00:00Z",90 "updated_at": "2025-02-02T00:00:00Z"91 },92 "created_at": "2026-02-06T10:25:42+0000",93 "version": "2025-08-29"94}
Each entry in bill_payments is discriminated by type:
TRANSFER—transferis populated andcard_transactionisnull.CARD_TRANSACTION—card_transactionis populated andtransferisnull.EXTERNAL— bothtransferandcard_transactionarenull(payment recorded outside Airwallex).