Update Cardholder
curl --request PATCH \
--url https://api.fyatu.com/api/v3/cardholders/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"phone": "+1987654321",
"address": "456 Oak Avenue",
"city": "Los Angeles",
"state": "CA"
}
'import requests
url = "https://api.fyatu.com/api/v3/cardholders/{id}"
payload = {
"phone": "+1987654321",
"address": "456 Oak Avenue",
"city": "Los Angeles",
"state": "CA"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
phone: '+1987654321',
address: '456 Oak Avenue',
city: 'Los Angeles',
state: 'CA'
})
};
fetch('https://api.fyatu.com/api/v3/cardholders/{id}', 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/cardholders/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'phone' => '+1987654321',
'address' => '456 Oak Avenue',
'city' => 'Los Angeles',
'state' => 'CA'
]),
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/cardholders/{id}"
payload := strings.NewReader("{\n \"phone\": \"+1987654321\",\n \"address\": \"456 Oak Avenue\",\n \"city\": \"Los Angeles\",\n \"state\": \"CA\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.fyatu.com/api/v3/cardholders/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"phone\": \"+1987654321\",\n \"address\": \"456 Oak Avenue\",\n \"city\": \"Los Angeles\",\n \"state\": \"CA\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fyatu.com/api/v3/cardholders/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"phone\": \"+1987654321\",\n \"address\": \"456 Oak Avenue\",\n \"city\": \"Los Angeles\",\n \"state\": \"CA\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"status": 200,
"message": "Cardholder updated successfully",
"data": {
"id": "ch_a1b2c3d4e5f6",
"externalId": "EXT-0001",
"firstName": "Alice",
"lastName": "Example",
"email": "alice@example.com",
"phone": "+15550009876",
"dateOfBirth": "1990-01-01",
"gender": "FEMALE",
"address": {
"line1": "456 Example Avenue",
"city": "Los Angeles",
"state": "CA",
"country": "US",
"zipCode": "90001"
},
"document": {
"type": "PASSPORT",
"number": "XX0000000"
},
"kyc": {
"status": "ACCEPTED",
"idFrontUrl": null,
"idBackUrl": null,
"selfieUrl": null
},
"metadata": null,
"status": "ACTIVE",
"cardsCount": 1,
"createdAt": "2026-01-10T14:30:00Z",
"updatedAt": "2026-01-17T11:00:00Z"
},
"meta": {
"requestId": "req_e5f6g7h8i9j0",
"timestamp": "2026-01-17T11:00:00Z"
}
}{
"success": false,
"status": 400,
"message": "Validation failed",
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "currency",
"message": "Currency is required"
}
]
},
"meta": {
"requestId": "req_abc123",
"timestamp": "2026-01-05T10:30:00+00:00"
}
}{
"success": false,
"status": 401,
"message": "Unable to identify business",
"error": {
"code": "AUTH_TOKEN_INVALID"
},
"meta": {
"requestId": "req_abc123",
"timestamp": "2026-01-05T10:30:00+00:00"
}
}{
"success": false,
"status": 404,
"message": "Wallet not found",
"error": {
"code": "RESOURCE_NOT_FOUND"
},
"meta": {
"requestId": "req_abc123",
"timestamp": "2026-01-05T10:30:00+00:00"
}
}{
"success": false,
"status": 401,
"message": "Invalid credentials",
"error": {
"code": "AUTH_INVALID_CREDENTIALS",
"details": [
{
"field": "appId",
"message": "AppId is required"
}
]
},
"meta": {
"requestId": "req_abc123def456",
"timestamp": "2023-11-07T05:31:56Z"
}
}Cardholders
Update Cardholder
Update cardholder personal information, metadata, or status. PATCH /cardholders/.
PATCH
/
cardholders
/
{id}
Update Cardholder
curl --request PATCH \
--url https://api.fyatu.com/api/v3/cardholders/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"phone": "+1987654321",
"address": "456 Oak Avenue",
"city": "Los Angeles",
"state": "CA"
}
'import requests
url = "https://api.fyatu.com/api/v3/cardholders/{id}"
payload = {
"phone": "+1987654321",
"address": "456 Oak Avenue",
"city": "Los Angeles",
"state": "CA"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
phone: '+1987654321',
address: '456 Oak Avenue',
city: 'Los Angeles',
state: 'CA'
})
};
fetch('https://api.fyatu.com/api/v3/cardholders/{id}', 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/cardholders/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'phone' => '+1987654321',
'address' => '456 Oak Avenue',
'city' => 'Los Angeles',
'state' => 'CA'
]),
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/cardholders/{id}"
payload := strings.NewReader("{\n \"phone\": \"+1987654321\",\n \"address\": \"456 Oak Avenue\",\n \"city\": \"Los Angeles\",\n \"state\": \"CA\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.fyatu.com/api/v3/cardholders/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"phone\": \"+1987654321\",\n \"address\": \"456 Oak Avenue\",\n \"city\": \"Los Angeles\",\n \"state\": \"CA\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fyatu.com/api/v3/cardholders/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"phone\": \"+1987654321\",\n \"address\": \"456 Oak Avenue\",\n \"city\": \"Los Angeles\",\n \"state\": \"CA\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"status": 200,
"message": "Cardholder updated successfully",
"data": {
"id": "ch_a1b2c3d4e5f6",
"externalId": "EXT-0001",
"firstName": "Alice",
"lastName": "Example",
"email": "alice@example.com",
"phone": "+15550009876",
"dateOfBirth": "1990-01-01",
"gender": "FEMALE",
"address": {
"line1": "456 Example Avenue",
"city": "Los Angeles",
"state": "CA",
"country": "US",
"zipCode": "90001"
},
"document": {
"type": "PASSPORT",
"number": "XX0000000"
},
"kyc": {
"status": "ACCEPTED",
"idFrontUrl": null,
"idBackUrl": null,
"selfieUrl": null
},
"metadata": null,
"status": "ACTIVE",
"cardsCount": 1,
"createdAt": "2026-01-10T14:30:00Z",
"updatedAt": "2026-01-17T11:00:00Z"
},
"meta": {
"requestId": "req_e5f6g7h8i9j0",
"timestamp": "2026-01-17T11:00:00Z"
}
}{
"success": false,
"status": 400,
"message": "Validation failed",
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "currency",
"message": "Currency is required"
}
]
},
"meta": {
"requestId": "req_abc123",
"timestamp": "2026-01-05T10:30:00+00:00"
}
}{
"success": false,
"status": 401,
"message": "Unable to identify business",
"error": {
"code": "AUTH_TOKEN_INVALID"
},
"meta": {
"requestId": "req_abc123",
"timestamp": "2026-01-05T10:30:00+00:00"
}
}{
"success": false,
"status": 404,
"message": "Wallet not found",
"error": {
"code": "RESOURCE_NOT_FOUND"
},
"meta": {
"requestId": "req_abc123",
"timestamp": "2026-01-05T10:30:00+00:00"
}
}{
"success": false,
"status": 401,
"message": "Invalid credentials",
"error": {
"code": "AUTH_INVALID_CREDENTIALS",
"details": [
{
"field": "appId",
"message": "AppId is required"
}
]
},
"meta": {
"requestId": "req_abc123def456",
"timestamp": "2023-11-07T05:31:56Z"
}
}Overview
Update cardholder information. Only the fields you provide will be updated. Note that the email address cannot be changed after creation.Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | string | Unique cardholder identifier |
Updatable Fields
| Field | Type | Description |
|---|---|---|
firstName | string | First name (locked after KYC verification) |
middleName | string | Optional middle name (max 15 chars). Editable even after KYC verification, unlike first/last name. Send "" to clear it. Distinguishes cardholders with identical first + last names for the card network’s per-holder card limit. |
lastName | string | Last name (locked after KYC verification) |
phone | string | Phone number in E.164 format |
dateOfBirth | string | Date of birth (YYYY-MM-DD, must be 18+) |
gender | string | Gender (MALE or FEMALE) |
address | string | Street address |
city | string | City |
state | string | State or province |
country | string | ISO country code (2 chars) |
zipCode | string | Postal/ZIP code |
documentType | string | Document type (PASSPORT, NATIONAL_ID, DRIVER_LICENSE) |
documentNumber | string | Document number |
externalId | string | Your system’s identifier |
status | string | Status (ACTIVE, INACTIVE, SUSPENDED) |
metadata | object | Custom key-value data (merge semantics, see below) |
Metadata (Merge Semantics)
Themetadata field uses merge semantics on update:
- Add a key: include the key with a value
- Update a key: include the key with a new value
- Delete a key: set the key to
nullor"" - Keys you don’t include are left unchanged
// Existing metadata: { "department": "Engineering", "tier": "VIP" }
// This request:
{ "metadata": { "tier": "Premium", "cost_center": "CC-500", "department": "" } }
// Results in: { "tier": "Premium", "cost_center": "CC-500" }
// "tier" was updated, "cost_center" was added, "department" was deleted
To clear all metadata, pass an empty object with every key set to
null.Example Usage
<?php
$cardholderId = 'CH1a2b3c4d5e6f';
$data = [
'phone' => '+1987654321',
'address' => '456 Oak Avenue',
'city' => 'Los Angeles',
'state' => 'CA',
'metadata' => [
'department' => 'Sales', // update existing key
'badge_number' => 'B-789', // add new key
],
];
$response = file_get_contents(
"https://api.fyatu.com/api/v3/cardholders/{$cardholderId}",
false,
stream_context_create([
'http' => [
'method' => 'PATCH',
'header' => [
'Authorization: Bearer ' . $accessToken,
'Content-Type: application/json'
],
'content' => json_encode($data)
]
])
);
$result = json_decode($response, true);
echo "Updated cardholder: " . $result['data']['id'] . "\n";
const cardholderId = 'CH1a2b3c4d5e6f';
const data = {
phone: '+1987654321',
address: '456 Oak Avenue',
city: 'Los Angeles',
state: 'CA',
metadata: {
department: 'Sales', // update existing key
badge_number: 'B-789', // add new key
},
};
const response = await fetch(
`https://api.fyatu.com/api/v3/cardholders/${cardholderId}`,
{
method: 'PATCH',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
}
);
const result = await response.json();
console.log('Updated cardholder:', result.data.id);
Example Response
The response returns the complete updated cardholder data:{
"success": true,
"status": 200,
"message": "Cardholder updated successfully",
"data": {
"id": "ch_a1b2c3d4e5f6",
"externalId": "EXT-0001",
"firstName": "Alice",
"lastName": "Example",
"email": "alice@example.com",
"phone": "+15550009876",
"dateOfBirth": "1990-01-01",
"gender": "FEMALE",
"address": {
"line1": "456 Oak Avenue",
"city": "Los Angeles",
"state": "CA",
"country": "US",
"zipCode": "90001"
},
"document": {
"type": "PASSPORT",
"number": "AB1234567"
},
"kyc": {
"status": "UNSUBMITTED",
"idFrontUrl": null,
"idBackUrl": null,
"selfieUrl": null
},
"status": "ACTIVE",
"metadata": {
"department": "Sales",
"badge_number": "B-789"
},
"createdAt": "2026-01-15 21:31:39",
"updatedAt": "2026-01-16T00:37:34+00:00"
},
"meta": {
"requestId": "req_7d30cd59796bbcf0e903b5fd",
"timestamp": "2026-01-16T00:37:34+00:00"
}
}
Suspend/Reactivate Cardholder
You can change the cardholder’s status to temporarily suspend or reactivate them:// Suspend a cardholder
{ "status": "SUSPENDED" }
// Reactivate a cardholder
{ "status": "ACTIVE" }
// Mark as inactive
{ "status": "INACTIVE" }
Suspending a cardholder does not automatically suspend their cards. You should manage card statuses separately if needed.
The
email field cannot be updated after cardholder creation. If you need to change the email, you must delete the cardholder and create a new one.The
documentType and documentNumber fields are locked once the cardholder’s KYC status is ACCEPTED or SUBMITTED. You cannot modify document information after KYC verification.Authorizations
JWT access token obtained from /auth/token
Path Parameters
Unique cardholder identifier
Body
application/json
Cardholder's first name
Required string length:
1 - 100Cardholder's last name
Required string length:
1 - 100Phone number with country code
Required string length:
6 - 20Date of birth (YYYY-MM-DD)
Gender
Available options:
MALE, FEMALE, OTHER Street address
Maximum string length:
255City
Maximum string length:
100State or province
Maximum string length:
100ISO 3166-1 alpha-2 country code
Required string length:
2Postal/ZIP code
Maximum string length:
20Type of identification document
Available options:
PASSPORT, NATIONAL_ID, DRIVER_LICENSE Document identification number
Maximum string length:
50Your system's identifier
Maximum string length:
100Cardholder status
Available options:
ACTIVE, INACTIVE, SUSPENDED ⌘I

