Capture charge
Quick Reference
/api/v1/bank/wallet/charge/capture/Bearer TokenCapture an authorized chargeWhy separate authorization and capture
| Without auth + capture | With auth + capture |
|---|---|
| Hotel charges $500 even if the guest spends $320 | Hotel authorizes $500 at check-in, captures $320 at checkout |
| Car rental can't hold a damage deposit | Car rental authorizes $2,000 deposit, captures only actual charges |
| Marketplace charges buyer before seller confirms stock | Marketplace holds funds until seller ships the item |
| Overcharges lead to refunds, disputes, and churn | Partial capture charges only what's owed — no refund needed |
| Restaurants can't add tips post-authorization | Restaurant authorizes the bill, captures bill + tip later |
Authorization and capture flow
Authentication
Requires Bearer token. See Authentication.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
charge_uuid | string (UUID) | Yes | Authorized charge to capture |
wallet_uuid | string (UUID) | Yes | Wallet that owns the charge |
amount | number | No | Capture amount. Omit for full capture. Pass a lower value for partial capture |
When amount is less than the original authorized amount, A55 captures only the specified amount and releases the remaining hold. Not all acquirers support partial capture — check Provider capabilities for details.
Code examples
Full capture
- cURL
- Python
- JavaScript
curl -s -X POST https://core-manager.a55.tech/api/v1/bank/wallet/charge/capture/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"charge_uuid": "51dcca6e-7310-4b73-a94c-90835408f2ff",
"wallet_uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}'
import requests
import os
token = os.environ["A55_API_TOKEN"]
base = os.environ.get("A55_API_BASE_URL", "https://core-manager.a55.tech")
capture = requests.post(
f"{base}/api/v1/bank/wallet/charge/capture/",
json={
"charge_uuid": "51dcca6e-7310-4b73-a94c-90835408f2ff",
"wallet_uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
},
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
).json()
print(f"Captured: {capture['charge_uuid']} — Status: {capture['status']}")
print(f"Amount: {capture['currency']} {capture['local_currency']}")
const token = process.env.A55_API_TOKEN;
const base = process.env.A55_API_BASE_URL || "https://core-manager.a55.tech";
const capture = await fetch(`${base}/api/v1/bank/wallet/charge/capture/`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
charge_uuid: "51dcca6e-7310-4b73-a94c-90835408f2ff",
wallet_uuid: "f47ac10b-58cc-4372-a567-0e02b2c3d479",
}),
}).then((r) => r.json());
console.log(`Captured: ${capture.charge_uuid} — Status: ${capture.status}`);
Partial capture (hotel checkout example)
- cURL
- Python
- JavaScript
curl -s -X POST https://core-manager.a55.tech/api/v1/bank/wallet/charge/capture/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"charge_uuid": "51dcca6e-7310-4b73-a94c-90835408f2ff",
"wallet_uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"amount": 320.00
}'
partial = requests.post(
f"{base}/api/v1/bank/wallet/charge/capture/",
json={
"charge_uuid": "51dcca6e-7310-4b73-a94c-90835408f2ff",
"wallet_uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"amount": 320.00,
},
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
).json()
print(f"Partial capture: {partial['currency']} {partial['local_currency']} of original hold")
const partial = await fetch(`${base}/api/v1/bank/wallet/charge/capture/`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
charge_uuid: "51dcca6e-7310-4b73-a94c-90835408f2ff",
wallet_uuid: "f47ac10b-58cc-4372-a567-0e02b2c3d479",
amount: 320.0,
}),
}).then((r) => r.json());
console.log(`Partial capture: ${partial.currency} ${partial.local_currency}`);
Response fields
The response follows the same structure as Create charge with status updated to confirmed:
| Field | Type | Description |
|---|---|---|
charge_uuid | string | Unique charge identifier |
status | string | confirmed after successful capture |
local_currency | number | Captured amount in settlement currency |
currency | string | ISO 4217 currency code |
usd_currency | number | Captured amount in USD |
eur_currency | number | Captured amount in EUR |
type | string | Payment method (credit_card, debit_card) |
date | string | Original charge creation date |
description | string | Charge description |
due_date | string | Payment due date |
message | array/null | null on success, error details on failure |
installment_count | integer | Number of installments |
installments | array | Per-installment breakdown with updated amounts |
Complete response example
{
"status": "confirmed",
"charge_uuid": "51dcca6e-7310-4b73-a94c-90835408f2ff",
"local_currency": 320.00,
"currency": "BRL",
"usd_currency": 57.41,
"eur_currency": 50.33,
"type": "credit_card",
"date": "2026-03-15",
"description": "Hotel reservation — Grand Suite",
"due_date": "2026-03-20",
"message": null,
"installment_count": 1,
"installments": [
{
"local_currency": 320.00,
"currency": "BRL",
"usd_currency": 57.41,
"eur_currency": 50.33,
"due_date": "2026-03-20",
"status": "confirmed",
"installment_number": 1
}
]
}
Error responses
| Status | Code | Description | Resolution |
|---|---|---|---|
| 400 | errors.wallet.charge_capture_not_available | Charge is not in a capturable state | Verify the charge status is authorized. Already captured, expired, or failed charges cannot be captured |
| 401 | unauthorized | Invalid or expired Bearer token | Refresh your access token via Cognito |
| 404 | errors.wallet.not_found | Wallet UUID does not exist | Verify wallet_uuid is correct |
| 404 | CHARGE_NOT_FOUND | Charge not found for this wallet | Verify both UUIDs match the original charge |
| 422 | amount_exceeds_authorization | Capture amount exceeds authorized amount | Capture amount must be ≤ the originally authorized amount |
Authorization holds expire after 7 days on most card networks. Capture before the hold expires, or the authorization will be voided automatically and you'll need to create a new charge.
Despite being an update operation, the OpenAPI spec defines capture as POST /charge/capture/. Use POST in your integration.
To use capture, you must first create a charge with capture: false in the Create charge request. If capture is true (default), the charge is authorized and captured in a single step — there's nothing to capture separately.