For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
AI agentsStatus PageContact sales
HomeGuidesDeveloper ToolsChangelogsCookbooks
HomeGuidesDeveloper ToolsChangelogsCookbooks
    • Home
    • Pay In cookbook
    • Pay Out cookbook
    • Pay Ops cookbook

© 2026 Centavo, Inc. All rights reserved | Centavo (DBA Payabli) is a registered Payment Facilitator of PNC Bank, N.A., Pittsburgh, PA. Payabli is a registered ISO/MSP of Merrick Bank, South Jordan, UT.

PayabliTest Cards & AccountsPay In StatusesPay Out StatusesTrust Center
LogoLogo
AI agentsStatus PageContact sales

Pay In cookbook

Quickstart recipes for accepting payments, refunds, and invoices
|View as Markdown|Open in Claude|
Was this page helpful?
Previous

Cookbooks and recipes home

Next

Pay Out cookbook

Applies to:DevelopersPartnersPaypoints

Use these recipes to get started with Pay In features and functions. See Pay In overview for more.

New to the API? Start with the authentication guide on the cookbooks home.

Run your first sale transaction

Learn how to run your first card sale transaction from start to finish

Create a customer

Learn how to create a customer record with the API

Refund a transaction

Learn how to refund a settled Pay In transaction

Void a transaction

Learn how to void an unsettled Pay In transaction

Charge a saved payment method

Learn how to charge a customer's stored card or bank account

Send a payment link

Learn how to generate and send a payment link to a customer

Create and send an invoice

Learn how to create an invoice and send it to a customer via email

Retrieve batches and transfers

Learn how to retrieve a list of batches and transfers for a paypoint

Reconcile batches and transfers

Learn how to find chargebacks, ACH returns, and other adjustments in a transfer

Retrieve and manage chargebacks

Learn how to list chargebacks, retrieve case details, and submit a response

Set up autopay on an invoice

Learn how to set up recurring automatic payments on an invoice

Set up an autopay

Learn how to set up recurring automatic payments for a customer

Recipe: Run your first sale transaction

/// Overview

This end-to-end workflow walks through how to run a card sale transaction using the API. The getpaid endpoint authorizes and captures the transaction in one step, so it’s immediately captured for settlement. This recipe uses the v2 transaction API, which all new integrations should use.

/// Prerequisites

Before you start, make sure you have the following:

  • Your paypoint’s entryPoint value
  • A customerId for the customer making the payment. If you don’t have one, create a customer first.
  • The customer’s payment details: for a card transaction, this includes the card number, expiration date, CVV, and billing ZIP code

PCI compliance note: This recipe passes raw card data directly through the API for demonstration purposes. In production, use an embedded component to collect card details, or use a stored payment method, which keeps your PCI scope minimal. If you handle raw card data directly, your PCI scope is expanded and you must secure cardholder data and customer IP addresses.

/// Step 1: Run the sale transaction

Send a POST request to /api/v2/MoneyIn/getpaid with the payment method, amount, and customer information. This authorizes and captures the transaction in one step.

$curl -X POST "https://api.payabli.com/api/v2/MoneyIn/getpaid" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "entryPoint": "your-entry-point",
> "paymentMethod": {
> "method": "card",
> "cardHolder": "Jane Smith",
> "cardnumber": "4111111111111111",
> "cardexp": "02/27",
> "cardcvv": "999",
> "cardzip": "12345",
> "initiator": "payor"
> },
> "paymentDetails": {
> "totalAmount": 100.00,
> "serviceFee": 0
> },
> "customerData": {
> "customerId": 4440
> },
> "ipaddress": "255.255.255.255"
> }'

A successful response returns code A0000 (Approved) and a paymentTransId in the data object that you can use to look up the transaction later.

,7
1{
2 "code": "A0000",
3 "reason": "Approved",
4 "explanation": "Transaction approved",
5 "action": "No action required",
6 "data": {
7 "paymentTransId": "3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae",
8 "method": "card",
9 "transStatus": 1,
10 "totalAmount": 100,
11 "netAmount": 100,
12 "payorId": 4440
13 },
14 "token": null
15}

See Make a transaction (v2) for the full API reference.

/// Step 2: Check the transaction status

Use the paymentTransId from the previous step to check the transaction’s status and details.

Send a GET request to /api/MoneyIn/details/{paymentTransId}.

$curl -X GET "https://api.payabli.com/api/MoneyIn/details/3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae" \
> -H "requestToken: YOUR_API_TOKEN"

