Create an account
Creates a new account with its complete B2B onboarding graph in a single atomic call.
Atomic create: supply addresses[], contacts[], payment_methods[], and tags[]
inline. All children are written in one database transaction — any child failure rolls back
the parent and every already-inserted child. The 201 response includes all children hydrated
inline; no follow-up GETs required.
name is required. Accepted aliases: display_name, company_name, or
first_name+last_name. Without a name the request returns 422.
entity_id is extracted from the API key and may NOT be supplied in the request body (Layer 1 isolation). Auto-assigns account_number, default_pricing_level_id, payment_term_id, and default_location_id from entity settings.
Address field aliases: street1/region/postal_code are accepted as Stripe-style
aliases for line1/state/zip.
Contact field aliases: role is accepted as a public alias for the title field.
Tag auto-create: tags supplied by name are auto-created for the entity if they do not exist. Applying the same tag twice is idempotent.
Side effects:
- Shopify customer sync fires post-commit if entity.settings.shopify_sync.customer_sync = true.
- AvaTax recalc fires if tax_exempt or avatax_entity_code is set.
Idempotent when Idempotency-Key header is supplied (24-hour window).
Authorizations
API key issued per entity via Settings > Developers > API Keys.
Each key carries scopes (e.g. orders:read, products:write).
Bearer token format: Authorization: Bearer ark_live_ent_Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.
Headers
Optional idempotency key for safe retries.
255Body
Creates a new account with its full onboarding graph in one atomic request.
Required fields: name (or display_name/company_name/first_name+last_name)
and account_type.
Nested children (all optional, all atomic):
addresses[]: billing and/or shipping addresses. Supportsstreet1/region/postal_code(Stripe-style aliases) orline1/state/zip(canonical). First address of each type auto-becomes the default.contacts[]: person contacts.roleis a public alias for thetitlefield. At most oneis_primary: true.payment_methods[]: Stripe payment methods viastripe_payment_method_id(thepm_*token from a completed SetupIntent). Requires Stripe to be configured for the entity.tags[]: tag names to apply. Tags are auto-created if they do not exist for the entity.
Transaction guarantee: all children are written in a single database transaction. Any child failure rolls back the parent account and every already-inserted child. You get a complete graph or nothing.
Hydrated response: the 201 body includes addresses, contacts, payment_methods,
and tags arrays inline. No follow-up GETs required.
See also: Creating accounts with addresses guide
Human-readable name for the account. Required. Aliases: display_name (business),
company_name (business), or first_name+last_name (individual). All are accepted;
name is the canonical public API field.
business, individual, lead, vendor Alias for name. Auto-derived from company_name or first+last if omitted.
For individual accounts.
For individual accounts.
Maps to phone_main internally.
Must reference an existing payment_terms row for this entity.
Alias for default_pricing_level_id.
Credit ceiling in USD. Returned as a JS number (float), never a string.
Billing and/or shipping addresses to create atomically with the account.
Supports street1/region/postal_code (Stripe-style) OR line1/state/zip (canonical).
At most one address per type may have is_default_billing: true or is_default_shipping: true.
Person contacts to create atomically with the account.
If omitted, an auto-generated primary contact is created from account-level name/email/phone.
At most one contact may have is_primary: true.
role is the public API alias for the internal title field.
Stripe payment methods to attach atomically with the account.
Each item requires a stripe_payment_method_id (the pm_* token from a completed
Stripe SetupIntent or test card). Requires Stripe to be configured for the entity.
Tag names to apply to the account. Tags are auto-created if they do not exist for the entity (using the name as the slug base). Idempotent: applying the same tag twice is a no-op.
Response
Account created
An Arcus ERP account. Represents a customer, vendor, lead, or individual. account_type drives AR vs AP behavior: business/individual/lead = customer (AR); vendor = supplier (AP). entity_id is always from the API key (Layer 1 isolation).

