curl --request GET \
--url https://api.bachs.io/v1/accounts/{account_id}/persons/{person_id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bachs.io/v1/accounts/{account_id}/persons/{person_id}', 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/{person_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/accounts/{account_id}/persons/{person_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": "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"
}{
"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"
}Read a person
Read one person. Requirement keys are anchored to the person id, so persons.per_3a91c0d7.id_document names exactly who this is about.
curl --request GET \
--url https://api.bachs.io/v1/accounts/{account_id}/persons/{person_id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bachs.io/v1/accounts/{account_id}/persons/{person_id}', 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/{person_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/accounts/{account_id}/persons/{person_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": "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"
}{
"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.
The person on that account.
Response
The person.
The person's identifier, prefixed per_. Requirement keys are anchored to it, so persons.per_3a91c0d7.id_document names exactly who owes a document.
"per_3a91c0d7"
The person's given name as recorded, or null when it has not been supplied yet. It is the name their identity document is checked against.
"Ada"
The person's family name as recorded, or null when it has not been supplied yet. It is checked against the identity document alongside first_name.
"Obi"
ISO-8601 date, YYYY-MM-DD.
"1990-04-12"
The person's residential address, carrying the line1, city, state, postal_code and country keys that were written, or null when no address has been supplied. It is stored whole, so a later write replaces it rather than merging into it.
The contact number recorded for this person, returned exactly as it was sent, or null when none has been supplied.
"+2348012345678"
The email address recorded for this person, or null when none has been supplied. It belongs to the person, not to the account, so it differs from the account's contact_email.
"ada@example.com"
true when a government ID number is held for this person, false when none has been supplied. The number itself is write-only and never returned, so this flag is how you tell whether you still need to collect one.
true
Role flags. One person is commonly several of these at once, which is why they are flags on one person rather than separate collections.
Show child attributes
Show child attributes
What has been established about this person. How it was established is not reported.
Show child attributes
Show child attributes
When the person was added to the account, ISO 8601 in UTC.
"2026-08-10T09:31:12.000Z"
When the person record last changed, ISO 8601 in UTC. A verification outcome we record moves it as well as your own writes, so do not read it as the time of your last edit.
"2026-08-11T14:05:40.219Z"

