Skip to main content

Get Campaign Stats

Retrieve delivery, click and conversion stats for an SMS campaign.

Totals are lifetime. Unique counts can lag event counts by up to 15 minutes. Before the campaign is sent, counts are 0 and rates are null.

Endpoint​

GET /sms/campaigns/:id/stats

Returns: 200 OK

Headers​

HeaderValueRequired
AuthorizationBearer <your-api-key>Yes

Path Parameters​

ParameterTypeRequiredDescription
idstringYesThe campaign ID.

Response​

{
"object": "sms_campaign_stats",
"campaign_id": "0192a1b2-c3d4-7e5f-9000-abcdef123456",
"recipients": 5200,
"sent": 5180,
"delivered": 4960,
"undelivered": 110,
"failed": 4,
"blocked": 6,
"rejected": 3,
"expired": 21,
"unknown": 9,
"pending": 71,
"clicks": 402,
"unique_clicks": 371,
"bot_clicks": 58,
"delivery_rate": 0.9575,
"click_rate": 0.0748,
"smart_sending": { "enabled": false, "skipped": 0 },
"conversions": {
"enabled": true,
"tracking_since": "2026-09-01T00:00:00.000Z",
"total": 42,
"revenue": [{ "currency": "SAR", "amount": 18350 }],
"by_event": [
{
"event_id": "0192a1b2-eeee-7fff-8000-111111111111",
"event_name": "order_completed",
"tracks_revenue": true,
"conversions": 42,
"revenue": [{ "currency": "SAR", "amount": 18350 }]
}
]
}
}

Response fields​

FieldTypeDescription
recipientsnumberContacts sent to. Before sending, the current audience size.
sentnumberAccepted by the SMS provider
deliverednumberConfirmed delivered to the handset
undeliverednumberDelivery failed (phone off, invalid number, do-not-disturb)
failednumberNever accepted by the SMS provider
blockednumberBlocked by the carrier or a regulatory filter
rejectednumberRejected before a delivery attempt
expirednumberDelivery window expired
unknownnumberReceipts with a status the provider did not name
pendingnumberAccepted, no final receipt yet
clicksnumberTotal clicks, link scanners excluded
unique_clicksnumberContacts who clicked
bot_clicksnumberLink-scanner clicks. Not counted in clicks.
delivery_ratenumber | nulldelivered / sent
click_ratenumber | nullunique_clicks / delivered
smart_sending.enabledbooleanSmart Sending was on when the campaign was sent
smart_sending.skippednumberRecipients skipped because they had reached the sending cap
conversions.enabledbooleanfalse when the organization has no conversion events
conversions.tracking_sincestring | nullWhen the first conversion event was enabled (ISO 8601)
conversions.totalnumberConversions attributed to the campaign
conversions.revenuearrayAttributed revenue as { currency, amount }, one entry per currency
conversions.by_eventarrayThe same breakdown per conversion event

Rates are fractions from 0 to 1, rounded to four decimals, and null when the denominator is 0.


Examples​

curl "https://api.arsel.sa/v1/sms/campaigns/0192a1b2-c3d4-7e5f-9000-abcdef123456/stats" \
-H "Authorization: Bearer $ARSEL_API_KEY"

Error Responses​

{
"status_code": 404,
"name": "not_found",
"message": "Campaign not found or access denied"
}