Spring til indhold

API til beskedgateway

Ét API til alle beskedkanaler

Send beskeder via WhatsApp Business, SMS, Telegram, Messenger, Instagram og TikTok gennem ét REST-endpoint. Forudbetalt, afregnet pr. udgående besked, med leveringswebhooks og testtilstand.

Fra
0,0003 $
pr. udgående besked
Ved oprettelse
100
gratis beskeder
Binding
Ingen
forudbetalt, ingen kontrakt
curl https://api.omnimessage.co/v1/messages \
  -H "Authorization: Bearer om_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1042-shipped" \
  -d '{
    "channel": "ch_7Hq2mN5vB8cX1zL0pK3j",
    "to": "+971501234567",
    "type": "text",
    "text": { "body": "Your order #1042 has shipped." },
    "reference": "order-1042"
  }'
202 Accepted
{
  "id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
  "object": "message",
  "mode": "live",
  "channel_id": "ch_7Hq2mN5vB8cX1zL0pK3j",
  "channel_type": "whatsapp",
  "direction": "outbound",
  "to": "+971501234567",
  "from": "+971800123456",
  "type": "text",
  "content": {
    "text": { "body": "Your order #1042 has shipped." }
  },
  "status": "queued",
  "error": null,
  "reference": "order-1042",
  "metadata": {},
  "billing": {
    "source": "wallet",
    "amount_micros": 1000,
    "package_grant_id": null,
    "refunded": false
  },
  "created_at": "2026-10-05T09:30:00.000Z",
  "sent_at": null,
  "delivered_at": null,
  "read_at": null,
  "failed_at": null
}
  • Kanaltyper7 bag ét endpoint
  • Beskedtyper9, fra tekst til interaktive lister
  • Pris fra0,0003 $ pr. udgående besked
  • Hastighedsgrænse100 anmodninger pr. sekund pr. nøgle
  • BatchstørrelseOp til 100 beskeder pr. anmodning
  • Genforsøg for webhooks8, med stigende ventetid fra 30 sekunder til 24 timer
  • Idempotensvindue24 timer
  • TesttilstandGratis, ingen kanal påkrævet
  • Mislykkede beskederRefunderes automatisk
  • Indgående beskederGratis

Sådan fungerer det

Fra oprettelse til leveret besked i fire trin

Der er intet salgsmøde og intet minimumsforbrug. Du kan lave dit første API-kald i testtilstand et minut efter, at du har oprettet en konto.

  1. Trin 01

    Opret en konto

    Tilmeld dig, bekræft din e-mail, og opret en API-nøgle i konsollen. Testnøgler virker med det samme, før der er tilsluttet nogen kanal.

  2. Trin 02

    Tilslut en kanal

    Log ind med Facebook eller TikTok i konsollen for at tilslutte et WhatsApp-nummer, en Side eller en virksomhedskonto. Tilføj en Telegram-bot eller et Twilio-nummer med de tilhørende legitimationsoplysninger, i konsollen eller med POST /v1/channels.

  3. Trin 03

    Send gennem ét endpoint

    POST /v1/messages tager et kanal-id, en modtager og et typebestemt indholdsobjekt. Anmodningsformatet er det samme på alle kanaler.

  4. Trin 04

    Følg hver levering

    Signerede webhooks melder sendt, leveret, læst og mislykket. Den samme historik findes i konsollen og på GET /v1/messages.

Beskedtyper

Det, du sender, er det, de ser

Hver besked har en type og et indholdsobjekt under nøglen for den type. Vælg en for at se anmodningens body ved siden af den besked, den giver.

POST /v1/messages
{
  "channel": "ch_7Hq2mN5vB8cX1zL0pK3j",
  "to": "+971501234567",
  "type": "text",
  "text": {
    "body": "Din ordre #1042 er afsendt. Følg den på https://example.com/t/1042",
    "preview_url": true
  },
  "reference": "order-1042"
}

Ren tekst, som accepteres af alle kanaltyper. Sæt preview_url for at lade kanalen vise en linkforhåndsvisning.

KanalerWhatsApp Business, SMS, SMS OTP, Telegram, Messenger, Instagram og TikTok

Konsol

En konsol til alt det, der ikke er kode

