Wave SMM Panel Documentation
Open Telegram bot

SMMWave API reference

Use one endpoint to load services, place orders, check delivery, and cancel work that is still in progress.

Base URL https://smm.lat/api/v2

Your first request

Read the parameters
cURL example
curl 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

Authentication

Every request needs your API key. Send it in the key field, the X-Api-Key header, or as a Bearer token.

Keep the key on your server.

Do not place it in browser code, screenshots, public repositories, or support messages.

cURL
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.

Request format parameters
FieldTypeDescription
keystringYour API key
actionstringThe operation to run
HTTP status behavior

Business errors are returned as JSON with HTTP 200 for compatibility with panel adapters. Always inspect the response body for an error field.

POST

List services

action=services

Returns every active service available to the provider account. Numeric values use strings so they can be consumed safely by older panel software.

Parameters

List services parameters
FieldRequiredDescription
keyrequiredAPI key
actionrequiredSet to services

Service fields

  • serviceNumeric service ID
  • ratePrice per 1,000 units
  • min / maxAccepted quantity range
  • cancel1 when cancellation is available
  • refill0; public refill is not supported

Response

200 JSON
[
  {
    "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"
  }
]
POST

Check balance

action=balance

Returns the provider balance with six decimal places and its configured currency.

Parameters

Check balance parameters
FieldRequiredDescription
keyrequiredAPI key
actionrequiredSet to balance

Response

200 JSON
{
  "balance": "125.500000",
  "currency": "USD"
}
POST

Add an order

action=add

Creates a new order and returns a numeric order ID. Save this value: it is used for status checks and cancellation.

Parameters

Add an order parameters
FieldRequiredDescription
keyrequiredAPI key
actionrequiredSet to add
servicerequiredService ID from the service list
linkrequiredPublic username, URL, or invite link
quantityrequiredWhole number within the service limits
idempotency_keyoptionalPrevents an accidental duplicate submission

Request

cURL
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"
Response{ "order": 891518433422477 }
POST

Bulk orders

action=add_bulk

Create 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

Bulk order parameters
FieldRequiredDescription
keyrequiredYour API key. Bearer authentication is also accepted.
actionrequiredSet to add_bulk at the base endpoint.
ordersone ofAn array of 1–100 order objects. In form requests, send the array as a JSON string.
linksone ofURLs as an array or one per line, with a shared service and quantity.
linesone ofOne service|link|quantity row per line, or an array of order objects.
idempotency_keyoptionalA 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 · JSON
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

200 JSON · one accepted, one rejected
{
  "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.

JSON body
{
  "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 · form
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.

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.

POST

Order status

action=status

Returns the current delivery state for one order. The remaining quantity is calculated from the latest recorded progress.

Parameters

Order status parameters
FieldRequiredDescription
keyrequiredAPI key
actionrequiredSet to status
orderrequiredNumeric order ID

Response

200 JSON
{
  "charge": "2.125000",
  "start_count": "521",
  "status": "In progress",
  "remains": "250",
  "currency": "USD"
}
POST

Multiple order status

action=status

Checks 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

Multiple order status parameters
FieldRequiredDescription
keyrequiredAPI key
actionrequiredSet to status
ordersrequiredUp to 100 IDs, separated by commas or supplied as a JSON array

Response

200 JSON
{
  "891518433422477": {
    "charge": "4.250000",
    "start_count": "521",
    "status": "Completed",
    "remains": "0",
    "currency": "USD"
  },
  "999999": {
    "error": "Incorrect order ID"
  }
}
POST

Cancel orders

action=cancel

Requests cancellation for one or more pending or running orders. The response is always an array, including single-order requests.

Parameters

Cancel orders parameters
FieldRequiredDescription
keyrequiredAPI key
actionrequiredSet to cancel
orderone ofA single order ID
ordersone ofUp to 100 IDs, separated by commas or supplied as a JSON array

Response

200 JSON
[
  {
    "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.

Pending

The order is queued and has not started yet.

In progress

Delivery has started and progress is still being recorded.

Completed

The full requested quantity was delivered.

Partial

Some quantity was delivered, but the order ended before reaching its target.

Canceled

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

200 JSON
{
  "error": "Incorrect order ID"
}

Integration notes

  1. Import services first. Use the IDs and min/max limits returned by the API instead of hard-coding them.

  2. Use POST in production. GET is supported for compatibility, but query strings may be stored in access logs.

  3. Store the order ID. It is the stable reference for later status and cancellation requests.

  4. Poll responsibly. A 10–30 second interval is sufficient for normal order-status checks.

  5. Parse the body on every response. Business errors use HTTP 200 by design.

  6. Read every batch result. A bulk request can contain accepted and rejected rows. Store each accepted order ID and inspect each row's error.

  7. Keep replay keys stable. Use the same key and payload after a timeout. Choose a new key for a new order or changed batch.

Copied to clipboard