curl --request POST \
--url https://api.bachs.io/v1/accounts/{account_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"display_name": "Ada Stores Ltd",
"configuration": {
"recipient": {
"capabilities": {
"conversions": {
"requested": true
}
}
}
},
"fields": {
"business_profile": {
"url": "https://adastores.example"
}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
display_name: 'Ada Stores Ltd',
configuration: {recipient: {capabilities: {conversions: {requested: true}}}},
fields: {business_profile: {url: 'https://adastores.example'}}
})
};
fetch('https://api.bachs.io/v1/accounts/{account_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}"
payload = {
"display_name": "Ada Stores Ltd",
"configuration": { "recipient": { "capabilities": { "conversions": { "requested": True } } } },
"fields": { "business_profile": { "url": "https://adastores.example" } }
}
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/{account_id}"
payload := strings.NewReader("{\n \"display_name\": \"Ada Stores Ltd\",\n \"configuration\": {\n \"recipient\": {\n \"capabilities\": {\n \"conversions\": {\n \"requested\": true\n }\n }\n }\n },\n \"fields\": {\n \"business_profile\": {\n \"url\": \"https://adastores.example\"\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": [
"payouts"
],
"capabilities": {
"payouts": {
"status": "active",
"requested": true,
"status_details": null
},
"transfers": {
"status": "restricted",
"requested": true,
"status_details": [
{
"code": "platform_disabled",
"resolution": "Contact support to re-enable this capability.",
"message": "This capability was disabled by the platform."
}
]
},
"conversions": {
"status": "pending",
"requested": true,
"status_details": null
}
},
"requirements": {
"currently_due": [
"business_profile.social_media"
],
"eventually_due": [],
"past_due": [],
"pending_verification": [
"company.documents.registration"
],
"errors": [
{
"field": "company.documents.memart",
"code": "unreadable",
"reason": "The document image was too blurry to read."
}
]
},
"is_active": true,
"created_at": "2026-08-01T09:12:44.000Z",
"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": "Resource not found",
"error_code": "NOT_FOUND"
}Update an account
The one write path for an account, yours or one you own. Set its profile and contact details, request capabilities, and supply requirement values in a single call. Omitted keys are left alone.
Each newly requested capability applies the configuration it belongs to, lands as pending, and surfaces the requirements it needs. Requesting authorizes nothing: a person enables the capability once those requirements are satisfied. Capabilities cannot be withdrawn once requested. See Capabilities.
curl --request POST \
--url https://api.bachs.io/v1/accounts/{account_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"display_name": "Ada Stores Ltd",
"configuration": {
"recipient": {
"capabilities": {
"conversions": {
"requested": true
}
}
}
},
"fields": {
"business_profile": {
"url": "https://adastores.example"
}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
display_name: 'Ada Stores Ltd',
configuration: {recipient: {capabilities: {conversions: {requested: true}}}},
fields: {business_profile: {url: 'https://adastores.example'}}
})
};
fetch('https://api.bachs.io/v1/accounts/{account_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}"
payload = {
"display_name": "Ada Stores Ltd",
"configuration": { "recipient": { "capabilities": { "conversions": { "requested": True } } } },
"fields": { "business_profile": { "url": "https://adastores.example" } }
}
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/{account_id}"
payload := strings.NewReader("{\n \"display_name\": \"Ada Stores Ltd\",\n \"configuration\": {\n \"recipient\": {\n \"capabilities\": {\n \"conversions\": {\n \"requested\": true\n }\n }\n }\n },\n \"fields\": {\n \"business_profile\": {\n \"url\": \"https://adastores.example\"\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": [
"payouts"
],
"capabilities": {
"payouts": {
"status": "active",
"requested": true,
"status_details": null
},
"transfers": {
"status": "restricted",
"requested": true,
"status_details": [
{
"code": "platform_disabled",
"resolution": "Contact support to re-enable this capability.",
"message": "This capability was disabled by the platform."
}
]
},
"conversions": {
"status": "pending",
"requested": true,
"status_details": null
}
},
"requirements": {
"currently_due": [
"business_profile.social_media"
],
"eventually_due": [],
"past_due": [],
"pending_verification": [
"company.documents.registration"
],
"errors": [
{
"field": "company.documents.memart",
"code": "unreadable",
"reason": "The document image was too blurry to read."
}
]
},
"is_active": true,
"created_at": "2026-08-01T09:12:44.000Z",
"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": "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.
Path Parameters
The account to act on. It must be one of your own accounts; any other ID returns 404 so the response never confirms that an unrelated account exists.
Body
The one account write. Set contact details, request capabilities and satisfy requirement fields in a single call. Anything you leave out is unchanged.
Personas to apply, and capabilities to request under them, the same nested shape as creation. Naming a persona here, with or without a capability nested under its capabilities, is what applies it if the account does not already have it: an account can start recipient-only and be given merchant later this way. Unlike creation, an omitted capabilities here never blanket-requests; it only applies the persona. A capability nested under the wrong persona for it is rejected with 400 capability_configuration_mismatch. Only names set to true are acted on; any name set to false fails the whole request with 400 capability_unrequest_unsupported. Capabilities the account already holds are unaffected, and an omitted map changes nothing.
Show child attributes
Show child attributes
The account's public name. Omit to leave it unchanged.
Where onboarding correspondence for the account is sent. Omit to leave it unchanged.
Requirement values, keyed by the field keys the account's requirements name: persons, company.*, business_profile.*, payout_destination, tos_acceptance.*. Omit to change nothing.
Which currencies the account holds, keyed by currency code. Holding a currency decides what the account settles in; a one-time checkout can be priced in any supported currency regardless. A recurring checkout is the exception and must be priced in a held currency, so set this before the account sells subscriptions in its own market. A new account holds only USD. Send true to add a currency and false to remove one. Omitthe field and nothing changes. USD is always held and cannot be removed. A currency Bachs cannot settle in is rejected with 400.
Show child attributes
Show child attributes
{ "NGN": true }
Response
The account, including any requirements the newly requested capability just surfaced and the effect of any fields supplied.
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": {} }