Opret nøgler, tilslut kanaler, søg i beskedloggen, afspil webhook-leveringer igen, og administrer fakturering. Alt, hvad konsollen viser, er også tilgængeligt via API’et.

Overblik. Saldo i tegnebogen, resterende pakkekreditter og de seneste 30 dages udgående volumen, pr. konto og pr. tilstand. Skærmbillederne på denne side er lavet med eksempeldata.
Beskedlog. Filtrér efter kanal, status, modtager eller din egen reference, og åbn en hvilken som helst besked for at se dens statushistorik, og hvad den kostede.
Fakturering. Tank tegnebogen op, køb pakker, slå automatisk optankning til, og hent kvitteringer. Pakkekreditter viser, hvad der er tilbage, og hvornår det udløber.

Priser

Betal pr. besked, eller køb beskeder i større mængder

Tank en forudbetalt tegnebog op fra 10 $, og betal prisen pr. besked for hver kanal, eller køb en pakke beskedkreditter til volumen på dine dyreste kanaler.

10 t beskeder

8 $

0,0008 $ pr. besked

  • 10.000 udgående beskeder
  • Gyldig i 3 måneder fra købet
  • Gyldig på alle kanaltyper
Start med 10 t

100 t beskeder

Fremhævet

60 $

0,0006 $ pr. besked

  • 100.000 udgående beskeder
  • Gyldig i 6 måneder fra købet
  • Gyldig på alle kanaltyper
Start med 100 t

1 mio. beskeder

400 $

0,0004 $ pr. besked

  • 1.000.000 udgående beskeder
  • Gyldig i 12 måneder fra købet
  • Gyldig på alle kanaltyper
Start med 1 mio.

Betal efter forbrug

Pris pr. udgående besked ved betaling efter forbrug, efter kanaltype, i amerikanske dollars
KanalPr. besked
WhatsApp Business0,001 $
SMS0,0005 $
SMS OTP0,0005 $
Telegram0,0003 $
Messenger0,0005 $
Instagram0,0005 $
TikTok0,0005 $

Det dækker prisen

  • FaktureresUdgående beskeder, som API’et accepterer, i det øjeblik de accepteres.
  • GratisIndgående beskeder, beskeder i testtilstand, webhooks og konsollen.
  • RefunderesEnhver besked, der ender som mislykket, tilbage til den pakke eller tegnebog, den blev trukket fra.
  • SeparatGebyrer, som Meta, teleoperatører eller andre udbydere opkræver for selve kanalen.

Udvikleroplevelse

Bygget til at blive integreret én gang og så passe sig selv

Signerede webhooks, sikre genforsøg, en sandbox, der opfører sig som produktion, og fejl, du kan forgrene på.

Webhooks, du kan verificere

Hver levering er signeret med HMAC-SHA256 over tidsstemplet og den rå body i headeren OmniMessage-Signature. Svar med en hvilken som helst 2xx inden for 10 sekunder. Mislykkede leveringer forsøges igen otte gange med stigende ventetid, fra 30 sekunder op til 24 timer.

verify-signature.js
import { createHmac, timingSafeEqual } from 'node:crypto';

// header is "t=<unix seconds>,v1=<hex hmac-sha256>"
export function verifySignature(rawBody, header, secret) {
  const parts = header.split(',').map((part) => part.split('='));
  const { t, v1 = '' } = Object.fromEntries(parts);

  const expected = createHmac('sha256', secret)
    .update(`${t}.${rawBody}`)
    .digest('hex');

  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
  const matches =
    v1.length === expected.length &&
    timingSafeEqual(Buffer.from(v1), Buffer.from(expected));

  return fresh && matches;
}
Hændelsen message.delivered
{
  "id": "evt_8Kd2pQ7wN4xB1zR6mT3c",
  "object": "event",
  "type": "message.delivered",
  "mode": "live",
  "created_at": "2026-10-05T09:30:02.900Z",
  "data": {
    "object": {
      "id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
      "object": "message",
      "status": "delivered",
      "reference": "order-1042",
      "delivered_at": "2026-10-05T09:30:02.871Z"
    }
  }
}

En testtilstand, der ikke koster noget