Since the getpaid endpoint authorizes and captures in one step, the transStatus is Captured (1). To track settlement progress, watch the settlementStatus field as it moves from Pending (0) through In Transit (1), Transferred (2), and Funded (3). See the Pay In lifecycle for more.

See Get details for a processed transaction for the full API reference.

/// What’s next

Congratulations! You just ran your first sale transaction. Next, learn about the Pay In transaction lifecycle and explore running transactions with other payment methods.

Recipe: Create a customer

/// Overview

Create a customer record in Payabli to track payers, store payment methods, and manage subscriptions. Customer records require at least one identifier field.

/// Prerequisites

Before you start, make sure you have the following:

  • Your paypoint’s entrypoint value
  • At least one customer identifier: firstname and lastname, email, or a custom identifier

Check your identifier settings in Settings > Custom Fields in PartnerHub. See custom identifiers for more.

/// Create the customer

Send a POST request to /api/Customer/single/{entry} with the customer’s details. Include identifier fields so Payabli can match against existing records.

$curl -X POST "https://api.payabli.com/api/Customer/single/your-entry-point" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "customerNumber": "12356ACB",
> "firstname": "Irene",
> "lastname": "Canizales",
> "address1": "123 Bishops Trail",
> "city": "Mountain City",
> "state": "TN",
> "zip": "37612",
> "country": "US",
> "email": "irene@canizalesconcrete.com",
> "identifierFields": ["email"],
> "timeZone": -5
> }'

The response includes a customerId that you can use with other endpoints to manage the customer and run transactions.

1{
2 "isSuccess": true,
3 "responseData": {
4 "customerId": 17264,
5 "customerNumber": "12356ACB",
6 "customerStatus": 0,
7 "Firstname": "Irene",
8 "Lastname": "Canizales",
9 "Email": "irene@canizalesconcrete.com"
10 },
11 "responseText": "Success"
12}

See Add customer for the full API reference.

/// What’s next

Congratulations! You’ve created a customer record. Learn more about managing customers with the API and customer entities in Payabli.

Recipe: Refund a transaction

/// Overview

Refund a settled Pay In transaction to return funds to the customer. You can refund the full amount or a partial amount. This recipe uses the v2 API.

/// Prerequisites

Before you start, make sure you have the following:

  • The referenceId of a settled transaction (also called the transId)
  • The refund amount, if you’re issuing a partial refund

If the transaction hasn’t settled yet, void it instead.

/// Refund the transaction

For a full refund, send a POST request to /api/v2/MoneyIn/refund/{transId}. For a partial refund, append the amount: /api/v2/MoneyIn/refund/{transId}/{amount}. The refund amount excludes any service fee charged on the original transaction.

This example refunds the full transaction amount:

$curl -X POST "https://api.payabli.com/api/v2/MoneyIn/refund/10-3ffa27df-b171-44e0-b251-e95fbfc7a723" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN"

A successful refund returns a code of A0004 with a reason of “Refunded”. The data object contains the full transaction details.

1{
2 "code": "A0004",
3 "reason": "Refunded",
4 "explanation": "Transaction refunded",
5 "action": "No action required",
6 "data": {
7 "paymentTransId": "3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae",
8 "method": "card",
9 "paymentData": {
10 "maskedAccount": "4XXXXXXXXXXX5439",
11 "accountType": "visa",
12 "holderName": "John Cassian"
13 }
14 },
15 "token": null
16}

To refund a partial amount, include the amount in the path. This example refunds $100.99:

$curl -X POST "https://api.payabli.com/api/v2/MoneyIn/refund/10-3ffa27df-b171-44e0-b251-e95fbfc7a723/100.99" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN"

See Refund a settled transaction (v2) for the full API reference.

/// What’s next

Congratulations! You’ve refunded a Pay In transaction. Learn about choosing between void and refund and the Enhanced Refund Flow.

Recipe: Void a transaction

/// Overview

Void an unsettled Pay In transaction to cancel it before the batch closes. Voids cancel the full transaction amount — partial voids aren’t supported. This recipe uses the v2 API.

/// Prerequisites

Before you start, make sure you have the following:

  • The referenceId of an unsettled transaction (also called the transId)

If the transaction has already settled, refund it instead.

/// Void the transaction

Send a POST request to /api/v2/MoneyIn/void/{transId}.

$curl -X POST "https://api.payabli.com/api/v2/MoneyIn/void/10-3ffa27df-b171-44e0-b251-e95fbfc7a723" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN"

