Media Mister REST API v1 ⬇ OpenAPI JSON
This document is the complete reference for the Media Mister API. It describes every endpoint, every parameter, every response field, and every error code. You can use this document to automate SMM order management. An AI agent can read this document and execute complete workflows — sign up, get services, place orders, check status, and manage refills.
🔗 Base URL
https://www.mediamister.com/api/v1/
📡 Method
All endpoints use POST. Accept application/x-www-form-urlencoded or application/json.
🔐 Auth
Include your panel API key as the key parameter in every request.
📦 Response
All responses are JSON. Errors include error and error_code fields.
⏱️ Rate Limit
60 requests per minute per API key.
🌍 Platforms
55 platforms. 989+ services. YouTube, TikTok, Spotify, X, Telegram, Twitch, and more.
Create a Panel Account
You need a panel account to use the API. A regular mediamister.com customer account does not have API access. The panel account is separate.
📋 Step 1 — Create Your Panel Account
Go to the panel sign-up page. Fill in your details. You will get a panel account with API access and a wallet.
Create Panel Account →How to get your API key
1. Create a panel account if you do not have one.
2. Log into your panel account at mediamister.com/panel.
3. Go to Settings.
4. Find the API Key section. Copy the key. It starts with api_.
5. Add funds to your wallet with Add Funds in the panel dashboard.
6. Use the key in all API requests as the key parameter.
Quick Start
Get your API key from Panel Settings. Run any example. All do the same thing — check your wallet balance.
curl -X POST "https://www.mediamister.com/api/v1/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "key=YOUR_API_KEY&action=balance"
import requests
API_KEY = "YOUR_API_KEY"
URL = "https://www.mediamister.com/api/v1/"
response = requests.post(URL, data={
"key": API_KEY,
"action": "balance"
})
print(response.json())
# {"balance": 991, "currency": "USD"}const KEY = "YOUR_API_KEY";
const res = await fetch("https://www.mediamister.com/api/v1/", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({ key: KEY, action: "balance" })
});
console.log(await res.json());
// {"balance": 991, "currency": "USD"}$KEY = "YOUR_API_KEY";
$ch = curl_init("https://www.mediamister.com/api/v1/");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(["key" => $KEY, "action" => "balance"]),
CURLOPT_RETURNTRANSFER => true,
]);
print_r(json_decode(curl_exec($ch), true));
curl_close($ch);Authentication
Every request must include your panel API key as the key parameter. The key is a string. It starts with api_.
Where to get it: Log into your panel account → Settings → API Key.
Security: Keep your key private. Do not commit it to public repositories. Do not expose it in client-side code. Rotate it from Settings if it is compromised.
What happens with a wrong key
{
"error": "Invalid API key",
"error_code": "INVALID_API_KEY"
}The API returns HTTP 200 even for errors. Check the error field in the JSON body. Do not rely on HTTP status codes.
Available Platforms
The catalog has 55 platforms and 989+ services. Use get_services to get the full list. These are the platforms with their service counts (live data, August 2026):
225 services
177 services
140 services
54 services
50 services
47 services
35 services
24 services
21 services
18 services
15 services
13 services
12 services
12 services
10 services
10 services
10 services
8 services
8 services
7 services
6 services
6 services
6 services
5 services
5 services
4 services
4 services
4 services
4 services
Plus: Mixcloud, RedNote, ReverbNation, Vimeo, Quora, Coub, Tumblr, Apple, Android, Fansly, Lazada, OnlyFans, OpenSea, Shazam, Medium, Dailymotion, Chzzk, DatPiff, Napster, and more. Full list available via get_services.
Service Object Schema
Each service object in the get_services response has this structure. All fields are documented below.
Top-level fields (present on every service)
| Field | Type | Description |
|---|---|---|
| service_name | string | Human-readable name. Example: "Buy Spotify Plays" |
| service_id | string | Unique identifier. Use this in add_order. Example: "MM1030" |
| min_quantity | integer | Minimum order quantity across all variants |
| max_quantity | integer | Maximum order quantity across all variants |
| price_starts_from | number | Lowest price per 1,000 units in USD across all variants. Example: 1.25 means $1.25 per 1,000 |
| catalog_variants | array | Array of variant objects. Each variant has different country, order type, or price. |
Variant fields (inside catalog_variants)
| Field | Type | Description |
|---|---|---|
| order_type | string | Type of order. Examples: "Spotify Track", "Video Views", "Channel Followers". Can be absent (default type). |
| country | string | Target country. "Worldwide" if not country-specific. Examples: "USA", "Brazil", "India". |
| min_quantity | integer | Minimum order quantity for this variant |
| max_quantity | integer | Maximum order quantity for this variant |
| price_starts_from | number | Price per 1,000 units for this variant in USD |
| profile_link_type | string | Type of link expected. "URL" or "Profile URL" or "Username". |
| profile_link_label | string | Human-readable instruction for the link field. Example: "Enter Spotify Track URL" |
| live_package_type | string | Present on live-stream services. Example: "One Time Package" |
| add_form_str_one_label | string | Label for an extra option field. Example: "Chat Message Language" |
| add_form_str_one_options | array | Available values for the extra option. Example: ["English"] |
| add_form_str_two_label | string | Label for a second extra option. Example: "Live Stream Duration" |
| add_form_str_two_options | array | Available values for the second option. Example: ["1 Hour"] |
| comment_type | string | Present on comment-type services. Indicates the comment format expected. |
Real service example (Spotify Plays)
{
"service_name": "Buy Spotify Plays",
"service_id": "MM1030",
"min_quantity": 10000,
"max_quantity": 100000,
"price_starts_from": 1.25,
"catalog_variants": [
{
"order_type": "Spotify Track",
"country": "Worldwide",
"min_quantity": 10000,
"max_quantity": 100000,
"price_starts_from": 1.25,
"profile_link_type": "URL",
"profile_link_label": "Enter Spotify Track URL"
}
]
}Endpoints
All endpoints use the same base URL. The action parameter selects which operation to perform. Eight actions are available: balance, services, add, status, multiStatus, refill, refill_status, cancel.
Returns your wallet balance in USD. Use this before you place orders. It confirms your API key works.
| Parameter | Value | |
|---|---|---|
| key | Your API key | REQUIRED |
| action | balance | REQUIRED |
Success response
{
"balance": 991,
"currency": "USD"
}| Response Field | Type | Description |
|---|---|---|
| balance | number | Current wallet balance in USD. 0 if empty. |
| currency | string | Always "USD". |
Returns all available services. 989+ services across 55 platforms. Each service has one or more catalog variants with different countries and order types. Cache this response. It does not change minute-to-minute.
| Parameter | Value | |
|---|---|---|
| key | Your API key | REQUIRED |
| action | services | REQUIRED |
Response
Returns a JSON array of service objects. See Service Object Schema for the complete field reference. Response size is approximately 500KB.
Place a new order. Provide a service ID from get_services, a target link, and a quantity. The API deducts the cost from your wallet.
| Parameter | Description | |
|---|---|---|
| key | Your API key | REQUIRED |
| action | add | REQUIRED |
| service_id | Service ID from the services list. Example: "MM1030" | REQUIRED |
| link | Target URL. Profile, post, video, or track link. Must be a real URL — placeholder text like "your_link" returns an error. | REQUIRED |
| quantity | Number of units. Must be within the service's min/max range for the selected variant. | REQUIRED |
| runs | Number of delivery runs for drip-feed. Default: 1 (deliver all at once). | OPTIONAL |
| interval | Minutes between drip-feed runs. Default: 0. Only used when runs > 1. | OPTIONAL |
| Parameters | Description |
|---|---|
key |
Your API key |
action |
add |
service_id |
Service ID |
link |
Link to page |
quantity |
Needed quantity |
runs |
Runs to deliver |
interval |
Interval in minutes |
Service-type-specific parameters
Some services need extra parameters. The API uses the same action=add endpoint. The extra parameters depend on the service type:
| Service Type | Extra Parameters | Example |
|---|---|---|
| Default | service_id, link, quantity | Standard followers/likes/views |
| Package | service_id, link | Pre-packaged bundles (no quantity) |
| Custom Comments | service_id, link, quantity, comments | Newline-separated custom comments |
| Mentions | service_id, link, quantity, usernames | Newline-separated usernames to mention |
| Comment Replies | service_id, link, quantity, username, comments | Reply to a specific comment |
| Poll | service_id, link, quantity, answer_number | Poll answer number to vote for |
| Subscriptions | service_id, link, quantity, min_sub, max_sub | Subscription duration range |
| Invites from Groups | service_id, link, quantity, groups | Group invite targets |
Success response
{
"order": 123456
}| Response Field | Type | Description |
|---|---|---|
| order | integer | Internal order ID. Use Order Status to get the submission ID (e.g. API100025). |
Full example: order 5,000 Spotify plays
curl -X POST "https://www.mediamister.com/api/v1/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "key=api_xxx&action=add&service_id=MM1030&link=https://open.spotify.com/track/4iV5W9uYEdYUVa79Axb7Rh&quantity=5000"
Common errors for Add Order
{
"error": "Invalid service ID",
"error_code": "INVALID_SERVICE"
}{
"error": "Quantity must be between 25 and 5000",
"error_code": "QUANTITY_OUT_OF_RANGE",
"min_quantity": 25,
"max_quantity": 5000
}{
"error": "Missing required field: service_id",
"error_code": "MISSING_REQUIRED_FIELD",
"field": "service_id"
}Check the status of one order. Use the submission ID (e.g. API100025).
| Parameter | Description | |
|---|---|---|
| key | Your API key | REQUIRED |
| action | status | REQUIRED |
| order | Submission ID. Example: "API100025" | REQUIRED |
Response
{
"status": "In Progress",
"submission_id": "API100025",
"charge": "5.00",
"start_count": "0",
"remains": "5000",
"currency": "USD"
}| Response Field | Type | Description |
|---|---|---|
| status | string | Current status. See Status Values. |
| submission_id | string | Order identifier. Use this for status checks and refills. |
| charge | string | Amount charged in USD. |
| start_count | string | Starting count before delivery began. Empty if not started. |
| remains | string | Remaining units to deliver. 0 if completed. |
| currency | string | Always "USD". |
Check up to 100 orders at once. Comma-separate the submission IDs.
| Parameter | Description | |
|---|---|---|
| key | Your API key | REQUIRED |
| action | multiStatus | REQUIRED |
| orders | Comma-separated submission IDs. Example: "API100025,API100026,API100027". Maximum 100. | REQUIRED |
Response
{
"API100025": {
"status": "Pending",
"charge": "5.00",
"currency": "USD"
},
"API100026": {
"status": "In Progress",
"charge": "10.00",
"start_count": "1000",
"remains": "500",
"currency": "USD"
},
"API100027": {
"status": "Completed",
"charge": "3.00",
"start_count": "0",
"remains": "0",
"currency": "USD"
}
}Request a refill for a completed order. Some services include refill guarantees. Check the service details.
| Parameter | Description | |
|---|---|---|
| key | Your API key | REQUIRED |
| action | refill | REQUIRED |
| refill | Submission ID to refill. Example: "API100025" | REQUIRED |
Response
{
"refill": 98765
}Check the status of one or more refill requests.
| Parameter | Description | |
|---|---|---|
| key | Your API key | REQUIRED |
| action | refill_status | REQUIRED |
| refill_id | Comma-separated refill IDs. Example: "98765,98766" | REQUIRED |
Cancel one or more orders. Only orders in Pending status can be canceled. Not all services support cancellation.
| Parameter | Description | |
|---|---|---|
| key | Your API key | REQUIRED |
| action | cancel | REQUIRED |
| orders | Comma-separated submission IDs. Example: "API100025,API100026" | REQUIRED |
Order Status Values
An order moves through these states. Poll with get_order_status to track progress.
Queued. Not yet started.
Delivery is active.
Delivery finished.
Partially delivered.
Canceled by user or system.
Error Reference
All errors return JSON with error (human-readable) and error_code (machine-readable) fields. Some errors include extra fields like min_quantity and max_quantity. The HTTP status code is always 200. Check the JSON body for errors.
Error Code Families
| Family | Range | What it covers |
|---|---|---|
| Authentication | 1xx | API key and rate-limit errors |
| Request Validation | 2xx | Missing fields, invalid action, invalid IDs |
| Service / Catalog | 3xx | Service or product resolution failures |
| Order | 4xx | Quantity, balance, and order lifecycle errors |
| Refill | 5xx | Refill request and status errors |
| Server | 9xx | Internal processing and fetch failures |
Complete Error Code List
| Code | Error Code | Message | When |
|---|---|---|---|
| 101 | INVALID_API_KEY | Invalid API key | Key is wrong or inactive |
| 102 | RATE_LIMIT_EXCEEDED | Rate limit exceeded. Please try again later. | Too many requests in 1 minute |
| 201 | INVALID_ACTION | Invalid action. Supported actions: add, status, multiStatus, services, balance, refill, refill_status, cancel | Unknown action value |
| 202 | MISSING_REQUIRED_FIELD | Missing required field: [field] | Required parameter not sent |
| 203 | MISSING_ORDER_ID | Missing order ID(s) | order/orders param not sent for status/cancel |
| 204 | MISSING_ORDERS_PARAM | Missing orders parameter | multiStatus without orders param |
| 205 | INVALID_ORDER_IDS | No valid order IDs provided | orders is empty or has only invalid IDs |
| 206 | TOO_MANY_ORDERS | Too many order IDs. Maximum 100. | Bulk request exceeds 100 orders |
| 207 | MISSING_REFILL_ID | Missing refill ID(s) | refill/refill_id not sent |
| 208 | INVALID_LINK | Link cannot be the same as our code for the api | Placeholder text submitted (e.g. "your_link") |
| 301 | INVALID_SERVICE | Invalid service ID | Service does not exist or is inactive |
| 302 | PRODUCT_NOT_FOUND | No matching product for this service, country, or quantity | No catalog row matches selections |
| 401 | QUANTITY_OUT_OF_RANGE | Quantity must be between [min] and [max] | Quantity outside range — response includes min/max |
| 402 | INSUFFICIENT_BALANCE | Insufficient balance | Wallet balance lower than order cost |
| 403 | ORDER_CREATE_FAILED | Failed to create order | Order could not be saved after validation |
| 404 | ORDER_NOT_FOUND | Order not found | Order ID invalid or does not belong to you |
| 501 | REFILL_NOT_FOUND | Refill not found | Refill ID does not exist |
| 900 | INTERNAL_ERROR | Internal server error | Unexpected exception — retry |
| 901 | BALANCE_FETCH_FAILED | Failed to get balance | Balance could not be retrieved |
| 902 | SERVICES_FETCH_FAILED | Failed to get services | Services list could not be retrieved |
| 903 | STATUS_FETCH_FAILED | Failed to get order status | Single status lookup failed |
| 904 | STATUSES_FETCH_FAILED | Failed to get order statuses | Bulk status lookup failed |
| 905 | ORDER_PROCESS_FAILED | Failed to process order | Add-order handler failed |
| 906 | REFILL_PROCESS_FAILED | Failed to process refill request | Refill could not be created |
| 907 | REFILL_STATUS_FAILED | Failed to get refill status | Refill status lookup failed |
| 908 | CANCEL_FAILED | Failed to cancel orders | Cancel could not be completed |
Endpoint-level errors
These errors occur when the request does not reach the API handler:
{
"error": "Method not allowed. Use POST."
}{
"error": "Missing required parameters: key and action",
"error_code": "MISSING_REQUIRED_FIELD",
"received_params": ["key"]
}Try It Live: Add Order
Select a platform and service — the form fields and PHP cURL snippet update automatically in real time.
Sign in to use Try It Live
Once you sign in, you'll be able to see the form inputs here — select a platform and service to build a live PHP cURL order request.
PHP Example Class
Complete PHP class for easy integration with the Media Mister API.
<?php
class MediaMisterApi
{
/** API URL */
public $api_url = 'https://www.mediamister.com/api/v1/';
/** Your API key */
public $api_key = '';
/** Add order */
public function order($data)
{
$post = array_merge(['key' => $this->api_key, 'action' => 'add'], $data);
return json_decode($this->connect($post));
}
/** Get order status */
public function status($order_id)
{
return json_decode(
$this->connect([
'key' => $this->api_key,
'action' => 'status',
'order' => $order_id
])
);
}
/** Get orders status */
public function multiStatus($order_ids)
{
return json_decode(
$this->connect([
'key' => $this->api_key,
'action' => 'multiStatus',
'orders' => implode(",", (array)$order_ids)
])
);
}
/** Get services */
public function services()
{
return json_decode(
$this->connect([
'key' => $this->api_key,
'action' => 'services',
])
);
}
/** Get balance */
public function balance()
{
return json_decode(
$this->connect([
'key' => $this->api_key,
'action' => 'balance',
])
);
}
private function connect($post)
{
$_post = [];
if (is_array($post)) {
foreach ($post as $name => $value) {
$_post[] = $name . '=' . urlencode($value);
}
}
$ch = curl_init($this->api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if (is_array($post)) {
curl_setopt($ch, CURLOPT_POSTFIELDS, join('&', $_post));
}
curl_setopt($ch, CURLOPT_USERAGENT, 'MediaMisterAPI/1.0');
$result = curl_exec($ch);
if (curl_errno($ch) != 0 && empty($result)) {
$result = false;
}
curl_close($ch);
return $result;
}
}
// Usage Examples
$api = new MediaMisterApi();
$api->api_key = 'your_api_key_here';
// Get available services
$services = $api->services();
// Check balance
$balance = $api->balance();
// Place an order
$order = $api->order([
'service_id' => 'MM1001',
'link' => 'https://www.tiktok.com/@vividflicks',
'quantity' => 100
]);
// Check order status
$status = $api->status($order->order);
// Check multiple order status
$multi_status = $api->multiStatus([1, 2, 3]);
?>
Rate Limits
| Scope | Limit |
|---|---|
| Per API key | 60 requests per minute |
If you exceed the limit:
{
"error": "Rate limit exceeded. Please try again later.",
"error_code": "RATE_LIMIT_EXCEEDED"
}Normal use does not hit this limit. Cache the services list — it is the largest response.
Complete Workflow for AI Agents
An AI agent can use this sequence to place and monitor an order:
Step 1 — Verify the connection
curl -X POST "https://www.mediamister.com/api/v1/" \ -d "key=API_KEY&action=balance"
Check: response has balance field. No error field. Key works.
Step 2 — Get the service list
curl -X POST "https://www.mediamister.com/api/v1/" \ -d "key=API_KEY&action=services"
Filter the response by service_name to find the platform you want. Pick a service_id. Note the min_quantity, max_quantity, and profile_link_label.
Step 3 — Place the order
curl -X POST "https://www.mediamister.com/api/v1/" \ -d "key=API_KEY&action=add&service_id=MM1030&link=TARGET_URL&quantity=5000"
Response: {"order": 123456}. Save the order number.
Step 4 — Check the order
curl -X POST "https://www.mediamister.com/api/v1/" \ -d "key=API_KEY&action=status&order=API100025"
Check the status field. Poll every 5-10 minutes until "Completed" or "Partial".
Step 5 — Refill if needed
curl -X POST "https://www.mediamister.com/api/v1/" \ -d "key=API_KEY&action=refill&refill=API100025"
Error handling pattern
After every request, check the response for an error field. If present, read error_code to decide what to do:
| error_code | Action |
|---|---|
| INVALID_API_KEY | Ask the user for a new key. Do not retry. |
| RATE_LIMIT_EXCEEDED | Wait 60 seconds. Retry. |
| INSUFFICIENT_BALANCE | Tell the user to add funds. Do not retry. |
| QUANTITY_OUT_OF_RANGE | Read min_quantity and max_quantity from the error. Adjust the quantity. Retry. |
| INTERNAL_ERROR | Wait 5 seconds. Retry once. If it fails again, report to user. |
MCP — The No-Code Alternative
If you do not want to write code, use the Media Mister MCP server. It wraps this REST API in an MCP interface. Connect any MCP client — Claude, ChatGPT, Cursor, Hermes Agent, OpenClaw — and use natural language.
🤖 MCP Setup
Full instructions for 9 AI clients. Open MCP Page →
🏛️ Hermes Agent
Add to ~/.hermes/config.yaml under mcp_servers. See the MCP page for exact config.
🦞 OpenClaw
Use transport: "streamable-http" in ~/.openclaw/config.yaml. See the MCP page for exact config.
📥 Example Code
Download a complete PHP integration class. Download →