curl --request PATCH \
--url https://api.bachs.io/v1/payouts/destinations/{destination_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Treasury NGN Account"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Treasury NGN Account'})
};
fetch('https://api.bachs.io/v1/payouts/destinations/{destination_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/payouts/destinations/{destination_id}"
payload = { "name": "Treasury NGN Account" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/payouts/destinations/{destination_id}"
payload := strings.NewReader("{\n \"name\": \"Treasury NGN Account\"\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))
}{
"id": "pd_7Kq2mNv4XbR9dLc0",
"name": "Treasury NGN Account",
"type": "bank_account",
"currency": "NGN",
"status": "pending_review",
"status_reason": null,
"is_usable": false,
"is_default": false,
"account_number": "0123456789",
"account_name": "JOHN DOE",
"bank_code": "058",
"bank_name": "Guaranty Trust Bank",
"phone_number": null,
"mobile_provider": null,
"wallet_address": null,
"network": null,
"reviewed_at": null,
"created_at": "2026-01-24T14:30:00.000Z",
"updated_at": "2026-02-22T14:30:00.000Z"
}{
"detail": "Invalid request parameters",
"error_code": "VALIDATION_ERROR",
"errors": [
{
"field": "amount",
"message": "Amount must be a positive decimal string",
"type": "value_error"
}
]
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}{
"detail": "Rate limit exceeded. Please retry after a few seconds.",
"error_code": "TOO_MANY_REQUESTS"
}{
"detail": "An unexpected error occurred. Please try again later.",
"error_code": "INTERNAL_SERVER_ERROR"
}Update Payout Destination
Update a destination: rename it, (de)promote it as a payout schedule’s default, or restate where money lands.
name and is_default alone are safe: neither touches review status, since the default can only ever be one of your own approved destinations. Sending any routing detail (currency, type, account, wallet or phone) restates the destination in full, the same shape as POST; omitted routing fields fall back to what is already stored. Changing an account number, bank code, wallet, network, or phone number this way checks the destination again as if it were new, because the approval it holds was granted for the old details. It goes back to review only for a crypto wallet for an account based in Nigeria, or a destination that was rejected.
Common errors:
400 VALIDATION_ERROR: neithernamenoris_defaultsent, or an invalid payload for the destination type. Resolution: validate request fields and retry.401 UNAUTHORIZED: API key is missing, invalid, or revoked. Resolution: use a valid API key in theAuthorizationheader.404 NOT_FOUND:destination_idwas not found. Resolution: verify destination ID and retry.
curl --request PATCH \
--url https://api.bachs.io/v1/payouts/destinations/{destination_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Treasury NGN Account"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Treasury NGN Account'})
};
fetch('https://api.bachs.io/v1/payouts/destinations/{destination_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/payouts/destinations/{destination_id}"
payload = { "name": "Treasury NGN Account" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/payouts/destinations/{destination_id}"
payload := strings.NewReader("{\n \"name\": \"Treasury NGN Account\"\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))
}{
"id": "pd_7Kq2mNv4XbR9dLc0",
"name": "Treasury NGN Account",
"type": "bank_account",
"currency": "NGN",
"status": "pending_review",
"status_reason": null,
"is_usable": false,
"is_default": false,
"account_number": "0123456789",
"account_name": "JOHN DOE",
"bank_code": "058",
"bank_name": "Guaranty Trust Bank",
"phone_number": null,
"mobile_provider": null,
"wallet_address": null,
"network": null,
"reviewed_at": null,
"created_at": "2026-01-24T14:30:00.000Z",
"updated_at": "2026-02-22T14:30:00.000Z"
}{
"detail": "Invalid request parameters",
"error_code": "VALIDATION_ERROR",
"errors": [
{
"field": "amount",
"message": "Amount must be a positive decimal string",
"type": "value_error"
}
]
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}{
"detail": "Rate limit exceeded. Please retry after a few seconds.",
"error_code": "TOO_MANY_REQUESTS"
}{
"detail": "An unexpected error occurred. Please try again later.",
"error_code": "INTERNAL_SERVER_ERROR"
}Authorizations
Bearer token authentication. Pass your API key as Authorization: Bearer sk_.... See Authentication for keys, scopes, and sandbox vs production.
Body
The one update a destination allows. name and is_default alone are safe: a rename touches no routing column, and the default can only ever be one of your own approved destinations. Sending any field below restates the destination in full, the same shape as POST; omitted routing fields fall back to what is already stored. Changing an account number, bank code, wallet, network or phone number this way checks the destination again as if it were new, because the approval it holds was granted for the old details. It goes back to review only for a crypto wallet for an account based in Nigeria, or a destination that was rejected.
Response
Success
Response containing payout destination details (bank account, mobile money, or crypto wallet).

