SMS API: dokumentasjon og eksempler.
Koble påminnelser, varsler og kundebeskjeder til D3 SMS. API-et bruker arbeidsområdets avsendere, saldo og meldingshistorikk.
Kom i gang
- Velg et aktivt Pro-abonnement og fyll på SMS-saldo.
- En administrator med bekreftet e-post aktiverer API under Innstillinger.
- Lagre API-brukernavnet og nøkkelen på serveren din. Hele nøkkelen vises bare én gang.
- Send med HTTPS POST og følg meldingen med statusoppslag.
Tilgangen følger arbeidsområdet. Den krever fortsatt Pro og en aktiv administrator som eier nøkkelen. Bytt nøkkel under Innstillinger dersom denne administratoren slutter.
Forespørsler og innlogging
API-et bruker samme grunnmodell som Teletopias HTTP-API: username, password, recipient, text og eventuelt sender i forespørselen. Her er password din D3 API-nøkkel.
Bruk HTTPS POST med UTF-8 og enten application/x-www-form-urlencoded eller application/json. Innloggingsopplysningene skal ligge i forespørselskroppen. GET, innlogging i URL-en og HTTP uten kryptering støttes ikke.
Dette er D3s eget API. Det har egne adresser, nøkler og statuskoder. Teletopias innloggingsopplysninger, statuskoder og øvrige parametere kan ikke brukes direkte.
Oppbevar nøkkelen på serveren. Ikke legg den i nettleserkode, mobilapper, kildekodelager eller logger. Bytt nøkkelen straks dersom den kan ha kommet på avveie.
Send SMS
POST https://d3.no/sms/api/v1/send.phpEn vellykket forespørsel reserverer beløpet og legger meldingene i kø. HTTP 200 bekrefter at forespørselen er behandlet; det betyr ikke at SMS-en er levert.
| Felt | Beskrivelse |
|---|---|
usernamePåkrevd | API-brukernavnet fra Innstillinger. |
passwordPåkrevd | API-nøkkelen. Dette er ikke passordet du logger inn på nettsiden med. |
recipientPåkrevd | Internasjonalt telefonnummer med landskode, for eksempel 47XXXXXXXX. Ledende + eller 00 godtas også. Flere numre skilles med komma, eller sendes som en liste med strenger i JSON. Maksimum 100 unike mottakere. Duplikater telles én gang. |
textPåkrevd | Meldingstekst i UTF-8, maksimalt 10 SMS-deler per mottaker. Lange tekster, enkelte spesialtegn og emoji kan gi flere deler. |
clientRefPåkrevd | Din unike referanse for utsendingen: 1–100 tegn, kun A–Z a–z 0–9 _ . : -. Bruk samme referanse ved et nytt forsøk på samme forespørsel. Bruk en intern ID uten navn, telefonnummer eller andre personopplysninger. |
senderValgfritt | Et eget godkjent og aktivt avsendernavn i arbeidsområdet. Utelates feltet, brukes D3SMS. Ventende, avviste, blokkerte og andre kunders navn kan ikke brukes. |
formatValgfritt | json er standard. plain gir et kort tekstsvar ved sending. |
Alle mottakere valideres før beløpet reserveres. Numrene må være gyldige og tilhøre et støttet land. Forespørselen avvises samlet ved ugyldige data eller for lav saldo.
curl --request POST 'https://d3.no/sms/api/v1/send.php' \
--data-urlencode 'username=DITT_API_BRUKERNAVN' \
--data-urlencode 'password=DIN_API_NOKKEL' \
--data-urlencode 'recipient=47XXXXXXXX' \
--data-urlencode 'text=Hei! Dette er en påminnelse.' \
--data-urlencode 'clientRef=paaminnelse-2026-001'
--data-urlencode bevarer blant annet plusstegn og norske bokstaver i skjemadata. Eksemplene inneholder plassholdere; lagre ekte nøkler i sikker konfigurasjon.
{
"success": true,
"messages": [{
"messageId": "d3m_0123456789abcdef0123456789abcdef",
"clientRef": "paaminnelse-2026-001",
"recipient": "47XXXXXXXX",
"sender": "D3SMS",
"status": "queued",
"statusCode": 10,
"statusText": "I kø",
"segments": 1,
"cost_ore": 79,
"createdAt": "2026-10-10T10:00:00Z",
"updatedAt": "2026-10-10T10:00:00Z"
}],
"total_ore": 79,
"currency": "NOK",
"duplicate": false
}
Hver mottaker får en egen messageId. Alle beløp er heltall i øre, inkludert mva. total_ore er summen for hele utsendingen.
Kort tekstsvar
Legg til format=plain for én linje per mottaker:
accepted:47XXXXXXXX:d3m_0123456789abcdef0123456789abcdefaccepted betyr at D3 har registrert utsendingen eller funnet en tidligere identisk forespørsel. Bruk alltid statusoppslag for leveringsstatus. Feil returneres som error:FEILKODE:beskrivelse. Feil som oppdages før svarformatet er lest, gir JSON. Status- og saldooppslag gir alltid JSON.
Unngå dobbeltutsending
Generer clientRef én gang i systemet ditt før sending, og lagre den sammen med beskjeden. Samme referanse og samme innhold gir tilbake de opprinnelige meldingene med duplicate: true. Det trekkes ikke penger på nytt. Referansen beholdes for å hindre dobbeltutsending; den skal derfor ikke inneholde personopplysninger.
Bruker du samme referanse med andre mottakere, annen tekst eller avsender, får du HTTP 409 og feil 4091. En ny, tilsiktet utsending må ha en ny referanse.
Ved timeout eller brutt forbindelse: slå først opp clientRef. Hvis forespørselen må gjentas, behold nøyaktig samme referanse og innhold. Ikke lag en ny referanse automatisk. Status 70 betyr uavklart resultat og skal undersøkes før du eventuelt sender på nytt.
Følg status og saldo
Bruk status.php med messageId eller clientRef for å følge meldinger. Se statusbeskrivelsen og alle D3-kodene. Denne versjonen har statusoppslag; utgående webhooks til kundens system er ikke tilgjengelige.
POST https://d3.no/sms/api/v1/balance.phpSend username og password for å lese saldo og gjeldende grunnpris.
{
"success": true,
"balance_ore": 10000,
"currency": "NOK",
"plan": "pro",
"unit_price_ore": 79,
"international_surcharge_ore": 100
}Pro har ordinært 299,00 kr per måned inkl. mva. (239,20 kr eks. mva.) og 0,79 kr per SMS-del til Norge inkl. mva. (0,632 kr eks. mva.). En egen prisavtale kan gi en annen grunnpris. Til utenlandske numre kommer alltid 1,00 kr inkl. mva. (0,80 kr eks. mva.) ekstra per SMS-del og mottaker, også med en egen prisavtale. SMS-forbruk trekkes fra forhåndsbetalt saldo. Se priser og regneeksempler.
Eksempel med PHP
Eksemplet leser nøkkelen fra serverens miljø og sender JSON. Lagre referansen før kallet; et timeout-resultat må avklares med statusoppslag.
$payload = [
'username' => getenv('D3_SMS_API_USERNAME'),
'password' => getenv('D3_SMS_API_PASSWORD'),
'recipient' => '47XXXXXXXX', // Erstatt med mottakerens nummer.
'text' => 'Hei! Dette er en påminnelse.',
'clientRef' => 'paaminnelse-2026-001', // Lagre før sending.
];
$ch = curl_init('https://d3.no/sms/api/v1/send.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_THROW_ON_ERROR),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 30,
]);
$body = curl_exec($ch);
$httpStatus = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($body === false) {
throw new RuntimeException('Uavklart svar. Slå opp clientRef.');
}
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
if ($httpStatus !== 200 || empty($result['success'])) {
throw new RuntimeException(
'D3 API-feil: '.($result['error']['code'] ?? $httpStatus)
);
}
// Lagre messageId fra hver oppføring i $result['messages'].
// HTTP 200 bekrefter ikke at SMS-en er levert.Grenser og tilgang
Forespørselskroppen kan være høyst 64 KiB. Sending er begrenset til 60 forespørsler per minutt per arbeidsområde. Status og saldo deler en grense på 300 forespørsler per minutt. Ved HTTP 429 skal klienten vente minst antallet sekunder i Retry-After før nytt forsøk.
Avsluttet eller utløpt Pro, blokkering eller ugyldig administratortilgang stanser API-kall. Ved utløpt Pro eller sperret arbeidsområde blir usendte API-meldinger satt på pause med uendret reservert pris. Ved bytte eller deaktivering av nøkkelen stoppes usendte API-meldinger, og beløpet tilbakeføres. Det samme gjelder hvis administratoren som eier nøkkelen, mister nødvendig tilgang. Et påbegynt sendeforsøk kan ikke tilbakekalles. En ny, gyldig nøkkel kan lese status for tidligere API-meldinger i samme arbeidsområde.
