curl --request POST \
--url https://api.bachs.io/v1/accounts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contact_email": "ada@adastores.example",
"display_name": "Ada Stores",
"first_name": "Ada",
"last_name": "Okafor",
"country": "NG",
"entity_type": "company",
"configuration": {
"recipient": {
"capabilities": {
"payouts": {
"requested": true
},
"transfers": {
"requested": true
}
}
}
},
"responsibilities": {
"fees": {
"collector": "bachs"
}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contact_email: 'ada@adastores.example',
display_name: 'Ada Stores',
first_name: 'Ada',
last_name: 'Okafor',
country: 'NG',
entity_type: 'company',
configuration: {
recipient: {capabilities: {payouts: {requested: true}, transfers: {requested: true}}}
},
responsibilities: {fees: {collector: 'bachs'}}
})
};
fetch('https://api.bachs.io/v1/accounts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/accounts"
payload = {
"contact_email": "ada@adastores.example",
"display_name": "Ada Stores",
"first_name": "Ada",
"last_name": "Okafor",
"country": "NG",
"entity_type": "company",
"configuration": { "recipient": { "capabilities": {
"payouts": { "requested": True },
"transfers": { "requested": True }
} } },
"responsibilities": { "fees": { "collector": "bachs" } }
}
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/accounts"
payload := strings.NewReader("{\n \"contact_email\": \"ada@adastores.example\",\n \"display_name\": \"Ada Stores\",\n \"first_name\": \"Ada\",\n \"last_name\": \"Okafor\",\n \"country\": \"NG\",\n \"entity_type\": \"company\",\n \"configuration\": {\n \"recipient\": {\n \"capabilities\": {\n \"payouts\": {\n \"requested\": true\n },\n \"transfers\": {\n \"requested\": true\n }\n }\n }\n },\n \"responsibilities\": {\n \"fees\": {\n \"collector\": \"bachs\"\n }\n }\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": "acct_3Wq8ZfT1yHnJ5sVe",
"name": "Ada Stores",
"owner_user_id": "usr_5e0b74c8a213",
"parent_organization_id": "acct_7KpQ2mNv4XbR9dLc",
"country": "NG",
"fee_handling": "account_pays_fee",
"enabled_payment_methods": null,
"adaptive_pricing": true,
"balance_currencies": [
"NGN"
],
"phone_number": null,
"company_name": null,
"enabled_capabilities": [],
"capabilities": {
"payouts": {
"status": "pending",
"requested": true,
"status_details": null
},
"transfers": {
"status": "pending",
"requested": true,
"status_details": null
}
},
"requirements": {
"currently_due": [
"persons",
"company.registered_name",
"company.registration_number",
"payout_destination"
],
"eventually_due": [],
"past_due": [],
"pending_verification": [],
"errors": []
},
"is_active": true,
"created_at": "2026-08-07T11:04:22.518Z",
"updated_at": "2026-08-07T11:04:22.518Z",
"responsibilities": {
"fees": {
"collector": "bachs"
}
},
"configuration": {
"recipient": {}
}
}{
"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"
}Create an account
Create an account under your platform. The account starts with nothing enabled: the capabilities you request here decide which requirements it is given, and a person enables each capability once those requirements are satisfied. Requires an active connect capability on your own platform, and an account cannot create accounts of its own. See Create an account.
curl --request POST \
--url https://api.bachs.io/v1/accounts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contact_email": "ada@adastores.example",
"display_name": "Ada Stores",
"first_name": "Ada",
"last_name": "Okafor",
"country": "NG",
"entity_type": "company",
"configuration": {
"recipient": {
"capabilities": {
"payouts": {
"requested": true
},
"transfers": {
"requested": true
}
}
}
},
"responsibilities": {
"fees": {
"collector": "bachs"
}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contact_email: 'ada@adastores.example',
display_name: 'Ada Stores',
first_name: 'Ada',
last_name: 'Okafor',
country: 'NG',
entity_type: 'company',
configuration: {
recipient: {capabilities: {payouts: {requested: true}, transfers: {requested: true}}}
},
responsibilities: {fees: {collector: 'bachs'}}
})
};
fetch('https://api.bachs.io/v1/accounts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/accounts"
payload = {
"contact_email": "ada@adastores.example",
"display_name": "Ada Stores",
"first_name": "Ada",
"last_name": "Okafor",
"country": "NG",
"entity_type": "company",
"configuration": { "recipient": { "capabilities": {
"payouts": { "requested": True },
"transfers": { "requested": True }
} } },
"responsibilities": { "fees": { "collector": "bachs" } }
}
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/accounts"
payload := strings.NewReader("{\n \"contact_email\": \"ada@adastores.example\",\n \"display_name\": \"Ada Stores\",\n \"first_name\": \"Ada\",\n \"last_name\": \"Okafor\",\n \"country\": \"NG\",\n \"entity_type\": \"company\",\n \"configuration\": {\n \"recipient\": {\n \"capabilities\": {\n \"payouts\": {\n \"requested\": true\n },\n \"transfers\": {\n \"requested\": true\n }\n }\n }\n },\n \"responsibilities\": {\n \"fees\": {\n \"collector\": \"bachs\"\n }\n }\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": "acct_3Wq8ZfT1yHnJ5sVe",
"name": "Ada Stores",
"owner_user_id": "usr_5e0b74c8a213",
"parent_organization_id": "acct_7KpQ2mNv4XbR9dLc",
"country": "NG",
"fee_handling": "account_pays_fee",
"enabled_payment_methods": null,
"adaptive_pricing": true,
"balance_currencies": [
"NGN"
],
"phone_number": null,
"company_name": null,
"enabled_capabilities": [],
"capabilities": {
"payouts": {
"status": "pending",
"requested": true,
"status_details": null
},
"transfers": {
"status": "pending",
"requested": true,
"status_details": null
}
},
"requirements": {
"currently_due": [
"persons",
"company.registered_name",
"company.registration_number",
"payout_destination"
],
"eventually_due": [],
"past_due": [],
"pending_verification": [],
"errors": []
},
"is_active": true,
"created_at": "2026-08-07T11:04:22.518Z",
"updated_at": "2026-08-07T11:04:22.518Z",
"responsibilities": {
"fees": {
"collector": "bachs"
}
},
"configuration": {
"recipient": {}
}
}{
"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"
}Authorizations
Bearer token authentication. Pass your API key as Authorization: Bearer sk_.... See Authentication for keys, scopes, and sandbox vs production.
Headers
Account ID when acting on behalf of a sub-account.
Body
Email address of the person or business behind the account. Trimmed and lowercased before it is stored.
"ada@adastores.example"
Name you want the account listed under. Becomes the account's name, and is null until the account holder sets one during onboarding if you omit it.
"Ada Stores"
Given name of the person you are onboarding, used to label the account before verification collects a legal name. Whitespace-only values are stored as null.
255"Ada"
Family name of the person you are onboarding. Whitespace-only values are stored as null.
255"Okafor"
Two-letter ISO 3166-1 country code for the account. Decides which requirements the account is given, so set it when you already know it. Falls back to your own platform's country.
"NG"
What kind of legal person the account is, which together with country decides the requirements it is given. company: a registered entity, asked for registration and ownership details. individual: a natural person, asked only for their own identity.
company, individual "company"
Personas the account is being created for, keyed by name (merchant, recipient). No persona is ever applied automatically, recipient included. An account created with no configuration holds neither and cannot hold any capability. Sending an empty object is rejected with 422 VALIDATION_ERROR; omit the field entirely for a persona-less account instead. A capability is only ever named inside the persona object it belongs to, in its capabilities, so naming one always names its persona in the same request; there is no way to name a capability without also naming a persona, and no way to infer one from a bare capability name. A capability nested under the wrong persona for it is rejected with 400 capability_configuration_mismatch. There is no field to apply a configuration after creation other than naming it again on update, so decide every persona the account will ever need up front, or add one later on POST /v1/accounts/{account_id}. An unrecognised key is rejected with 400 invalid_configuration.
Show child attributes
Show child attributes
{
"merchant": {
"capabilities": { "card_collection": { "requested": true } }
}
}
Fee arrangement for the account. Defaults to Bachs collecting its fee out of the charge.
Show child attributes
Show child attributes
Response
Account created, with the requirements the requested capabilities just surfaced.
Unique identifier for the account.
"acct_7KpQ2mNv4XbR9dLc"
The account's display name.
"Ada Stores"
The user that owns the account. For an account you own this is a service user Bachs created; you never authenticate as it.
"usr_7b3e19d24c0a"
The platform this account is connected to, or null when it is a platform in its own right.
"acct_7KpQ2mNv4XbR9dLc"
Two-letter ISO 3166-1 country code. Decides which requirements the account is given.
"NG"
What kind of legal person the account is, which together with country decides the requirements it is given. company: a registered entity, asked for registration and ownership details. individual: a natural person, asked only for their own identity.
company, individual "company"
Who absorbs processing fees at checkout. account_pays_fee: deducted from the amount you receive. customer_pays_fee: added to what the customer pays.
account_pays_fee, customer_pays_fee "account_pays_fee"
One entry per exact corridor (USD_CARD, NGN_CARD, NGN_BANK_TRANSFER, MOMO_GHS to MOMO_ZMW, CRYPTO). See payment method support. Each value has an enabled boolean; CRYPTO additionally carries a currencies map since it covers several asset/network pairs.
When true, customers are shown prices in their local currency where one is available.
true
Currencies this account is configured to hold a balance in.
["NGN", "USD"]
Contact phone number, including country code.
"+2348012345678"
Registered company name, when the account is a company.
"Ada Stores Limited"
Names of the capabilities currently active on this account. A convenience view of capabilities.
["transfers", "payouts"]
Each capability's status, keyed by capability name. Populated on single-account reads only; null on list items.
Show child attributes
Show child attributes
Outstanding requirements for this account. Populated on single-account reads only; null on list items.
Show child attributes
Show child attributes
When false, the account is deactivated and cannot authenticate or move funds.
true
When the account was created, ISO 8601 in UTC.
"2026-08-01T09:12:44.000Z"
When the account was last updated, ISO 8601 in UTC.
"2026-08-07T11:04:22.518Z"
Fee arrangement for an account you own. null when this object is not an account you own.
Show child attributes
Show child attributes
Personas applied to this account, keyed by name (merchant, recipient), each with an empty object as its value. Populated on single-account reads, where it is {} when none apply; null on list items.
Show child attributes
Show child attributes
{ "merchant": {}, "recipient": {} }

