Create a subaccount
/v1/subaccountsCreates a subaccount keyed by an ACCT_… code. bank_code is validated against the NIBSS bank list — call List banks to discover valid codes. account_number must be a 10-digit NUBAN. The pair (bank_code, account_number) is immutable after creation; to change the settlement destination, create a new subaccount.
Body parameters
business_namestringrequiredVendor label (1–200 chars). Shown in the dashboard and on settlement reports.
bank_codestringrequiredNIBSS bank code (3–6 digits). See **List banks**.
account_numberstringrequired10-digit NUBAN of the destination account.
percentage_chargenumberrequiredPlatform fee on the vendor's slice (0–100, max 2 decimal places). Distinct from TagPay's processing fee.
primary_contact_emailstringoptionalContact email for the vendor.
primary_contact_namestringoptionalContact name for the vendor (1–120 chars).
primary_contact_phonestringoptionalContact phone (1–32 chars).
metadataobjectoptionalArbitrary key/value pairs stored alongside the subaccount.
Response
201subaccount_codestringTagPay-assigned code (`ACCT_…`). Use this in every subsequent subaccount and split call.
business_namestringHuman-friendly label for the vendor / sub-merchant.
bank_namestringResolved bank name (derived from `bank_code`).
bank_codestringNIBSS bank code (3–6 digits). **Immutable** after creation.
account_numberstring10-digit NUBAN where settlements land. **Immutable** after creation.
settlement_bankstringSame value as `bank_name`. Mirrored for backwards compatibility with older Paystack-style consumers.
percentage_chargenumberPlatform fee taken off the subaccount's slice (0–100). This is **your** fee on the vendor, separate from TagPay's processing fee.
primary_contact_emailstring | nullContact email for the vendor, or null.
primary_contact_namestring | nullContact name for the vendor, or null.
primary_contact_phonestring | nullContact phone for the vendor, or null.
metadataobject | nullArbitrary key/value pairs you stored on the subaccount.
activebooleanWhether the subaccount can be used in new splits. Inactive subaccounts are rejected at split-create/initialize time.
created_atstringISO-8601 creation timestamp.
updated_atstringISO-8601 last-update timestamp.
Errors
VALIDATION_ERROR400A field is missing or invalid (`bank_code` not 3–6 digits, `account_number` not 10 digits, `percentage_charge` outside 0–100, etc.).INVALID_BANK_CODE400The supplied `bank_code` is not in the NIBSS bank list.SUBACCOUNT_DUPLICATE409An active subaccount with the same `bank_code` + `account_number` already exists for this merchant.INVALID_KEY401Secret key missing or invalid.