Unload Card
curl --request POST \
--url https://api.fyatu.com/api/v3/cards/{cardId}/unload \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": 25,
"reference": "withdraw-67890"
}
'import requests
url = "https://api.fyatu.com/api/v3/cards/{cardId}/unload"
payload = {
"amount": 25,
"reference": "withdraw-67890"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: 25, reference: 'withdraw-67890'})
};
fetch('https://api.fyatu.com/api/v3/cards/{cardId}/unload', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fyatu.com/api/v3/cards/{cardId}/unload",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 25,
'reference' => 'withdraw-67890'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fyatu.com/api/v3/cards/{cardId}/unload"
payload := strings.NewReader("{\n \"amount\": 25,\n \"reference\": \"withdraw-67890\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fyatu.com/api/v3/cards/{cardId}/unload")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 25,\n \"reference\": \"withdraw-67890\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fyatu.com/api/v3/cards/{cardId}/unload")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 25,\n \"reference\": \"withdraw-67890\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"status": 200,
"message": "Card unloaded successfully",
"data": {
"cardId": "crd_8f3a2b1c4d5e6f7890abcdef12345678",
"amountUnloaded": 25,
"fee": 0.25,
"amountCredited": 24.75,
"reference": "withdraw-67890"
},
"meta": {
"requestId": "req_a1b2c3d4e5f6",
"timestamp": "2026-01-17T10:00:00+00:00"
}
}Cards
Unload Card
Withdraw remaining balance from a card back to your business wallet. POST /cards//unload.
POST
/
cards
/
{cardId}
/
unload
Unload Card
curl --request POST \
--url https://api.fyatu.com/api/v3/cards/{cardId}/unload \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": 25,
"reference": "withdraw-67890"
}
'import requests
url = "https://api.fyatu.com/api/v3/cards/{cardId}/unload"
payload = {
"amount": 25,
"reference": "withdraw-67890"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: 25, reference: 'withdraw-67890'})
};
fetch('https://api.fyatu.com/api/v3/cards/{cardId}/unload', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fyatu.com/api/v3/cards/{cardId}/unload",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 25,
'reference' => 'withdraw-67890'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fyatu.com/api/v3/cards/{cardId}/unload"
payload := strings.NewReader("{\n \"amount\": 25,\n \"reference\": \"withdraw-67890\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fyatu.com/api/v3/cards/{cardId}/unload")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 25,\n \"reference\": \"withdraw-67890\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fyatu.com/api/v3/cards/{cardId}/unload")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 25,\n \"reference\": \"withdraw-67890\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"status": 200,
"message": "Card unloaded successfully",
"data": {
"cardId": "crd_8f3a2b1c4d5e6f7890abcdef12345678",
"amountUnloaded": 25,
"fee": 0.25,
"amountCredited": 24.75,
"reference": "withdraw-67890"
},
"meta": {
"requestId": "req_a1b2c3d4e5f6",
"timestamp": "2026-01-17T10:00:00+00:00"
}
}Overview
Withdraw funds from a card back to your business wallet. An unloading fee may apply based on your pricing configuration.Unloading is asynchronous. A successful (
2xx) response means the request was accepted and is pending confirmation from the card provider — it does not mean the funds have been returned, and the provider may still reject the unload. Do not treat the response as final. Use the card.unloaded (confirmed — funds credited) and card.unloading_failed (rejected — no funds credited) webhooks as the source of truth.Path Parameters
| Parameter | Type | Description |
|---|---|---|
cardId | string | The unique card identifier |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Amount to unload in USD |
reference | string | No | Your unique reference for this operation. Defaults to cardId if not provided. Returned in webhooks for easy reconciliation. |
A
reference is single-use and final once it resolves. Retrying the same reference returns
the original result rather than unloading again. If an unload resolves to FAILED, the same
reference returns 409 REFERENCE_ALREADY_FAILED — send a new reference to genuinely retry.Example Usage
<?php
$cardId = 'crd_8f3a2b1c4d5e6f7890abcdef12345678';
$data = [
'amount' => 25.00,
'reference' => 'withdraw-67890' // Optional: your unique reference
];
$ch = curl_init("https://api.fyatu.com/api/v3/cards/{$cardId}/unload");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $accessToken,
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($data)
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
if ($result['success']) {
// Request accepted — NOT final. Funds are credited only when the
// card.unloaded webhook arrives; card.unloading_failed means it was rejected.
echo "Unload request submitted: $" . $result['data']['amountUnloaded'] . "\n";
echo "Reference: " . $result['data']['reference'] . "\n";
}
const cardId = 'crd_8f3a2b1c4d5e6f7890abcdef12345678';
const response = await fetch(`https://api.fyatu.com/api/v3/cards/${cardId}/unload`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 25.00,
reference: 'withdraw-67890' // Optional: your unique reference
})
});
const result = await response.json();
if (result.success) {
// Request accepted — NOT final. Funds are credited only when the
// card.unloaded webhook arrives; card.unloading_failed means it was rejected.
console.log('Unload request submitted: $' + result.data.amountUnloaded);
console.log('Reference: ' + result.data.reference);
}
Asynchronous Processing
Card unloading is processed asynchronously by the card provider. A2xx response confirms only that the request was accepted and submitted — the funds are not yet credited, and the operation can still be rejected downstream.
- When the provider confirms the unload, a
card.unloadedwebhook is sent and the net amount is credited to your business wallet. - If the provider rejects the unload, a
card.unloading_failedwebhook is sent and no funds are credited.
reference you supplied (it is returned in both the response and the webhook).
Treat the immediate response as “request accepted”, never as “completed”. Use the
card.unloaded / card.unloading_failed webhooks — not the synchronous response — as the source of truth for the final status.Error Responses
A2xx response is an acceptance, not a settlement (see Asynchronous Processing). These errors are returned synchronously when the request cannot even be submitted:
| Status | Error Code | Description |
|---|---|---|
| 400 | CARD_NOT_ACTIVE | Card is not active (frozen, suspended, or terminated) |
| 400 | INSUFFICIENT_CARD_BALANCE | Card balance is lower than the requested unload amount |
| 400 | CARD_FROZEN | Card is frozen at bank partner (auto-syncs local status) |
| 400 | CARD_TERMINATED | Card has been terminated (auto-syncs local status) |
| 409 | UNLOAD_IN_PROGRESS | A previous unload with the same reference is still pending |
| 409 | REFERENCE_ALREADY_FAILED | This reference already resolved to FAILED and is single-use — send a new reference to retry |
| 500 | BALANCE_CHECK_FAILED | Failed to verify card balance |
| 500 | UNLOAD_FAILED | The provider rejected the request at submission time |
Use the Get Pricing endpoint to check if unloading fees apply. Funds are credited to your business wallet only once the card provider confirms the unload (see Asynchronous Processing above).
Authorizations
JWT access token obtained from /auth/token
Path Parameters
Body
application/json

