Spend & Expense transaction notification payloads

When you subscribe to a BILL event and the event triggers, BILL sends a notification to your provided notificationUrl. See /v3/spend/transactions in the API reference for more information about the response fields.

❗️

IMPORTANT

When you create a subscription (POST v3/subscriptions) for a Spend & Expense event, the apiToken header value is required for authentication.

See Authentication with Spend & Expense API token for information about authentication for the Spend & Expense API endpoints.

Sample spend.transaction.updated payload

In this sample unescaped JSON payload, the details of a Spend & Expense transaction are available. The notification provides a set of transaction fields.

FieldDescription
uuidBILL-generated UUID of the transaction
feesSum of transaction fees (including foreignExchangeFee)
foreignExchangeFeeForeign exchange fee, if any, on this transaction
transactionTypeTransaction type (CLEAR, DECLINE, AUTHORIZATION, or OTHER)
parentTransactionUuidBILL-generated UUID of the parent transaction. This value is set on child transactions when a parent transaction is split.
userUuidBILL-generated UUID of the user that created the transaction
rawMerchantNameRaw merchant name for the transaction
merchantNameReadable (cleaned) merchant name for the transaction
budgetUuidBILL-generated UUID of the budget that this transaction belongs to
originalAuthTransactionUuidBILL-generated UUID of the originating authorization transaction.

After a transaction is authorized, it is set as cleared when it is complete. The originalAuthTransactionUuid ties the cleared transaction to the authorized transaction. The value is null when the transaction is not authorized.
occurredTimeCreated date and time
updatedTimeUpdated date and time
authorizedTimeTransaction authorized date and time
completeSet as true if the transaction has all the required fields completed
declineReasonTransaction decline reason. This field is available when transactionType is set as DECLINE.
declineInternalReasonCodeTransaction decline reason code
customFieldsTransaction custom fields information
amountTransaction amount
receiptStatusReceipt status (VALIDATED, NOT_VALIDATED, ATTACHED, MISSING, NOT_REQUIRED, or NOT_ATTACHED)
cardUuidBILL-generated UUID of the card used to make the transaction
companyUuidBILL-generated UUID of the company in your Spend & Expense account
merchantCategoryCodeMerchant category code
{
  "metadata": {
    "eventId": "{event_id}",
    "subscriptionId": "{subscription_id}",
    "spendCompanyUuid": "{S&E_company_uuid}",
    "eventType": "spend.transaction.updated",
    "version": "1"
  },
  "transaction": {
    "uuid": "{transaction_uuid}",
    "fees": 3.21,
    "foreignExchangeFee": 2.98,
    "transactionType": "DECLINE",
    "parentTransactionUuid": "{parent_transaction_uuid}",
    "userUuid": "{user_id}",
    "rawMerchantName": "AMZN Mktp US",
    "merchantName": "Amazon",
    "budgetUuid": "{budget_uuid}",
    "originalAuthTransactionUuid": "{originating_authorization_transaction}",
    "occurredTime": "2025-12-30T18:23:01.211+00:00",
    "updatedTime": "2025-12-30T18:23:01.211+00:00",
    "authorizedTime": null,
    "complete": false,
    "declineReason": "CVV is invalid. Check if the CVV is correct and try again.",
    "declineInternalReasonCode": "invalid_cvc_code",
    "customFields": [
      {
        "uuid": "{customfield_uuid}",
        "name": "Team offsite",
        "note": null,
        "selectedValues": "Food"
      }
    ],
    "amount": 53.03,
    "receiptStatus": "NOT_ATTACHED",
    "cardUuid": "{card_uuid}",
    "companyUuid": "{company_uuid}",
    "merchantCategoryCode": "5942"
  }
}

Fields that trigger spend.transactions.updated notifications

When changes are made to a set of fields in a bill, the spend.transactions.updated event notification is triggered.

FieldDescription
transactionTypeTransaction type (CLEAR, DECLINE, AUTHORIZATION, or OTHER).

Note: The AUTHORIZATION or DECLINE value is set at the time of the transaction. The CLEAR value is set after BILL has moved money from the funding account. In addition, BILL may update a transaction a few minutes after the transaction is created.
parentTransactionUuidBILL-generated UUID of the parent transaction. This value is set on child transactions when a parent transaction is split.
budgetUuidBILL-generated UUID of the budget that this transaction belongs to
customFieldsTransaction custom fields information.

Note: BILL will not send a notification when a custom field is updated with PATCH /v3/spend/custom-fields/{customFieldId}.
receiptStatusReceipt status (VALIDATED, NOT_VALIDATED, ATTACHED, MISSING, NOT_REQUIRED, or NOT_ATTACHED)