---
title: "Create Bank Account"
method: POST
path: "/accounts"
tags: ["Accounts"]
---

# Create Bank Account

`POST /accounts`

## Request

- Base URL: `https://api.meow.com/v1`
- URL: `https://api.meow.com/v1/accounts`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/meow/apis/meow-api/docs/accounts/post.ts> (a function with typed inputs; its response is checked against the schema)

Opens an additional bank account under the given `product`. You must already have an open account of that product, and your business must have completed verification and accepted its required agreements. See `consent` on the entity's onboarding status. The account may open immediately (status `created`, with `account_id`) or in the background (status `processing`); when `processing`, poll `GET /accounts` until the account appears. Not available to an API key restricted to one account.

## Headers

- `Idempotency-Key` string, required: A unique key you generate (1-50 printable ASCII characters, no spaces) so retrying this request never creates a duplicate. Reusing a key is rejected.
- `x-entity-id` string, uuid

## Request body

- CreateAccountRequest
  - `product` 'grasshopper' | 'crb', required
  - `reference_id` string, nullable: Your own identifier for this account. It is echoed back on the account read endpoints and in `account.created` / `account.updated` webhooks, so you can match the account to the request that opened it. This matters most for products that open in the background, where the response carries no `account_id`. It is a label, not an idempotency key, so reuse it freely. Use the `Idempotency-Key` header to make a retry safe.

## Response `200`

Successful Response

- CreateAccountResponse
  - `status` 'processing' | 'created', required
  - `account_id` string, nullable: The new `account_id`, returned only when status is `created`. Null when status is `processing`; fetch it from `GET /accounts` once the account appears.
  - `reference_id` string, nullable: Echoes the `reference_id` from your request, confirming it was stored. The same value arrives on the `account.created` webhook, which is how you match that event back to this call.

## Other responses

- `400`: The request could not be processed.
- `401`: Authentication failed.
- `403`: The API key is not authorized for this operation, or the user of a global API key is an admin or controller without approved KYC. The KYC case returns the message `KYC is required for controllers and admins.` until that user completes KYC in the Meow dashboard.
- `429`: Too many requests.

---

[API](https://skmtc.dev/meow/apis/meow-api.md) - [All operations](https://skmtc.dev/meow/apis/meow-api/llms.txt) - [OpenAPI document](https://skmtc.dev/meow/apis/meow-api/revisions/ea2d7e25b63b?raw)
