Notix
API reference

SMS.

Send a transactional SMS from your wallet and read its delivery status. Every request needs an API key in the Authorization header; the reference overview covers keys, errors and rate limits.

Send an SMS

POST/v1/smsSending or full access key

Send one transactional SMS. The message is charged to your wallet when it is queued and delivered by the route Notix has configured for the destination country. Delivery status arrives through the sms.sent, sms.delivered and sms.failed webhooks, or by reading the message back.

Pricing

One GSM-7 message is up to 160 characters; longer text is billed per 153 character segment. Text with characters outside GSM-7 is billed per 70 characters (67 when concatenated). SMS needs no paid plan: it is prepaid from your wallet.

Sender ID

senderId is optional. It defaults to your team's own approved sender ID for the destination country, or to the shared Notix sender ID when you have none. Only a sender ID approved for your team is accepted. See SMS and sender IDs.

Idempotency

Pass an Idempotency-Key header to make a retry safe. The same key and body returns the original message. The same key with a different body answers 409.

Errors

StatusCodeMeaning
400BAD_REQUESTThe number is not valid E.164, the text is empty or over 1,600 characters, or the sender ID is not one you may use.
402INSUFFICIENT_BALANCEYour wallet cannot cover the message. Nothing was sent.
403FORBIDDENSMS is not enabled for your team.
409NOT_UNIQUEThe idempotency key was used with a different body.
422RISK_REFUSEDRisk scoring refused the request.
Headers
FieldTypeAbout
Idempotency-Keystring

Makes the request safe to retry. Same key and same body returns the original message. Same key and a different body answers 409 NOT_UNIQUE.

Request body (JSON)
FieldTypeAbout
torequiredstring

The recipient phone number with its country code.

textrequiredstring

The message. Up to 1600 characters. GSM-7 text is billed in 160 character segments (153 when concatenated); text with other characters in 70 (67).

At most 1,600 characters.

senderIdstring

A sender ID approved for this team. Defaults to the team's own approved sender ID for the country, or to the shared Notix sender ID when it has none.

At most 11 characters.

clientIpstring (ip)

The IPv4 or IPv6 address the end user made the request from. Used by risk scoring. Notix stores only a keyed hash of it.

terminal
curl -X POST "https://app.usenotix.dev/api/v1/sms" \
  -H "Authorization: Bearer $NOTIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "to": "+2348012345678",
  "text": "Your order 4471 has shipped."
}'

Responses

201The message was charged to the wallet and queued for delivery.
201 response fields
FieldTypeAbout
idrequiredstring
torequiredstring

Masked to the last four digits.

statusrequiredstring

One of queued, sent, delivered, failed, rejected.

segmentsrequiredinteger
chargerequiredobject
charge.currencyrequiredstring

One of USD, NGN, KES.

charge.amountrequiredstring

Decimal string in the team's wallet currency.

reasonrequiredobject

Set when the status is failed or rejected. Plain language, never a provider code.

Can be null.

reason.coderequiredstring
reason.messagerequiredstring
createdAtrequiredstring
updatedAtrequiredstring
400Invalid input: the number, the text length or the sender ID.
402The team wallet cannot cover the message. Nothing was sent.
402 response fields
FieldTypeAbout
errorrequiredobject
error.coderequiredstring

One of INSUFFICIENT_BALANCE.

error.messagerequiredstring
403SMS is not enabled for this team, or the environment refuses this destination.
409The Idempotency-Key was used with a different body, or a request with it is in progress.
422Risk scoring refused the request. Nothing was sent.
422 response fields
FieldTypeAbout
errorrequiredobject
error.coderequiredstring

One of RISK_REFUSED.

error.messagerequiredstring
riskrequiredobject
risk.scorerequirednumber
risk.levelrequiredstring

One of LOW, MEDIUM, HIGH.

risk.reasonsrequiredobject[]
risk.reasons[].coderequiredstring
risk.reasons[].detailrequiredstring

List SMS messages

GET/v1/smsFull access key

List the team's SMS messages, newest first, with a cursor for the next page. Filter by status and page with cursor and limit (default 50, max 100). Needs a full access key.

StatusMeaning
queuedCharged, waiting for the provider.
sentAccepted by the network.
deliveredConfirmed delivered by the provider's delivery report.
failedNot delivered after being sent. The charge stands.
rejectedRefused before delivery. The charge was returned.
Query parameters
FieldTypeAbout
cursorstring
limitinteger

Default 50.

statusstring

One of queued, sent, delivered, failed, rejected.

terminal
curl -X GET "https://app.usenotix.dev/api/v1/sms" \
  -H "Authorization: Bearer $NOTIX_API_KEY"

Responses

200The team's messages, newest first, with a cursor for the next page.
200 response fields
FieldTypeAbout
datarequiredobject[]
data[].idrequiredstring
data[].torequiredstring

Masked to the last four digits.

data[].statusrequiredstring

One of queued, sent, delivered, failed, rejected.

data[].segmentsrequiredinteger
data[].chargerequiredobject
data[].charge.currencyrequiredstring

One of USD, NGN, KES.

data[].charge.amountrequiredstring

Decimal string in the team's wallet currency.

data[].reasonrequiredobject

Set when the status is failed or rejected. Plain language, never a provider code.

Can be null.

data[].reason.coderequiredstring
data[].reason.messagerequiredstring
data[].createdAtrequiredstring
data[].updatedAtrequiredstring
nextCursorrequiredstring

Can be null.

400Invalid cursor, limit or status.

Get an SMS message

GET/v1/sms/{id}Full access key

Retrieve one SMS message by id, with its current delivery status and reason. Needs a full access key.

StatusMeaning
queuedCharged, waiting for the provider.
sentAccepted by the network.
deliveredConfirmed delivered by the provider's delivery report.
failedNot delivered after being sent. The charge stands.
rejectedRefused before delivery. The charge was returned.
Path parameters
FieldTypeAbout
idrequiredstring
terminal
curl -X GET "https://app.usenotix.dev/api/v1/sms/<id>" \
  -H "Authorization: Bearer $NOTIX_API_KEY"

Responses

200The message with its delivery status and reason.
200 response fields
FieldTypeAbout
idrequiredstring
torequiredstring

Masked to the last four digits.

statusrequiredstring

One of queued, sent, delivered, failed, rejected.

segmentsrequiredinteger
chargerequiredobject
charge.currencyrequiredstring

One of USD, NGN, KES.

charge.amountrequiredstring

Decimal string in the team's wallet currency.

reasonrequiredobject

Set when the status is failed or rejected. Plain language, never a provider code.

Can be null.

reason.coderequiredstring
reason.messagerequiredstring
createdAtrequiredstring
updatedAtrequiredstring
404No message with this id belongs to the team.