Change the destination address of a collect wallet
curl --request PATCH \
--url https://api.kemycard.com/v1/wallets/{code}/destination \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"destination_address": "YOUR_NEW_SOLANA_ADDRESS"
}
'import requests
url = "https://api.kemycard.com/v1/wallets/{code}/destination"
payload = { "destination_address": "YOUR_NEW_SOLANA_ADDRESS" }
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({destination_address: 'YOUR_NEW_SOLANA_ADDRESS'})
};
fetch('https://api.kemycard.com/v1/wallets/{code}/destination', 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.kemycard.com/v1/wallets/{code}/destination",
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([
'destination_address' => 'YOUR_NEW_SOLANA_ADDRESS'
]),
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.kemycard.com/v1/wallets/{code}/destination"
payload := strings.NewReader("{\n \"destination_address\": \"YOUR_NEW_SOLANA_ADDRESS\"\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.kemycard.com/v1/wallets/{code}/destination")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"destination_address\": \"YOUR_NEW_SOLANA_ADDRESS\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kemycard.com/v1/wallets/{code}/destination")
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 \"destination_address\": \"YOUR_NEW_SOLANA_ADDRESS\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "standard",
"customer_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reference": "order-1001",
"blockchain": "solana",
"currency": "USDC",
"address": "CUSTOMER_DEPOSIT_ADDRESS",
"balance": 98.5,
"destination_address": null,
"forward_threshold": null,
"status": "active",
"created_at": "2023-11-07T05:31:56Z",
"previous_destination_address": "YOUR_SOLANA_ADDRESS"
},
"meta": {
"request_id": "a4f8e2c1b3d97056",
"mode": "test",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"success": false,
"error": {
"code": "ACCOUNT_SUSPENDED_NEGATIVE_BALANCE",
"message": "Your account is suspended because one of your ops balances is negative. Top up the negative balance to restore access. Read-only requests (GET) remain available.",
"details": {
"negative_balance_since": "2026-10-15T08:00:00+00:00"
}
}
}{
"success": false,
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found.",
"details": null
}
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Missing required fields.",
"details": {}
},
"meta": {
"request_id": "a4f8e2c1b3d97056",
"mode": "test",
"timestamp": "2023-11-07T05:31:56Z"
}
}Wallets
Change a Destination Address
Sets a new destination address for a collect wallet. Every forward created from now on is sent to the new address; forwards already created keep the address they were created with.
- Same blockchain. The address must be valid on the blockchain of the wallet. It cannot be the address of the wallet itself, nor the address of a KemyCard collect wallet.
- You are notified. Each change sends the
wallet.destination_updatedwebhook (previous and new address) and an email to the email address of your account. - Protected like every call. It requires your API key and a call from one of your allowed IP addresses.
Collect wallets only: a standard wallet has no destination address (422).
PATCH
/
wallets
/
{code}
/
destination
Change the destination address of a collect wallet
curl --request PATCH \
--url https://api.kemycard.com/v1/wallets/{code}/destination \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"destination_address": "YOUR_NEW_SOLANA_ADDRESS"
}
'import requests
url = "https://api.kemycard.com/v1/wallets/{code}/destination"
payload = { "destination_address": "YOUR_NEW_SOLANA_ADDRESS" }
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({destination_address: 'YOUR_NEW_SOLANA_ADDRESS'})
};
fetch('https://api.kemycard.com/v1/wallets/{code}/destination', 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.kemycard.com/v1/wallets/{code}/destination",
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([
'destination_address' => 'YOUR_NEW_SOLANA_ADDRESS'
]),
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.kemycard.com/v1/wallets/{code}/destination"
payload := strings.NewReader("{\n \"destination_address\": \"YOUR_NEW_SOLANA_ADDRESS\"\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.kemycard.com/v1/wallets/{code}/destination")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"destination_address\": \"YOUR_NEW_SOLANA_ADDRESS\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kemycard.com/v1/wallets/{code}/destination")
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 \"destination_address\": \"YOUR_NEW_SOLANA_ADDRESS\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "standard",
"customer_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reference": "order-1001",
"blockchain": "solana",
"currency": "USDC",
"address": "CUSTOMER_DEPOSIT_ADDRESS",
"balance": 98.5,
"destination_address": null,
"forward_threshold": null,
"status": "active",
"created_at": "2023-11-07T05:31:56Z",
"previous_destination_address": "YOUR_SOLANA_ADDRESS"
},
"meta": {
"request_id": "a4f8e2c1b3d97056",
"mode": "test",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"success": false,
"error": {
"code": "ACCOUNT_SUSPENDED_NEGATIVE_BALANCE",
"message": "Your account is suspended because one of your ops balances is negative. Top up the negative balance to restore access. Read-only requests (GET) remain available.",
"details": {
"negative_balance_since": "2026-10-15T08:00:00+00:00"
}
}
}{
"success": false,
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found.",
"details": null
}
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Missing required fields.",
"details": {}
},
"meta": {
"request_id": "a4f8e2c1b3d97056",
"mode": "test",
"timestamp": "2023-11-07T05:31:56Z"
}
}This call changes where the funds of a collect wallet go. It is made with your API key, and API calls are only accepted from your allowed IP addresses, which are required. Every change is notified by the
wallet.destination_updated webhook and by email.A blockchain transfer cannot be cancelled or reversed. Check that
destination_address is an address on the blockchain of the wallet before you call.Authorizations
API key (sk_test_... or sk_live_...)
Path Parameters
Code of the collect wallet
Body
application/json
New destination address, on the blockchain of the wallet
Example:
"YOUR_NEW_SOLANA_ADDRESS"