Recording customer payments
A customer payment is an incoming remittance from a shipper/customer applied against their receivable invoices. It has two levels:- The payment (
pym_…) — the money that arrived: an amount, a currency, a transaction date, and the check/ACH reference it came in on. - Its line items (
pli_…) — how that money is split across your invoices. Each line item applies an amount to a specific invoice (inv_…) for a specific customer (cus_…).
This is the accounts-receivable (money in) side. For paying carriers (money out) the resource is
bill-payments, which is a separate endpoint family. For the AR concepts behind these records — reconciliation, short-pays, and the like — see Remittances Management and Accounts Receivable Management.Create a payment with its line items
The primary flow is a singlePOST /api/rest/customer_payments that inserts the payment and its line items together, using a nested paymentLineItems.data array:
When line items are nested under the payment like this, omit
paymentId on each line item — the parent payment supplies the link. Fields you don’t set come back null.Required fields
Field reference
Payment (pym_…)
Line item (
pli_…)
The line-item amounts don’t have to sum to the payment’s
totalAmount — a remittance can be partially applied and reconciled later. For the complete column list, see the customer_payments and customer_payment_line_items entries in the API Reference.Two different status fields
These are not the same field, and the difference matters:
- Payment
statusis optional and drawn fromPaymentStatusesEnum:PENDING,SUCCEEDED,FAILED,DISPUTED,REFUNDED,PAYMENT_REVERSED— each defined in the Vocabulary. Most imported payments leave it unset; read an unset value asSUCCEEDEDfor display and reconciliation. - Line-item
statusis a required free-form string, not a fixed enum. In practice it carries reconciliation states likeapplied,paid, orcompleted. Don’t assume a closed set of values or a fixed casing.
Read payments back
POST /api/rest/customer_payments/search with a Hasura-style where:
Create many at once
POST /api/rest/bulk-customer-payments inserts an array of payments in one call. The response is a Hasura mutation envelope — read the created rows from returning:
Update and delete
Line items on their own
If you’d rather attach line items to an existing payment (or manage them independently), use the line-item endpoints directly —GET/POST /api/rest/customer_payment_line_items and .../customer_payment_line_items/{id}. Here, set paymentId explicitly to link the line item to its payment:
POST /api/rest/bulk-customer-payment-line-items bulk-creates several at once, the same { "inputs": [...] } shape as bulk-customer-payments:
How applications update invoices
Creating, changing, or deleting a linked payment line item automatically recalculates the target invoice in the standard API-managed model:PART_PAID; zero or less produces PAID. Removing the application reopens a previously paid or partially paid invoice when its full balance is due again. A payment header without an invoice-linked line item does not change any invoice.
Correct or reverse an application
Update the original line item’s amount when the allocation was wrong. Delete it when the application should no longer exist:status does not reverse the amount. Preserve the line-item ID or its stable source key so corrections and returns update the original application instead of creating a second one.
Idempotency and deduplication
If you setsourceSystem and sourceSystemId, the pair is unique per tenant — within your organization no two payments can share it, and no two line items can either. Use your own remittance/transaction reference as sourceSystemId so re-posting the same remittance conflicts instead of creating a duplicate — a simple idempotency key for retried imports.
For payment line items, use a key that identifies the individual application, not only the parent remittance. One payment can be split across several invoices, and each application must be independently correctable.
For the complete request and response schemas, see the
customer_payments and customer_payment_line_items entries in the API Reference. To submit carrier invoices (the payables side) instead, see Submitting carrier invoices via API.
