SMM panel API for resellers

SMMLotos provides a standard SMM panel API (v2). Use it to connect our services to your own panel, bot or script — or add us as a provider in another panel.

Endpoint

POST https://smmlotos.com/api/v2

Send a POST request with the fields key and action, as a form or as JSON. Every response is JSON. Errors look like {"error": "…"}. Requests are limited to 120 per minute per IP address.

Get an API key

Register an account, then open the API page in your account: your personal key is there. Keep it secret — anyone with the key can place orders from your balance.

Actions

ActionParametersReturns
services—A list of active services: service, name, category, rate (per 1000), min, max, type, dripfeed, refill, cancel.
balance—Your balance and currency.
addservice, link, quantity; optional runs and interval for drip-feed{"order": 1234}. The order is charged immediately.
statusorder, or orders (up to 100, comma-separated)charge, start_count, status, remains for each order.
refillorder, or ordersA refill request ID per order, for completed orders on services that support refill.
refill_statusrefill, or refillsThe status of each refill request.
cancelorders (comma-separated)The result of the cancel request for each order, for services that support cancel.

Examples

List services

curl -X POST https://smmlotos.com/api/v2 \
  -d key=YOUR_API_KEY \
  -d action=services

Place an order

curl -X POST https://smmlotos.com/api/v2 \
  -d key=YOUR_API_KEY \
  -d action=add \
  -d service=1 \
  -d link=https://example.com/target \
  -d quantity=100

{"order": 1234}

Place a drip-feed order: 5 runs of 100, one run every 60 minutes (500 in total)

curl -X POST https://smmlotos.com/api/v2 \
  -d key=YOUR_API_KEY \
  -d action=add \
  -d service=1 \
  -d link=https://example.com/target \
  -d quantity=100 \
  -d runs=5 \
  -d interval=60

Check an order

curl -X POST https://smmlotos.com/api/v2 \
  -d key=YOUR_API_KEY \
  -d action=status \
  -d order=1234

{"charge": 0.2, "start_count": 0, "status": "In progress", "remains": 100}

Drip-feed

For services with dripfeed: true, send runs (2–1000) and interval (minutes, 1–10080) together. quantity is then the amount per run, the total is quantity × runs, and that total is what is charged.

Ready-made PHP client

A small wrapper class around this API — drop in your key and go.

Show the PHP code
<?php

class SMMLotosApi
{
    private string $apiUrl;
    private string $apiKey;

    public function __construct(string $apiKey, string $apiUrl = 'https://smmlotos.com/api/v2')
    {
        $this->apiKey = $apiKey;
        $this->apiUrl = $apiUrl;
    }

    public function services(): array
    {
        return $this->call(['action' => 'services']);
    }

    public function balance(): array
    {
        return $this->call(['action' => 'balance']);
    }

    /** $extra: for drip-feed pass ['runs' => 5, 'interval' => 60] (quantity is then per run). */
    public function addOrder(int $service, string $link, int $quantity, array $extra = []): array
    {
        return $this->call(['action' => 'add', 'service' => $service, 'link' => $link, 'quantity' => $quantity] + $extra);
    }

    /** One id or an array of up to 100 ids. */
    public function status(int|array $orderId): array
    {
        $field = is_array($orderId) ? 'orders' : 'order';
        $value = is_array($orderId) ? implode(',', $orderId) : $orderId;
        return $this->call(['action' => 'status', $field => $value]);
    }

    public function requestRefill(int|array $orderId): array
    {
        $field = is_array($orderId) ? 'orders' : 'order';
        $value = is_array($orderId) ? implode(',', $orderId) : $orderId;
        return $this->call(['action' => 'refill', $field => $value]);
    }

    public function refillStatus(int|array $refillId): array
    {
        $field = is_array($refillId) ? 'refills' : 'refill';
        $value = is_array($refillId) ? implode(',', $refillId) : $refillId;
        return $this->call(['action' => 'refill_status', $field => $value]);
    }

    /** Up to 100 order ids. */
    public function cancel(array $orderIds): array
    {
        return $this->call(['action' => 'cancel', 'orders' => implode(',', $orderIds)]);
    }

    private function call(array $fields): array
    {
        $ch = curl_init($this->apiUrl);
        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query(['key' => $this->apiKey] + $fields),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 15,
        ]);
        $body = curl_exec($ch);
        if ($body === false) {
            throw new \RuntimeException('SMMLotos API request failed: ' . curl_error($ch));
        }
        curl_close($ch);
        return json_decode($body, true) ?? [];
    }
}

// Usage:
$api = new SMMLotosApi('YOUR_API_KEY');
$order = $api->addOrder(1, 'https://example.com/target', 100);
$drip  = $api->addOrder(1, 'https://example.com/target', 100, ['runs' => 5, 'interval' => 60]);
$state = $api->status($order['order']);