A successful void returns a code of A0003 with a reason of “Canceled”. The data object contains the full transaction details.

1{
2 "code": "A0003",
3 "reason": "Canceled",
4 "explanation": "Transaction canceled",
5 "action": "No action required",
6 "data": {
7 "paymentTransId": "3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae",
8 "method": "card",
9 "paymentData": {
10 "maskedAccount": "4XXXXXXXXXXX5439",
11 "accountType": "visa",
12 "holderName": "John Cassian"
13 }
14 },
15 "token": null
16}

If you try to void a transaction that has already been settled or voided, the API returns a 400 status.

See Void a transaction (v2) for the full API reference.

/// What’s next

Congratulations! You’ve voided a Pay In transaction. Learn about choosing between void and refund and explore other cancellation methods.

Recipe: Charge a saved payment method

/// Overview

Charge a returning customer using a payment method you’ve already tokenized and stored, without collecting their card or bank account details again. This recipe uses the v2 transaction API, which all new integrations should use.

/// Prerequisites

Before you start, make sure you have the following:

  • A storedMethodId for the customer’s saved payment method. If you haven’t saved one yet, see Save a payment method.
  • The customerId for the customer who owns the stored method
  • Your paypoint’s entryPoint value
  • Know whether the stored method is a card or ach method, so you can set the method field correctly

/// Step 1: Run the transaction

Send a POST request to /api/v2/MoneyIn/getpaid with the storedMethodId in the paymentMethod object instead of raw card or bank account details.

Set initiator to payor for customer-initiated transactions, or merchant for merchant-initiated transactions. See CIT and MIT overview for guidance on which to use.

-9
$curl -X POST "https://api.payabli.com/api/v2/MoneyIn/getpaid" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "entryPoint": "your-entry-point",
> "paymentMethod": {
> "method": "card",
> "storedMethodId": "1ec55af9-7b5a-4ff0-81ed-c12d2f95e135-4440",
> "initiator": "payor",
> "storedMethodUsageType": "unscheduled"
> },
> "paymentDetails": {
> "totalAmount": 100.00,
> "serviceFee": 0
> },
> "customerData": {
> "customerId": 4440
> }
> }'

A successful response returns code A0000 (Approved) and a paymentTransId in the data object that you can use to look up the transaction later.

,7
1{
2 "code": "A0000",
3 "reason": "Approved",
4 "explanation": "Transaction approved",
5 "action": "No action required",
6 "data": {
7 "paymentTransId": "3040-9708542b00354726ad8a6b0c65bc7a54",
8 "method": "card",
9 "transStatus": 1,
10 "totalAmount": 100,
11 "netAmount": 100,
12 "payorId": 4440
13 },
14 "token": null
15}

See Make a transaction (v2) for the full API reference.

/// Step 2: Check the transaction status

Use the paymentTransId from the previous step to check the transaction’s status and details.

Send a GET request to /api/MoneyIn/details/{paymentTransId}.

$curl -X GET "https://api.payabli.com/api/MoneyIn/details/3040-9708542b00354726ad8a6b0c65bc7a54" \
> -H "requestToken: YOUR_API_TOKEN"

Since the getpaid endpoint authorizes and captures in one step, the transStatus is Captured (1). To track settlement progress, watch the settlementStatus field as it moves from Pending (0) through In Transit (1), Transferred (2), and Funded (3). See Pay In lifecycle for more.

See Get details for a processed transaction for the full API reference.

/// What’s next

Congratulations! You just charged a saved payment method. Next, learn about tokenization and explore other ways to make transactions.

Recipe: Send a payment link

/// Overview

Generate a payment link from an existing invoice and send it to a customer via email. Payment links direct customers to a hosted payment page where they can pay using your accepted methods.

/// Prerequisites

Before you start, make sure you have the following:

  • An idInvoice for an invoice created via the API. If you haven’t created one yet, see Manage invoices.
  • Your paypoint’s entryPoint value
  • The customer’s email address

/// Step 1: Generate the payment link

Create a payment link from your invoice. You can customize the hosted payment page’s branding, accepted payment methods, and layout.

Send a POST request to /api/PaymentLink/{idInvoice}.

