Skip to content

Expense Payment

Expense payments represent outgoing payments made to settle expenses with type invoice. They track payment details including creditor information, bank accounts, execution dates, and payment references. The system supports Swiss banking standards including QR-bill payments, IBAN validation, and automatic reconciliation with bank transactions.

Allowed query parameters

Filters

FilterTypeDescription
statusStringFilter by payment status:
pending (not yet executed), transmitted (a subset of pending: transmitted but not yet executed), executed
has_bank_transaction_matchBooleanFilter by bank transaction match status

Sorting

creditor_name, execute_at, executed_at, amount

Includes

expense.company.media, expense.media, bankAccount, bankTransactionMatch.bankTransaction.bankAccount

Create an expense payment

post
/expense/{expense_id}/payment
Attribute (* required)TypeDescription
bank_account_idString?Bank account ID for payment execution
bank_payment_typeString?Payment type: credit_transfer, credit_transfer_qrr, credit_transfer_scor
amount *FloatPayment amount (must be > 0)
creditor_ibanString?Creditor IBAN (validated for Swiss/Liechtenstein)
creditor_bicString?Creditor BIC (required for non-CH/LI IBANs)
creditor_referenceString?Payment reference (QR or SCOR reference)
creditor_nameString?Creditor name
creditor_streetString?Creditor street address
creditor_building_noString?Creditor building number
creditor_zipString?Creditor ZIP code
creditor_cityString?Creditor city
creditor_countryString?Creditor country
messageString?Payment message/description
execute_atDate?Scheduled execution date

Example response

json
// HTTP 201 Created
{
    "id": "v7rnRjBn9o",
    "expense_id": "AG52olvLXP",
    "bank_account": null,
    "bank_payment_type": "credit_transfer",
    "amount": 540.05,
    "creditor_iban": "CH7230114000000018007",
    "creditor_iban_formatted": "CH72 3011 4000 0000 1800 7",
    "creditor_bic": null,
    "creditor_name": "Cembra MoneyBank",
    "creditor_street": "P.P.",
    "creditor_building_no": null,
    "creditor_zip": "8048",
    "creditor_city": "Zürich",
    "creditor_country": "CH",
    "creditor_reference": "10 00000 00000 06096 37449 80405",
    "creditor_reference_formatted": "10 00000 00000 06096 37449 80405",
    "creditor_address": "P.P.\nCH-8048 Zürich",
    "is_ready_for_execution": true,
    "missing_information": [],
    "message": null,
    "execute_at": "2024-01-15T00:00:00.000000Z",
    "executed_at": null,
    "transmitted_at": null,
    "is_executed": false,
    "is_pending": true,
    "is_transmitted": false
}

Update an expense payment

put
/expense/{expense_id}/payment/{id}
AttributeTypeDescription
bank_account_idString?Bank account ID for payment execution
bank_payment_typeString?Payment type: credit_transfer, credit_transfer_qrr, credit_transfer_scor
amountFloat?Payment amount (must be > 0)
creditor_ibanString?Creditor IBAN (validated for Swiss/Liechtenstein)
creditor_bicString?Creditor BIC (required for non-CH/LI IBANs)
creditor_referenceString?Payment reference (QR or SCOR reference)
creditor_nameString?Creditor name
creditor_streetString?Creditor street address
creditor_building_noString?Creditor building number
creditor_zipString?Creditor ZIP code
creditor_cityString?Creditor city
creditor_countryString?Creditor country
messageString?Payment message/description
execute_atDate?Scheduled execution date
executed_atDate?Actual execution date (sets payment as executed)

Example response

json
// HTTP 200 OK
{
    // an expense payment object
}

Retrieve an expense payment

get
/expense/{expense_id}/payment/{id}

Example response

json
// HTTP 200 OK
{
    "id": "v7rnRjBn9o",
    "expense_id": "AG52olvLXP",
    "expense": {
        "id": "AG52olvLXP",
        "number": "E-2021-0001",
        "name": "Kreditkartenabrechnung",
        "total": 540.05,
        "total_paid": 540.05,
        "total_open": 0
    },
    "bank_account": {
        "id": "bk1nRjBn9o",
        "name": "UBS Business Account",
        "currency": "CHF",
        "iban": "CH9300762011623852957"
    },
    "bank_transaction_match": null,
    "bank_payment_type": "credit_transfer_qrr",
    "amount": 540.05,
    "creditor_iban": "CH7230114000000018007",
    "creditor_iban_formatted": "CH72 3011 4000 0000 1800 7",
    "creditor_bic": null,
    "creditor_name": "Cembra MoneyBank",
    "creditor_street": "P.P.",
    "creditor_building_no": null,
    "creditor_zip": "8048",
    "creditor_city": "Zürich",
    "creditor_country": "CH",
    "creditor_reference": "10 00000 00000 06096 37449 80405",
    "creditor_reference_formatted": "10 000 00000 00060 96374 49804 05",
    "creditor_address": "P.P.\nCH-8048 Zürich",
    "is_ready_for_execution": true,
    "missing_information": [],
    "message": "Payment for invoice E-2021-0001",
    "execute_at": "2024-01-15T00:00:00.000000Z",
    "executed_at": "2024-01-15T10:30:00.000000Z",
    "transmitted_at": "2024-01-14T09:00:00.000000Z",
    "is_executed": true,
    "is_pending": false,
    "is_transmitted": false
}

Delete an expense payment

delete
/expense/{expense_id}/payment/{id}

Example response

json
// HTTP 204 No Content

List expense payments

get
/expense/{expense_id}/payment

The list endpoint accepts the same parameters as in Retrieve an expense payment and returns a paginated array of the same expense payment object in the data property.

get
/expense-payment

You can also list all expense payments across all expenses using the global endpoint.

Read more about Pagination, Filtering, Sorting and Includes on the Introduction page.

Payment Status and Validation

Payment Types

  • credit_transfer: Standard bank transfer (IBAN)
  • credit_transfer_qrr: Swiss QR-bill payment with QR reference
  • credit_transfer_scor: Payment with SCOR reference (ISO 11649)

Payment Validation

The system automatically validates payment information and provides feedback through the is_ready_for_execution and missing_information fields:

  • IBAN validation: Swiss/Liechtenstein IBANs are validated, non-CH/LI IBANs require BIC
  • QR reference validation: QR IBANs must have valid QR references
  • SCOR reference validation: SCOR references are validated according to ISO 11649
  • Required fields: Bank account, creditor information, and positive amount

Execution States

  • Pending: Payment created but not yet executed (executed_at is null). This is the broadest non-executed state and includes transmitted payments.
  • Transmitted: A sub-state of pending — a pain.001 payment order has been generated for the payment and it is awaiting confirmation from the bank (transmitted_at is set, executed_at is still null). transmitted_at is set automatically when a pain.001 file is downloaded, and is cleared when the parent expense is reverted to draft or approved.
  • Executed: Payment has been processed (executed_at is set)

Because transmitted is a subset of pending, filtering by status=pending also returns transmitted payments; use status=transmitted to narrow to only those awaiting bank confirmation. The is_transmitted flag is only true while a payment is transmitted but not yet executed; once executed_at is set, the payment is considered executed and is_transmitted becomes false.

When a payment is executed, the parent expense's total_paid amount is automatically updated, and the expense may be marked as fully paid if the total payments cover the expense amount.