telkittelkit
telkit SMS

SMS in Norway, from one endpoint

A POST call sends the message. The delivery report comes back as a signed webhook, and your sender ID can be any 11-character name without registering it first. Messages the carrier filters out stay off your invoice.

Outbound and inbound

Every message carries a status you can act on

Outbound A2P goes to one endpoint, inbound arrives on another. A message moves through queued, sent and delivered, and each transition lands on your webhook as a signed event.

Outbound A2P

One-time codes, alerts and confirmations. An Idempotency-Key makes a retry safe. The server counts segments and picks the encoding, then returns both in the response.

Inbound and two-way

A message to your telkit number becomes a message.received event carrying from, to and body. Reply from the same number and the thread stays intact.

Delivery reports

queued → sent → delivered, or failed / undelivered with an error_code. Every transition is both a webhook and an SSE event.

send-sms.tsts
import { Telkit } from "@telkit/sdk"; const telkit = new Telkit({ apiKey: process.env.TELKIT_API_KEY }); // Alphanumeric sender ID: nothing to register in Norway.const message = await telkit.messages.create({  from: "Telkit",  to: "+4791234567",  body: "Hi! Your code is 4821. Valid for 5 minutes.",  idempotencyKey: "otp-4821",}); message.id;        // "msg_8Kp2Qf9aR"message.status;    // "queued"message.segments;  // 1message.encoding;  // "GSM-7"
Send an SMS with the type-safe SDK.
webhook.jsonjson
// Delivery report, signed with Ed25519. Verify the signature first.{  "type": "message.delivered",  "data": { "id": "msg_8Kp2Qf9aR", "status": "delivered", "billed": true }} // Filtered by the carrier → never billed.{  "type": "message.undelivered",  "data": { "id": "msg_9Lr3Tw0bS", "status": "undelivered",            "error_code": "carrier_filtered", "billed": false }}
Delivery reports arrive as signed events.
Norwegian rules

Norway skips the registration round

There is no 10DLC-style registration for Norwegian SMS. You put the sender name in the from field, up to 11 characters, and you can change it between sends.

11-character sender IDs

A–Z and 0–9, preserved exactly as you sent them. Nothing to register, no approval to wait for, and different campaigns can carry different sender names.

Links are checked at submit

You register the domains you link to. A message pointing somewhere else comes back as a 422 right away, so it never disappears silently on its way to the handset.

No short codes

Norway has neither short codes nor domestic long codes for A2P. We route over international long codes, and the throughput limit sits in the response headers next to the 429 you get when you pass it.

The ECC is moving toward mandatory sender-ID registries. Sender-ID management already sits in the platform, so a stricter rule turns into a config change on our side.

Two-way and consent

Consent mechanics you never have to build

An inbound STOP is recorded the moment it arrives, and further sends to that number halt. The consent itself is still yours to hold. We enforce the mechanics; the opt-in and the use case are on you.

  • Two-way conversations

    Replies arrive as message.received. Answer from the same number and the whole exchange stays in one thread on the handset.

  • STOP and STOPP

    Both keywords are detected automatically. We record the opt-out, suppress further sends (configurable) and emit message.opt_out so your own database keeps up.

  • Consent under section 15

    Marketing by SMS needs consent under section 15 of the Norwegian Marketing Control Act. The national opt-out register covers telemarketing and addressed mail, and SMS falls outside it. Gambling and lottery traffic is blocked.

  • Quiet hours

    Keep non-essential sends outside 20:00–08:00. Queue the batch for the morning instead: a marketing SMS at midnight buys you complaints and opt-outs.

opt-out.jsonjson
// Inbound "STOP" → the opt-out is recorded and sends are halted.{  "type": "message.received",  "data": { "from": "+4791234567", "to": "Telkit", "body": "STOP" }} {  "type": "message.opt_out",  "data": { "number": "+4791234567", "scope": "sender:Telkit", "source": "keyword" }}
An inbound “STOP” is recorded as an opt-out.

The consent is yours to hold. telkit enforces STOP and the domain list by default, while the opt-in and the use case stay on your side.

Pricing

Per segment, in EUR

You pay per segment in EUR, with no platform fee on top. Inbound is priced separately. A message the carrier filtered out never reaches your invoice.

SMS

To Norway
€0.04–€0.06 / segment
Inbound
Low / free
Local number
€1–€2 / mo
KYC bundle
Free

The figures are anchors, shown as “from”. The full rate card lives on the pricing page.

How a segment is counted

GSM-7 (standard text)160 chars · 153 concatenated
UCS-2 (emoji / special chars)70 chars · 67 concatenated

Plain text runs on GSM-7 and fits 160 characters. Add one character outside that alphabet, an emoji for instance, and the whole message switches to UCS-2 at 70 characters. Anything longer splits into concatenated segments, each billed on its own. Call pricing/preview to see the split before you send.

Filtered SMS is not billed

Where the carrier separates filtered or hard-failed from delivered, that message stays off your invoice. The reason sits in error_code and in the event.

See the full rate card
Questions

SMS questions we get asked

What developers want settled before the first send.

Ready for the first send?

The key is issued immediately, and the free tier asks for no card.