Skip to main content

Java SDK

The Orbit Java SDK wraps the platform’s core API resources — messaging (SMS, WhatsApp, email), voice, contacts, campaigns, verify (OTP), and webhook signature verification — with typed methods. It requires JDK 11+ and has zero external runtime dependencies.
Pre-publish — source-only. This SDK is not yet on Maven Central — the dependencies below describe the future registry shape. Until first publish, vendor the source from the monorepo (packages/sdk-java/) or call the REST API directly. See Java: core-scope, not full parity on the SDK index for exactly what is and isn’t wrapped, and the low-level client.request(method, path, ...) escape hatch for uncovered routes (worked example below).

Installation

No registry dependency block is live yet — nothing here resolves today. Vendor the SDK source from the monorepo (packages/sdk-java/) and build it into your project, or call the REST API directly with any HTTP client until the first Maven Central release ships (coordinates change).

Client initialization

Or read the key from an environment variable (ORBIT_API_KEY):
Tune timeouts and retries with the builder:
OrbitClient is safe for concurrent use across threads — share a single instance per JVM.

Quickstart: send your first SMS

A runnable end-to-end — the key comes from ORBIT_API_KEY, never from source. Copy it into Main.java and run it:
Point ORBIT_API_KEY at a sandbox key prefixed dv_test_sk_ first — sandbox sends are simulated, free, and never reach a carrier. Swap in your live key (dv_live_sk_...) when you’re ready to send for real; the code does not change. The response shape above comes from the Messages API reference — its language tabs include this exact call.

Messaging

client.messages also exposes sendWhatsApp, sendEmail, and get (fetch a message by id).

Voice

client.voice also exposes get, list, hangup, and transfer by call id.

Verify (OTP)

The send-and-check round trip is the most common first integration on the platform — here as a complete flow. Send the code, keep the returned verification id, and check the code the user typed in against it:
A wrongly-typed or expired code reports valid: false — it never throws for a bad guess (only for transport/auth failures), so branch on the flag. The Verify API reference covers the full contract, and Starter examples ships a complete OTP sign-in starter repo (orbit-otp-nextjs). client.verify also exposes resend and getDetail.

Contacts

Campaigns

client.campaigns also exposes list, get, update, and delete.

Paginate a list

List endpoints are cursor-paginated — read meta.pagination.cursor and meta.pagination.has_more off each response and pass the cursor back as a query param until has_more is false. Page through SMS messages with the escape hatch:
The full pagination model (cursor vs. offset endpoints, page-size caps, and why cursors are not bookmarkable) is in the Pagination guide.

Error handling

All Orbit-originated errors inherit from OrbitError:
Every non-GET request automatically carries an Idempotency-Key header (UUIDv4); pass your own stable key as the fourth argument to sendSms when retrying from your own queue (client.messages.sendSms("+14155552671", "...", null, "job-7a3b9d-attempt-1")).

Covered route missing? Use the escape hatch

The typed clients wrap 8 core resources; the rest of the API — contact segments, event sinks, frequency caps, and everything else listed as out of scope on the SDK index — is reachable through client.request(method, path, ...). It returns the raw JSON body as a Map<String, Object>. Fetch a segment by id:
The escape hatch carries the same auth, retry, and error model as the typed clients — treat it as a first-class client, not a fallback HttpClient.

Webhook signature verification