curl --request POST \
--url https://api.bachs.io/v1/payouts/destinations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "My GTBank Savings",
"currency": "NGN",
"label": "Treasury NGN Account",
"account_number": "0123456789",
"bank_code": "058"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'My GTBank Savings',
currency: 'NGN',
label: 'Treasury NGN Account',
account_number: '0123456789',
bank_code: '058'
})
};
fetch('https://api.bachs.io/v1/payouts/destinations', 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"
payload = {
"name": "My GTBank Savings",
"currency": "NGN",
"label": "Treasury NGN Account",
"account_number": "0123456789",
"bank_code": "058"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(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"
payload := strings.NewReader("{\n \"name\": \"My GTBank Savings\",\n \"currency\": \"NGN\",\n \"label\": \"Treasury NGN Account\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"058\"\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))
}{
"id": "pd_7Kq2mNv4XbR9dLc0",
"name": "My GTBank Savings",
"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-01-24T14: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"
}Create Payout Destination
Add a new payout destination (bank account, mobile money, or crypto wallet) where you can withdraw funds. A connected account can add a mobile money wallet, or a bank paid outside Nigeria, only when international payouts are on for it. Otherwise it is refused with 400 INTERNATIONAL_PAYOUTS_NOT_ENABLED.
curl --request POST \
--url https://api.bachs.io/v1/payouts/destinations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "My GTBank Savings",
"currency": "NGN",
"label": "Treasury NGN Account",
"account_number": "0123456789",
"bank_code": "058"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'My GTBank Savings',
currency: 'NGN',
label: 'Treasury NGN Account',
account_number: '0123456789',
bank_code: '058'
})
};
fetch('https://api.bachs.io/v1/payouts/destinations', 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"
payload = {
"name": "My GTBank Savings",
"currency": "NGN",
"label": "Treasury NGN Account",
"account_number": "0123456789",
"bank_code": "058"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(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"
payload := strings.NewReader("{\n \"name\": \"My GTBank Savings\",\n \"currency\": \"NGN\",\n \"label\": \"Treasury NGN Account\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"058\"\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))
}{
"id": "pd_7Kq2mNv4XbR9dLc0",
"name": "My GTBank Savings",
"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-01-24T14: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
Register where money should land. Accepts both the field names this surface has always used and newer aliases, so a caller never has to know which generation of the API it is talking to. Where a legacy name and its alias overlap, the newer name wins.
Response
Success
Response containing payout destination details (bank account, mobile money, or crypto wallet).

