Developers
FortWave developer documentation
FortWave lets your application send SMS and WhatsApp messages through one REST API. Use it for verification codes, order updates, reminders and campaigns, with the same API key, the same conventions and one dashboard to track everything.
Ready to send your first message?
Each quick start takes you from an API key to a delivered message in a few minutes.
Available APIs
Each API has its own reference with every endpoint, parameter, response and error, plus code samples in cURL, Node.js, Python, Go, PHP and Ruby.
SMS API
AvailableSend text messages from your registered sender ID to any phone in your sender's country.
- One message, up to 500 different messages, or one template filled in for up to 500 recipients
- Free test messages to your own verified number with the MiraiTest sender
- Signed delivery webhooks when a message is sent or fails
/v1/sms/v1/sms/bulk/v1/sms/templateWhatsApp API
AvailableSend WhatsApp template messages from your business number, with rich headers and per-recipient variables, and reply with free-form text and files.
- Templates approved by Meta, filled in with each recipient's variables
- Free-form replies with text and files inside the customer's 24-hour window
- Image, video or PDF headers, uploaded once and reused
- Up to 500 messages per request, paid from your WhatsApp wallet
/v1/whatsapp/media/v1/whatsapp/messages/v1/whatsapp/messages/bulk/v1/whatsapp/messages/batch/v1/whatsapp/messages/free-formEmail · An email API is coming soon.
How it works
Every integration follows the same four steps. The first three are done once, in the dashboard.
- 1
Create your account
Sign up and create your company. For SMS, the company must be approved and verified before you can send.
- 2
Set up a channel
SMS: register a sender ID and wait for its approval. WhatsApp: connect your Meta business account and a sender, and get a template approved.
- 3
Create an API key
Generate a key under Settings → API keys. The same key works for every FortWave API. Keep it on your server.
- 4
Send and track
Call the API from your backend. Accepted messages are queued and delivered in the background; follow them through webhooks (SMS) or your message history.
SMS or WhatsApp?
Both channels reach your customers' phones, but they work differently. Many businesses use both: WhatsApp for rich messages, SMS to reach everyone.
| Aspect | SMS | |
|---|---|---|
| Message content | Any text up to 600 characters, or your own template with placeholders. | Templates approved by Meta to start a conversation, and free-form text and files for 24 hours after the customer's last message. |
| Media | Text only. | Image, video or PDF template headers; images, videos, audio and documents in free-form replies. |
| Setup | An approved and verified company, and an approved sender ID (1 to 11 letters or digits). | A connected Meta business account, a connected sender, and approved templates. |
| Pricing | Prepaid SMS credits. One credit covers 160 standard characters, or 70 with emoji or other Unicode characters. | Paid per message from your WhatsApp wallet, by destination country and template category. |
| Recipients | Phones in the same country as your sender ID's carrier. | WhatsApp users in supported countries, in international format. |
| Testing | The MiraiTest sender sends free test messages to your verified number. | Send to your own number with a connected sender. |
| Delivery tracking | Signed webhooks for sent and failed messages, plus the dashboard. | WhatsApp message history in the dashboard. |
Common to every API
Learn these once and they apply everywhere. Every request has the same shape:
curl -X POST https://rest.api.fortwave.io/v1/... \
-H "Authorization: Bearer $FORTWAVE_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{ ... }'- Authentication
- Send your API key as a Bearer token in the Authorization header. A missing or revoked key returns 401.
- JSON in, JSON out
- Request bodies are JSON (WhatsApp media uploads are multipart). Send Accept: application/json so errors come back as JSON too.
- Asynchronous delivery
- A 200 means the message was accepted, charged and queued, not yet delivered. Delivery happens in the background.
- Errors you can act on
- Validation errors return 422 with an errors object keyed by field, so you know exactly what to fix. Messages are localized; branch on status codes and field keys.
- Rate limits
- 500 requests per minute per user on each API (120 for WhatsApp media uploads). Over the limit you get 429 and a Retry-After header.
- Bulk is all or nothing
- Bulk and batch requests take up to 500 messages. If any item is invalid, nothing is sent and nothing is charged.