Authorize and capture transactions
Important API update: The GET capture endpoint will be sunset on November 24, 2025. This guide has been updated to use the new POST endpoint. All integrations should use the POST capture endpoint, which supports both full and partial captures with flexible service fee adjustments. The GET endpoint currently supports only captures for the exact authorized amount.
See the Migrating from GET to POST endpoint section for details on migrating your integration.
For some businesses, it makes sense to authorize a transaction first and then capture later. When you authorize, you verify that the customer has sufficient funds, and you place a hold on that amount without actually processing the transaction and taking the money. Authorizing a transaction gives merchants time to verify inventory, prepare shipments, or complete services before finalizing the charge. Capturing the transaction is what puts the transaction in a batch for settlement and starts the process of moving the funds from the customer to the merchant account.
Capturing an authorized transaction later also allows merchants to capture part of the authorized amount if the final total ends up being less than expected, avoiding the need for refunds.
This guide covers how to authorize and capture transactions through the API. To authorize and capture a payment in one step, use the Make a transaction endpoint instead.
Considerations
Keep these considerations in mind when working with transactions:
- Authorizing a transaction reserves funds for the merchant but doesn’t move them.
- You must capture an authorized transaction to complete it and move the funds.
- You can capture an amount equal to or less than the original authorization, but not less than 85% of the original authorized amount.
- If you need to capture less than 85% of the authorized amount or more than the authorized amount, then void the authorization and create a new sale transaction.
- Service fees can be adjusted proportionally when capturing partial amounts, and can vary based on your service fee configuration. See Pass-through fees for more information.
- Authorized transactions aren’t flagged for settlement until they’re captured.
- If an authorized transaction isn’t captured within 10 days, Payabli voids the transaction. If you try to capture the voided transaction, the capture will fail.
If aren’t using a stored payment method provided by an embedded component to run transactions, you must secure cardholder, bank account data, and customer IP address because your PCI scope is expanded.
Authorize a transaction
Send a POST request to /api/MoneyIn/authorize
to authorize a payment transaction. This action reserves funds and returns an authorization code. See the API reference for this endpoint for full documentation.
This example authorizes a card transaction for $100, with no service fee, for entrypoint f743aed24a
. The customer ID is 4440
.
A successful request returns a 200 response with a JSON body containing a referenceId which you’ll need for the capture operation.
After authorizing a transaction, you can capture the transaction to complete it and move the funds from the customer to the merchant account.
Capture a transaction
To capture an authorized transaction and start the settlement process, send a POST request to /MoneyIn/capture/{transId}
. This endpoint allows you to capture the full authorized amount or a partial amount (minimum 85% of the original authorization) with flexible service fee adjustments. See the API reference for full documentation.
When capturing a transaction, the following rules apply:
- Full capture: Capture the exact authorized amount with the original or adjusted service fee
- Partial capture: Capture less than the authorized amount (minimum 85% of original total)
- Service fee adjustment: Adjust the service fee proportionally or as needed when capturing partial amounts
- Out-of-range captures: If you need to capture less than 85% or more than the authorized amount, you must void the original authorization and create a new sale transaction with the correct amount.
Each example captures a $100 card transaction for the transaction 10-7d9cd67d-2d5d-4cd7-a1b7-72b8b201ec13.
Full capture with fee example
Partial capture with fee example
Full capture without fee example
A successful capture request returns a 200 response with a JSON body containing the transaction details.
Real-world example
This example illustrates a homeowner reserving a clubhouse for an event with a $200 deposit for cleaning and damages, plus a 3% service fee. After the event, the clubhouse admin calculates the actual charges and charges the homeowner for the final amount.
Initial authorization: $200.00 + $6.00 (3% fee) = $206.00 total
Scenario 1: Partial capture within threshold
In this case, the homeowner left the clubhouse in good condition, resulting in lower cleaning fees. The final charges are within the 85% threshold of the original authorization.
Final charges: $180.00 + $5.40 (3% fee) = $185.40
Because $185.40 is greater than 85% of $206.00 ($175.10), you can use the capture endpoint:
Scenario 2: Amount below threshold
In this case, the homeowner left the clubhouse in excellent condition. Their cleaning fee was significantly reduced, leading to final charges below the 85% threshold of the original authorization. Final charges: $60.00 + $1.80 (3% fee) = $61.80
Because $61.80 is less than 85% of $206.00 ($175.10), you must:
- Void the original $206.00 authorization
- Create a new sale transaction for $61.80
Scenario 3: Amount exceeds authorization
In this case the homeowner incurred additional costs for damages, leading to final charges exceeding the initial authorization.
Final charges: $300.00 + $9.00 (3% fee) = $309.00
Because this exceeds the original authorization, you must:
- Void the original $206.00 authorization
- Create a new sale transaction for $309.00
Migrating from GET to POST endpoint
If you’re currently using the GET endpoint (/MoneyIn/capture/{transId}/{amount}
), you need to migrate to the POST endpoint before November 24, 2025.
Here are the key differences between the two endpoints:
And here are examples for both endpoints:
Before (GET endpoint):
After (POST endpoint):