Skip to main content
POST
Create an account

Authorizations

Authorization
string
header
required

Bearer token authentication. Pass your API key as Authorization: Bearer sk_.... See Authentication for keys, scopes, and sandbox vs production.

Headers

X-Account-Id
string

Account ID when acting on behalf of a sub-account.

Body

application/json
contact_email
string<email>
required

Email address of the person or business behind the account. Trimmed and lowercased before it is stored.

Example:

"ada@adastores.example"

display_name
string | null

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.

Example:

"Ada Stores"

first_name
string | null

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.

Maximum string length: 255
Example:

"Ada"

last_name
string | null

Family name of the person you are onboarding. Whitespace-only values are stored as null.

Maximum string length: 255
Example:

"Okafor"

country
string | null

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.

Example:

"NG"

entity_type
enum<string> | null

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.

Available options:
company,
individual
Example:

"company"

configuration
object | null

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.

Example:
responsibilities
object

Fee arrangement for the account. Defaults to Bachs collecting its fee out of the charge.

Response

Account created, with the requirements the requested capabilities just surfaced.

id
string

Unique identifier for the account.

Example:

"acct_7KpQ2mNv4XbR9dLc"

name
string | null

The account's display name.

Example:

"Ada Stores"

owner_user_id
string

The user that owns the account. For an account you own this is a service user Bachs created; you never authenticate as it.

Example:

"usr_7b3e19d24c0a"

parent_organization_id
string | null

The platform this account is connected to, or null when it is a platform in its own right.

Example:

"acct_7KpQ2mNv4XbR9dLc"

country
string | null

Two-letter ISO 3166-1 country code. Decides which requirements the account is given.

Example:

"NG"

entity_type
enum<string> | null

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.

Available options:
company,
individual
Example:

"company"

fee_handling
enum<string>

Who absorbs processing fees at checkout. account_pays_fee: deducted from the amount you receive. customer_pays_fee: added to what the customer pays.

Available options:
account_pays_fee,
customer_pays_fee
Example:

"account_pays_fee"

enabled_payment_methods
object | null

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.

adaptive_pricing
boolean

When true, customers are shown prices in their local currency where one is available.

Example:

true

balance_currencies
string[]

Currencies this account is configured to hold a balance in.

Example:
phone_number
string | null

Contact phone number, including country code.

Example:

"+2348012345678"

company_name
string | null

Registered company name, when the account is a company.

Example:

"Ada Stores Limited"

enabled_capabilities
string[] | null

Names of the capabilities currently active on this account. A convenience view of capabilities.

Example:
capabilities
object | null

Each capability's status, keyed by capability name. Populated on single-account reads only; null on list items.

requirements
object | null

Outstanding requirements for this account. Populated on single-account reads only; null on list items.

is_active
boolean

When false, the account is deactivated and cannot authenticate or move funds.

Example:

true

created_at
string

When the account was created, ISO 8601 in UTC.

Example:

"2026-08-01T09:12:44.000Z"

updated_at
string

When the account was last updated, ISO 8601 in UTC.

Example:

"2026-08-07T11:04:22.518Z"

responsibilities
object | null

Fee arrangement for an account you own. null when this object is not an account you own.

configuration
object | null

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.

Example: