Manage vendor payment links

Generate, send, and manage payment links for bills so vendors can choose their preferred payment method
View as MarkdownOpen in Claude
Applies to:Developers

Use vendor payment links to let vendors choose how they want to get paid. When you generate a payment link for a bill, the vendor receives a secure, hosted page where they can select their preferred payment method — ACH, virtual card (vCard), or check. Their choice is stored and reused for future payouts, so you don’t need to collect payment details manually or send additional links.

This is ideal for on-demand payout workflows where you need vendors to self-enroll their payment preferences without building your own collection UI.

Considerations

Keep these in mind when working with vendor payment links:

  • You must create a vendor and a bill before generating a payment link.
  • The payment link is tied to a specific bill. When the vendor completes the link, Payabli automatically authorizes and captures the payout, and the vendor’s payment method preference is stored for future use.
  • Paypoints control which payment methods are offered to the vendor. You can configure the link to show any combination of ACH, virtual card, and check.
  • You can send payment links via email.

Payment methods

Vendor payment links support the following payout methods. Paypoints determine which methods to offer each vendor.

MethodDescriptionDelivery speed
Virtual card (vCard)A single-use virtual credit card delivered to the vendor via secure email. Includes card number, expiration, and CVV behind MFA.Same day or next day
ACH transferA direct electronic bank transfer. Same-day and standard options available depending on underwriting approval.1 – 3 business days
CheckA physical check generated and mailed to the vendor’s address on file.5 – 14 business days

Payments captured before 3:30 PM ET typically pull funds from the payer’s account within 2–3 business days. A 3-day hold is applied to ensure funds clear before disbursement to the vendor.

Send a POST request to /api/PaymentLink/bill/{billId} to create a payment link for a bill. Use the mail2 query parameter to send the link directly to the vendor’s email — pass one or more email addresses separated by semicolons (for example, mail2=ap@vendor.com; billing@vendor.com). See the API reference for full documentation.

Use the request body to configure the payment page appearance, including branding, messaging, and which payout methods are offered to the vendor. The paymentMethods.methods object uses Pay Out-specific field names:

  • ach — offer ACH bank transfer
  • vcard — offer virtual card
  • check — offer physical check

Set defaultMethod to highlight a preferred option (for example, "vcard"), and use allowMultipleMethods: true to let the vendor pick from all enabled options.

POST
/api/PaymentLink/bill/:billId
1curl -X POST "https://api-sandbox.payabli.com/api/PaymentLink/bill/23548884?mail2=jo%40example.com%3B%20ceo%40example.com" \
2 -H "requestToken: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "contactUs": {
6 "emailLabel": "Email",
7 "enabled": true,
8 "header": "Contact Us",
9 "order": 0,
10 "paymentIcons": true,
11 "phoneLabel": "Phone"
12 },
13 "logo": {
14 "enabled": true,
15 "order": 0
16 },
17 "messageBeforePaying": {
18 "enabled": true,
19 "label": "Please review your payment details",
20 "order": 0
21 },
22 "notes": {
23 "enabled": true,
24 "header": "Additional Notes",
25 "order": 0,
26 "placeholder": "Enter any additional notes here",
27 "value": ""
28 },
29 "page": {
30 "description": "Get paid securely",
31 "enabled": true,
32 "header": "Payment Page",
33 "order": 0
34 },
35 "paymentButton": {
36 "enabled": true,
37 "label": "Pay Now",
38 "order": 0
39 },
40 "paymentMethods": {
41 "allMethodsChecked": true,
42 "allowMultipleMethods": true,
43 "defaultMethod": "vcard",
44 "enabled": true,
45 "header": "Payment Methods",
46 "methods": {
47 "ach": true,
48 "check": true,
49 "vcard": true
50 },
51 "order": 0,
52 "showPreviewVirtualCard": true
53 },
54 "review": {
55 "enabled": true,
56 "header": "Review Payment",
57 "order": 0
58 },
59 "settings": {
60 "color": "#000000",
61 "language": "en"
62 }
63}'

