SDKs

Six idioms.
One contract.

Every Dials SDK is generated from the same versioned OpenAPI document. Same request shape. Same response shape. Same retries, errors, signing, and idempotency.

At a glance

What every SDK gives you.

Typed
End-to-end
Requests, responses, errors, and webhooks — all typed at the boundary.
Retries
Exponential
Backoff with jitter for 408, 429, 5xx — never for 4xx outside 408/429.
Signing
Webhook + HMAC
Verify inbound webhooks with a single SDK call.
Idempotency
Built in
Idempotency keys generated and replayed automatically on retry.

Languages

Pick your idiom.

TypeScript

npm i @dials/sdk

GA
Rust

cargo add dials-sdk

GA
Python

pip install dials

Beta
Go

go get github.com/dials/sdk-go

Beta
Swift

Swift Package Manager

Modeled
Kotlin

Gradle: implementation("com.dials:sdk")

Modeled

TypeScript

Reach the same path.

Configure a client with your tenant and audience, hold a scope, and call any of the verified paths. The same body shape the dashboard sends.

TypeScript
import { Dials } from "@dials/sdk";

const dials = new Dials({
  audience: "platform.dials.com",
  scope:    ["dials.read", "dials.dial"]
});

const results = await dials.numbers.search({
  areaCode:         "512",
  exchangeCode:     "555",
  localCallingArea: true,
  limit:            25
});

for (const num of results.items) {
  console.log(num.e164);
}

Rust

Production by default.

Rust SDK is the reference implementation. Identical retries, identical signing, identical types. Compiles to a static binary.

Rust
use dials_sdk::{Dials, NumberSearch};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let dials = Dials::from_env()?;
    let res = dials
        .numbers()
        .search(NumberSearch::new()
            .area_code("512")
            .exchange_code("555")
            .local_calling_area(true)
            .limit(25))
        .await?;
    for n in res.items { println!("{}", n.e164); }
    Ok(())
}

Pick a language.

Install an SDK, point it at your tenant, and run the smoke flow end-to-end.