Skip to main content
POST
/
api
/
organizations
Create or adopt my organization
curl --request POST \
  --url https://agenticadvertising.org/api/organizations \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "organization_name": "Acme Media",
  "is_personal": false,
  "company_type": "adtech",
  "revenue_tier": "under_1m",
  "marketing_opt_in": false
}
'
{
  "success": true,
  "organization": {
    "id": "org_01HXZAB123",
    "name": "Acme Media"
  },
  "id": "<string>",
  "name": "<string>",
  "adopted": true
}

Documentation Index

Fetch the complete documentation index at: https://docs.adcontextprotocol.org/llms.txt

Use this file to discover all available pages before exploring further.

Authorizations

Authorization
string
header
required

Bearer token in the Authorization header. Two token types are accepted:

  • Organization API key (sk_...) issued via the dashboard. Org-scoped, long-lived, for server-to-server use.
  • User JWT obtained via the OAuth 2.1 authorization code flow with PKCE. User-scoped, short-lived. Discover the authorization server at /.well-known/oauth-authorization-server and the protected-resource metadata at /.well-known/oauth-protected-resource/api.

Body

application/json

Request body for POST /api/organizations.

Bootstraps a WorkOS organization, mirrors the caller as owner, records the caller's ToS / privacy-policy acceptance, and (for non-personal orgs) inserts an email-verified record into organization_domains so subsequent registry calls can skip explicit domain-verification.

Membership tier and corporate domain are not caller-supplied: the tier is set by the Stripe webhook on subscription events, and the corporate domain is derived from the authenticated user's email.

organization_name
string
required

Display name for the organization. Used both as the org row name and (when auto-bootstrapping a member profile via the first agent registration) as the profile's display_name.

Required string length: 1 - 200
Example:

"Acme Media"

is_personal
boolean
default:false

Set to true to create a personal workspace instead of a corporate organization. Personal workspaces skip corporate-domain verification, are limited to one per user, and cannot host the company_* membership tiers.

company_type
enum<string>

Coarse classification of the organization's role in the open ad ecosystem. Drives default verification badges and the member profile's display category.

Available options:
adtech,
agency,
brand,
publisher,
data,
ai,
other
revenue_tier
enum<string>

Annual revenue band, USD. Drives membership-tier eligibility for company-tier seats.

Available options:
under_1m,
1m_5m,
5m_50m,
50m_250m,
250m_1b,
1b_plus
marketing_opt_in
boolean
default:false

Whether the caller opted in to AAO marketing communications. Recorded once per user (not overwritten on subsequent calls). Independent of Terms-of-Service consent, which is recorded server-side from the request context.

Response

Prospect adoption — an existing prospect organization for this domain was claimed by the caller. Body is { id, name, adopted: true }.

Response from POST /api/organizations. The body shape varies by path: a fresh creation returns { success: true, organization: { id, name } }; a prospect adoption returns { id, name, adopted: true } directly. Both paths are 2xx; downstream callers should treat any 2xx as "the org now exists and you are an owner of it" and read whichever id is present.

success
boolean
organization
object
id
string

Set on the prospect-adoption path: when an org with the user's email domain already exists in a prospect state (i.e. the registry pre-recorded it from a brand crawl but no human had claimed it yet), this call adopts that org for the caller instead of creating a new one.

name
string
adopted
boolean

true when the response is the prospect-adoption path. When true, no new WorkOS organization was created — the caller is now the owner of an existing prospect record.