A successful request returns a 200 response with the payment link ID.

Response
1{
2 "isSuccess": true,
3 "responseText": "Success",
4 "responseData": "2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234"
5}

Send a POST request to /api/PaymentLink/push/{payLinkId} to deliver a payment link to the vendor via email. See the API reference for full documentation.

If you included the mail2 query parameter when generating the link, the vendor already received it. Use this endpoint to resend the link or send it to additional recipients.

POST
/api/PaymentLink/push/:payLinkId
1curl -X POST https://api-sandbox.payabli.com/api/PaymentLink/push/payLinkId \
2 -H "requestToken: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "channel": "email",
6 "additionalEmails": [
7 "admin@example.com",
8 "accounting@example.com"
9 ],
10 "attachFile": true
11}'

A successful request returns a 200 response with the payment link ID.

Response
1{
2 "isSuccess": true,
3 "responseText": "Success",
4 "responseData": "2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234"
5}

What the vendor sees

When the vendor opens the payment link, they see a secure, branded page with the bill details and available payment methods. If you set a defaultMethod when generating the link, that method is highlighted as the recommended option. The vendor can choose a different method if multiple methods are enabled.

The vendor selects their preferred method and provides the required details:

  • ACH: Bank account and routing number
  • Virtual card: Email address for secure card delivery
  • Check: Mailing address (if not already on file)

When the vendor submits their selection, Payabli automatically authorizes and captures the payout for that bill. The bill status transitions follow the same flow as any other authorize and capture action — for example, moving from Active to In Transit to Paid. You don’t need to call the authorize or capture endpoints separately.

The vendor’s payment method preference is also securely tokenized and stored on their vendor record. You can use this stored preference for future payouts without sending additional links.

Send a GET request to /api/PaymentLink/{payLinkId} to retrieve information about a specific payment link. See the API reference for full documentation.

GET
/api/PaymentLink/load/:paylinkId
1curl https://api-sandbox.payabli.com/api/PaymentLink/load/paylinkId \
2 -H "requestToken: <apiKey>"

A successful request returns a 200 response with the payment link details.

Response
1{
2 "responseText": "Success",
3 "isSuccess": true,
4 "responseData": {
5 "AdditionalData": {
6 "key1": {
7 "key": "value"
8 },
9 "key2": {
10 "key": "value"
11 },
12 "key3": {
13 "key": "value"
14 }
15 },
16 "credentials": [
17 {}
18 ],
19 "lastAccess": "2022-06-30T15:01:00Z",
20 "pageContent": {
21 "amount": {
22 "enabled": true
23 },
24 "autopay": {
25 "enabled": true
26 },
27 "contactUs": {
28 "enabled": true
29 },
30 "entry": "entry",
31 "invoices": {
32 "enabled": true
33 },
34 "logo": {
35 "enabled": true
36 },
37 "messageBeforePaying": {
38 "enabled": true
39 },
40 "name": "name",
41 "notes": {
42 "enabled": true
43 },
44 "page": {
45 "enabled": true
46 },
47 "paymentButton": {
48 "enabled": true
49 },
50 "paymentMethods": {
51 "enabled": true
52 },
53 "payor": {
54 "enabled": true
55 },
56 "review": {
57 "enabled": true
58 },
59 "subdomain": "mypage-1"
60 },
61 "pageIdentifier": "null",
62 "pageSettings": {
63 "color": "color",
64 "customCssUrl": "customCssUrl",
65 "language": "language",
66 "redirectAfterApprove": true,
67 "redirectAfterApproveUrl": "redirectAfterApproveUrl"
68 },
69 "published": 1,
70 "receiptContent": {
71 "amount": {
72 "enabled": true
73 },
74 "contactUs": {
75 "enabled": true
76 },
77 "details": {
78 "enabled": true
79 },
80 "logo": {
81 "enabled": true
82 },
83 "messageBeforeButton": {
84 "enabled": true
85 },
86 "page": {
87 "enabled": true
88 },
89 "paymentButton": {
90 "enabled": true
91 },
92 "paymentInformation": {
93 "enabled": true
94 },
95 "settings": {
96 "enabled": true
97 }
98 },
99 "subdomain": "mypage-1",
100 "totalAmount": 1.1,
101 "validationCode": "validationCode"
102 }
103}

