Skip to main content

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 generic request() keeps auth/retries and the { data, meta } envelope identical:
Python (same call via the SDK’s escape hatch):
The Python SDK is core-scope — it wraps the 8 core resources (messaging, voice, contacts, campaigns, verify, numbers) and reaches everything else through the generic 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.
Rename the org or update general settings with a 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.
When there is no active restriction the response is { "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.
The body is a partial JSONB merge — send only the fields you change; explicit 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:
In your DNS provider, create a CNAME on 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:
List the claimed domains with 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:
Scopes are validated against a closed catalog (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:
Rotate drops a fresh key while keeping the old one valid for a grace period (1–168 hours, 24 by default) so running processes finish before flip-down — pass { "mode": "immediate" } on a compromised key instead. Revoke ends a key outright:

See also