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
Create your key
Create an account, then generate an API key from Profile. The full key is shown only once.
- 2
Configure your panel
Add the API endpoint as a provider URL in PerfectPanel and paste your WOWLIKE API key.
- 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.
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.
SERVICES
Service list
Import the services and member-specific prices currently available to this account.
https://wowlike-th.com/api/v2action=services| Parameter | Type | Description |
|---|---|---|
| key | string | Your private WOWLIKE member API key. |
| action | "services" | Must be the literal value services. |
curl -X POST "https://wowlike-th.com/api/v2" \
-d "key=$WOWLIKE_API_KEY" \
-d "action=services"Example response
[
{
"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.
https://wowlike-th.com/api/v2action=add| Parameter | Type | Description |
|---|---|---|
| key | string | Your private WOWLIKE member API key. |
| action | "add" | Must be the literal value add. |
| service | integer | Permanent numeric service ID returned by the services action. |
| link | URL | Public target URL for the page, post, profile, or media. |
| quantity | integer | Required for Default services. The requested amount must be within the service minimum and maximum. |
| comments | string | Required for Custom Comments services. Send one comment per line; quantity is calculated from the non-empty lines. |
Default service
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
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'{
"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.
https://wowlike-th.com/api/v2action=status| Parameter | Type | Description |
|---|---|---|
| key | string | Your private WOWLIKE member API key. |
| action | "status" | Must be the literal value status. |
| order | integer | One WOWLIKE order number. Do not send together with orders. |
| orders | string | Comma-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.
# 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"{
"9001": {
"charge": "42",
"start_count": "1250",
"status": "In progress",
"remains": "600",
"currency": "THB"
},
"9002": {"error": "Incorrect order ID"}
}Status values
| Status | Description |
|---|---|
| Pending | Received and waiting for submission or processing. |
| Processing | Submitted and being prepared by the provider. |
| In progress | Delivery is currently in progress. |
| Completed | The full requested quantity was delivered. |
| Partial | Part of the order was delivered and the undelivered remainder was refunded. |
| Canceled | The 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.
https://wowlike-th.com/api/v2action=cancel| Parameter | Type | Description |
|---|---|---|
| key | string | Your private WOWLIKE member API key. |
| action | "cancel" | Must be the literal value cancel. |
| orders | string | Comma-separated order numbers to cancel, up to 100. |
curl -X POST "https://wowlike-th.com/api/v2" \
-d "key=$WOWLIKE_API_KEY" \
-d "action=cancel" \
-d "orders=9001,9002"[
{"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.
https://wowlike-th.com/api/v2action=balance| Parameter | Type | Description |
|---|---|---|
| key | string | Your private WOWLIKE member API key. |
| action | "balance" | Must be the literal value balance. |
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"{
"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.
| Error | Meaning |
|---|---|
| Invalid API key | The key is missing, malformed, revoked, or does not match an active member. |
| Too many requests | The current read or mutation rate limit has been exceeded. |
| Invalid request parameters | An action or one of its required parameters is missing or malformed. |
| Service not found | The public service ID does not exist or is unavailable. |
| Incorrect order ID | The order does not exist or belongs to another member. |
| Insufficient balance | The wallet does not have enough available THB balance. |
| Invalid quantity | The quantity is outside the service minimum or maximum. |
| Error calling provider | The service or current order state does not allow cancellation. |
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
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.
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /api/v1/member/services | List available services |
| GET | /api/v1/member/balance | Read wallet balance |
| POST | /api/v1/member/orders | Create an idempotent order |
| GET | /api/v1/member/orders/{orderNumber} | Read one order |
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
{
"success": true,
"data": {},
"error": null
}Need help validating an integration or an unexpected response? Contact support