Introduction
This documentation aims to provide all the information you need to work with our API. As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile). You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).
Getting Started
All API endpoints require authentication using Bearer tokens.
Obtaining API Token
- Register at https://tikosms.com/register
- Login to your account
- Navigate to your profile at https://tikosms.com/profile
- Generate your API token in the API section
Using API Token
Include your token in every request header:
Authorization: Bearer YOUR_API_TOKEN_HERE
Content-Type: application/json
Webhooks (Callbacks)
TikoSMS can send delivery reports to your server via HTTP POST requests.
Setting up callbacks:
- Include
callback_urlparameter in your SMS request - Ensure your endpoint accepts POST requests
- Return HTTP 200 status to acknowledge receipt
Callback types:
create- Initial callback when SMS is accepted (status: SENT)update- Final callback with delivery status (status: DELIVRD, UNDELIV, etc.)
Callback security:
- All callbacks include a timestamp for verification
- Callbacks are sent from TikoSMS servers with User-Agent:
TikoSMS-Callback/1.0 - Implement proper validation on your endpoint
Example "create" callback (SMS accepted):
{
"create": {
"message_id": "6fcfcd12-8ea5-4e45-b1b7-66e3f5e67600",
"from": "MySender",
"to": "380501234567",
"status": "SENT",
"sent_at": "2025-08-06 15:32:18"
"callback_url": "https://yoursite.com/callback",
"client_ref": "order-123",
"mccmnc": "255001",
"cost": 0.045,
"part": 1,
"total_parts": 1,
}
}
Example "update" callback (final status):
{
"update": {
"message_id": "6fcfcd12-8ea5-4e45-b1b7-66e3f5e67600",
"from": "MySender",
"to": "380501234567",
"status": "DELIVRD",
"delivered_at": "2025-08-06 15:33:45",
"callback_url": "https://yoursite.com/callback",
"client_ref": "order-123",
"mccmnc": "255001",
"cost": 0.045,
"part": 1,
"total_parts": 1,
"timestamp": "2025-08-06T15:33:45.123"
}
}
### SMS Status Values
All SMS operations use these standard status codes:
- `SENT` - Message accepted for delivery
- `DELIVRD` - Successfully delivered to handset
- `UNDELIV` - Failed to deliver
- `EXPIRED` - Message expired before delivery
- `REJECTD` - Rejected by carrier
- `UNKNOWN` - Status unknown
### Example Request
```bash
curl -X POST https://api.tikosms.com/api/v1/message \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"from": "MySender",
"to": "380501234567",
"message": "Your OTP is 1234",
"callback_url": "https://yoursite.com/sms-callback"
}'
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer {YOUR_TOKEN}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can retrieve your token in your profile settings.
Balance
Get current user's SMS balance
Requires authentication via Bearer token.
Headers
curl --request GET \
--get "https://api.tikosms.com/v1/balance" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"balance_updated": "2025.07.03 13:34:34",
"currency_code": "EUR",
"balance": 634.9288,
"in_credit_limit": 1000
}
SMS API
POST v1/messages
Headers
Body Parameters
curl --request POST \
"https://api.tikosms.com/v1/messages" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"from\": \"MyBrand\",
\"message\": \"Big sale today!\",
\"recipients\": [
{
\"to\": \"380501234567\",
\"client_ref\": \"order-1\"
}
],
\"callback_url\": \"https:\\/\\/example.com\\/callback\",
\"scheduled_at\": \"2025-08-12 10:00:00\",
\"concurrency\": 20
}"
SMS Rates
GET v1/sms-rates
Headers
Query Parameters
MCCMNC code (e.g. 255001 or 255).
Country name.
curl --request GET \
--get "https://api.tikosms.com/v1/sms-rates?mccmnc=255001&country=Ukraine" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"rate": {
"mcc": "255",
"mnc": "001",
"mccmnc": "255001",
"country": "Ukraine",
"rate": "0.045000",
"rate_start_date": "2025-08-01 00:00:00",
"rate_end_date": "2100-01-01 00:00:00"
}
}
Number Lookup (HLR)
Find out where a mobile number is right now: the network that serves it, whether it was ported away from the network it was issued by, and whether the network confirms the subscriber is active.
How it works
- Optionally price your list with
POST /v1/lookups/quote. It is free and holds nothing. - Submit the list with
POST /v1/lookups. The quoted amount is held on your balance. - Poll
GET /v1/lookups/{id}untilstatusiscompleted. - Fetch the answers with
GET /v1/lookups/{id}/results.
What you pay. Each number is charged at its actual price when its result arrives. The held amount is an upper bound: whatever is not used goes back to your balance when the batch completes. Numbers that cannot be looked up (an invalid number, an unsupported destination) are not charged.
Price a list
Returns the price of a list and what your balance allows, without submitting anything. Nothing is held or charged.
The total is an upper bound (ceiling: true): the actual charge per
number is known only once its result arrives, and is often lower.
Headers
Body Parameters
Response Fields
curl --request POST \
"https://api.tikosms.com/v1/lookups/quote" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"numbers\": [
\"37253004550\",
\"37253004551\"
]
}"
{
"numbers": 2,
"balance": {
"account": 100,
"held": 0,
"pending_charges": 0,
"available": 100,
"currency": "EUR"
},
"methods": {
"auto": {
"method": "auto",
"numbers": 2,
"total": 0.09,
"currency": "EUR",
"ceiling": true,
"breakdown": [
{
"country_code": "372",
"count": 2,
"unit_price": 0.045,
"subtotal": 0.09
}
],
"unknown_country": 0,
"unpriced": 0,
"affordable": true,
"shortfall": 0
}
}
}
Submit numbers for lookup
Holds the quoted amount on your balance and starts the lookup. Returns
202 straight away; results arrive over the next minutes.
A list longer than 10,000 numbers is split into several batches, each
with its own id. Send an Idempotency-Key header to make a retry safe:
the same key returns the batches the first request created instead of
starting — and paying for — the lookup again.
Headers
Body Parameters
curl --request POST \
"https://api.tikosms.com/v1/lookups" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Idempotency-Key: A unique value per list, e.g. a UUID. Example: 2f6b1c9e-8a43-4d2e-9b71-0c5d3e8f4a12" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"numbers\": [
\"37253004550\",
\"37253004551\"
],
\"method\": \"auto\"
}"
{
"estimated_total": 0.09,
"currency": "EUR",
"batches": [
{
"id": "9c1f6a52-3e2b-4b8e-a1d4-5f0c2e7b9a10",
"method": "auto",
"status": "submitted",
"numbers": 2,
"completed": 0,
"failed": 0,
"skipped": 0,
"estimated_total": 0.09,
"charged_total": 0,
"currency": "EUR",
"created_at": "2026-10-07T10:15:00+00:00",
"completed_at": null
}
]
}
Get batch progress
Poll this until status is completed. Do not wait for completed to
equal numbers: a network may never answer for some numbers, and the
batch completes without them.
Headers
URL Parameters
The batch id from the submit response.
Response Fields
curl --request GET \
--get "https://api.tikosms.com/v1/lookups/9c1f6a52-3e2b-4b8e-a1d4-5f0c2e7b9a10" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"id": "9c1f6a52-3e2b-4b8e-a1d4-5f0c2e7b9a10",
"method": "auto",
"status": "running",
"numbers": 2,
"completed": 1,
"failed": 0,
"skipped": 0,
"estimated_total": 0.09,
"charged_total": 0.0023,
"currency": "EUR",
"created_at": "2026-10-07T10:15:00+00:00",
"completed_at": null
}
Get batch results
One row per number, available while the batch is running and after it completes.
Read answer before trusting the network fields. live means a network
was queried and the fields describe where the number is now. prefix
means no network answered: the fields describe the range the number was
issued in, which is exactly what a ported number gets wrong.
Headers
URL Parameters
The batch id.
Query Parameters
Only rows with this status: ok, failed or skipped.
Only live or only prefix answers.
1 for ported numbers only, 0 for numbers known not to be ported.
1 for numbers the network confirmed active.
Page number.
Rows per page, up to 1000. Default: 500.
Response Fields
curl --request GET \
--get "https://api.tikosms.com/v1/lookups/9c1f6a52-3e2b-4b8e-a1d4-5f0c2e7b9a10/results?status=ok&answer=live&ported=1&present=1&page=1&per_page=500" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"batch_id": "9c1f6a52-3e2b-4b8e-a1d4-5f0c2e7b9a10",
"data": [
{
"number": "37253004550",
"status": "ok",
"answer": "live",
"network": "Elisa Eesti",
"country": "Estonia",
"mcc_mnc": "248002",
"original_network": "Telia Eesti",
"original_mcc_mnc": "248001",
"ported": true,
"present": true,
"mnc_ambiguous": false,
"imsi": "248021234567890",
"msc": "37256000001",
"error": null,
"skip_reason": null,
"price": 0.0023,
"checked_at": "2026-10-07T10:15:42+00:00"
}
],
"page": 1,
"per_page": 500,
"total": 1,
"total_pages": 1
}
List batches
Your batches, newest first.
Headers
Query Parameters
Page number.
Batches per page, up to 100. Default: 25.
curl --request GET \
--get "https://api.tikosms.com/v1/lookups?page=1&per_page=25" \
--header "Authorization: Bearer {YOUR_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"id": "9c1f6a52-3e2b-4b8e-a1d4-5f0c2e7b9a10",
"method": "auto",
"status": "completed",
"numbers": 2,
"completed": 2,
"failed": 0,
"skipped": 0,
"estimated_total": 0.09,
"charged_total": 0.0046,
"currency": "EUR",
"created_at": "2026-10-07T10:15:00+00:00",
"completed_at": "2026-10-07T10:16:12+00:00"
}
],
"page": 1,
"per_page": 25,
"total": 1,
"total_pages": 1
}