# Pay In cookbook

> This is Payabli documentation. For a complete page index, fetch https://docs.payabli.com/llms.txt — append .md to any page URL for lightweight markdown. For section-level indexes, query parameters, and other AI-optimized access methods, see https://docs.payabli.com/ai-agents.md

> Quickstart recipes for accepting payments, refunds, and invoices

<AudienceInfo audiences={["developers", "partners", "merchants"]} />

Use these recipes to get started with Pay In features and functions. See [Pay In overview](/guides/pay-in-overview) for more.

New to the API? Start with the [authentication guide](/cookbooks/cookbooks-overview) on the cookbooks home.

<div class="sr-only">
  <h3>Recipe: Run your first sale transaction</h3>
  /// 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](/developers/api-reference/moneyIn/v2), 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](/cookbooks/cookbooks-overview?recipe=Create%20a%20customer) 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](/guides/pay-in-components-overview) 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.

  ```bash
  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.

  ```json highlight=2,7
  {
    "code": "A0000",
    "reason": "Approved",
    "explanation": "Transaction approved",
    "action": "No action required",
    "data": {
      "paymentTransId": "3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae",
      "method": "card",
      "transStatus": 1,
      "totalAmount": 100,
      "netAmount": 100,
      "payorId": 4440
    },
    "token": null
  }
  ```

  See [Make a transaction (v2)](/developers/api-reference/moneyinV2/make-a-transaction) 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}`.

  ```bash
  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](/guides/pay-in-transactions-lifecycle-overview) for more.

  See [Get details for a processed transaction](/developers/api-reference/moneyin/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](/guides/pay-in-transactions-lifecycle-overview) and explore [running transactions with other payment methods](/guides/pay-in-developer-transactions-create).

  <h3>Recipe: Create a customer</h3>
  /// 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](/guides/pay-ops-developer-customers-manage#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.

  ```bash
  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.

  ```json highlight=4
  {
    "isSuccess": true,
    "responseData": {
      "customerId": 17264,
      "customerNumber": "12356ACB",
      "customerStatus": 0,
      "Firstname": "Irene",
      "Lastname": "Canizales",
      "Email": "irene@canizalesconcrete.com"
    },
    "responseText": "Success"
  }
  ```

  See [Add customer](/developers/api-reference/customer/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](/guides/pay-ops-developer-customers-manage) and [customer entities in Payabli](/guides/platform-entities-overview).

  <h3>Recipe: Refund a transaction</h3>
  /// 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](/guides/pay-in-developer-transactions-cancel#v1-and-v2-endpoints).

  /// 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](/developers/api-reference/moneyinV2/void-a-transaction) 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:

  ```bash
  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.

  ```json
  {
    "code": "A0004",
    "reason": "Refunded",
    "explanation": "Transaction refunded",
    "action": "No action required",
    "data": {
      "paymentTransId": "3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae",
      "method": "card",
      "paymentData": {
        "maskedAccount": "4XXXXXXXXXXX5439",
        "accountType": "visa",
        "holderName": "John Cassian"
      }
    },
    "token": null
  }
  ```

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

  ```bash
  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)](/developers/api-reference/moneyinV2/refund-a-settled-transaction) for the full API reference.

  /// What's next

  Congratulations! You've refunded a Pay In transaction. Learn about [choosing between void and refund](/guides/pay-in-transactions-void-vs-refund-decision) and the [Enhanced Refund Flow](/guides/pay-in-refunds-enhanced-flow-overview).

  <h3>Recipe: Void a transaction</h3>
  /// 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](/guides/pay-in-developer-transactions-cancel#v1-and-v2-endpoints).

  /// 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](/developers/api-reference/moneyinV2/refund-a-settled-transaction) instead.

  /// Void the transaction

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

  ```bash
  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.

  ```json
  {
    "code": "A0003",
    "reason": "Canceled",
    "explanation": "Transaction canceled",
    "action": "No action required",
    "data": {
      "paymentTransId": "3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae",
      "method": "card",
      "paymentData": {
        "maskedAccount": "4XXXXXXXXXXX5439",
        "accountType": "visa",
        "holderName": "John Cassian"
      }
    },
    "token": null
  }
  ```

  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)](/developers/api-reference/moneyinV2/void-a-transaction) for the full API reference.

  /// What's next

  Congratulations! You've voided a Pay In transaction. Learn about [choosing between void and refund](/guides/pay-in-transactions-void-vs-refund-decision) and explore [other cancellation methods](/guides/pay-in-developer-transactions-cancel).

  <h3>Recipe: Charge a saved payment method</h3>
  /// 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](/developers/api-reference/moneyIn/v2), 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](/guides/platform-developer-tokenization-save-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](/guides/pay-in-transactions-cit-mit-overview) for guidance on which to use.

  ```bash highlight=8-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.

  ```json highlight=2,7
  {
    "code": "A0000",
    "reason": "Approved",
    "explanation": "Transaction approved",
    "action": "No action required",
    "data": {
      "paymentTransId": "3040-9708542b00354726ad8a6b0c65bc7a54",
      "method": "card",
      "transStatus": 1,
      "totalAmount": 100,
      "netAmount": 100,
      "payorId": 4440
    },
    "token": null
  }
  ```

  See [Make a transaction (v2)](/developers/api-reference/moneyinV2/make-a-transaction) 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}`.

  ```bash
  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](/guides/pay-in-transactions-lifecycle-overview) for more.

  See [Get details for a processed transaction](/developers/api-reference/moneyin/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](/guides/platform-tokenization-overview) and explore other ways to [make transactions](/guides/pay-in-developer-transactions-create).

  <h3>Recipe: Send a payment link</h3>
  /// 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](/guides/pay-in-developer-invoices-manage).
  * 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}`.

  ```bash
  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.

  ```json highlight=3
  {
    "isSuccess": true,
    "responseData": "2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234",
    "responseText": "Success"
  }
  ```

  See [Create payment link from invoice](/developers/api-reference/paymentlink/generate-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}`.

  ```bash
  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.

  ```json
  {
    "isSuccess": true,
    "responseData": "2325-XXXXXXX-90b1-4598-b6c7-44cdcbf495d7-1234",
    "responseText": "Success"
  }
  ```

  See [Send payment link](/developers/api-reference/paymentlink/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](/guides/pay-in-invoicing-delivery-decision) and explore all the ways to [manage payment links](/guides/pay-in-developer-payment-links-manage).

  <h3>Recipe: Create and send an invoice</h3>
  /// 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](/guides/pay-ops-developer-customers-manage).
  * 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}`.

  ```bash
  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.

  ```json highlight=3
  {
    "isSuccess": true,
    "responseData": 3625,
    "responseText": "Success"
  }
  ```

  See [Add invoice](/developers/api-reference/invoice/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}`.

  ```bash
  curl -X GET "https://api.payabli.com/api/Invoice/send/3625?attachfile=true&mail2=tamara@example.com" \
    -H "requestToken: YOUR_API_TOKEN"
  ```

  ```json
  {
    "isSuccess": true,
    "responseText": "Success"
  }
  ```

  See [Send invoice via email](/developers/api-reference/invoice/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](/guides/pay-in-developer-invoices-manage) and learn how to [choose an invoice delivery strategy](/guides/pay-in-invoicing-delivery-decision).

  <h3>Recipe: Retrieve batches and transfers</h3>
  /// 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](/cookbooks/cookbooks-overview?recipe=Authentication%20guide) 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}`.

  ```bash
  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.

  ```json highlight=20-28
  {
    "Summary": {
      "totalRecords": 2,
      "totalAmount": 1299.46,
      "totalPages": 1,
      "pageSize": 20
    },
    "Records": [
      {
        "IdBatch": 1012,
        "BatchNumber": "BT-2023041421-187",
        "BatchDate": "2023-04-14T21:01:03Z",
        "BatchAmount": 1080.44,
        "BatchStatus": 2,
        "BatchRecords": 4,
        "PaypointId": 187,
        "PaypointDba": "Gruzya Adventure Outfitters",
        "Method": "card",
        "ExpectedDepositDate": "2023-04-15T00:00:00Z",
        "Transfer": {
          "TransferId": 5998,
          "TransferDate": "2023-04-16T00:00:00Z",
          "TransferStatus": 1,
          "GrossAmount": 1080.44,
          "ChargeBackAmount": 0,
          "ReturnedAmount": 0,
          "NetFundedAmount": 1080.44
        }
      }
    ]
  }
  ```

  See [List batches for paypoint](/developers/api-reference/query/get-list-of-batches-for-an-entrypoint) 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}`.

  ```bash
  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.

  ```json
  {
    "Summary": {
      "totalPages": 1,
      "totalRecords": 1,
      "pageSize": 20
    },
    "Records": [
      {
        "transferId": 79851,
        "paypointId": 705,
        "batchNumber": "split_705_gp_11-16-2024",
        "batchId": 111430,
        "transferDate": "2024-11-17T08:20:07.288+00:00",
        "transferStatus": 2,
        "grossAmount": 1029.00,
        "chargeBackAmount": 25.00,
        "returnedAmount": 0.00,
        "holdAmount": 0.00,
        "billingFeesAmount": 0.00,
        "adjustmentsAmount": 0.00,
        "netTransferAmount": 1004.00
      }
    ]
  }
  ```

  See [List transfers](/developers/api-reference/query/get-list-of-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](/guides/pay-ops-developer-transfers-reconcile). For more on how batches and transfers relate, see [How money moves](/guides/platform-how-money-moves-overview#transfers).

  <h3>Recipe: Set up autopay on an invoice</h3>
  /// Overview

  Set up recurring automatic payments on an invoice by creating a subscription that references it. In this example, a customer owes $1,800 and pays it off at $150 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](/guides/pay-ops-developer-customers-manage).
  * 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](/guides/platform-developer-tokenization-save-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}`.

  ```bash
  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](/developers/api-reference/invoice/add-invoice) for the full API reference.

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

  Create a subscription that charges $150 per month against the $1,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`.

  ```bash
  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`.

  ```json highlight=3
  {
    "responseText": "Success",
    "isSuccess": true,
    "responseData": 396,
    "customerId": 4440
  }
  ```

  See [Create subscription](/developers/api-reference/subscription/create-a-subscription-or-scheduled-payment) 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](/guides/pay-in-developer-subscriptions-manage) and explore the full invoice lifecycle in [Manage invoices with the API](/guides/pay-in-developer-invoices-manage).
</div>