Airwallex logo

Spend

Subscribe to webhook events for bill, card expense, and reimbursement report status changes.

Copy for LLMView as Markdown

The following webhook events are available for your Spend integration.

Card expense webhooks

Web app LabelEvent TypeDescription
Expenses -> Expense draftspend.expense.draftA card expense has been created.
Expenses -> Expense awaiting approvalspend.expense.awaiting_approvalA card expense has been submitted for approval, or has been approved but requires additional approvals.
Expenses -> Expense updatedspend.expense.updatedA card expense or its underlying card transaction has been updated.
Expenses -> Expense rejectedspend.expense.rejectedA card expense has been rejected.
Expenses -> Expense approvedspend.expense.approvedA card expense has been fully approved.
Expenses -> Expense archivedspend.expense.archivedA card expense has been archived.
Expenses -> Expense deletedspend.expense.deletedA 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 LabelEvent TypeDescription
Reimbursement Reports -> Report draftspend.reimbursement_report.draftA reimbursement report has been created.
Reimbursement Reports -> Report awaiting approvalspend.reimbursement_report.awaiting_approvalA reimbursement report has been submitted for approval.
Reimbursement Reports -> Report awaiting paymentspend.reimbursement_report.awaiting_paymentA reimbursement report has been approved and is awaiting payment.
Reimbursement Reports -> Report rejectedspend.reimbursement_report.rejectedA reimbursement report has been rejected.
Reimbursement Reports -> Report payment in progressspend.reimbursement_report.payment_in_progressPayment for a reimbursement report is being processed.
Reimbursement Reports -> Report paidspend.reimbursement_report.paidA reimbursement report has been paid through Airwallex.
Reimbursement Reports -> Report marked as paidspend.reimbursement_report.mark_as_paidA reimbursement report has been marked as paid externally, outside Airwallex.
Reimbursement Reports -> Report deletedspend.reimbursement_report.deletedA reimbursement report has been deleted.
Reimbursement Reports -> Report updatedspend.reimbursement_report.updatedA reimbursement report has been updated.

For more details on reimbursement operations, see Reimbursements via API.

Bill webhooks

Web app LabelEvent TypeDescription
Bills -> Bill awaiting approvalspend.bill.awaiting_approvalA bill is submitted and is awaiting approval.
Bills -> Bill updatedspend.bill.updatedA bill has been edited.
Bills -> Bill awaiting paymentspend.bill.awaiting_paymentA bill is approved and is awaiting payment.
Bills -> Bill payment in progressspend.bill.payment_in_progressA bill payment is in progress.
Bills -> Bill paidspend.bill.paidA bill is fully paid.
Bills -> Bill rejectedspend.bill.rejectedA bill's approval is rejected.
Bills -> Bill scheduledspend.bill.scheduledA bill is scheduled for payment.
Bills -> Bill deletedspend.bill.deletedA 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:

JSON
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:

FieldDescription
idUnique identifier of the card expense.
account_idThe Airwallex account ID.
legal_entity_idThe legal entity associated with this expense.
card_idThe card used for this transaction.
billing_amount / billing_currencyThe amount and currency billed to the card.
card_transactionNested object containing the card transaction details: status (for example, CLEARED), amount, and currency.
merchantThe merchant name.
statusThe expense approval status (for example, APPROVED).
sync_statusWhether the expense has been synced to an external system (NOT_SYNCED, SYNCED).
line_itemsArray of line items, each with its own accounting_field_selections.
attachmentsArray of file attachments associated with the expense.
approversArray of users who approved the expense.
commentsArray of comments on the expense.
settled_atTimestamp 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:

JSON
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": [
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:

FieldDescription
idUnique identifier of the reimbursement report.
nameThe report name (for example, Q3 Marketing Campaign).
legal_entity_idThe legal entity associated with this report.
beneficiary_idThe beneficiary who receives the reimbursement payment.
billing_currencyThe currency for the report.
statusThe report status (for example, AWAITING_PAYMENT).
sync_statusWhether the report has been synced to an external system (NOT_SYNCED, SYNCED).
approversArray of email addresses of users who approved the report.
created_byEmail 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:

JSON
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": [
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:

FieldDescription
idUnique identifier of the bill.
legal_entity_idThe legal entity associated with this bill.
invoice_numberInvoice number associated with the bill.
billing_amount / billing_currencyTotal amount and currency of the bill.
statusBill 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_messageSync status with external accounting systems (NOT_SYNCED, SYNCED, SYNC_FAILED) and any failure message.
tax_statusTax treatment of the bill (TAX_EXCLUSIVE, TAX_INCLUSIVE, UNSPECIFIED).
vendor_id / purchase_order_idVendor and purchase order associated with the bill.
bill_paymentsPayments applied to the bill. Empty until payments exist.
line_itemsLine items on the bill, each with accounting_field_selections.
attachmentsFile attachments associated with the bill. file_url requires authentication.
external_idExternal identifier for this bill in your system.
approversEmail 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.

JSON
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": [
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:

  • TRANSFERtransfer is populated and card_transaction is null.
  • CARD_TRANSACTIONcard_transaction is populated and transfer is null.
  • EXTERNAL — both transfer and card_transaction are null (payment recorded outside Airwallex).
Was this page helpful?