POST /orgs
Create a new org. The calling user is automatically added to the new org as owner. The org starts with kyb_status draft. See POST /org/kyb/submit when ready to verify.
Bearer sessions only. API keys can't create orgs (they're already scoped to one).
Request body
{
"name": "Acme Inc.",
"compliance_email": "compliance@acme.example"
}| Field | Type | Required | Notes |
|---|---|---|---|
name | string | yes | 1–80 characters. Display name. Shown in the dashboard and on the org list. Orgs are addressed by UUID, not name. |
compliance_email | string | yes | Compliance contact address for the new org. Verification starts immediately: the address is marked verified right away when it belongs to a verified member of the org (the creating owner's own address, typically), otherwise a confirmation link is emailed and compliance_email_verified stays false until it's clicked. Changeable later with PUT /org/compliance-email. |
Response 201
{
"org": {
"id": "0a2a…",
"name": "Acme Inc.",
"kyb_status": "draft",
"compliance_email": "compliance@acme.example",
"compliance_email_verified": false,
"created_at": "2026-05-06T15:04:05Z",
"updated_at": "2026-05-06T15:04:05Z"
},
"role": "owner"
}Errors
400 InvalidRequest:namefailed validation (length), orcompliance_emailwas missing, empty, or malformed.401: no credential.
Example
curl -X POST "$SEISMIC_ORCHESTRATION_URL/v0/orgs" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Inc.",
"compliance_email": "compliance@acme.example"
}'After creation, subsequent org-scoped requests should pass ?org=<id> to target the new org explicitly, even though the auto-pick would resolve correctly when this is the user's only org, being explicit avoids surprises once they create or join a second one.
