> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK language plans — which escape hatch per language, and which cookbook to use

> Per-language map of the untyped request escape hatch (client.request / client.Request / client.RequestAsync / web chat and push clients) and pointers to the sub-cookbook each loop lives in — operations, contact lifecycle, root, or the client-side section — plus why Go, Ruby, PHP, Java, C#, and Swift ship source-only today.

# SDK language plans

The [SDK index](/sdks) lists install coordinates and scope per language. This page answers the two questions that land next: **which escape hatch to call when a typed helper stops**, and **which cookbook holds the worked round trip for that loop**.

## Escape hatch per language

Every SDK accepts a plain path below the `https://api.orbit.devotel.io/api/v1`
base — never a full URL. The untyped call inherits the client-wide auth,
retry, and error model, so it behaves exactly like a typed call once it
returns its `OrbitApiError` subclass.

| Language | Escape hatch | Cookbook route to reach |
| - | - | - |
| Node.js / TypeScript | `orbit.request(method, path, …)` | Typed helpers cover the whole surface today; the hatch exists for routes newer than your pinned version |
| Python | `client.request(method, path, …)` | Batch sends, analytics reads |
| Go | `client.Request(ctx, method, path, …)` | Batch sends, analytics reads |
| Ruby | `client.request(method, path, **opts)` | Batch sends, analytics reads |
| PHP | `$client->request(method, path, …)` | Batch sends, analytics reads |
| Java | `client.request(method, path, …)` | Batch sends, analytics reads |
| C# | `client.RequestAsync(method, path, …)` | Batch sends, analytics reads |
| Web (browser) | `web.chat` — the drop-in `OrbitChat` widget, or `OrbitPersonalization.getPersonalization(slot)` | Client-side surfaces; never a secret key |

## The four canonical server loops

Past the first send, every server integration runs the same four round trips. Each one is a numbered recipe on the [Per-language recipes](/guides/per-language-recipes) guide, with a cURL tab plus Python, Go, Ruby, PHP, Java, and C# — and a dart on the escape hatch where no typed helper exists:

1. **Message send + DLR webhook** — send, then consume `message.delivered` / `message.failed` on your registered webhook endpoint.
2. **Batch send with a pinned-key 429 loop** — one `Idempotency-Key` riding through the whole retry loop, honor `Retry-After`, never double-send a row.
3. **OTP round trip** — `verify/send` then `verify/check`; a wrong guess returns `valid: false`, never an exception.
4. **Usage read** — `GET /analytics/messages` paginated by splitting the date window, bucketed with `group_by`.

Each recipe names the sub-cookbook it draws from: the [operations cookbook](/guides/api-recipes/operations) for send/batch/analytics, the [contact lifecycle cookbook](/guides/api-recipes/contacts-lifecycle) for the contact side of the loop, or the [recipes hub root](/guides/api-recipes/index) for pre-send screens like 10DLC posture.

## Client-side loops (mobile + browser SDKs)

The client SDKs — Swift, Android (Kotlin), Flutter, React Native, Web — run a different loop with a publishable key (`dv_live_pk_…`): **register a push device token** (from your backend), **connect the chat client with a 429-aware send loop**, and **resolve a personalization slot**. Those are numbered recipes 5–7 on [Per-language recipes](/guides/per-language-recipes#client-side-loops). Their escape hatch is not a raw request — it is the **per-call `idempotencyKey` parameter** every send method accepts, which dedupes your own retry loop the same way the server-side key does.

## Why the second-tier SDK pages have no typed helper today

Go, Ruby, PHP, Java, C#, and Swift (plus Android, Flutter, React Native on the client side) ship **source-only** — vendored from the monorepo, not published to a package registry. They wrap the eight core resources (messaging, voice, contacts, campaigns, verify, webhooks) with typed methods, but batch sends and analytics reads intentionally stay at the escape hatch until the first registry publish. The [SDK index](/sdks) tracks the status per language; the vendoring walkthrough for Java and C# is at [SDK index — vendoring](/sdks#vendoring-java-and-c).

<Note>
  When a typed helper for batch or analytics lands in your language, the recipes above move from the escape-hatch column to the typed column without changing shape — the escape hatch call and the eventual typed call share the same round trip.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.