The organization object
string
Unique id (e.g.
org_01H...).string
Display name.
integer
Current credit balance, in micro-USD.
string
The company’s timezone, an IANA name such as
America/New_York (every company starts there). A deployment created without a timezone takes this one, and the studio says when a post goes out in it.string | null
The company’s logo, an SVG (see The logo);
null until one is set. The studio shows it in its top-left corner and in its apps.object | null
The company’s brand kit (see The brand kit):
{ palette, typeface, tagline }; null until one is set. Whoever makes things in the company’s look reads it.boolean
true while the company is being set up: made in a chat with its CEO and not yet activated by a paid plan. It turns false the first time the plan reads active and never back, even if the plan later lapses.string | null
The
blueprint/template a link named when the company was made (see Set up a company); null otherwise.string | null
The company’s CEO: the one agent whose turns are given the control plane. Recorded when an admin binds this API’s
/v1/mcp to an agent in the “Orchestrator control plane” vault (see Vaults); null while there is none, or after the CEO is deleted. The setup chat responds without it.string
Creation timestamp.
Create an organization
POST /v1/organizations → 201 Created
The only write that is not scoped to an organization — it is how an existing caller gets another one. Authenticate with either an admin API key or a signed-in user session; an unauthenticated call is refused with 401. Your first organization comes from signing up, not from this route.
string
required
Display name for the organization.
string
A creator’s referral code, accepted from a signed-in user session only. Attributes the new organization to that creator; a code that cannot be honoured is ignored and the organization is still created.
Response
admin key that opens it, whose secret is returned here and never again. A caller signed in as a person also becomes the founding owner.
For a signed-in person whose only company is the one being set up for them when they confirmed their email, the first create takes that company if nothing has touched it yet (still “New company”, no template, no CEO chat, no key): it is renamed to name and returned with whatever setup credit it was given, still setting_up until its plan is paid. Otherwise a new organization is made. An API key’s create always makes a new one.
Set up a company
POST /v1/organizations/setup → 201 Created, or 200 OK when it already exists
The company a signed-in person is setting up, found or made. A person with no company starts here: the company is made unnamed (“New company”), live, with them as its owner, and it is set up in a chat with its CEO before it is paid for. Until it is paid for, asking again — another tab, a retry, another Deploy — answers the same one. Once it is activated by a payment, the next call makes a new one. (The dashboard calls this for New company. A Deploy from a company that already runs a template adds it to that company instead, as a second install.) One exception: a call that names a template while the person owns an activated company on a live plan that runs nothing answers that company (200, setting_up: false, no setup credit), so its first template is set up there rather than beside it. It mints no API key. An API key, or a call with no session, is refused with 403 or 401.
string
The
blueprint/template a link named, such as media/faceless. Stored as start_template when the company is made, and replaces it when the company is found again; leaving it out clears it. A held install in it is kept; holding another template replaces it. Anything that is not two lower-case names joined by / is 400 validation_failed.Response
+tag, or Gmail’s dots) gets its company but no second credit. A person whose earlier company was activated is credited again. A company being set up cannot top up (402); its next step is the plan. A template set up in that chat is recorded as held and built when the company is activated (installs).
List, retrieve & update
GET /v1/organizations is orgless — it answers on a user session rather than an org-scoped key, which is what makes org switching possible. See Authentication.
Response
Update an organization
PATCH /v1/organizations/{id}
string
New display name.
string
New timezone, an IANA name (
America/Los_Angeles). It is stored under its canonical name (US/Eastern is kept as America/New_York). An abbreviation (EST), an offset (+05:00) or a name the platform does not know is 400 validation_failed on timezone. Only the fields you send are changed: a rename leaves the timezone as it is.string | null
A new logo, as SVG text;
null removes it. It is stored trimmed, with xmlns="http://www.w3.org/2000/svg" added to the root when it has none. A logo the rules below refuse is 400 validation_failed on logo_svg, and the message says what to change.object | null
A new brand kit;
null removes it. See The brand kit. A kit that does not match it exactly is 400 validation_failed on brand.The logo
A logo is one<svg> element that the platform checks before it stores it. The check is an allow-list:
- At most 16 KB, and exactly one root
<svg>with aviewBoxof four numbers. No nested<svg>. - Elements:
svg,g,path,rect,circle,ellipse,line,polyline,polygon,defs,linearGradient,radialGradient,stop,title,desc,clipPath,mask.<title>and<desc>hold words only. Anything else is refused, including<text>(draw letters as paths),<image>,<use>,<style>,<script>,<a>and animation. - Attributes: geometry and presentation only (
viewBox,xmlns,width,height,x…y2,cx,cy,r,rx,ry,d,points,fill,strokeand itsstroke-*family,opacity,fill-opacity,fill-rule,clip-rule,transform,offset,stop-color,stop-opacity,gradientUnits,gradientTransform,id,clip-path,mask,preserveAspectRatio,fx,fy,spreadMethod,role,aria-hidden). Every value is quoted. Noon…handlers,href,styleorclass. - A value holds numbers, names,
#coloursandurl(#id)only: no otherurl(…), nojavascript:,data:orhttp, no entities, and no<. - No comments, CDATA, DOCTYPE, entities or processing instructions.
company.set_logo tool. It passes the same check.
The brand kit
The company’s look, beside its logo: a palette, a typeface and a tagline.object[]
3 to 6 colours, each
{ name, hex }: a name of 1–24 characters and a lower-case #rrggbb.string
grotesk, serif, rounded or mono.string
One line of up to 80 characters;
"" for none.company.set_brand, which builds the palette from one colour.
Members
Users belong to an organization with a role that controls what they can do.The member object
string
Member id (e.g.
usr_01H...). It is the id the member routes address and the id the audit log records as the actor.string
The member’s email address.
string
owner | admin | member.string | null
Id of the member who invited them;
null for the founding owner.string
When the member joined the organization.
List members
GET /v1/organizations/{id}/members — cursor-paginated. See Pagination. Readable before the organization has a plan, so you can find its owner before paying; adding, changing and removing members need one.
Response
Add a member
POST /v1/organizations/{id}/members
string
required
Email address to invite.
string
required
owner | admin | member.Response
Update a member’s role
PATCH /v1/organizations/{id}/members/{member_id}
string
required
owner | admin | member.Remove a member
DELETE /v1/organizations/{id}/members/{member_id}
Both mutations are recorded in the audit log as member.role_changed and member.removed, attributed to the acting principal.
API keys
Programmatic access uses org-scoped API keys, managed under/v1/api_keys. For creation, scopes, and rotation, see Authentication.
Credits & billing
The org’s real-USD balance, ledger, and top-ups.