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 prefixeddv_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 channel below pairs the raw curl with the equivalent typed Node SDK
call side by side — one endpoint, one SDK method, same queued envelope.
SMS
Python SDK
The Python SDK is core-scope — SMS, WhatsApp, and email
sends work today; deeper surfaces (voice recordings, conferences, IVR,
dialer) are intentionally out of scope. For those, use the Node SDK
above 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; 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; 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; 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 other six SDKs (Python, Go, Ruby, PHP, Java, C#) cover
POST /voice/calls under their core scope — see the per-language
sections 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 – andPOST /voice/calls – returns the same
queued envelope. Use the shape for the channel you’re integrating first:
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:- 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.
-
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-verticalcv_tokennotes.
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.