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.

Scopes

connected_accounts:write

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

A given name used only to label the account. It does not add a person to the account and does not satisfy persons.name: add the representative through fields.persons on Update an account. Whitespace-only values are stored as null.

Maximum string length: 255
Example:

"Ada"

last_name
string | null

A family name used only to label the account. Like first_name, it does not add a person to the account. 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; the personas and capabilities in your Connect setup are not applied to an API create. Only the setup's international payouts default is, when payouts is requested. 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.

dashboard
enum<string>
default:none

Whether the person behind the account can log in to see their money. none: nobody logs in. light: they log in at connect.bachs.io, with your branding and no password. full: they log in to the Bachs dashboard at app.bachs.io with a Bachs login, and are invited by email when the account goes live. You can raise the mode later, but not lower it. See Give an account a dashboard.

Available options:
none,
light,
full
Example:

"light"

dashboard_features
object

What the person may change from their dashboard. Every switch starts off. Send only the switches you want to change; the rest keep their value. view_payments is always on and cannot be sent. These switches limit the person only, never your API key. See Give an account a dashboard.

Example:

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:
dashboard
enum<string>

The account's access mode. See Give an account a dashboard.

Available options:
none,
light,
full
Example:

"light"

dashboard_features
object

All five switches. view_payments is true in light and full mode. In none mode every switch reads false, because nobody logs in; the switches you set come back if you raise the mode.

Example:
dashboard_access
enum<string>

not_invited: nobody has logged in yet. invited: a full invite is out, and nobody has accepted it yet. active: the person behind the account has logged in at least once, or accepted the full invite.

Available options:
not_invited,
invited,
active
Example:

"not_invited"

liveness_owed
boolean | null

true when the person behind the account still needs to do the selfie video check. Send them a liveness account link. Only on a single-account read. See The selfie video check.

Example:

false