API documentation
Two versions are available: v2 is the industry standard (your existing scripts work unchanged), v3 is modern REST (JSON, idempotency, cursor pagination, 5 languages).
URLs
Click a URL to copy it.
https://smmbilan.uz/api/v2
Authentication: the `key` field in the body
https://smmbilan.uz/api/v3
Authentication: `Authorization: Bearer <key>`
Rate limit: 600 requests per minute per key. Idempotency keys are kept for 24 hours.
Quick start
Four steps — a few minutes to your first request.
- Sign up and log in to the panel.
- Create a new key in the "API keys" section. The key is shown ONCE — save it immediately.
- Request the catalogue and take the service ID you need.
- Send the order. Track its status by polling or via webhook.
curl https://smmbilan.uz/api/v3/services \
-H "Authorization: Bearer <KALITINGIZ>"
v2 — the industry standard
POST is recommended. Legacy GET/query is accepted for compatibility but deprecated. A business error comes back with HTTP 200 and `{"error":"..."}` — that is part of the standard and existing scripts rely on it.
curl -X POST https://smmbilan.uz/api/v2 \
-d "key=<KALITINGIZ>" \
-d "action=add" \
-d "service=<XIZMAT_ID>" \
-d "link=https://t.me/kanalim" \
-d "quantity=1000"
# Javob: {"order": 100123}
POST
action=balance
—
200
Account balance. Resellers usually call this before every order.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=balance'
{
"balance": "125.4000",
"currency": "USD"
}
POST
action=services
—
200
The entire catalogue. There is NO pagination, so the response is large — cache it.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=services'
[
{
"service": "<XIZMAT_ID>",
"name": "Telegram kanal a'zolari",
"type": "Default",
"category": "Telegram",
"rate": "1.20000000",
"min": "100",
"max": "100000",
"refill": true,
"cancel": true,
"dripfeed": true
}
]
POST
action=add
service, link, quantity
200
Place an order. The `order` value in the response is the number used in later requests.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=add' \
-d 'service=<XIZMAT_ID>' \
-d 'link=https://t.me/kanalim' \
-d 'quantity=100'
{
"order": 100123,
"charge": "1.2000",
"currency": "USD"
}
POST
action=status
order
200
Status of a single order. All values are STRINGS, including `remains`.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=status' \
-d 'order=100123'
{
"charge": "1.2000",
"start_count": "3572",
"status": "In progress",
"remains": "157",
"currency": "USD"
}
POST
action=status
orders
200
Bulk status: up to 100 per request. The keys are the IDs you REQUESTED.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=status' \
-d 'orders=100123,100124'
{
"100123": {
"charge": "1.2000",
"start_count": "3572",
"status": "Completed",
"remains": "0",
"currency": "USD"
},
"100124": {
"error": "Incorrect order ID"
}
}
POST
action=refill
order
200
Request a refill. Track its state via `refill_status` using the ID from the response.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=refill' \
-d 'order=100123'
{
"refill": 5
}
POST
action=refill_status
refill
200
Refill status. The `Error` state also appears as `Pending` — retries are still running.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=refill_status' \
-d 'refill=5'
{
"status": "Completed"
}
POST
action=cancel
orders
200
A cancellation REQUEST. `cancel: 1` means the request was accepted, NOT that the order was cancelled.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=cancel' \
-d 'orders=100123,100124'
[
{
"order": 100123,
"cancel": 1
},
{
"order": 100124,
"cancel": {
"error": "Incorrect order status"
}
}
]
POST
action=special_services
—
200
Special services catalog: Telegram numbers, Stars, Premium. The price is for ONE unit, while `rate` in `services` is per 1000.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=special_services'
[
{
"variant": "12",
"kind": "number",
"slug": "UZ",
"name": "O'zbekiston",
"price": "1.2000",
"currency": "USD",
"dial_code": "+998",
"stock": "35",
"stars": null,
"months": null,
"recipient": false,
"max_quantity": "10"
}
]
POST
action=special_add
kind, variant, quantity, recipient
200
Special order. `kind` and `variant` are required; Stars and Premium also need `recipient`. Watch the `status` in the response: Stars and Premium may wait for funds.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=special_add' \
-d 'kind=stars' \
-d 'variant=31' \
-d 'recipient=@mijoz_nomi'
{
"order": 900123,
"charge": "0.9900",
"currency": "USD",
"status": "Pending"
}
POST
action=special_status
order (yoki orders)
200
A single special order — WITH the SMS code and 2FA password. In the bulk form (`orders=`) those fields are `null`.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=special_status' \
-d 'order=900123'
{
"charge": "1.2000",
"status": "Completed",
"currency": "USD",
"kind": "number",
"variant": "O'zbekiston",
"quantity": "1",
"recipient": null,
"phone_number": "+998901234567",
"refunded": "0.0000",
"sms_code": "84921",
"two_fa_password": null,
"has_code": true
}
POST
action=special_code
order
200
SMS code for a purchased number. Call it ONLY AFTER your customer has entered the number into Telegram — the code expires within minutes.
curl -X POST https://smmbilan.uz/api/v2 \
-d 'key=<KALITINGIZ>' \
-d 'action=special_code' \
-d 'order=900123'
{
"sms_code": "84921",
"two_fa_password": null,
"phone_number": "+998901234567",
"attempts_left": "4"
}
{
"error": "Not enough funds"
}
v3 — REST
Real HTTP codes, structured error responses, an `X-Request-Id` header and error messages in 5 languages (`Accept-Language`).
curl -X POST https://smmbilan.uz/api/v3/orders \
-H "Authorization: Bearer <KALITINGIZ>" \
-H "Idempotency-Key: 3f9c1e40-…" \
-H "Content-Type: application/json" \
-d '{"service_id": <XIZMAT_ID>, "link": "https://t.me/kanalim", "quantity": 1000}'
{
"error": {
"code": "insufficient_balance",
"message": "Balansingizda yetarli mablag' yo'q.",
"details": {
"required": "1.2000",
"available": "0.3000"
}
},
"request_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB"
}
Endpoints
GET
/api/v3/me
—
200
Key and account information. Called ONCE while setting up the integration.
curl -X GET 'https://smmbilan.uz/api/v3/me' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"user": {
"username": "reseller1",
"balance": "125.4000",
"currency": "USD",
"status": "active",
"discount_percent": "5.00"
},
"api_key": {
"name": "Ishlab chiqarish",
"prefix": "smb_live_a1b2c3",
"version": "v3",
"sandbox": false,
"scopes": [
"balance:read",
"services:read",
"orders:read",
"orders:write"
],
"rate_limit_per_minute": 600,
"expires_at": null
},
"capabilities": {
"idempotency": true,
"webhooks": true,
"localization": true
}
}
}
GET
/api/v3/balance
balance:read
200
A lightweight endpoint: one query, no relations loaded.
curl -X GET 'https://smmbilan.uz/api/v3/balance' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"balance": "125.4000",
"currency": "USD",
"total_spent": "874.2000",
"total_deposited": "1000.0000"
}
}
GET
/api/v3/services
services:read
200
Catalogue with a cursor. Pass `next_cursor` as `after=` in the next request.
curl -X GET 'https://smmbilan.uz/api/v3/services?limit=100&after=0' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": [
{
"id": "<XIZMAT_ID>",
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"name": "Telegram kanal a'zolari",
"description": null,
"type": "default",
"category": {
"id": 3,
"name": "Telegram"
},
"pricing": {
"rate_per_1000": "1.20000000",
"currency": "USD",
"discount_percent": "5.00"
},
"quantity": {
"min": 100,
"max": 100000,
"increment": 1,
"from_input": false,
"fixed": false
},
"features": {
"refill": true,
"refill_days": 30,
"cancel": true,
"dripfeed": true
},
"link_type": "link",
"required_fields": [],
"avg_time_seconds": 3600
}
],
"pagination": {
"limit": 100,
"has_more": true,
"next_cursor": 148
}
}
GET
/api/v3/services/{id}
services:read
200
A single service. Accepts either `id` or `public_id` (ULID).
curl -X GET 'https://smmbilan.uz/api/v3/services/<XIZMAT_ID>' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"id": "<XIZMAT_ID>",
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"name": "Telegram kanal a'zolari",
"description": null,
"type": "default",
"category": {
"id": 3,
"name": "Telegram"
},
"pricing": {
"rate_per_1000": "1.20000000",
"currency": "USD",
"discount_percent": "5.00"
},
"quantity": {
"min": 100,
"max": 100000,
"increment": 1,
"from_input": false,
"fixed": false
},
"features": {
"refill": true,
"refill_days": 30,
"cancel": true,
"dripfeed": true
},
"link_type": "link",
"required_fields": [],
"avg_time_seconds": 3600
}
}
POST
/api/v3/orders
orders:write
201
Place an order. The `Idempotency-Key` header is REQUIRED.
curl -X POST 'https://smmbilan.uz/api/v3/orders' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json' \
-H 'Idempotency-Key: 8f14e45fceea167a5a36dedd4bea2543' \
-H 'Content-Type: application/json' \
-d '{"service_id":"<XIZMAT_ID>","link":"https://t.me/kanalim","quantity":100}'
{
"data": {
"id": 100123,
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"service": {
"id": "<XIZMAT_ID>",
"name": "Telegram kanal a'zolari",
"type": "default"
},
"link": "https://t.me/kanalim",
"quantity": 100,
"status": "pending",
"charge": "1.2000",
"currency": "USD",
"start_count": null,
"remains": null,
"delivered": 0,
"progress_percent": 0,
"refunded": "0.0000",
"dripfeed": null,
"refill_available": false,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": null
}
}
GET
/api/v3/orders
orders:read
200
Orders with a REVERSE cursor (`before=`) — newest first. System-generated child orders are excluded.
curl -X GET 'https://smmbilan.uz/api/v3/orders?limit=50' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": [
{
"id": 100123,
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"service": {
"id": "<XIZMAT_ID>",
"name": "Telegram kanal a'zolari",
"type": "default"
},
"link": "https://t.me/kanalim",
"quantity": 100,
"status": "pending",
"charge": "1.2000",
"currency": "USD",
"start_count": null,
"remains": null,
"delivered": 0,
"progress_percent": 0,
"refunded": "0.0000",
"dripfeed": null,
"refill_available": false,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": null
}
],
"pagination": {
"limit": 50,
"has_more": false,
"next_cursor": null
}
}
GET
/api/v3/orders/{id}
orders:read
200
A single order. Accepts either `number` or `public_id`.
curl -X GET 'https://smmbilan.uz/api/v3/orders/100123' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"id": 100123,
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"service": {
"id": "<XIZMAT_ID>",
"name": "Telegram kanal a'zolari",
"type": "default"
},
"link": "https://t.me/kanalim",
"quantity": 100,
"status": "pending",
"charge": "1.2000",
"currency": "USD",
"start_count": null,
"remains": null,
"delivered": 0,
"progress_percent": 0,
"refunded": "0.0000",
"dripfeed": null,
"refill_available": false,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": null
}
}
POST
/api/v3/orders/{id}/refill
orders:write
202
Request a refill. 202 means accepted, not yet finished.
curl -X POST 'https://smmbilan.uz/api/v3/orders/100123/refill' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"id": 5,
"order_id": 100123,
"status": "pending",
"quantity": null,
"charge": "0.0000",
"is_paid": false,
"reason": null,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": null
}
}
POST
/api/v3/orders/{id}/cancel
orders:write
202
A cancellation request. The response also includes the order's UPDATED state.
curl -X POST 'https://smmbilan.uz/api/v3/orders/100123/cancel' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"accepted": true,
"approval_status": "pending",
"order": {
"id": 100123,
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"service": {
"id": "<XIZMAT_ID>",
"name": "Telegram kanal a'zolari",
"type": "default"
},
"link": "https://t.me/kanalim",
"quantity": 100,
"status": "pending",
"charge": "1.2000",
"currency": "USD",
"start_count": null,
"remains": null,
"delivered": 0,
"progress_percent": 0,
"refunded": "0.0000",
"dripfeed": null,
"refill_available": false,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": null
}
}
}
GET
/api/v3/refills/{id}
orders:read
200
Refill status.
curl -X GET 'https://smmbilan.uz/api/v3/refills/5' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"id": 5,
"order_id": 100123,
"status": "pending",
"quantity": null,
"charge": "0.0000",
"is_paid": false,
"reason": null,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": null
}
}
GET
/api/v3/special/services
services:read
200
Special services catalog. NO pagination — there are only three sections. `price` is for ONE unit.
curl -X GET 'https://smmbilan.uz/api/v3/special/services' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": [
{
"kind": "stars",
"label": "Telegram Stars",
"description": "Telegram Stars paketlari",
"accepting_orders": true,
"freeze_reason": null,
"requires_recipient": true,
"supports_quantity": false,
"max_quantity": 1,
"delivers_sms_code": false,
"variants": [
{
"id": 31,
"slug": "50",
"label": "50 Stars",
"price": "0.9900",
"currency": "USD",
"dial_code": null,
"stock": null,
"stars": 50,
"months": null
}
]
}
]
}
POST
/api/v3/special/orders
orders:write
201
Special order. `Idempotency-Key` is REQUIRED. `recipient` is mandatory for Stars and Premium.
curl -X POST 'https://smmbilan.uz/api/v3/special/orders' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json' \
-H 'Idempotency-Key: 8f14e45fceea167a5a36dedd4bea2543' \
-H 'Content-Type: application/json' \
-d '{"kind":"stars","variant_id":31,"recipient":"mijoz_nomi"}'
{
"data": {
"id": 900123,
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"kind": "stars",
"variant": {
"id": 31,
"label": "50 Stars",
"country_code": null,
"dial_code": null,
"stars": 50,
"months": null
},
"recipient": "mijoz_nomi",
"quantity": 1,
"status": "pending",
"charge": "0.9900",
"currency": "USD",
"refunded": "0.0000",
"delivery": {
"phone_number": null,
"sms_code": null,
"two_fa_password": null,
"has_code": false
},
"code_available": false,
"code_attempts_left": 0,
"waiting_for_funds": false,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": null
}
}
GET
/api/v3/special/orders
orders:read
200
Special orders, the cursor goes BACKWARDS (`before=`). In the LIST the SMS code and 2FA password are ALWAYS `null` — check `has_code` and fetch the order individually.
curl -X GET 'https://smmbilan.uz/api/v3/special/orders?limit=50' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": [
{
"id": 900123,
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"kind": "stars",
"variant": {
"id": 31,
"label": "50 Stars",
"country_code": null,
"dial_code": null,
"stars": 50,
"months": null
},
"recipient": "mijoz_nomi",
"quantity": 1,
"status": "pending",
"charge": "0.9900",
"currency": "USD",
"refunded": "0.0000",
"delivery": {
"phone_number": null,
"sms_code": null,
"two_fa_password": null,
"has_code": false
},
"code_available": false,
"code_attempts_left": 0,
"waiting_for_funds": false,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": null
}
],
"pagination": {
"limit": 50,
"has_more": false,
"next_cursor": null
}
}
GET
/api/v3/special/orders/{id}
orders:read
200
A single special order — WITH the credentials. Accepts `number` (from 900000) or `public_id`.
curl -X GET 'https://smmbilan.uz/api/v3/special/orders/900123' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"id": 900123,
"public_id": "01K3XZQ8V4N7Y2M9P6R1T5W0AB",
"kind": "number",
"variant": {
"id": 12,
"label": "O'zbekiston",
"country_code": "UZ",
"dial_code": "+998",
"stars": null,
"months": null
},
"recipient": null,
"quantity": 1,
"status": "completed",
"charge": "1.2000",
"currency": "USD",
"refunded": "0.0000",
"delivery": {
"phone_number": "+998901234567",
"sms_code": "84921",
"two_fa_password": null,
"has_code": true
},
"code_available": true,
"code_attempts_left": 4,
"waiting_for_funds": false,
"created_at": "2026-08-31T09:14:02+00:00",
"completed_at": "2026-08-31T09:15:40+00:00"
}
}
POST
/api/v3/special/orders/{id}/code
orders:write
200
SMS code for a number. Every call spends an attempt — even a failed one. `Idempotency-Key` is NOT accepted here: the response carries account credentials.
curl -X POST 'https://smmbilan.uz/api/v3/special/orders/900123/code' \
-H 'Authorization: Bearer <KALITINGIZ>' \
-H 'Accept: application/json'
{
"data": {
"phone_number": "+998901234567",
"sms_code": "84921",
"two_fa_password": null,
"attempts_left": 4
}
}
OpenAPI 3.1 spec: /api/v3/openapi.json — opens without a key. Import it into Postman or Insomnia, or generate a client library with a code generator.
Order statuses
| v3 | v2 | Note |
|---|---|---|
| pending | Pending | Pending |
| awaiting | Pending | Awaiting |
| in_progress | In progress | In progress |
| processing | Processing | Processing |
| completed | Completed | Completed |
| partial | Partial | Partial |
| canceled | Canceled | Canceled |
| refunded | Canceled | Refunded |
| failed | Canceled | Failed |
Note: v2 has NO separate `refunded` or `failed` states — both appear as `Canceled`.
Service types and required fields
| v3 | v2 | Additional fields | Quantity |
|---|---|---|---|
| default | Default | — | you send |
| package | Package | — | fixed (min = max) |
| custom_comments | Custom Comments | comments | counted from sign-in |
| custom_comments_package | Custom Comments Package | comments | fixed (min = max) |
| mentions | Mentions | usernames | counted from sign-in |
| mentions_hashtags | Mentions with Hashtags | hashtags | you send |
| mentions_custom | Mentions Custom List | usernames | counted from sign-in |
| mentions_followers | Mentions User Followers | username | you send |
| mentions_likers | Mentions Likers | username | you send |
| mentions_media_likers | Mentions Media Likers | media_url | you send |
| subscriptions | Subscriptions | username | you send |
| poll | Poll | answer_number | you send |
| invites | Invites | groups | you send |
| comment_likes | Comment Likes | username | you send |
v3 error codes
| Code | HTTP | What happened |
|---|---|---|
| invalid_api_key | 401 | The key is invalid, expired or revoked. |
| wrong_api_version | 401 | Calling v3 with a v2 key (or the other way round). |
| account_blocked | 403 | The account is suspended or blocked. |
| api_disabled_for_account | 403 | The API is disabled on this account — please write to support. |
| insufficient_scope | 403 | The key lacks the required permission. See `details.required_scope`. |
| not_found | 404 | The record was not found or does not belong to you. |
| idempotency_key_required | 422 | The `Idempotency-Key` header was not sent. It is REQUIRED when placing orders. |
| idempotency_in_progress | 409 | A request with the same key is still being processed. Please retry in 1-2 seconds. |
| idempotency_key_reused | 409 | The same key was sent with a different operation, route parameter or payload. Generate a new key for every action. |
| validation_failed | 422 | The request fields are invalid. |
| order_rejected | 422 | The order was rejected. `details.reason` gives the reason. |
| refill_rejected | 422 | The guarantee request was rejected. `details.reason` gives the reason. |
| insufficient_balance | 402 | Insufficient balance. `details` holds the required and available amounts. |
| rate_limited | 429 | Rate limit exceeded. Wait for the period in the `Retry-After` header. |
| api_version_disabled | 503 | The API is temporarily disabled. Please try again. |
| sandbox_read_only | 403 | A test key cannot modify data. |
Get your key today
Signing up is free. Once the key is created, the panel shows a ready-made example with YOUR service IDs and prices.
smmbilan.uz