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
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.