There are two ways to update a Pay Out payment link:

Update status or expiration

Send a PATCH request to /api/PaymentLink/out/{paylinkId} to update the link’s status, expiration date, or page content. See the API reference for full documentation.

Use this to cancel a link, extend its expiration, or reactivate an expired link. Setting a new expiration date on an expired link automatically reactivates it to Active status.

Payment link statuses: Active, Expired, Canceled, Deleted.

This example reactivates an expired link with a new expiration date:

PATCH
/api/PaymentLink/out/:paylinkId
1curl -X PATCH https://api-sandbox.payabli.com/api/PaymentLink/out/2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234 \
2 -H "requestToken: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "expirationDate": "2026-06-01T00:00:00Z",
6 "status": "Active"
7}'
Response
1{
2 "isSuccess": true,
3 "responseText": "Success",
4 "responseData": "2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234"
5}

Update page content

Send a PATCH request to /api/PaymentLink/updateOut/{paylinkId} to update the payment page configuration — branding, messaging, payment methods offered, and other page settings. See the API reference for full documentation.

This example changes which payment methods are offered to the vendor:

PATCH
/api/PaymentLink/updateOut/:paylinkId
1curl -X PATCH https://api-sandbox.payabli.com/api/PaymentLink/updateOut/2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234 \
2 -H "requestToken: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "paymentButton": {
6 "enabled": true,
7 "label": "Choose Payment Method",
8 "order": 0
9 },
10 "paymentMethods": {
11 "allMethodsChecked": false,
12 "allowMultipleMethods": true,
13 "defaultMethod": "vcard",
14 "enabled": true,
15 "header": "Payment Methods",
16 "methods": {
17 "ach": true,
18 "check": false,
19 "vcard": true
20 },
21 "order": 0,
22 "showPreviewVirtualCard": true
23 }
24}'
Response
1{
2 "isSuccess": true,
3 "responseText": "Success",
4 "responseData": "2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234"
5}

Send a DELETE request to /api/PaymentLink/{payLinkId} to delete a payment link. See the API reference for full documentation.

DELETE
/api/PaymentLink/:payLinkId
1curl -X DELETE https://api-sandbox.payabli.com/api/PaymentLink/2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234 \
2 -H "requestToken: <apiKey>"

A successful request returns a 200 response confirming the payment link was deleted.

Response
1{
2 "isSuccess": true,
3 "responseText": "Success",
4 "responseData": "2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234"
5}

Stored payment preferences

When a vendor completes a payment link, their chosen method and payment details are securely tokenized and stored on their vendor record. You can retrieve a vendor’s stored methods by calling GET /api/Vendor/{id} — the response includes a storedMethods array with each method’s idPmethod (the stored method ID), method type, and masked account details.

For subsequent payouts, reference the stored method by passing its storedMethodId in the authorize request:

$curl -X POST "https://api-sandbox.payabli.com/api/MoneyOut/authorize" \
> -H "Content-Type: application/json" \
> -H "requestToken: $API_TOKEN" \
> -d '{
> "entryPoint": "$ENTRY_POINT",
> "paymentMethod": {
> "method": "ach",
> "storedMethodId": "$STORED_METHOD_ID"
> },
> "paymentDetails": {
> "totalAmount": 1500.00
> },
> "vendorData": {
> "vendorNumber": "VENDOR-001"
> },
> "invoiceData": [
> {
> "billId": 12345,
> "invoiceNumber": "INV-2025-002",
> "netAmount": "1500.00"
> }
> ]
> }'

You can also set a default stored method on the vendor record using the defaultMethodId field on the vendor object. This identifies which stored method to use by default for that vendor’s payouts.

For more on authorizing and capturing payouts, see Manage payouts.