The order is queued and has not started yet.
SMMWave API reference
Use one endpoint to load services, place orders, check delivery, and cancel work that is still in progress.
https://smm.lat/api/v2
Your first request
Read the parameterscurl https://smm.lat/api/v2 \
-X POST \
-d "key=YOUR_API_KEY" \
-d "action=services"Examples only. No requests are sent from this page.
- Transport
- HTTPS
- Request
- POST preferred
- Response format
- JSON
Official links
Use the links below for announcements, order access, and account support.
Authentication
Every request needs your API key. Send it in the key field, the X-Api-Key header, or as a Bearer token.
Do not place it in browser code, screenshots, public repositories, or support messages.
curl https://your-domain.example/api/v2 \
--request POST \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "action=balance"
Request format
Send requests to the same endpoint and select an operation with the action parameter. Form-encoded POST is recommended because it works across older PHP panels as well as modern clients. JSON bodies and GET query parameters are accepted too.
| Field | Type | Description |
|---|---|---|
key | string | Your API key |
action | string | The operation to run |
Business errors are returned as JSON with HTTP 200 for compatibility with panel adapters. Always inspect the response body for an error field.
List services
action=servicesReturns every active service available to the provider account. Numeric values use strings so they can be consumed safely by older panel software.
Parameters
| Field | Required | Description |
|---|---|---|
key | required | API key |
action | required | Set to services |
Service fields
serviceNumeric service IDratePrice per 1,000 unitsmin/maxAccepted quantity rangecancel1when cancellation is availablerefill0; public refill is not supported
Response
[
{
"service": "1000",
"name": "Telegram Channel Members",
"type": "Default",
"category": "Telegram",
"rate": "4.250000",
"min": "10",
"max": "10000",
"refill": "0",
"cancel": "1",
"dripfeed": "0",
"desc": "Channel members"
}
]Check balance
action=balanceReturns the provider balance with six decimal places and its configured currency.
Parameters
| Field | Required | Description |
|---|---|---|
key | required | API key |
action | required | Set to balance |
Response
{
"balance": "125.500000",
"currency": "USD"
}Add an order
action=addCreates a new order and returns a numeric order ID. Save this value: it is used for status checks and cancellation.
Parameters
| Field | Required | Description |
|---|---|---|
key | required | API key |
action | required | Set to add |
service | required | Service ID from the service list |
link | required | Public username, URL, or invite link |
quantity | required | Whole number within the service limits |
idempotency_key | optional | Prevents an accidental duplicate submission |
Request
curl https://your-domain.example/api/v2 \
-X POST \
-d "key=YOUR_API_KEY" \
-d "action=add" \
-d "service=1000" \
--data-urlencode "link=https://t.me/example" \
-d "quantity=500"{ "order": 891518433422477 }Bulk orders
action=add_bulkCreate up to 100 orders in one request. Each row is validated and charged independently. A rejected row leaves the other accepted orders in place.
Batch parameters
| Field | Required | Description |
|---|---|---|
key | required | Your API key. Bearer authentication is also accepted. |
action | required | Set to add_bulk at the base endpoint. |
orders | one of | An array of 1–100 order objects. In form requests, send the array as a JSON string. |
links | one of | URLs as an array or one per line, with a shared service and quantity. |
lines | one of | One service|link|quantity row per line, or an array of order objects. |
idempotency_key | optional | A batch replay key, up to 128 characters. The Idempotency-Key header is an alternative. |
Each order object
Supply service, link and quantity, using the same limits as a single order. An optional idempotency_key on a row lets you retry that order independently.
Use exactly one input: orders, links or lines. An empty, oversized or ambiguous batch is rejected before any order is created.
Request
curl https://smm.lat/api/v2 \
-X POST \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: batch-example-01' \
-d '{
"key": "YOUR_API_KEY",
"action": "add_bulk",
"orders": [
{"service": 1000, "link": "https://t.me/example_a", "quantity": 500},
{"service": 1000, "link": "https://t.me/example_b", "quantity": 0}
]
}'Response
{
"data": [
{"index": 0, "order": 891518433422477},
{"index": 1, "error": "Incorrect quantity"}
],
"count": 2,
"succeeded": 1,
"failed": 1
}Results retain input order; index starts at zero. succeeded counts accepted orders. Check each returned order ID for delivery progress.
One service, multiple links
Choose this input when all links use the same service and quantity. Each link receives its own order ID and result.
{
"key": "YOUR_API_KEY",
"action": "add_bulk",
"idempotency_key": "links-example-01",
"service": 1000,
"quantity": 500,
"links": ["https://t.me/example_a", "https://t.me/example_b"]
}Text rows
Send one order per line in lines. URL-encode the field so private invite links keep their + character.
curl https://smm.lat/api/v2 \
-X POST \
-d 'key=YOUR_API_KEY' \
-d 'action=add_bulk' \
-H 'Idempotency-Key: lines-example-01' \
--data-urlencode 'lines=1000|https://t.me/example_a|500
1000|https://t.me/+Abcd_1234|250'Endpoint shortcuts
You can also POST the same body to either URL below. Both use the same authentication, limits and response. The action field is optional on these paths.
https://smm.lat/api/v2/orders/batchhttps://smm.lat/api/v2/orders/bulk
Retry safely
Send a unique batch key before your first attempt. Repeating the same key with the same rows returns the existing orders without a second charge. Changing the rows, their order or the batch size with that key returns an error.
A row key takes precedence over its generated batch key. Keep row keys attached to the same orders when moving them between batches. Without replay keys, resubmitting can create new orders and charges.
Rows may be processed concurrently. If your balance covers only part of a batch, some rows can be accepted and the rest return Not enough funds. After a connection timeout, retry the same payload with its original keys.
After an explicit rejection, fix the problem and resubmit only the rejected rows with new keys. Keep the order IDs from accepted rows.
Order status
action=statusReturns the current delivery state for one order. The remaining quantity is calculated from the latest recorded progress.
Parameters
| Field | Required | Description |
|---|---|---|
key | required | API key |
action | required | Set to status |
order | required | Numeric order ID |
Response
{
"charge": "2.125000",
"start_count": "521",
"status": "In progress",
"remains": "250",
"currency": "USD"
}Multiple order status
action=statusChecks up to 100 orders in one request. Supply comma-separated IDs or a JSON array in orders. Each response entry is keyed by the requested order ID.
The action names multistatus and orders are aliases for this batch status check. Requests over 100 IDs are rejected as a whole.
Parameters
| Field | Required | Description |
|---|---|---|
key | required | API key |
action | required | Set to status |
orders | required | Up to 100 IDs, separated by commas or supplied as a JSON array |
Response
{
"891518433422477": {
"charge": "4.250000",
"start_count": "521",
"status": "Completed",
"remains": "0",
"currency": "USD"
},
"999999": {
"error": "Incorrect order ID"
}
}Cancel orders
action=cancelRequests cancellation for one or more pending or running orders. The response is always an array, including single-order requests.
Parameters
| Field | Required | Description |
|---|---|---|
key | required | API key |
action | required | Set to cancel |
order | one of | A single order ID |
orders | one of | Up to 100 IDs, separated by commas or supplied as a JSON array |
Response
[
{
"order": "891518433422477",
"cancel": 1
},
{
"order": "260731849605218",
"cancel": {
"error": "Order cannot be canceled"
}
}
]Status values
Terminal states are based on the amount actually delivered. A completed quantity takes precedence over an internal processing error.
Delivery has started and progress is still being recorded.
The full requested quantity was delivered.
Some quantity was delivered, but the order ended before reaching its target.
No quantity was delivered, or a pending/running order was canceled.
Errors
Errors use a short JSON object. They deliberately keep HTTP 200 for compatibility, so treat the presence of error as a failed operation.
Invalid API keyThe supplied key is missing or incorrect.Invalid actionThe requested action is not available.Incorrect service IDThe service does not exist or is inactive.Incorrect linkThe order link is missing.Incorrect quantityThe quantity is invalid or outside service limits.Incorrect order IDThe order is missing or cannot be found.Not enough fundsYour available balance cannot cover this order.Provide between 1 and 100 ordersSplit the list into smaller batches, or add an order to the empty list.Maximum 100 order IDs per requestSplit the status or cancellation request into groups of up to 100 IDs.Idempotency-Key was already used for a different batchRetry the original payload, or use a new key for the changed batch.Refill is not supportedThe public refill action is not enabled.Error response
{
"error": "Incorrect order ID"
}Integration notes
Import services first. Use the IDs and min/max limits returned by the API instead of hard-coding them.
Use POST in production. GET is supported for compatibility, but query strings may be stored in access logs.
Store the order ID. It is the stable reference for later status and cancellation requests.
Poll responsibly. A 10–30 second interval is sufficient for normal order-status checks.
Parse the body on every response. Business errors use HTTP 200 by design.
Read every batch result. A bulk request can contain accepted and rejected rows. Store each accepted order ID and inspect each row's
error.Keep replay keys stable. Use the same key and payload after a timeout. Choose a new key for a new order or changed batch.