Skip to main content

Quickstart

Step 1: Create an Account

Sign up at orbit.devotel.io/signup. The dashboard will route you to your locale-preferred URL automatically. No credit card required — verifying your email is all it takes to unlock the sandbox in the next step.

Step 2: Get a Sandbox API Key

Navigate to Settings > API Keys, create a new key, and set its mode to Test. Sandbox keys are prefixed dv_test_sk_, work immediately with no KYC or approval step, and cost $0 — every sandbox send is simulated in-house and never reaches a real carrier or touches Stripe. Keep the key server-side only. (Live keys are prefixed dv_live_sk_ and bill real traffic — see Step 5: Go Live once you’re ready for production numbers.)

Step 3: Send Your First Message (Sandbox)

The same /messages/<channel> endpoint shape works across SMS, WhatsApp, Email, RCS, Viber, and the other messaging channels — pick the channel you’re integrating first. Voice is separate: place calls with POST /voice/calls (see the Voice example below). Use your dv_test_sk_ key from Step 2 as $ORBIT_API_KEY below — the send is free and instant, with no live traffic risk. Each send below is shown in six languages — curl plus Node.js, Python, Go, Ruby, and PHP — so pick your language’s tab. The core SDKs type the common send shapes; payloads outside that typed scope (for example a WhatsApp template with components) go through each SDK’s low-level escape hatch — see SDK scope by language.

SMS

WhatsApp

Email

The full Node SDK reference — every channel helper, plus pagination, webhooks, and error handling — lives at Node.js SDK. Python, Go, Ruby, and PHP live inside the CodeGroups above — pick your language’s tab in the SMS, WhatsApp, Email, or Voice send. Java and C# route samples follow below; first-send tabs for them are landing on the per-language recipes guide.

Python SDK

The Python SDK is core-scope — SMS, WhatsApp, and email sends work today (the Python tabs in the CodeGroups above); deeper surfaces (voice recordings, conferences, IVR, dialer) are intentionally out of scope. For those, use the Node SDK or call the REST API directly via the low-level client.request(method, path, ...) escape hatch — see SDK scope by language.

Go SDK

The Go SDK is core-scope and unpublished — client.Messages() + client.Voice() work today (the Go tabs above use them); voice conferences/IVR/dialer/recordings are out of scope. For those, use the Node SDK or the low-level client.Request(ctx, method, path, ...) escape hatch — see SDK scope by language.

Ruby SDK

The Ruby SDK is core-scope and unpublished — client.messages + client.voice sends work today (the Ruby tabs above use them); recordings/transcripts/conferences/IVR/dialer are out of scope. For those, use the Node SDK or the low-level client.request(method, path, **opts) escape hatch — see SDK scope by language.

PHP SDK

The PHP SDK is core-scope and unpublished — $client->messages + $client->voice sends work today (the PHP tabs above use them); conferences, IVR, dialer, SIP trunks, and recordings are out of scope. For those, use the Node SDK or the low-level OrbitClient::request(method: ..., path: ..., ...) escape hatch — see SDK scope by language.

Java SDK

The Java SDK is core-scope and unpublished — client.messages + client.voice sends work today; recordings/transcripts/conferences/ IVR/dialer and WhatsApp template components are out of scope. For those, use the Node SDK or the low-level client.request(method, path, ...) escape hatch — see SDK scope by language.

C# SDK

The .NET SDK is core-scope and unpublished — client.Messages + client.Voice sends work today; recordings/transcripts/conferences/ IVR/dialer are out of scope. For those, use the Node SDK or the low-level client.RequestAsync(method, path, ...) escape hatch — see SDK scope by language.

Voice

The core-scope SDKs (Python, Go, Ruby, PHP) type the originate shape above. Voice recordings, transcripts, conferences, IVR, and dialer are out of scope for those SDKs; use the Node SDK or the REST API directly via each language’s low-level request(...) escape hatch — see SDK scope by language.
Starting from zero with voice? Walk through the dedicated Voice Quickstart — it covers provisioning a number, configuring an agent with a system prompt, browser-mic testing, and SSE event subscription, all in under 5 minutes.
The first-send snippets above stop at the send. The recipes that round out the loop — voice originate via the escape hatch, the full OTP verify round trip, and a paginated delivery-analytics read — have a per-language tab on the Per-language recipes guide.
Replace $ORBIT_API_KEY with the key from Step 2 (or export it in your shell). Don’t paste your key directly into shared snippets.

Step 4: Check the Response

Every messaging channel – and POST /voice/calls – returns the same queued envelope. Use the shape for the channel you’re integrating first — the How to read a worked sample guide explains the envelope conventions every worked sample in these docs follows:
Congratulations — you’ve sent your first message with Orbit, for free, in under 5 minutes. A sandbox send keeps its honest test_sent status rather than being promoted to delivered/failed — to trigger a specific delivery-receipt outcome (delivered, undelivered, expired, and 7 others) on demand, send to a recipient number with the matching trailing digit; see Sandbox Magic Numbers. Hook a delivery webhook next: see Webhooks.

Step 5: Go Live

Sandbox traffic never reaches a real carrier, so it’s the fastest way to build and test your integration — but going live requires two more things:
  1. KYC verification. Submit your business documents under Settings > KYC. Once an admin approves your organization, live sending is unlocked — but Orbit is pay-as-you-go with no automatic trial credit, so your live balance stays $0 until you add funds under Settings > Billing. SMS (US or international), WhatsApp, and voice all require both approved KYC and a funded balance before they’ll send.
  2. 10DLC registration for US SMS. Sending SMS to US numbers over live traffic also requires a 10DLC brand + campaign registration — a further compliance step layered on top of KYC, not a substitute for it. The worked campaign body below is the same one from the 10DLC registration guide — copy it as-is and swap in your brand_id:
    See Sender ID Registration for the broader sender-verification context, and 10DLC registration guide for the full walkthrough including throughput tiers and political-vertical cv_token notes.
Once KYC is approved, mint a live key (prefix dv_live_sk_) under Settings > API Keys and swap it in for the dv_test_sk_ key you used above — the request shape doesn’t change.