Skip to content
Developers

Build on the carrier, not on a reseller.

Seven REST APIs - Voice, SMS, Verify, Video, Email, Number Lookup and Fax - on Dollu’s own network: 600+ carrier interconnects, numbers in 110+ countries, signed webhooks and SDKs in six languages. Free sandbox, no card.

  • 7

    APIs behind one key

  • 6

    Official SDKs plus CLI

  • 99.99%

    Core availability

APIs

Seven products, one key, one console.

Each API is a first-class product with its own reference, limits and pricing - and all of them share authentication, webhooks, sub-accounts and billing.

CPaaS portfolio
Quick start

Two requests to production-grade messaging and voice.

Send a message and place a call with curl or the Node.js SDK. Every other product follows the same shape: one POST, one id, events on your webhook.

POST /v2/messages

curl
curl -X POST https://api.dollu.com/v2/messages \
  -H "Authorization: Bearer $DOLLU_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7" \
  -d '{
    "from": "Dollu",
    "to": "+447700900123",
    "text": "Your verification code is 482913",
    "webhook_url": "https://example.com/hooks/dollu"
  }'

# 202 Accepted
# { "id": "msg_01J8ZK3V9Q", "status": "queued", "segments": 1,
#   "request_id": "req_5f2c..." }
Node.js
import { Dollu } from "@dollu/sdk"

const dollu = new Dollu(process.env.DOLLU_API_KEY)

const message = await dollu.messages.create({
  from: "Dollu",
  to: "+447700900123",
  text: "Your verification code is 482913",
  webhookUrl: "https://example.com/hooks/dollu",
})

console.log(message.id, message.status)
// msg_01J8ZK3V9Q queued

POST /v2/calls

curl
curl -X POST https://api.dollu.com/v2/calls \
  -H "Authorization: Bearer $DOLLU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "+442045770000",
    "to": "+919876543210",
    "answer_url": "https://example.com/ivr/answer",
    "record": true,
    "machine_detection": "enabled"
  }'

# 201 Created
# { "id": "call_01J8ZKQ2MB", "status": "initiated",
#   "direction": "outbound", "request_id": "req_a91d..." }
Node.js
const call = await dollu.calls.create({
  from: "+442045770000",
  to: "+919876543210",
  answerUrl: "https://example.com/ivr/answer",
  record: true,
  machineDetection: "enabled",
})

// answer_url returns JSON verbs when the call connects:
// [{ "say": { "text": "Hello from Dollu" } },
//  { "gather": { "digits": 1, "action_url": "/ivr/menu" } }]

console.log(call.id, call.status)
// call_01J8ZKQ2MB initiated

Sandbox keys (sk_test_) accept exactly the same requests. Verified numbers receive real traffic; every other destination returns simulated delivery receipts and call events so you can exercise webhooks end to end without touching the PSTN.

API essentials

The conventions every endpoint follows.

Boring on purpose. Once you know one Dollu API you know all seven.

Base URLhttps://api.dollu.com/v2 - REST over HTTPS, JSON in and out; TLS 1.2+
AuthenticationBearer API keys with scopes (sk_test_… for sandbox, sk_live_… for production) or OAuth 2.0 client credentials; optional IP allow-lists
IdempotencyIdempotency-Key header on every POST, honoured for 24 hours; every response carries a request_id to quote to support
Rate limitsProduction defaults: 100 CPS and 1,000 concurrent calls; 300 messages/second; 1,000 lookups/minute - raised on request. Sandbox: 10 requests/second
ErrorsConventional HTTP status codes; JSON body with type, code, message, param and docs_url; retry-after on 429
VersioningPath version (v2) for breaking changes; additive changes announced 30 days ahead; sunset headers on deprecated endpoints
RegionsAPI served from Frankfurt, Ashburn, Mumbai and Singapore; media anchored at the nearest of 6 interconnect PoPs; recordings stored in the region you choose
ComplianceISO 27001, SOC 2 controls, GDPR data processing agreement; DLT (India), 10DLC and STIR/SHAKEN (US) handled in the console
SDKs & tooling

Official SDKs in six languages, plus a CLI and OpenAPI spec.

