PerfectPanel-compatible provider API

Connect your panel to WOWLIKE

A production-ready reference for importing services, placing orders, tracking delivery, requesting cancellations, and reading your THB balance.

HTTP method
POST
API endpoint
https://wowlike-th.com/api/v2
Compatible alias
https://wowlike-th.com/api/v1
Response format
JSON

Get started

Connect in three steps

Use the same API URL and key in PerfectPanel or any client that supports the common SMM panel API format.

  1. 1

    Create your key

    Create an account, then generate an API key from Profile. The full key is shown only once.

  2. 2

    Configure your panel

    Add the API endpoint as a provider URL in PerfectPanel and paste your WOWLIKE API key.

  3. 3

    Run a smoke test

    Request your balance, then import services. A JSON balance response confirms the connection.

Use https://wowlike-th.com/api/v2 as the primary endpoint. If the provider panel connects through API version 1, use https://wowlike-th.com/api/v1. Both endpoints use the same API key and return the same service data.

bash
curl -X POST "https://wowlike-th.com/api/v2" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "key=$WOWLIKE_API_KEY" \
  -d "action=balance"

Security

Authenticate every request

Send your API key in the form field named key. The key identifies the member account, prices, wallet, and orders used by the request.

Key lifecycle

One API key can be active per account. Rotating or revoking it immediately invalidates the previous key. WOWLIKE stores only a cryptographic hash.

Rate limits

Read actions allow 120 requests per minute. Add and cancel actions allow 30 requests per minute. Limits are applied per member and source IP.

Keep the key private. Store it in a server-side secret or environment variable. Never put it in browser JavaScript, a public repository, screenshots, or support messages.

SERVICES

Service list

Import the services and member-specific prices currently available to this account.

POSThttps://wowlike-th.com/api/v2action=services
ParameterTypeDescription
keystringYour private WOWLIKE member API key.
action"services"Must be the literal value services.
bash
curl -X POST "https://wowlike-th.com/api/v2" \
  -d "key=$WOWLIKE_API_KEY" \
  -d "action=services"

Example response

json
[
  {
    "service": 123,
    "name": "ผู้ติดตาม Instagram — เสถียร",
    "nameEn": "Instagram followers — stable",
    "descriptionEn": "Stable delivery with refill support.",
    "type": "Default",
    "rate": 42,
    "min": 100,
    "max": 10000,
    "dripfeed": false,
    "refill": true,
    "cancel": true,
    "category": "บริการ Instagram ประเทศไทย",
    "categoryEn": "บริการ Instagram ประเทศไทย"
  },
  {
    "service": 124,
    "name": "ความคิดเห็นกำหนดเอง",
    "nameEn": "Custom comments",
    "descriptionEn": null,
    "type": "Custom Comments",
    "rate": 85,
    "min": 10,
    "max": 1000,
    "dripfeed": false,
    "refill": false,
    "cancel": false,
    "category": "บริการ Instagram ประเทศไทย",
    "categoryEn": "บริการ Instagram ประเทศไทย"
  }
]

service is the permanent ID allocated by WOWLIKE and does not depend on a provider ID. category and categoryEn contain the service group; rate, min, and max are JSON numbers, while dripfeed, refill, and cancel publish the effective service capabilities.

Every request returns the latest member price, limits, and available service list without using a response cache. Downstream systems can poll the services action to synchronize data; polling frequency and whether synchronization controls are enabled depend on the downstream adapter.

ADD

Add order

Create an order for a published service and debit the member wallet using the current member-specific price.

POSThttps://wowlike-th.com/api/v2action=add
ParameterTypeDescription
keystringYour private WOWLIKE member API key.
action"add"Must be the literal value add.
serviceintegerPermanent numeric service ID returned by the services action.
linkURLPublic target URL for the page, post, profile, or media.
quantityintegerRequired for Default services. The requested amount must be within the service minimum and maximum.
commentsstringRequired for Custom Comments services. Send one comment per line; quantity is calculated from the non-empty lines.

Default service

bash
curl -X POST "https://wowlike-th.com/api/v2" \
  -d "key=$WOWLIKE_API_KEY" \
  -d "action=add" \
  -d "service=123" \
  --data-urlencode "link=https://example.com/post" \
  -d "quantity=1000"

Custom Comments service

bash
curl -X POST "https://wowlike-th.com/api/v2" \
  -d "key=$WOWLIKE_API_KEY" \
  -d "action=add" \
  -d "service=124" \
  --data-urlencode "link=https://example.com/post" \
  --data-urlencode $'comments=First comment\nSecond comment'
json
{
  "order": 9001
}

For Custom Comments, omit quantity and send comments as newline-separated text. WOWLIKE trims blank lines and uses the remaining line count as the order quantity.

Only retry after a transport failure when you are sure no order number was returned. For integrations that require guaranteed idempotent retries, use the REST order endpoint.

STATUS

Order status

Read one order or up to 100 orders belonging to the API key owner.

POSThttps://wowlike-th.com/api/v2action=status
ParameterTypeDescription
keystringYour private WOWLIKE member API key.
action"status"Must be the literal value status.
orderintegerOne WOWLIKE order number. Do not send together with orders.
ordersstringComma-separated order numbers, up to 100. Do not send together with order.

Send either order or orders, never both. A multiple-order response is keyed by the requested order number.

bash
# Single order
curl -X POST "https://wowlike-th.com/api/v2" \
  -d "key=$WOWLIKE_API_KEY" -d "action=status" -d "order=9001"

# Multiple orders
curl -X POST "https://wowlike-th.com/api/v2" \
  -d "key=$WOWLIKE_API_KEY" -d "action=status" -d "orders=9001,9002"
