curl --request GET \
--url https://api.bachs.io/v1/accounts/{account_id}/persons \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bachs.io/v1/accounts/{account_id}/persons', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/accounts/{account_id}/persons"
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/accounts/{account_id}/persons"
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))
}{
"items": [
{
"id": "per_3a91c0d7",
"first_name": "Ada",
"last_name": "Obi",
"dob": "1990-04-12",
"address": {
"line1": "14 Balogun Street",
"city": "Lagos",
"state": "Lagos",
"postal_code": "101241",
"country": "NG"
},
"phone": "+2348012345678",
"email": "ada@example.com",
"id_number_provided": true,
"relationship": {
"representative": true,
"owner": true,
"director": false,
"executive": false,
"percent_ownership": 60,
"title": "Founder"
},
"verification": {
"status": "verified",
"document_provided": true,
"failure_reason": null
},
"created_at": "2026-08-10T09:31:12.000Z",
"updated_at": "2026-08-11T14:05:40.219Z"
},
{
"id": "per_9c40be12",
"first_name": "Tunde",
"last_name": "Bello",
"dob": "1986-11-02",
"address": null,
"phone": null,
"email": null,
"id_number_provided": false,
"relationship": {
"representative": false,
"owner": false,
"director": true,
"executive": false,
"percent_ownership": null,
"title": "Non-executive director"
},
"verification": {
"status": "unverified",
"document_provided": false,
"failure_reason": null
},
"created_at": "2026-08-10T09:44:07.000Z",
"updated_at": "2026-08-10T09:44:07.000Z"
}
],
"total": 2,
"limit": 50,
"offset": 0
}{
"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"
}List persons
The people behind the account: its representative, beneficial owners and directors.
curl --request GET \
--url https://api.bachs.io/v1/accounts/{account_id}/persons \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bachs.io/v1/accounts/{account_id}/persons', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/accounts/{account_id}/persons"
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/accounts/{account_id}/persons"
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))
}{
"items": [
{
"id": "per_3a91c0d7",
"first_name": "Ada",
"last_name": "Obi",
"dob": "1990-04-12",
"address": {
"line1": "14 Balogun Street",
"city": "Lagos",
"state": "Lagos",
"postal_code": "101241",
"country": "NG"
},
"phone": "+2348012345678",
"email": "ada@example.com",
"id_number_provided": true,
"relationship": {
"representative": true,
"owner": true,
"director": false,
"executive": false,
"percent_ownership": 60,
"title": "Founder"
},
"verification": {
"status": "verified",
"document_provided": true,
"failure_reason": null
},
"created_at": "2026-08-10T09:31:12.000Z",
"updated_at": "2026-08-11T14:05:40.219Z"
},
{
"id": "per_9c40be12",
"first_name": "Tunde",
"last_name": "Bello",
"dob": "1986-11-02",
"address": null,
"phone": null,
"email": null,
"id_number_provided": false,
"relationship": {
"representative": false,
"owner": false,
"director": true,
"executive": false,
"percent_ownership": null,
"title": "Non-executive director"
},
"verification": {
"status": "unverified",
"document_provided": false,
"failure_reason": null
},
"created_at": "2026-08-10T09:44:07.000Z",
"updated_at": "2026-08-10T09:44:07.000Z"
}
],
"total": 2,
"limit": 50,
"offset": 0
}{
"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"
}Authorizations
Bearer token authentication. Pass your API key as Authorization: Bearer sk_.... See Authentication for keys, scopes, and sandbox vs production.
Path Parameters
The account to act on. It must be one of your own accounts; any other ID returns 404.
Query Parameters
1 <= x <= 100x >= 0Response
The account's persons.
The account's persons for this page, oldest first, each carrying the same shape as reading one person. The order is stable, so paging with offset neither repeats nor skips anyone.
Show child attributes
Show child attributes
How many persons the account has in total, not how many came back on this page. Compare it against offset plus the length of items to know whether another page is waiting.
2
How many persons a page returns at most, echoing the limit you sent. It defaults to 50 and is capped at 100; anything outside 1 to 100 is rejected with 422.
50
How many persons were skipped before this page, echoing the offset you sent. Add limit to it to ask for the next page, and stop once it reaches total.
0