Typed models, retries with backoff, idempotency keys and webhook signature verification are built into every SDK, so the integration code you write is about your product, not ours.

  • Node.js / TypeScript

    npm
    npm install @dollu/sdk
  • Python

    PyPI
    pip install dollu
  • Java / Kotlin

    Maven Central
    com.dollu:dollu-sdk
  • Go

    Go modules
    go get github.com/dollu/dollu-go
  • PHP

    Packagist
    composer require dollu/dollu-php
  • .NET (C#)

    NuGet
    dotnet add package Dollu.Sdk
  • OpenAPI 3.1 specification

    One spec for every product. Generate clients in any language, import into Postman or Insomnia, or diff versions in CI.

  • Command-line interface

    Send a test message, place a call, tail webhook deliveries and replay events from your terminal - the same API key, no console needed.

  • Console with request logs

    Every request with headers, latency and the carrier-side outcome; SIP traces for calls; per-message delivery timelines and DLR reason codes.

Webhooks & events

Every state change, signed and delivered.

One webhook format across all products - verify the signature, switch on the event type, acknowledge with a 2xx. Retries and replay are handled for you.

DeliveryJSON POST over HTTPS to the URL on your account, number or individual request (webhook_url); 5 s connect timeout, 15 s response timeout
SignatureX-Dollu-Signature: HMAC-SHA256 of timestamp + body with your webhook secret; X-Dollu-Timestamp for replay protection (reject skew > 5 minutes); SDK helpers verify in one call
RetriesAny non-2xx or timeout is retried with exponential backoff for up to 24 hours; failed deliveries can be replayed from the console or API
Messaging eventsmessage.queued · message.sent · message.delivered · message.failed · message.received (inbound) · message.opted_out
Voice eventscall.initiated · call.ringing · call.answered · call.completed · call.machine_detected · call.dtmf_received · recording.completed · transcription.completed
Verify eventsverification.sent · verification.approved · verification.failed · verification.expired · verification.fraud_blocked
Video eventsroom.created · room.ended · participant.joined · participant.left · recording.completed
Email eventsemail.accepted · email.delivered · email.deferred · email.bounced · email.opened · email.clicked · email.complained
Fax and lookupfax.sent · fax.failed · fax.received; number lookups are synchronous and return in the response, no webhook
Payloadid, type, created_at, data (the full resource), plus account_id and sub_account_id for platform customers; schema published in the OpenAPI spec
Sandbox limits

What the free sandbox includes, and where it stops.

Enough to build and demonstrate a complete flow, with real deliveries to your own numbers and simulated events for everything else.

CostFree. No card. Production needs KYC and either a prepaid top-up or approved credit terms
API surfaceEvery endpoint of every product with sk_test_ keys; identical request and response shapes to production
NumbersTwo test numbers per account (one voice, one SMS-enabled) plus shared CLI-check numbers; add up to five verified personal numbers as destinations
Messaging200 messages per day to verified numbers, delivered over the real network; other destinations return simulated delivery receipts
Voice50 calls per day, 2 concurrent, 5 minutes each, to verified numbers; other destinations produce simulated call events for IVR and webhook testing
Verify50 verifications per day across SMS, voice and WhatsApp channels to verified numbers
VideoRooms of up to 4 participants for 30 minutes; recordings kept for 24 hours
Email and fax100 emails per day from a shared sandbox domain; 10 fax pages per day to verified fax numbers
Rate limit10 requests per second per key; 429 with Retry-After beyond that
RetentionSandbox logs, recordings and media are deleted after 30 days
Going liveComplete KYC in the console and add a payment method or credit terms; swap sk_test_ for sk_live_ - nothing else in your code changes
Sandbox

Get a sandbox key.

Tell us what you are building and which SDK you prefer. A solutions engineer sends your key, test numbers and console login - and stays on the thread for questions.

  • A key within one business day

    We provision sandbox accounts by hand for now - it keeps the network clean and you get a real engineer's email address in the process.

  • Test numbers and console access

    Two test numbers, shared CLI-check numbers, request logs, webhook replay and the OpenAPI spec are ready when your key arrives.

  • A human when you need one

    Solutions engineers who know both the API and the PSTN answer integration questions; the 24×7 NOC covers production once you are live.

Already in production elsewhere and comparing routes or pricing? Request a rate deck instead - it comes with test credentials too.

Sandbox sign-up

Fields marked * are required. Work email addresses only, please - it speeds up approval.

Free sandbox. No card. By submitting you agree to our privacy policy.

FAQ

Developers - common questions.

The questions customers and carriers ask us most often before they interconnect. If yours is not here, our team answers within one business day.

Still have a question?

Ask our solutions team

Yes. Sandbox keys cost nothing, need no card and do not expire while they are in use. Limits are generous enough to build and test a complete flow - real deliveries to your verified numbers, simulated events for everything else. Production usage is billed per second, per message or per verification at published rates with no monthly minimum.

Developers

Ship it on the network that carries it.

Start in the sandbox today, or talk to a solutions engineer about volumes, SIP interconnect alongside the API, or a platform agreement with sub-accounts and your own decks.

Abstract globe with connected network lines