Organization API
Your own organization — read and update its profile, run KYC (“know your customer”) verification, check account status, set default business hours, and manage own-org branding and custom domains. For cross-org admin, see the Admin Organizations API (parent-child) or contact support for platform-level operations. Base path:/api/v1/organization
Authentication: API key (X-API-Key) or session JWT. Read endpoints are available to any org member; endpoints marked admin require the owner or admin role.
Using the SDKs
Prefer the typed client, but this page’s endpoint has no helper yet — the genericrequest() keeps auth/retries and the { data, meta } envelope identical:
client.request() escape hatch above. See the Python SDK.
Raw curl in the body of this page works identically. Full SDK index at SDK quickstart.
Profile
PUT /api/v1/organization/ is the same operation as PUT /api/v1/settings/general — it renames the org and updates its general settings, accepting the same fields and applying the same validation. Use whichever path fits your integration.
PUT — the call requires the owner or admin role and accepts the same body as PUT /api/v1/settings/general:
KYC & verification
KYC is required to send messages on certain channels (10DLC SMS in the US, registered sender IDs in some countries, WhatsApp Business verification). Statuses are
not_started (no KYC on file), pending, pending_review (submitted, awaiting review), approved, and rejected.
The IDV endpoints add hosted document capture with selfie liveness. POST /kyc/idv/session returns a session you send the user to; GET /kyc/idv/status polls the normalized result. These return 503 IDV_NOT_CONFIGURED until an IDV provider is provisioned for your account. An IDV pass is a verification signal reviewed alongside your KYC submission — it does not approve KYC on its own.
Submit KYC, then poll the status
POST /api/v1/organization/kyc/submit records the form and stamps the org pending_review — the review is operator-run, not instant, so poll GET /api/v1/organization/kyc/status until it resolves to approved or rejected. Re-submitting an already-approved org returns 409 ALREADY_VERIFIED.
Legacy SDK builds (pre-2026-06-09) read verification state from the bare
GET /api/v1/organization/kyc, which returns the same result as /kyc/status. New integrations should call /kyc/status.AI provider selection
Every tenant runs its AI features on Orbit’s curated provider lineup — you pick the tier; Orbit runs the model, the keys, and the metering behind it.
Two tiers are selectable today: the Devotel LLM free base tier (
devotel — zero vendor cost, the default every tenant starts from) and premium Anthropic Claude (anthropic). Recording a selection is a whitelabel-parent / root-organization capability: a subaccount can read the catalog and resolution but always gets 403 on the PUT.
Additional third-party models join the lineup only after passing a measured quality, latency, and cost evaluation — a provider still being evaluated is never returned as selectable and never resolves, so no stale or unvetted id can ever be recorded or honored.
If your org has never recorded a selection the resolution falls back to the platform default (premium Claude), so this API changes nothing until you opt in. PUT accepts { "provider": "devotel" | "anthropic" | null }; passing null clears the selection back to the platform default.
Account status
GET /api/v1/organization/account-status is the self-serve answer to “why is my account restricted and how do I fix it?” It reports any active restriction (outbound pause, dunning, subscription state, or pending KYC) with reason codes, the steps to clear it, and where to appeal — so an account is never silently suspended.
{ "state": "active", "restrictions": [] }.
Business hours
Org business hours are the company-wide default schedule. Every ACD queue, inbound route, and auto-attendant that hasn’t set its own schedule inherits these hours, so you configure them once instead of per route.
The body is diff-submit: an omitted field is untouched,
holiday_calendar_id set to null clears the calendar link, and a set value must reference a holiday calendar owned by your org.
Branding
An own-org shortcut for the branding CRUD that also lives at/api/v1/subaccounts/{id}/branding — manage your own org’s branding without needing to know your org id ahead of time. To read the resolved effective branding for the current tenant, see the Branding API.
null clears a field; omitted fields stay untouched. Six-digit hex colours, http(s) logo URLs (public, non-private hosts), dashboard_name up to 50 characters.
Read the current branding with GET /api/v1/organization/branding (same role gate), or fall back to the platform defaults by resetting explicitly:
Custom domains
An own-org shortcut for the custom-domain CRUD at/api/v1/subaccounts/{id}/domains. Add a vanity domain for your dashboard; each domain is CNAME-verified before it goes live.
Claim a domain first — the response carries the domain row and the canonical CNAME target you must point your hostname at:
desk.acme.example pointing at the cname_target above and wait for it to propagate — no A record. GET /api/v1/subaccounts/{id}/domains/cname-target returns the same canonical target server-side if you render DNS instructions in your own portal. After the record resolves, trigger re-verification; the DNS check re-runs so a fresh record turns your domain live, and the TLS certificate provisions asynchronously after verify succeeds:
GET /api/v1/organization/domains and remove one with DELETE /api/v1/organization/domains/{domainId} — both respond on the same { data, meta } envelope; the delete returns { "deleted": true }.
Members & invites
Own-org aliases for the team surface in Settings — manage seats and pending invitations without knowing the canonical/api/v1/settings/* paths.
API keys
Issue, rotate, and revoke API keys for your own organization. These are aliases of the Settings security surface; SDKs and hand-rolled integrations can treat/organization/api-keys as the canonical path.
Create a key with an explicit
scopes set — the response returns the plaintext key exactly once, store it before you leave the response:
messages:read / messages:write, contacts:*, billing:*, voice:*, video:*, numbers:*, campaigns:*, analytics:read, webhooks:*, and siblings) — an unknown scope is a 422 VALIDATION_ERROR, and minting a wildcard * key requires the owner role. A public key (embeddable in client code) can only hold read-only scopes; write scopes on a public key are rejected.
List the keys currently active on the org:
{ "mode": "immediate" } on a compromised key instead. Revoke ends a key outright:
See also
- Subaccounts API — manage child orgs under a parent
- Branding API — resolve effective branding for the current tenant
- Settings API — general org settings behind
PUT /organization/ - 10DLC registration guide