$curl -X POST "https://api.payabli.com/api/PaymentLink/23548884" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "page": {
> "enabled": true,
> "header": "Payment Page",
> "description": "Complete your payment securely",
> "order": 0
> },
> "paymentButton": {
> "enabled": true,
> "label": "Pay Now",
> "order": 0
> },
> "paymentMethods": {
> "enabled": true,
> "header": "Payment Methods",
> "allMethodsChecked": true,
> "methods": {
> "visa": true,
> "mastercard": true,
> "amex": true,
> "discover": true,
> "eCheck": true
> },
> "order": 0
> },
> "payor": {
> "enabled": true,
> "header": "Payor Information",
> "order": 0,
> "fields": [
> {
> "name": "fullName",
> "label": "Full Name",
> "required": true,
> "display": true,
> "order": 0,
> "validation": "alpha",
> "identifier": true,
> "fixed": true,
> "value": "",
> "width": 0
> }
> ]
> }
> }'

The response includes the payment link ID in responseData. You need this ID to send the link in the next step.

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

See Create payment link from invoice for the full API reference.

/// Step 2: Send the payment link

Send the payment link to the customer via email. You can include additional recipients and attach a PDF invoice.

Send a POST request to /api/PaymentLink/push/{payLinkId}.

$curl -X POST "https://api.payabli.com/api/PaymentLink/push/2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "channel": "email",
> "attachFile": true,
> "additionalEmails": [
> "admin@example.com",
> "accounting@example.com"
> ]
> }'

A successful response returns the payLinkId and a success message.

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

See Send payment link for the full API reference.

/// What’s next

Congratulations! You just sent a payment link to your customer. Next, learn about choosing an invoice delivery strategy and explore all the ways to manage payment links.

Recipe: Create and send an invoice

/// Overview

Create a one-time invoice for a customer and send it via email with an attached PDF. This recipe covers the two-call workflow: create the invoice, then send it.

/// Prerequisites

Before you start, make sure you have the following:

  • Your paypoint’s entryPoint value
  • A customerId for an existing customer. If you haven’t created one yet, see Manage customers.
  • Invoice details: line items, amounts, and a unique invoice number

/// Step 1: Create the invoice

Create the invoice linked to an existing customer. The request includes customer identification, line items, amount, and invoice metadata.

Send a POST request to /api/Invoice/{entry}.

$curl -X POST "https://api.payabli.com/api/Invoice/your-entry-point" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "customerData": {
> "customerId": 4440,
> "firstName": "Tamara",
> "lastName": "Bagratoni"
> },
> "invoiceData": {
> "invoiceNumber": "INV-3",
> "invoiceDate": "2025-10-19",
> "invoiceAmount": 982.37,
> "invoiceType": 0,
> "invoiceStatus": 1,
> "frequency": "onetime",
> "discount": 10,
> "items": [
> {
> "itemProductName": "Adventure Consult",
> "itemDescription": "Consultation for Georgian tours",
> "itemCost": 100,
> "itemQty": 1
> },
> {
> "itemProductName": "Deposit",
> "itemDescription": "Deposit for trip planning",
> "itemCost": 882.37,
> "itemQty": 1
> }
> ]
> }
> }'

The response includes the invoice ID in responseData. You need this to send the invoice in the next step.

1{
2 "isSuccess": true,
3 "responseData": 3625,
4 "responseText": "Success"
5}

See Add invoice for the full API reference.

/// Step 2: Send the invoice

Email the invoice to the customer. Use attachfile=true to include a PDF copy, and mail2 to specify the recipient email address. If you omit mail2, Payabli sends the invoice to the email address on file for the customer.

Send a GET request to /api/Invoice/send/{idInvoice}.

$curl -X GET "https://api.payabli.com/api/Invoice/send/3625?attachfile=true&mail2=tamara@example.com" \
> -H "requestToken: YOUR_API_TOKEN"
1{
2 "isSuccess": true,
3 "responseText": "Success"
4}

See Send invoice via email for the full API reference.

/// What’s next

Congratulations! You just created and sent an invoice. Next, explore the full invoice lifecycle in Manage invoices with the API and learn how to choose an invoice delivery strategy.

Recipe: Retrieve batches and transfers

/// Overview

Retrieve a list of batches and transfers for a paypoint to monitor settlement activity. A batch is a group of transactions that are settled together at the end of a processing cycle. A transfer is the actual movement of funds from the batch into the paypoint’s bank account.

/// Prerequisites

Before you start, make sure you have the following:

  • Your paypoint’s entrypoint identifier
  • An API token with access to the paypoint. See the authentication recipe for help

/// Step 1: Get batches for the paypoint

