curl --request POST \
--url https://api.trycherry.ai/v1/incorporations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"legalName": "<string>",
"filingState": "<string>",
"addressStreet": "<string>",
"addressCity": "<string>",
"addressState": "<string>",
"addressZip": "<string>",
"mailingAddressStreet": "<string>",
"mailingAddressCity": "<string>",
"mailingAddressState": "<string>",
"mailingAddressZip": "<string>",
"officers": [
{}
],
"llcMemberCount": 2,
"authorizedShares": 2,
"parValuePerShare": "<string>",
"fiscalEndMonth": "<string>",
"principalCounty": "<string>",
"addressCountry": "<string>",
"mailingAddressCountry": "<string>",
"registeredAgent": {},
"useRegisteredAgentService": true,
"ein": {},
"einNoSsn": true
}
'import requests
url = "https://api.trycherry.ai/v1/incorporations"
payload = {
"legalName": "<string>",
"filingState": "<string>",
"addressStreet": "<string>",
"addressCity": "<string>",
"addressState": "<string>",
"addressZip": "<string>",
"mailingAddressStreet": "<string>",
"mailingAddressCity": "<string>",
"mailingAddressState": "<string>",
"mailingAddressZip": "<string>",
"officers": [{}],
"llcMemberCount": 2,
"authorizedShares": 2,
"parValuePerShare": "<string>",
"fiscalEndMonth": "<string>",
"principalCounty": "<string>",
"addressCountry": "<string>",
"mailingAddressCountry": "<string>",
"registeredAgent": {},
"useRegisteredAgentService": True,
"ein": {},
"einNoSsn": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
legalName: '<string>',
filingState: '<string>',
addressStreet: '<string>',
addressCity: '<string>',
addressState: '<string>',
addressZip: '<string>',
mailingAddressStreet: '<string>',
mailingAddressCity: '<string>',
mailingAddressState: '<string>',
mailingAddressZip: '<string>',
officers: [{}],
llcMemberCount: 2,
authorizedShares: 2,
parValuePerShare: '<string>',
fiscalEndMonth: '<string>',
principalCounty: '<string>',
addressCountry: '<string>',
mailingAddressCountry: '<string>',
registeredAgent: {},
useRegisteredAgentService: true,
ein: {},
einNoSsn: true
})
};
fetch('https://api.trycherry.ai/v1/incorporations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.trycherry.ai/v1/incorporations",
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([
'legalName' => '<string>',
'filingState' => '<string>',
'addressStreet' => '<string>',
'addressCity' => '<string>',
'addressState' => '<string>',
'addressZip' => '<string>',
'mailingAddressStreet' => '<string>',
'mailingAddressCity' => '<string>',
'mailingAddressState' => '<string>',
'mailingAddressZip' => '<string>',
'officers' => [
[
]
],
'llcMemberCount' => 2,
'authorizedShares' => 2,
'parValuePerShare' => '<string>',
'fiscalEndMonth' => '<string>',
'principalCounty' => '<string>',
'addressCountry' => '<string>',
'mailingAddressCountry' => '<string>',
'registeredAgent' => [
],
'useRegisteredAgentService' => true,
'ein' => [
],
'einNoSsn' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.trycherry.ai/v1/incorporations"
payload := strings.NewReader("{\n \"legalName\": \"<string>\",\n \"filingState\": \"<string>\",\n \"addressStreet\": \"<string>\",\n \"addressCity\": \"<string>\",\n \"addressState\": \"<string>\",\n \"addressZip\": \"<string>\",\n \"mailingAddressStreet\": \"<string>\",\n \"mailingAddressCity\": \"<string>\",\n \"mailingAddressState\": \"<string>\",\n \"mailingAddressZip\": \"<string>\",\n \"officers\": [\n {}\n ],\n \"llcMemberCount\": 2,\n \"authorizedShares\": 2,\n \"parValuePerShare\": \"<string>\",\n \"fiscalEndMonth\": \"<string>\",\n \"principalCounty\": \"<string>\",\n \"addressCountry\": \"<string>\",\n \"mailingAddressCountry\": \"<string>\",\n \"registeredAgent\": {},\n \"useRegisteredAgentService\": true,\n \"ein\": {},\n \"einNoSsn\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.trycherry.ai/v1/incorporations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"legalName\": \"<string>\",\n \"filingState\": \"<string>\",\n \"addressStreet\": \"<string>\",\n \"addressCity\": \"<string>\",\n \"addressState\": \"<string>\",\n \"addressZip\": \"<string>\",\n \"mailingAddressStreet\": \"<string>\",\n \"mailingAddressCity\": \"<string>\",\n \"mailingAddressState\": \"<string>\",\n \"mailingAddressZip\": \"<string>\",\n \"officers\": [\n {}\n ],\n \"llcMemberCount\": 2,\n \"authorizedShares\": 2,\n \"parValuePerShare\": \"<string>\",\n \"fiscalEndMonth\": \"<string>\",\n \"principalCounty\": \"<string>\",\n \"addressCountry\": \"<string>\",\n \"mailingAddressCountry\": \"<string>\",\n \"registeredAgent\": {},\n \"useRegisteredAgentService\": true,\n \"ein\": {},\n \"einNoSsn\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.trycherry.ai/v1/incorporations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"legalName\": \"<string>\",\n \"filingState\": \"<string>\",\n \"addressStreet\": \"<string>\",\n \"addressCity\": \"<string>\",\n \"addressState\": \"<string>\",\n \"addressZip\": \"<string>\",\n \"mailingAddressStreet\": \"<string>\",\n \"mailingAddressCity\": \"<string>\",\n \"mailingAddressState\": \"<string>\",\n \"mailingAddressZip\": \"<string>\",\n \"officers\": [\n {}\n ],\n \"llcMemberCount\": 2,\n \"authorizedShares\": 2,\n \"parValuePerShare\": \"<string>\",\n \"fiscalEndMonth\": \"<string>\",\n \"principalCounty\": \"<string>\",\n \"addressCountry\": \"<string>\",\n \"mailingAddressCountry\": \"<string>\",\n \"registeredAgent\": {},\n \"useRegisteredAgentService\": true,\n \"ein\": {},\n \"einNoSsn\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"companyId": "comp_x1y2z3a4b5c6d7e8",
"items": [
{
"orderId": "ord_a1b2c3d4e5f6a7b8",
"orderType": "formation",
"filingStatus": "submitted"
},
{
"orderId": "ord_b2c3d4e5f6a7b8c9",
"orderType": "registered_agent",
"filingStatus": "submitted"
}
]
}
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "payment_required",
"reason": "This account has no incorporation credits left. Buy credits at `topUpUrl`, then retry the same request (with the same Idempotency-Key, if one was sent).",
"topUpUrl": "https://checkout.stripe.com/c/pay/cs_live_a1b2c3"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}Form a new company (write scope)
Start a company formation in any US state — LLC or corporation — optionally bundling an EIN order. This files real state paperwork and incurs filing costs.
International founders: the company’s principal/mailing addresses and every officer address accept ANY country — set the *Country fields to a two-letter ISO code (default US). For non-US addresses the state field is free text (e.g. CDMX) and the zip field takes any postal code. Only filingState must be a US state.
LLCs must set structureType (MEMBER or MANAGER). A registered agent in the filing state is required: supply your own via registeredAgent, or leave useRegisteredAgentService at its default (true) and Cherry provides one.
EIN: include ein to apply for the company’s EIN in the same bundle. When the responsible party has no SSN or ITIN, omit responsiblePartySsn and set einNoSsn: true — Cherry then prepares and files the EIN application with the IRS on the company’s behalf, and the response carries an einApplication describing its status. The flag is required rather than inferred: dropping an SSN by accident and silently taking the slower route would be the wrong default, so the two are rejected as a pair (send the SSN, or send einNoSsn, never both).
Idempotency: send an Idempotency-Key header; a retried POST with the same key replays the original result instead of forming a second company.
Credits: every formation spends one prepaid incorporation credit. With none left the request is refused with 402 payment_required and a topUpUrl — a hosted checkout where the account owner buys credits (one, or a pack). Nothing is ordered on a 402; retry the same request (same Idempotency-Key) once the credits have landed. topUpUrl is null when checkout is unavailable; contact support.
Errors specific to this endpoint: registered_agent_required (400 — supply registeredAgent or leave useRegisteredAgentService unset), payment_required (402 — no credit; see topUpUrl), filing_account_conflict / company_conflict (409 — a filing account or company with this identity exists but is not linked; contact support), formation_not_filed (502 — the order was accepted but no formation filing came back; recorded for review, do NOT retry), billing_unavailable (503 — the credit could not be confirmed; nothing was ordered, retry shortly), incorporations_unavailable (503).
curl --request POST \
--url https://api.trycherry.ai/v1/incorporations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"legalName": "<string>",
"filingState": "<string>",
"addressStreet": "<string>",
"addressCity": "<string>",
"addressState": "<string>",
"addressZip": "<string>",
"mailingAddressStreet": "<string>",
"mailingAddressCity": "<string>",
"mailingAddressState": "<string>",
"mailingAddressZip": "<string>",
"officers": [
{}
],
"llcMemberCount": 2,
"authorizedShares": 2,
"parValuePerShare": "<string>",
"fiscalEndMonth": "<string>",
"principalCounty": "<string>",
"addressCountry": "<string>",
"mailingAddressCountry": "<string>",
"registeredAgent": {},
"useRegisteredAgentService": true,
"ein": {},
"einNoSsn": true
}
'import requests
url = "https://api.trycherry.ai/v1/incorporations"
payload = {
"legalName": "<string>",
"filingState": "<string>",
"addressStreet": "<string>",
"addressCity": "<string>",
"addressState": "<string>",
"addressZip": "<string>",
"mailingAddressStreet": "<string>",
"mailingAddressCity": "<string>",
"mailingAddressState": "<string>",
"mailingAddressZip": "<string>",
"officers": [{}],
"llcMemberCount": 2,
"authorizedShares": 2,
"parValuePerShare": "<string>",
"fiscalEndMonth": "<string>",
"principalCounty": "<string>",
"addressCountry": "<string>",
"mailingAddressCountry": "<string>",
"registeredAgent": {},
"useRegisteredAgentService": True,
"ein": {},
"einNoSsn": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
legalName: '<string>',
filingState: '<string>',
addressStreet: '<string>',
addressCity: '<string>',
addressState: '<string>',
addressZip: '<string>',
mailingAddressStreet: '<string>',
mailingAddressCity: '<string>',
mailingAddressState: '<string>',
mailingAddressZip: '<string>',
officers: [{}],
llcMemberCount: 2,
authorizedShares: 2,
parValuePerShare: '<string>',
fiscalEndMonth: '<string>',
principalCounty: '<string>',
addressCountry: '<string>',
mailingAddressCountry: '<string>',
registeredAgent: {},
useRegisteredAgentService: true,
ein: {},
einNoSsn: true
})
};
fetch('https://api.trycherry.ai/v1/incorporations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.trycherry.ai/v1/incorporations",
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([
'legalName' => '<string>',
'filingState' => '<string>',
'addressStreet' => '<string>',
'addressCity' => '<string>',
'addressState' => '<string>',
'addressZip' => '<string>',
'mailingAddressStreet' => '<string>',
'mailingAddressCity' => '<string>',
'mailingAddressState' => '<string>',
'mailingAddressZip' => '<string>',
'officers' => [
[
]
],
'llcMemberCount' => 2,
'authorizedShares' => 2,
'parValuePerShare' => '<string>',
'fiscalEndMonth' => '<string>',
'principalCounty' => '<string>',
'addressCountry' => '<string>',
'mailingAddressCountry' => '<string>',
'registeredAgent' => [
],
'useRegisteredAgentService' => true,
'ein' => [
],
'einNoSsn' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.trycherry.ai/v1/incorporations"
payload := strings.NewReader("{\n \"legalName\": \"<string>\",\n \"filingState\": \"<string>\",\n \"addressStreet\": \"<string>\",\n \"addressCity\": \"<string>\",\n \"addressState\": \"<string>\",\n \"addressZip\": \"<string>\",\n \"mailingAddressStreet\": \"<string>\",\n \"mailingAddressCity\": \"<string>\",\n \"mailingAddressState\": \"<string>\",\n \"mailingAddressZip\": \"<string>\",\n \"officers\": [\n {}\n ],\n \"llcMemberCount\": 2,\n \"authorizedShares\": 2,\n \"parValuePerShare\": \"<string>\",\n \"fiscalEndMonth\": \"<string>\",\n \"principalCounty\": \"<string>\",\n \"addressCountry\": \"<string>\",\n \"mailingAddressCountry\": \"<string>\",\n \"registeredAgent\": {},\n \"useRegisteredAgentService\": true,\n \"ein\": {},\n \"einNoSsn\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.trycherry.ai/v1/incorporations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"legalName\": \"<string>\",\n \"filingState\": \"<string>\",\n \"addressStreet\": \"<string>\",\n \"addressCity\": \"<string>\",\n \"addressState\": \"<string>\",\n \"addressZip\": \"<string>\",\n \"mailingAddressStreet\": \"<string>\",\n \"mailingAddressCity\": \"<string>\",\n \"mailingAddressState\": \"<string>\",\n \"mailingAddressZip\": \"<string>\",\n \"officers\": [\n {}\n ],\n \"llcMemberCount\": 2,\n \"authorizedShares\": 2,\n \"parValuePerShare\": \"<string>\",\n \"fiscalEndMonth\": \"<string>\",\n \"principalCounty\": \"<string>\",\n \"addressCountry\": \"<string>\",\n \"mailingAddressCountry\": \"<string>\",\n \"registeredAgent\": {},\n \"useRegisteredAgentService\": true,\n \"ein\": {},\n \"einNoSsn\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.trycherry.ai/v1/incorporations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"legalName\": \"<string>\",\n \"filingState\": \"<string>\",\n \"addressStreet\": \"<string>\",\n \"addressCity\": \"<string>\",\n \"addressState\": \"<string>\",\n \"addressZip\": \"<string>\",\n \"mailingAddressStreet\": \"<string>\",\n \"mailingAddressCity\": \"<string>\",\n \"mailingAddressState\": \"<string>\",\n \"mailingAddressZip\": \"<string>\",\n \"officers\": [\n {}\n ],\n \"llcMemberCount\": 2,\n \"authorizedShares\": 2,\n \"parValuePerShare\": \"<string>\",\n \"fiscalEndMonth\": \"<string>\",\n \"principalCounty\": \"<string>\",\n \"addressCountry\": \"<string>\",\n \"mailingAddressCountry\": \"<string>\",\n \"registeredAgent\": {},\n \"useRegisteredAgentService\": true,\n \"ein\": {},\n \"einNoSsn\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"companyId": "comp_x1y2z3a4b5c6d7e8",
"items": [
{
"orderId": "ord_a1b2c3d4e5f6a7b8",
"orderType": "formation",
"filingStatus": "submitted"
},
{
"orderId": "ord_b2c3d4e5f6a7b8c9",
"orderType": "registered_agent",
"filingStatus": "submitted"
}
]
}
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "payment_required",
"reason": "This account has no incorporation credits left. Buy credits at `topUpUrl`, then retry the same request (with the same Idempotency-Key, if one was sent).",
"topUpUrl": "https://checkout.stripe.com/c/pay/cs_live_a1b2c3"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}{
"error": "<string>",
"reason": "<string>"
}Authorizations
Cherry API key, created in the app. Sent as Authorization: Bearer ck_live_…. OAuth access tokens (ck_oat_…) are accepted in exactly the same header.
Body
Exact legal name including the suffix (LLC, Inc.).
LLC, CORP Two-letter US state to form in.
Two-letter state code for US addresses; free text elsewhere.
ZIP for US addresses; any postal code elsewhere.
At least one officer (PERSON or COMPANY), each with their own address — any country.
1Required for LLCs.
MEMBER, MANAGER How many members the LLC has. LLCs only. Supply it when ordering an EIN: it answers SS-4 line 8b and decides line 9a (one member is a disregarded entity, several a partnership).
x >= 1Corporations only.
C Corporation, S Corporation Shares the certificate of incorporation authorises. Corporations only. Required in the states that price the certificate by its stock (CT, DE, KY, MA, MD, MI, MO, NM, NV, OH, OK, VA), where the published fee is a minimum rather than the price; optional elsewhere.
x >= 1Par value per share as a decimal string, e.g. "0.0001", or "0" for no par value. Corporations only. Required in the states whose fee depends on it (DE, MD, MO, NV, OK) because the two answers differ by orders of magnitude and neither is safe to assume.
e.g. December.
County of the principal place of business — SS-4 line 6. US addresses only; sending one with a foreign address is rejected. Optional: Cherry derives the county from the ZIP wherever two independent public datasets agree the ZIP sits in a single county, and only needs this for the ZIPs that straddle a county line.
60Two-letter ISO country code, uppercase. Default US.
Bring your own registered agent (must be in the filing state). Omit to use Cherry's registered-agent service.
Default true when no registeredAgent is supplied: Cherry provides the agent as a separate order line.
Apply for the company's EIN in the same bundle. Omit responsiblePartySsn when the responsible party has no SSN/ITIN, and set einNoSsn alongside it.
The responsible party has no US SSN or ITIN, so Cherry prepares and files the EIN application itself and the EIN arrives later. Required when ein omits responsiblePartySsn, and rejected when sent alongside one.
Response
The incorporation order bundle
Show child attributes
Show child attributes