Testnøgler bruger indbyggede sandbox-kanaler, så der er ikke noget at tilslutte. De sidste cifre i modtageren afgør det simulerede udfald, og dine webhooks udløses, som de ville i produktion.

Sandbox-anmodning, ender som læst
curl https://api.omnimessage.co/v1/messages \
  -H "Authorization: Bearer om_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "ch_test_whatsapp",
    "to": "+971501230002",
    "type": "text",
    "text": { "body": "Hello from the sandbox" }
  }'

Fejl med en type og en kode

Alle svar, der ikke er 2xx, har samme body: en type for fejlklassen, en stabil code at forgrene på, den problematiske param, hvor der er en, og et request_id til support.

402 Payment Required
{
  "error": {
    "type": "billing_error",
    "code": "insufficient_balance",
    "message": "Not enough wallet balance or package credits.",
    "request_id": "req_5Vn1cH8jL3qW6yD9sF2k",
    "doc_url": "https://omnimessage.co/docs/errors#insufficient_balance"
  }
}
  • Idempotente POST-anmodninger

    Send en Idempotency-Key-header, så returnerer et genforsøg inden for 24 timer det gemte svar med Idempotent-Replayed: true, uden at der sendes eller opkræves to gange.

  • Forudsigelige grænser

    100 anmodninger pr. sekund pr. nøgle på POST /v1/messages, 20 på de øvrige endpoints. Alle svar indeholder RateLimit-Remaining, og et 429-svar indeholder Retry-After.

  • Batchafsendelse

    POST /v1/messages/batch accepterer op til 100 beskeder. Hvert element accepteres, afvises og faktureres for sig, og 207-svaret rapporterer dem efter indeks.

  • Nøgler med afgrænsede rettigheder

    Giv hver nøgle kun de rettigheder, den har brug for, såsom messages:write eller billing:read, og begræns den til en liste over tilladte IP-adresser.

Spørgsmål

Før du integrerer

De korte svar. De lange står i dokumentationen.

Skal jeg have mit eget WhatsApp-nummer, min egen bot eller mit eget SMS-nummer?

Ja. OmniMessage er en gateway, hvor du medbringer dine egne kanaler: Du tilslutter dit eget WhatsApp Cloud API-nummer, din Telegram-bot, dit Twilio-nummer eller din konto på et socialt medie og beholder ejerskabet. På siden om kanaler kan du se, hvad hver type kræver.

Hvad bliver jeg helt præcist faktureret for?

Én opkrævning pr. udgående besked, som API’et accepterer: en pakkekredit, hvis du har en, og ellers kanaltypens pris pr. besked fra din tegnebog. Indgående beskeder og beskeder i testtilstand er gratis, og en besked, der ender som mislykket, refunderes automatisk.

Er gebyrer til Meta, teleoperatører eller udbydere inkluderet?

Nej. Gatewaygebyret dækker API’et, leveringssporing, webhooks og konsollen. Gebyrer, som Meta, Twilio eller en anden udbyder opkræver for selve kanalen, er et anliggende mellem dig og den pågældende udbyder.

Hvordan tester jeg uden at sende rigtige beskeder?

Brug en nøgle, der begynder med om_test_. Hver konto har en sandbox-kanal pr. type, for eksempel ch_test_whatsapp. Intet bliver leveret eller faktureret, og statusser er simulerede: En modtager, der ender på 0000, mislykkes, 0001 forbliver sendt, 0002 bliver også læst, og alt andet leveres inden for cirka to sekunder.

Hvad sker der, når min saldo er brugt op?

API’et svarer 402 insufficient_balance, og intet sættes i kø, så du kommer aldrig til at skylde penge bagefter. Du kan abonnere på hændelsen balance.low eller slå automatisk optankning til, så tegnebogen tankes op, når den kommer under en grænse, du selv vælger.

Skal jeg bruge et SDK?

Nej. API’et er JSON over HTTPS med bearer-autentificering, så enhver HTTP-klient kan bruges. Dokumentationen har eksempler i cURL, Node, Python og PHP.

Send din første besked i testtilstand i dag

Opret en konto, kopiér en testnøgle, og kald API’et, før du har tilsluttet en eneste kanal. Alle nye konti starter med 100 gratis beskeder.