Query the batches endpoint to retrieve settlement batches for a paypoint. Each batch groups transactions and, once transferred, includes a Transfer object with deposit details.

Send a GET request to /api/Query/batches/{entry}.

$curl -X GET "https://api.payabli.com/api/Query/batches/your-entry-point?limitRecord=20&fromRecord=0" \
> -H "requestToken: YOUR_API_TOKEN"

The response includes batch records. If a batch has been transferred, the Transfer object contains the transfer details. If Transfer is null, the batch hasn’t been transferred yet.

-28
1{
2 "Summary": {
3 "totalRecords": 2,
4 "totalAmount": 1299.46,
5 "totalPages": 1,
6 "pageSize": 20
7 },
8 "Records": [
9 {
10 "IdBatch": 1012,
11 "BatchNumber": "BT-2023041421-187",
12 "BatchDate": "2023-04-14T21:01:03Z",
13 "BatchAmount": 1080.44,
14 "BatchStatus": 2,
15 "BatchRecords": 4,
16 "PaypointId": 187,
17 "PaypointDba": "Gruzya Adventure Outfitters",
18 "Method": "card",
19 "ExpectedDepositDate": "2023-04-15T00:00:00Z",
20 "Transfer": {
21 "TransferId": 5998,
22 "TransferDate": "2023-04-16T00:00:00Z",
23 "TransferStatus": 1,
24 "GrossAmount": 1080.44,
25 "ChargeBackAmount": 0,
26 "ReturnedAmount": 0,
27 "NetFundedAmount": 1080.44
28 }
29 }
30 ]
31}

See List batches for paypoint for the full API reference.

/// Step 2: Get transfers for the paypoint

Query the transfers endpoint to get deposit records with adjustment details like chargebacks, ACH returns, and fees.

Send a GET request to /api/Query/transfers/{entry}.

$curl -X GET "https://api.payabli.com/api/Query/transfers/your-entry-point?limitRecord=20&fromRecord=0" \
> -H "requestToken: YOUR_API_TOKEN"

The response includes transfer records with gross amounts, deductions, and the net amount deposited.

1{
2 "Summary": {
3 "totalPages": 1,
4 "totalRecords": 1,
5 "pageSize": 20
6 },
7 "Records": [
8 {
9 "transferId": 79851,
10 "paypointId": 705,
11 "batchNumber": "split_705_gp_11-16-2024",
12 "batchId": 111430,
13 "transferDate": "2024-11-17T08:20:07.288+00:00",
14 "transferStatus": 2,
15 "grossAmount": 1029.00,
16 "chargeBackAmount": 25.00,
17 "returnedAmount": 0.00,
18 "holdAmount": 0.00,
19 "billingFeesAmount": 0.00,
20 "adjustmentsAmount": 0.00,
21 "netTransferAmount": 1004.00
22 }
23 ]
24}

See List transfers for the full API reference.

/// What’s next

You’ve retrieved batches and transfers for a paypoint. To track chargebacks and ACH returns within transfers, see Reconcile adjustments in transfers. For more on how batches and transfers relate, see How money moves.

Recipe: Reconcile batches and transfers

/// Overview

Find chargebacks, ACH returns, and other adjustments in a Pay In transfer so you can reconcile deposits with your accounting records. This recipe drills into a single transfer — to list batches and transfers without focusing on adjustments, see the Retrieve batches and transfers recipe.

/// Prerequisites

Before you start, make sure you have the following:

  • Your paypoint’s entrypoint identifier
  • An API token with access to the paypoint. See the authentication recipe for help
  • (Optional) A transferId for a specific transfer you want to reconcile

/// Step 1: List transfers and spot adjustments

Query the transfers endpoint to retrieve deposit records for a paypoint. Each record shows the transfer’s gross amount, any adjustments deducted, and the net amount deposited to the merchant’s bank account.

Send a GET request to /api/Query/transfers/{entry}.

$curl -X GET "https://api.payabli.com/api/Query/transfers/your-entry-point?limitRecord=20&fromRecord=0" \
> -H "requestToken: YOUR_API_TOKEN"

In the response, look for non-zero values in chargeBackAmount, returnedAmount, holdAmount, billingFeesAmount, and adjustmentsAmount. Any non-zero value means the transfer included that type of adjustment. Copy the transferId for any transfer you want to break down further.

