Payments
Use POST /v3/payments
to pay a vendor bill. If you make a vendor payment without creating a bill, a new bill is auto-generated at the time of payment. You can also use POST /v3/payments/bulk
to pay multiple bills with one request. See the /v3/payments API for the complete list of available operations.
When you pay a vendor, BILL sends a payment check to the vendor. To enable electronic payments, vendor bank account information and additional vendor details are required. See Vendors for more information.
See Payables payment timing in the BILL Help Center to learn about the standard BILL payment process and timing.
Creating a payment is an MFA-trusted operationCreating a payment requires an MFA-trusted API session. See MFA setup in the API reference for information about the BILL MFA process.
Create a payment
In your POST /v3/payments
request, set the required fields.
Field | Description |
---|---|
| BILL-generated ID of the bill to be paid. The value begins with |
| Bill payment processing date in the If the funding account type is set as |
| Funding account information.
|
| Payment amount information. For a payment in an international currency (not USD), this value is in the local currency. |
| Payment processing options.
|
See the /v3/payments API for more information about the other payment fields you can set.
Sample request
In this cURL example, a vendor payment of $228.99
is created for the vendor (vendorId
). The billId
is associated with the payment to link the payment with the bill line items and amount. Funding account details are added to provide a bank account source for the payment.
You can retrieve the bank account id
with GET /v3/bankaccounts
. See Get list of bank accounts in the API reference for more information.
curl --request POST \
--url 'https://gateway.stage.bill.com/connect/v3/payments' \
--header 'content-type: application/json' \
--header 'devKey: {developer_key}' \
--header 'sessionId: {session_id}' \
--data '{
"vendorId": "{vendor_id}",
"billId": "{bill_id}",
"processDate": "2025-12-31",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}"
},
"amount": 228.99,
"processingOptions": {
"requestPayFaster": false,
"createBill": false
}
}'
In the above request, set createBill
as true
if you want to create a new bill for the vendor payment. Do not set billId
in your payment request.
Response
In the response, a BILL-generated payment id
is available. The value begins with stp
. In addition, disbursement information is available based on the type of payment. The singleStatus
field provides a complete view of your payment based on status
and disbursementStatus
at different stages of your payment lifecycle. See Single status payment values for more information.
{
"id": "stp01ZZRCUFIQWHP6ldb",
"vendorId": "{vendor_id}",
"vendorName": "{vendor_name}",
"billId": "{bill_id}",
"billPayments": [
{
"id": "{bill_payment_id}",
"billId": "{bill_id}",
"amount": 228.99
}
],
"description": "Inv #20251231",
"processDate": "2025-12-31",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}"
},
"amount": 228.99,
"processingOptions": {
"requestPayFaster": false,
"createBill": false,
"requestCheckDeliveryType": "STANDARD"
},
"transactionNumber": "EPKZLNTSTYSEUWVALISV",
"confirmationNumber": "P24123101 - 0411839",
"status": "SCHEDULED",
"onlinePayment": true,
"disbursementType": "ACH",
"createdTime": "2025-12-30T23:56:52.127+00:00",
"updatedTime": "2025-12-30T23:56:52.127+00:00",
"createdBy": "{user_id}",
"voidInfo": [],
"singleStatus": "SCHEDULED"
}
If the payment is created in an international currency (not USD), there are three payment amount-related fields to note.
Field | Description |
---|---|
amount | Payment amount information. For a payment in an international currency (not USD), this value is in the local currency. |
fundingAmount | Payment amount in USD |
exchangeRate | Exchange rate for the payment in an international currency (not USD) |
You can use the payment id
for other payment operations. See the /v3/payments API for more information.
Create a payment with Pay Faster
With BILL Pay Faster, you can pay vendors with faster check and ePayment options.
To use the Pay Faster feature, set processDate
and processingOptions
based on the disbursement method accepted by the vendor (only CHECK
or ACH
).
Pay Faster | Rules (for a payment created on Monday, December 1, 2025 at 9 AM PT / 12 PM ET) | Estimated payment arrival date |
---|---|---|
ACH payment | Earliest |
|
Check payment via UPS 1-day delivery | Earliest |
|
Check payment via UPS 2-days delivery | Earliest |
|
Check payment via UPS 3-days delivery | Earliest |
|
Check payment via USPS to a PO Box or a non-serviceable vendor address | Earliest |
|
See Pay Faster and other expedited payment methods in the BILL Help Center for information about payment limits and Pay Faster pricing.
Sample request: Pay Faster ACH payment
In this cURL example, a vendor payment of $228.99
is created on Monday, December 1, 2025 at 9 AM PT / 12 PM ET. For the Pay Faster ACH payment, processDate
is set as 2025-12-01
. The required processingOptions
fields are set.
curl --request POST \
--url 'https://gateway.stage.bill.com/connect/v3/payments' \
--header 'content-type: application/json' \
--header 'devKey: {developer_key}' \
--header 'sessionId: {session_id}' \
--data '{
"vendorId": "{vendor_id}",
"billId": "{bill_id}",
"description": "Inv #20251201",
"processDate": "2025-12-01",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}"
},
"amount": 228.99,
"processingOptions": {
"requestPayFaster": true,
"requestCheckDeliveryType": "RTP_DELIVERY"
}
}'
Response
In the response, a BILL-generated payment id
is available. The value begins with stp
. In addition, the processDate
and processingOptions
information confirms that a Pay Faster ACH payment has been created.
{
"id": "stp02TSDTDYOEJX936sf",
"vendorId": "{vendor_id}",
"billId": "{bill_id}",
"billPayments": [
{
"id": "{bill_payment_id}",
"billId": "{bill_id}",
"amount": 228.99
}
],
"description": "Inv #20251201",
"processDate": "2025-12-01",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}"
},
"amount": 228.99,
"processingOptions": {
"requestPayFaster": true,
"createBill": false,
"requestCheckDeliveryType": "RTP_DELIVERY"
},
"transactionNumber": "POMMJRZIIVWFSCYVVCFV",
"confirmationNumber": "P25042502 - 0716978",
"status": "SCHEDULED",
"onlinePayment": true,
"disbursementType": "ACH",
"createdTime": "2025-12-01T17:00:00.000+00:00",
"updatedTime": "2025-12-01T17:00:00.000+00:00",
"createdBy": "{user_id}",
"voidInfo": [],
"cancelRequestSubmitted": false,
"singleStatus": "SCHEDULED"
}
Create a bulk payment
Bulk payments at BILL follow a set of rules.
- Successful response: In your bulk payment request, all your bill payments must be successful for a successful response. If any bill payment is not successful, the entire request fails and none of the bills in the request are paid.
- You can pay multiple vendors: You can pay multiple vendors with one
POST /v3/payments/bulk
request. In this case, make sure that you do not setvendorId
in your request. - You can only pay existing bills: When you create a single payment with
POST /v3/payments
, you can setcreateBill
astrue
in your request for creating a new bill for a vendor payment. In your bulk payment request, an existing billId is required for each bill to be paid.
In your POST /v3/payments/bulk
request, set the required fields.
Field | Description |
---|---|
| Bill payment processing date in the
|
| Funding account information.
|
| BILL-generated ID of the bill to be paid. This value begins with |
| Payment amount |
See the /v3/payments/bulk API for more information about the other bulk payment fields you can set.
Bulk payment to multiple vendors
In this cURL example, a bulk payment is created with two bills that belong to different vendors. The billId
is associated with each payment. Funding account details are added to provide a bank account source for the payment.
BILL v3 payments is powerfulYour
POST /v3/payments/bulk
request can be the same regardless of whether you are paying a single vendor or multiple vendors.
curl --request POST \
--url 'https://gateway.stage.bill.com/connect/v3/payments/bulk' \
--header 'content-type: application/json' \
--header 'devKey: {developer_key}' \
--header 'sessionId: {session_id}' \
--data '{
"processDate": "2025-12-16",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}"
},
"payments": [
{
"billId": "{bill_id01}",
"amount": 228.99
},
{
"billId": "{bill_id02}",
"amount": 142.00
}
]
}'
Sample response
In this successful response, a different BILL-generated payment id
is available for each payment made to each vendor. Each id
value begin with stp
.
The billPayments
object shows that the payment amount
is applied to each bill. The bill payment is identified by a bill payment id
. This value begins with blp
. In addition, disbursement information is available based on the type of payment.
The singleStatus
field provides a complete view of your payment based on status
and disbursementStatus
at different stages of your payment lifecycle. See Single status payment values for more information.
{
"payments": [
{
"id": "stp02TAXHUYITPCGf3b5",
"vendorId": "{vendor_id01}",
"billId": "{bill_id01}",
"billPayments": [
{
"id": "{bill_payment_id01}",
"billId": "{bill_id01}",
"amount": 228.99
}
],
"description": "Inv #1216202502",
"processDate": "2025-12-16",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}"
},
"amount": 228.99,
"processingOptions": {
"requestPayFaster": false,
"requestCheckDeliveryType": "STANDARD"
},
"transactionNumber": "EHHXAICWPQDUEIBOEAER",
"confirmationNumber": "P24121502 - 1389127",
"status": "SCHEDULED",
"onlinePayment": true,
"disbursementType": "CHECK",
"createdTime": "2025-12-15T20:59:39.816+00:00",
"updatedTime": "2025-12-15T20:59:40.000+00:00",
"createdBy": "{user_id}",
"voidInfo": [],
"disbursementStatus": "SCHEDULE",
"singleStatus": "SCHEDULED"
},
{
"id": "stp02TAXHUYITPCGf3b6",
"vendorId": "{vendor_id02}",
"billId": "{bill_id02}",
"billPayments": [
{
"id": "{bill_payment_id01}",
"billId": "{bill_id02}",
"amount": 142.00
}
],
"description": "Inv #1216202501",
"processDate": "2025-12-16",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}"
},
"amount": 142.00,
"processingOptions": {
"requestPayFaster": false,
"requestCheckDeliveryType": "STANDARD"
},
"transactionNumber": "EHHXAICWPQDUEIBOEAES",
"confirmationNumber": "P24121502 - 1389129",
"status": "SCHEDULED",
"onlinePayment": true,
"disbursementType": "CHECK",
"createdTime": "2025-12-15T20:59:39.816+00:00",
"updatedTime": "2025-12-15T20:59:40.000+00:00",
"createdBy": "{user_id}",
"voidInfo": [],
"disbursementStatus": "SCHEDULE",
"singleStatus": "SCHEDULED"
}
]
}
Error response
In the above POST /v3/payments/bulk
request, consider an example where the payment amount
for the first bill is greater than the $228.99
bill amount. This will result in an error response.
In this error response, there are details about the error at the individual bill level. The entire request fails and none of the bills in the request are paid.
[
{
"timestamp": "2025-12-15T20:59:39.816+00:00",
"code": "BDC_1159",
"severity": "ERROR",
"category": "DOWNSTREAM",
"message": "Cannot overpay a bill."
},
{
"timestamp": "2025-12-15T20:59:39.816+00:00",
"code": "BDC_1159",
"severity": "ERROR",
"category": "DOWNSTREAM",
"message": "{bill_id01}: Cannot overpay a bill."
}
]
Combine bulk payments to a single vendor
In the above cURL example, consider that the two bills belong to the same vendor that has combinePayments
set as true
.
curl --request POST \
--url 'https://gateway.stage.bill.com/connect/v3/payments/bulk' \
--header 'content-type: application/json' \
--header 'devKey: {developer_key}' \
--header 'sessionId: {session_id}' \
--data '{
"processDate": "2025-12-16",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}",
"vendorId": {vendor_id}
},
"payments": [
{
"billId": "{bill_id01}",
"amount": 228.99
},
{
"billId": "{bill_id02}",
"amount": 142.00
}
]
}'
Sample response
In this successful response, one BILL-generated payment id
is available for the bulk payment made to the same vendor. This value begin with stp
. The bulk payment amount
is combined and sent to the vendor.
You can pay vendors regardless of thecombinePayments
valueIf the vendor does not have
combinePayments
set astrue
, thePOST /v3/payments/bulk
response includes a different paymentid
for each payment made to the vendor. The response looks just like a bulk payments response made to multiple vendors.
The billPayments
object shows that the payment amount
is applied to each bill. The bill payment is identified by a bill payment id
. This value begins with blp
. In addition, disbursement information is available based on the type of payment.
{
"payments": [
{
"id": "stp02TAXHUYITPCGf3b5",
"vendorId": "{vendor_id}",
"billPayments": [
{
"id": "{bill_payment_id01}",
"billId": "{bill_id01}",
"amount": 228.99
},
{
"id": "{bill_payment_id02}",
"billId": "{bill_id02}",
"amount": 142.00
}
],
"description": "Multiple inv. (details on stub)",
"processDate": "2025-12-16",
"fundingAccount": {
"type": "BANK_ACCOUNT",
"id": "{org_bank_account_id}"
},
"amount": 370.99,
"processingOptions": {
"requestPayFaster": false,
"requestCheckDeliveryType": "STANDARD"
},
"transactionNumber": "EHHXAICWPQDUEIBOEAER",
"confirmationNumber": "P24121502 - 1389127",
"status": "SCHEDULED",
"onlinePayment": true,
"disbursementType": "CHECK",
"createdTime": "2025-12-15T20:59:39.816+00:00",
"updatedTime": "2025-12-15T20:59:40.000+00:00",
"createdBy": "{user_id}",
"voidInfo": [],
"disbursementStatus": "SCHEDULE",
"singleStatus": "SCHEDULED"
}
]
}
See the /v3/payments/bulk API for more information.
Common error cases
Payment requests can fail for various reasons. This list highlights some of the more common error cases.
Common error cases |
---|
Bill ID not found. |
Vendor ID not found. |
Cannot overpay a bill. |
Invalid process date. |
Bank account is inactive. |
Card account is inactive. |
Updated about 22 hours ago