Overview
The Morethanpanel API is a single POST endpoint that gives you the whole service catalog, order placement, order status, refills, cancellations and your account balance in JSON.
Getting Started
Four steps from generating your API key to placing and monitoring your first order.
- Generate an API key from your Account page. The key identifies your account and carries your balance and prices.
- Call
servicesonce and store the result. It returns each service with its ID, rate, minimum and maximum quantity. - Place a small test order using
add. Using the service minimum keeps the test as small as the service allows. - Read the order using
status. When polling multiple orders, use the batched status form with up to 100 order IDs.
Authentication
Every request carries your API key in the POST body using the key parameter.
| Parameter | Description |
|---|---|
key
|
Your API authentication key. |
Rate Limits
The platform does not publish a per-key or per-IP request limit, and responses do not contain rate-limit headers.
- Send requests sequentially where practical.
- Space polling requests at approximately one second.
- Keep concurrent in-flight requests in single figures.
- Batch order IDs instead of making one request for every order.
- Stop polling orders after they reach a final state.
Quick Start
The same service-list request in four languages. Change the action and add the parameters documented below to make other calls.
curl -X POST "https://morethanpanel.com/api/v2" \
-d "key=YOUR_API_KEY" \
-d "action=services"
<?php
$ch = curl_init('https://morethanpanel.com/api/v2');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'services',
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
$services = json_decode(curl_exec($ch));
curl_close($ch);
import requests
r = requests.post(
"https://morethanpanel.com/api/v2",
data={"key": "YOUR_API_KEY", "action": "services"},
timeout=30,
)
services = r.json()
const res = await fetch("https://morethanpanel.com/api/v2", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams({
key: "YOUR_API_KEY",
action: "services"
}),
});
const services = await res.json();
Service List
Returns every available service with its numeric ID, name, type, category, rate, minimum, maximum and supported options.
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
services |
[
{
"service": 1,
"name": "Followers",
"type": "Default",
"category": "First Category",
"rate": "0.90",
"min": "50",
"max": "10000",
"refill": true,
"cancel": true
},
{
"service": 2,
"name": "Comments",
"type": "Custom Comments",
"category": "Second Category",
"rate": "8",
"min": "10",
"max": "1500",
"refill": false,
"cancel": true
}
]
Add Order
Creates a new order. The parameters required by add depend on the selected service type.
Default
| Parameter | Required | Description |
|---|---|---|
key |
Yes | Your API key. |
action |
Yes | add |
service |
Yes | Service ID. |
link |
Yes | Link to the target page. |
quantity |
Yes | Required quantity. |
runs |
Optional | Number of drip-feed runs. |
interval |
Optional | Interval between runs in minutes. |
Custom Comments
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
add |
service |
Service ID. |
link |
Link to page. |
comments |
Comments separated by
\r\n or \n.
|
Usernames List
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
add |
service |
Service ID. |
link |
Link to page. |
usernames |
Usernames separated by
\r\n or \n.
|
Hashtag
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
add |
service |
Service ID. |
link |
Link to page. |
quantity |
Required quantity. |
hashtag |
Hashtag to scrape usernames from. |
Scrape Followers
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
add |
service |
Service ID. |
link |
Link to page. |
quantity |
Required quantity. |
username |
URL to scrape followers from. |
Subscription
| Parameter | Required | Description |
|---|---|---|
key |
Yes | Your API key. |
action |
Yes | add |
service |
Yes | Service ID. |
username |
Yes | Username. |
min |
Yes | Minimum quantity. |
max |
Yes | Maximum quantity. |
posts |
Optional | Number of future posts to parse. |
old_posts |
Optional | Number of existing posts to parse. |
delay |
Yes | Delay in minutes. |
expiry |
Optional |
Expiry date in d/m/Y.
|
Comments by Username
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
add |
service |
Service ID. |
link |
Link to page. |
quantity |
Required quantity. |
username |
Username of comment owner. |
Poll Answers
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
add |
service |
Service ID. |
link |
Link to page. |
quantity |
Required quantity. |
answer_number |
Answer number of the poll. |
{
"order": 23501
}
Order Status
Returns the current status of a single order.
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
status |
order |
Order ID. |
{
"charge": "0.27819",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD"
}
Multiple Orders Status
Check up to 100 order IDs in a single request. IDs should be separated by commas.
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
status |
orders |
Order IDs separated by commas, up to 100 IDs. |
{
"1": {
"charge": "0.27819",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD"
},
"10": {
"error": "Incorrect order ID"
},
"100": {
"charge": "1.44219",
"start_count": "234",
"status": "In progress",
"remains": "10",
"currency": "USD"
}
}
Create Refill
Creates a refill request for an order. Refill is available only for services that support it.
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
refill |
order |
Order ID. |
{
"refill": "1"
}
Create Multiple Refill
Create refill requests for up to 100 orders in one request.
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
refill |
orders |
Order IDs separated by commas, up to 100 IDs. |
[
{
"order": 1,
"refill": 1
},
{
"order": 2,
"refill": 2
},
{
"order": 3,
"refill": {
"error": "Incorrect order ID"
}
}
]
Get Refill Status
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
refill_status |
refill |
Refill ID. |
{
"status": "Completed"
}
Get Multiple Refill Status
Check up to 100 refill IDs in one request.
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
refill_status |
refills |
Refill IDs separated by commas, up to 100 IDs. |
[
{
"refill": 1,
"status": "Completed"
},
{
"refill": 2,
"status": "Rejected"
},
{
"refill": 3,
"status": {
"error": "Refill not found"
}
}
]
Create Cancel
Submit cancellation requests for up to 100 orders in one request.
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
cancel |
orders |
Order IDs separated by commas, up to 100 IDs. |
[
{
"order": 9,
"cancel": {
"error": "Incorrect order ID"
}
},
{
"order": 2,
"cancel": 1
}
]
User Balance
Returns the current account balance and currency.
| Parameter | Description |
|---|---|
key |
Your API key. |
action |
balance |
{
"balance": "100.84292",
"currency": "USD"
}
Drip-feed
Drip-feed splits one order into a series of smaller deliveries released on a timer.
The add action accepts two additional parameters for drip-feed: runs and interval.
quantity=100, runs=10 and interval=60. This creates ten deliveries of 100 followers, one every 60 minutes.quantityis the size of each run, not the total quantity.- Total delivery equals quantity multiplied by runs.
- The balance is charged for the total delivery.
- Drip-feed is not available for every service.
- Check the service list before offering this option to customers.
Webhooks and Polling
The API does not provide webhooks. Order status is retrieved by polling the status action.
Recommended Polling Pattern
- Keep a local set of order IDs that have not reached a final state.
- Poll orders in batches of up to 100.
- Space polling batches approximately one second apart.
- Remove orders from the polling set as soon as they reach a final state.
- Back off when an order has not changed for a longer period.
Errors
Errors are returned as JSON with an error key. HTTP status codes are not uniform, so integrations should inspect both the HTTP response and JSON body.
| Error | HTTP | Meaning | What to do |
|---|---|---|---|
Invalid API key
|
401 | Key is missing, incorrect or has been regenerated. | Copy the current key from Account. |
Incorrect request
|
404 | No action was sent or the action is unknown. | Check the action name. |
Incorrect request
|
200 | The action is valid but a required parameter is missing. | Compare the request with the method parameters. |
Incorrect order ID
|
200 | The order does not exist on the account. | Confirm the ID came from an order created with this key. |
Incorrect service ID
|
200 | Service does not exist or is no longer available. | Refresh the cached service list. |
Quantity less than minimal N
|
200 | Quantity is below the service minimum. | Validate against the service minimum. |
Quantity more than maximum N
|
200 | Quantity exceeds the service maximum. | Validate against the service maximum or split the order. |
Not enough funds on balance
|
200 | Order cost exceeds available balance. | Add funds or reduce quantity. |
Error Order
When several parts of a request are invalid, the API returns one error rather than a list. The documented validation order is service ID, quantity range and then balance.
Link Validation
The endpoint does not validate the target link in the same way it validates the service, quantity and balance. Your application should validate URLs and platform-specific links before creating an order.
Security
Protect your API key as a server-side secret.
- Store the API key in an environment variable or secrets manager.
- Never put the key into browser-side JavaScript.
- Never ship the key inside a mobile app.
- Never commit the key to a public repository.
- Use one API key per system where practical.
- Rotate the key immediately if you suspect it has been exposed.
Regenerating the key from the Account page invalidates the previous key immediately.
Frequently Asked Questions
Common questions about the Morethanpanel API.
Spin & Win
Rewards are subject to eligibility and the active promotion rules.