-17
1{
2 "Summary": {
3 "totalPages": 1,
4 "totalRecords": 1,
5 "pageSize": 20
6 },
7 "Records": [
8 {
9 "transferId": 10101,
10 "transferDate": "2024-01-20T23:45:01.877+00:00",
11 "transferStatus": 2,
12 "grossAmount": 222.22,
13 "chargeBackAmount": 0,
14 "returnedAmount": -140.00,
15 "holdAmount": 0,
16 "billingFeesAmount": 0,
17 "adjustmentsAmount": 0,
18 "netTransferAmount": 82.22
19 }
20 ]
21}

See List transfers for the full API reference.

/// Step 2: Get the transaction-level breakdown

For each transfer with adjustments, query the transfer details endpoint to see which individual transactions contributed to the chargebacks, ACH returns, or other adjustments.

Send a GET request to /api/Query/transferDetails/{entry}/{transferId}.

$curl -X GET "https://api.payabli.com/api/Query/transferDetails/your-entry-point/10101?limitRecord=20&fromRecord=0" \
> -H "requestToken: YOUR_API_TOKEN"

The Summary rolls up the adjustments across the whole transfer. The Records array has one entry per transaction included in the transfer — use the category field to identify which transactions were adjustments. The value is return for an ACH return and chargeback for a chargeback. Match transactionId against your own records to tie each adjustment back to a customer, invoice, or order.

-6,14,17-19
1{
2 "Summary": {
3 "achReturns": -140,
4 "chargebacks": 0,
5 "adjustments": 0,
6 "billingFees": 0,
7 "grossTransferAmount": 222.22,
8 "totalNetAmountTransfer": 82.22
9 },
10 "Records": [
11 {
12 "transferDetailId": 34135,
13 "transferId": 10101,
14 "transactionId": "100-b1000d0ec123456789aa",
15 "transactionNumber": "TRN_fEoo5pq0000XXX",
16 "method": "ach",
17 "category": "return",
18 "chargeBackAmount": 0,
19 "returnedAmount": -140,
20 "grossAmount": 0,
21 "netTransferAmount": -140
22 }
23 ]
24}

See List transfer details for the full API reference.

/// What’s next

You’ve reconciled the adjustments in a transfer. To start from a batch instead of a transfer, see Reconcile adjustments in transfers. To work with chargebacks specifically, see Retrieve and manage chargebacks.

Recipe: Retrieve and manage chargebacks

/// Overview

List chargebacks for a paypoint, retrieve the details of a specific case, and submit a response with supporting documentation. To work with ACH returns instead, see the retrieve ACH returns recipe.

/// Prerequisites

Before you start, make sure you have the following:

  • Your paypoint’s entrypoint identifier
  • An API token with access to the paypoint. See the authentication recipe for help
  • Documentation to support your response, if you plan to defend a chargeback. See chargeback documentation requirements for what to include

/// Step 1: List chargebacks for the paypoint

Query the disputes endpoint with a method filter of card to exclude ACH returns from the results. The endpoint returns both chargebacks and ACH returns, so filtering by method gives you only credit card chargebacks.

Send a GET request to /api/Query/chargebacks/{entry}.

$curl -X GET "https://api.payabli.com/api/Query/chargebacks/your-entry-point?method(eq)=card&limitRecord=20&fromRecord=0" \
> -H "requestToken: YOUR_API_TOKEN"

The response includes one record per chargeback. Use Id to retrieve full details or submit a response in the next steps. Status tracks the chargeback lifecycle: 0 is open, 1 is pending, 2 is closed-won, and 3 is closed-lost. ReplyBy is the deadline for your response.

,14,17
1{
2 "Summary": {
3 "totalRecords": 1,
4 "totalAmount": 156.00,
5 "totalNetAmount": 150.00,
6 "totalPages": 1,
7 "pageSize": 20
8 },
9 "Records": [
10 {
11 "Id": 578,
12 "CaseNumber": "CB-00712",
13 "ChargebackDate": "2026-04-15T00:00:00Z",
14 "Status": 0,
15 "Method": "card",
16 "AccountType": "visa",
17 "ReplyBy": "2026-04-25T23:59:59Z",
18 "NetAmount": 150.00,
19 "Reason": "Services not rendered",
20 "ReasonCode": "13.1",
21 "LastFour": "0003",
22 "PaymentTransId": "10-bfcd5a17861d4a8690ca53c00000X",
23 "Customer": {
24 "customerId": 1324,
25 "FirstName": "Janis",
26 "LastName": "Berzins",
27 "BillingEmail": "janis.berzins@example.com"
28 }
29 }
30 ]
31}