json
{
  "9001": {
    "charge": "42",
    "start_count": "1250",
    "status": "In progress",
    "remains": "600",
    "currency": "THB"
  },
  "9002": {"error": "Incorrect order ID"}
}

Status values

StatusDescription
PendingReceived and waiting for submission or processing.
ProcessingSubmitted and being prepared by the provider.
In progressDelivery is currently in progress.
CompletedThe full requested quantity was delivered.
PartialPart of the order was delivered and the undelivered remainder was refunded.
CanceledThe order was canceled or failed and the applicable balance was refunded.

CANCEL

Cancel orders

Request cancellation for up to 100 active orders whose services advertise cancel: true.

POSThttps://wowlike-th.com/api/v2action=cancel
ParameterTypeDescription
keystringYour private WOWLIKE member API key.
action"cancel"Must be the literal value cancel.
ordersstringComma-separated order numbers to cancel, up to 100.
bash
curl -X POST "https://wowlike-th.com/api/v2" \
  -d "key=$WOWLIKE_API_KEY" \
  -d "action=cancel" \
  -d "orders=9001,9002"
json
[
  {"order": 9001, "cancel": 1},
  {"order": 9002, "cancel": {"error": "Error calling provider"}}
]

cancel: 1 means the cancellation request was accepted. It may remain pending while the upstream provider or WOWLIKE operations team completes it; continue polling order status for the final result.

BALANCE

User balance

Return the available member wallet balance as a decimal string in THB.

POSThttps://wowlike-th.com/api/v2action=balance
ParameterTypeDescription
keystringYour private WOWLIKE member API key.
action"balance"Must be the literal value balance.
bash
curl -X POST "https://wowlike-th.com/api/v2" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "key=$WOWLIKE_API_KEY" \
  -d "action=balance"
json
{
  "balance": "1250.7500",
  "currency": "THB"
}

Error handling

Errors use a predictable JSON shape

PerfectPanel-compatible responses return an error field instead of the successful payload. Bulk actions report errors on the affected order so other items can still succeed.

ErrorMeaning
Invalid API keyThe key is missing, malformed, revoked, or does not match an active member.
Too many requestsThe current read or mutation rate limit has been exceeded.
Invalid request parametersAn action or one of its required parameters is missing or malformed.
Service not foundThe public service ID does not exist or is unavailable.
Incorrect order IDThe order does not exist or belongs to another member.
Insufficient balanceThe wallet does not have enough available THB balance.
Invalid quantityThe quantity is outside the service minimum or maximum.
Error calling providerThe service or current order state does not allow cancellation.
The API follows the MeeLike error contract: an invalid key or order-related business error returns HTTP 200 with an error field, request validation returns HTTP 400 with status, message, timestamp, and path, unsupported methods return HTTP 404, and OPTIONS returns HTTP 204.

PHP

Complete PHP example

This small client keeps TLS verification enabled, uses connection and request timeouts, and throws when the API returns an error.

php
<?php
final class WowlikeApi {
    public function __construct(
        private string $apiUrl,
        private string $apiKey,
    ) {}

    public function call(string $action, array $parameters = []): array {
        $handle = curl_init($this->apiUrl);
        curl_setopt_array($handle, [
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POSTFIELDS => http_build_query([
                'key' => $this->apiKey,
                'action' => $action,
                ...$parameters,
            ]),
            CURLOPT_CONNECTTIMEOUT => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_HTTPHEADER => ['Accept: application/json'],
        ]);
        $body = curl_exec($handle);
        if ($body === false) {
            throw new RuntimeException(curl_error($handle));
        }
        $result = json_decode($body, true, flags: JSON_THROW_ON_ERROR);
        if (isset($result['error'])) {
            throw new RuntimeException((string) $result['error']);
        }
        return $result;
    }
}

$api = new WowlikeApi('https://wowlike-th.com/api/v2', getenv('WOWLIKE_API_KEY'));
$services = $api->call('services');
$order = $api->call('add', [
    'service' => 123,
    'link' => 'https://example.com/post',
    'quantity' => 1000,
]);
$commentOrder = $api->call('add', [
    'service' => 124,
    'link' => 'https://example.com/post',
    'comments' => "First comment\nSecond comment",
]);
$status = $api->call('status', ['order' => $order['order']]);
$statuses = $api->call('status', ['orders' => '9001,9002']);
$cancellations = $api->call('cancel', ['orders' => '9001,9002']);

REST API

Advanced REST API

Use the REST interface for custom server integrations that benefit from HTTP status codes, a consistent response envelope, and idempotent order creation.

MethodEndpointPurpose
GET/api/v1/member/servicesList available services
GET/api/v1/member/balanceRead wallet balance
POST/api/v1/member/ordersCreate an idempotent order
GET/api/v1/member/orders/{orderNumber}Read one order
bash
curl "https://wowlike-th.com/api/v1/member/services?locale=en" \
  -H "Authorization: Bearer $WOWLIKE_API_KEY"

curl -X POST "https://wowlike-th.com/api/v1/member/orders" \
  -H "Authorization: Bearer $WOWLIKE_API_KEY" \
  -H "Idempotency-Key: merchant-order-2026-0001" \
  -H "Content-Type: application/json" \
  -d '{"serviceId":123,"targetUrl":"https://example.com/post","quantity":1000}'

Bearer authentication

Send the same member key in Authorization: Bearer <key>. REST endpoints return HTTP 401, 403, 422, or 429 when applicable.

Safe retries

Every REST order request must include a unique Idempotency-Key of at most 200 characters. Reusing it returns the original order instead of charging twice.

Success envelope

json
{
  "success": true,
  "data": {},
  "error": null
}

Need help validating an integration or an unexpected response? Contact support