curl --request POST \
--url https://api.meow.com/v1/accounts \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"product": "grasshopper",
"reference_id": "catnip-payroll-2026"
}
'import requests
url = "https://api.meow.com/v1/accounts"
payload = {
"product": "grasshopper",
"reference_id": "catnip-payroll-2026"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({product: 'grasshopper', reference_id: 'catnip-payroll-2026'})
};
fetch('https://api.meow.com/v1/accounts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meow.com/v1/accounts"
payload := strings.NewReader("{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.meow.com/v1/accounts")
.header("Idempotency-Key", "<idempotency-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meow.com/v1/accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meow.com/v1/accounts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'product' => 'grasshopper',
'reference_id' => 'catnip-payroll-2026'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}const url = 'https://api.meow.com/v1/accounts';
const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({product: 'grasshopper', reference_id: 'catnip-payroll-2026'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://api.meow.com/v1/accounts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Idempotency-Key", "<idempotency-key>");
request.AddHeader("x-api-key", "<api-key>");
request.AddJsonBody("{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
val client = OkHttpClient()
val mediaType = MediaType.parse("application/json")
val body = RequestBody.create(mediaType, "{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}")
val request = Request.Builder()
.url("https://api.meow.com/v1/accounts")
.post(body)
.addHeader("Idempotency-Key", "<idempotency-key>")
.addHeader("x-api-key", "<api-key>")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()import Foundation
let parameters = [
"product": "grasshopper",
"reference_id": "catnip-payroll-2026"
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.meow.com/v1/accounts")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"Idempotency-Key": "<idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))falsefalse$headers=@{}
$headers.Add("Idempotency-Key", "<idempotency-key>")
$headers.Add("x-api-key", "<api-key>")
$headers.Add("Content-Type", "application/json")
$response = Invoke-WebRequest -Uri 'https://api.meow.com/v1/accounts' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"product": "grasshopper",
"reference_id": "catnip-payroll-2026"
}'{
"status": "created",
"account_id": "cash_account_3f9c1b2e-7a4d-4e88-9c21-0b6f5d8e1a2c",
"reference_id": "catnip-payroll-2026"
}{
"code": 123,
"message": "<string>",
"debug_message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}Open an Additional Bank Account
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.
curl --request POST \
--url https://api.meow.com/v1/accounts \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"product": "grasshopper",
"reference_id": "catnip-payroll-2026"
}
'import requests
url = "https://api.meow.com/v1/accounts"
payload = {
"product": "grasshopper",
"reference_id": "catnip-payroll-2026"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({product: 'grasshopper', reference_id: 'catnip-payroll-2026'})
};
fetch('https://api.meow.com/v1/accounts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meow.com/v1/accounts"
payload := strings.NewReader("{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.meow.com/v1/accounts")
.header("Idempotency-Key", "<idempotency-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meow.com/v1/accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meow.com/v1/accounts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'product' => 'grasshopper',
'reference_id' => 'catnip-payroll-2026'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}const url = 'https://api.meow.com/v1/accounts';
const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({product: 'grasshopper', reference_id: 'catnip-payroll-2026'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://api.meow.com/v1/accounts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Idempotency-Key", "<idempotency-key>");
request.AddHeader("x-api-key", "<api-key>");
request.AddJsonBody("{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
val client = OkHttpClient()
val mediaType = MediaType.parse("application/json")
val body = RequestBody.create(mediaType, "{\n \"product\": \"grasshopper\",\n \"reference_id\": \"catnip-payroll-2026\"\n}")
val request = Request.Builder()
.url("https://api.meow.com/v1/accounts")
.post(body)
.addHeader("Idempotency-Key", "<idempotency-key>")
.addHeader("x-api-key", "<api-key>")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()import Foundation
let parameters = [
"product": "grasshopper",
"reference_id": "catnip-payroll-2026"
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.meow.com/v1/accounts")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"Idempotency-Key": "<idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))falsefalse$headers=@{}
$headers.Add("Idempotency-Key", "<idempotency-key>")
$headers.Add("x-api-key", "<api-key>")
$headers.Add("Content-Type", "application/json")
$response = Invoke-WebRequest -Uri 'https://api.meow.com/v1/accounts' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"product": "grasshopper",
"reference_id": "catnip-payroll-2026"
}'{
"status": "created",
"account_id": "cash_account_3f9c1b2e-7a4d-4e88-9c21-0b6f5d8e1a2c",
"reference_id": "catnip-payroll-2026"
}{
"code": 123,
"message": "<string>",
"debug_message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}Authorizations
Your Meow API key, sent in the x-api-key header for authentication.
Headers
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.
1 - 50^[!-~]+$Optional entity_id to scope requests to a specific entity.
Body
The product to open the new account under. You must already have an open account of this product. 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.
grasshopper, crb "grasshopper"
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.
1 - 255"catnip-payroll-2026"
Response
Successful Response
created when the new account is ready immediately and its account_id is returned. processing when the account is still being opened; poll GET /accounts until it appears.
processing, created "created"
The new account_id, returned only when status is created. Null when status is processing; fetch it from GET /accounts once the account appears.
"cash_account_3f9c1b2e-7a4d-4e88-9c21-0b6f5d8e1a2c"
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.
"catnip-payroll-2026"