See List disputes by paypoint for the full API reference, including all available filters and pagination options.

/// Step 2: Retrieve details for a chargeback

Use the Id from the list response to fetch the full chargeback record, including the original transaction, any prior responses, and the case message timeline.

Send a GET request to /api/ChargeBacks/read/{Id}.

$curl -X GET "https://api.payabli.com/api/ChargeBacks/read/578" \
> -H "requestToken: YOUR_API_TOKEN"

The response contains the full chargeback object. Confirm Status and ReplyBy before submitting a response, and check Responses to see whether one has already been submitted.

-5,8
1{
2 "Id": 578,
3 "CaseNumber": "CB-00712",
4 "Status": 0,
5 "ReplyBy": "2026-04-25T23:59:59Z",
6 "Reason": "Services not rendered",
7 "ReasonCode": "13.1",
8 "Responses": [],
9 "Transaction": {
10 "PaymentTransId": "10-bfcd5a17861d4a8690ca53c00000X",
11 "TotalAmount": 156.00,
12 "NetAmount": 150.00,
13 "Method": "card",
14 "Operation": "Sale"
15 }
16}

See Get chargeback or ACH return record for the full API reference.

/// Step 3: Respond to the chargeback

Submit your response with supporting documentation before the ReplyBy date. Each attachment is a base64-encoded file in the attachments array. Include receipts, contracts, customer correspondence, and any other evidence that supports your case.

Send a POST request to /api/ChargeBacks/response/{Id}.

-14
$curl -X POST "https://api.payabli.com/api/ChargeBacks/response/578" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "contactName": "Janis Berzins",
> "contactEmail": "support@bigskyimports.example.com",
> "notes": "Service was completed on 2026-04-10. Attached signed work order, customer acceptance email, and the original receipt.",
> "attachments": [
> {
> "filename": "signed-work-order.pdf",
> "ftype": "application/pdf",
> "fContent": "JVBERi0xLjQK..."
> }
> ]
> }'

A successful response returns the response identifier in responseData. Save it if you need to reference the submission later.

1{
2 "isSuccess": true,
3 "responseData": 126,
4 "responseText": "Success"
5}

See Add response to chargeback or return for the full API reference.

/// What’s next

You’ve responded to a chargeback. To stay on top of new cases as they come in, subscribe to the ReceivedChargeBack webhook event — see Manage notifications. For more on documentation requirements and prevention, see the payment disputes guide.

Recipe: Set up autopay on an invoice

/// Overview

Set up recurring automatic payments on an invoice by creating a subscription that references it. In this example, a customer owes 1,800andpaysitoffat1,800 and pays it off at 1,800andpaysitoffat150 per month over 12 months. Each subscription payment automatically posts against the invoice.

/// Prerequisites

Before you start, make sure you have the following:

  • Your paypoint’s entryPoint value
  • A customerId for an existing customer. If you haven’t created one yet, see Manage customers.
  • Invoice details: line items, amounts, and a unique invoice number
  • A storedMethodId for the customer’s saved payment method. To save a method, see Save a payment method.
  • A schedule for the autopay: start date, end date (or open-ended), and frequency

/// Step 1: Create the invoice

Create a one-time invoice for the customer. This is the invoice that subscription payments will post against.

Send a POST request to /api/Invoice/{entry}.

$curl -X POST "https://api.payabli.com/api/Invoice/your-entry-point" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "customerData": {
> "customerId": 4440
> },
> "invoiceData": {
> "invoiceNumber": "INV-2345",
> "invoiceDate": "2026-04-01",
> "invoiceDueDate": "2026-04-15",
> "invoiceAmount": 1800.00,
> "invoiceType": 0,
> "invoiceStatus": 1,
> "frequency": "onetime",
> "items": [
> {
> "itemProductName": "Annual service agreement",
> "itemDescription": "Service agreement, 12-month term",
> "itemCost": 1800.00,
> "itemQty": 1
> }
> ]
> }
> }'

In the next step, you use the same invoiceNumber to link the subscription to this invoice.

See Add invoice for the full API reference.

/// Step 2: Create a subscription with the invoice

Create a subscription that charges 150permonthagainstthe150 per month against the 150permonthagainstthe1,800 invoice from step 1. The invoiceNumber in the subscription request must match the one you set when creating the invoice — this is what ties the payments to the invoice. The scheduleDetails.frequency controls when payments run, while invoiceData.frequency describes the invoice itself — keep the invoice as "onetime" and let the subscription handle the recurrence.

