curl --request GET \
--url https://api.bachs.io/v1/payouts/{withdrawal_id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bachs.io/v1/payouts/{withdrawal_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/{withdrawal_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/payouts/{withdrawal_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "pay_4Xr9dLc0mNv7Kq2B",
"status": "processing",
"amount": "5000.00",
"currency": "NGN",
"source_currency": "NGN",
"fee": "100.00",
"total_debited": "5100.00",
"destination": "pd_7Kq2mNv4XbR9dLc0",
"reference": "WD-20260222-001",
"narration": "Bachs Payout",
"session_id": null,
"failure_reason": null,
"created_at": "2026-02-22T12:00:00.000Z",
"completed_at": null
}{
"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"
}Get Payout
Get a payout withdrawal by ID.
curl --request GET \
--url https://api.bachs.io/v1/payouts/{withdrawal_id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bachs.io/v1/payouts/{withdrawal_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/{withdrawal_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/payouts/{withdrawal_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "pay_4Xr9dLc0mNv7Kq2B",
"status": "processing",
"amount": "5000.00",
"currency": "NGN",
"source_currency": "NGN",
"fee": "100.00",
"total_debited": "5100.00",
"destination": "pd_7Kq2mNv4XbR9dLc0",
"reference": "WD-20260222-001",
"narration": "Bachs Payout",
"session_id": null,
"failure_reason": null,
"created_at": "2026-02-22T12:00:00.000Z",
"completed_at": null
}{
"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.
Response
Success - Payout retrieved
The one shape a payout has on this API, across create, retrieve and list. amount is denominated in currency; fee and total_debited are denominated in source_currency. The two differ on every cross-currency payout, so the debit side must say which one it is in. For a same-currency payout source_currency equals currency.
The narration we sent with this payout: the narration you sent, or our default text when you sent none (Bachs Payout on bank and mobile money payouts). null on a crypto payout without one. The recipient's bank may show it shortened, or show its own label instead.
"Invoice 1042"
The NIP session ID of a payout to a Nigerian bank account: the ID the receiving bank uses to trace the transfer. Give it to the recipient or their bank when they ask where the money is. null until status is completed, and always null on other payout types. Payouts completed before 22 October 2026 have none.
null

