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.
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.
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"// 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 }}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.
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.
// 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" }}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.
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
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.
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.