Send a POST request to /api/Subscription/add.

$curl -X POST "https://api.payabli.com/api/Subscription/add" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "entryPoint": "your-entry-point",
> "customerData": {
> "customerId": 4440
> },
> "paymentMethod": {
> "method": "card",
> "storedMethodId": "1a2b3c4d-5e6f-7890-abcd-ef12345678901",
> "initiator": "merchant",
> "storedMethodUsageType": "recurring"
> },
> "paymentDetails": {
> "totalAmount": 150.00,
> "serviceFee": 0
> },
> "scheduleDetails": {
> "startDate": "04-15-2026",
> "endDate": "04-15-2027",
> "frequency": "monthly"
> },
> "invoiceData": {
> "invoiceNumber": "INV-2345",
> "invoiceAmount": 150.00,
> "frequency": "onetime"
> }
> }'

The response includes the subscription ID in responseData and the linked customerId.

1{
2 "responseText": "Success",
3 "isSuccess": true,
4 "responseData": 396,
5 "customerId": 4440
6}

See Create subscription for the full API reference.

/// What’s next

Congratulations! You just set up autopay on an invoice. Next, learn how to manage and update subscriptions and explore the full invoice lifecycle in Manage invoices with the API.

Recipe: Set up an autopay

/// Overview

Set up a recurring payment (also called a subscription, autopay, or scheduled payment) for a customer using a saved payment method, so the customer is charged automatically on a schedule. This recipe covers the merchant-initiated case, where the customer authorizes recurring billing up front and Payabli runs each payment without further customer action.

/// Prerequisites

Before you start, make sure you have the following:

  • Your paypoint’s entryPoint value
  • A customerId for an existing customer. If you haven’t created one yet, see Manage customers.
  • A storedMethodId for the customer’s saved payment method. To save one, see Save a payment method.
  • A schedule: start date, end date (or open-ended), and frequency (weekly, monthly, annually, etc.)
  • The recurring amount you’ll charge each cycle
  • Documented customer authorization for recurring billing, including clear terms and conditions that cover cancellation policies, refund rules, billing frequency, and payment amounts. Capturing customer consent up front protects you in the event of a chargeback dispute. See CIT and MIT overview for guidance on consent and required indicators.

/// Step 1: Create the subscription

Send a POST request to /api/Subscription/add with the stored payment method, schedule, and amount. Set initiator to merchant and storedMethodUsageType to recurring to flag this as merchant-initiated recurring billing.

,13
$curl -X POST "https://api.payabli.com/api/Subscription/add" \
> -H "Content-Type: application/json" \
> -H "requestToken: YOUR_API_TOKEN" \
> -d '{
> "entryPoint": "your-entry-point",
> "customerData": {
> "customerId": 4440
> },
> "paymentMethod": {
> "method": "card",
> "initiator": "merchant",
> "storedMethodId": "1ec55af9-7b5a-4ff0-81ed-c12d2f95e135-4440",
> "storedMethodUsageType": "recurring"
> },
> "paymentDetails": {
> "totalAmount": 100.00,
> "serviceFee": 0
> },
> "scheduleDetails": {
> "startDate": "2026-06-01",
> "endDate": "untilcancelled",
> "frequency": "monthly"
> }
> }'

A successful response includes the new subscription’s ID in responseData. Save it. You’ll need it to update, pause, or delete the subscription later.

1{
2 "responseText": "Success",
3 "isSuccess": true,
4 "responseData": 396,
5 "customerId": 4440
6}

See Create subscription for the full API reference.

/// Step 2: Confirm the subscription

Verify the subscription was created correctly by retrieving it. Use the responseData value from the previous step as the subId path parameter.

Send a GET request to /api/Subscription/{subId}.

$curl -X GET "https://api.payabli.com/api/Subscription/396" \
> -H "requestToken: YOUR_API_TOKEN"

The response includes the schedule, payment method, customer details, and the NextDate field showing when the next scheduled payment will run. Subscription and autopay transactions typically run between 2:30 and 3:30 AM Eastern time on the scheduled date.

See Get subscription for the full API reference.

/// What’s next

Congratulations! You just set up a recurring payment for a customer. If you want each scheduled payment to post against an invoice instead, see the “Set up autopay on an invoice” recipe in the Pay In cookbook. To pause, update, or cancel the schedule later, see Manage subscriptions with the API, and explore subscription utilities for handling failed payments.