Media Mister REST API v1

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.

🤖
Prefer natural language? Use the MCP integration to connect Claude, ChatGPT, Cursor, Hermes, or OpenClaw. Speak in plain English. Your AI handles the API calls. No code needed.

🔗 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.

🔑
Account merge coming soon. In approximately 2 months, we will merge panel accounts and regular customer accounts. After the merge, any Media Mister account will work with the API. Until then, use a 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
curl -X POST "https://www.mediamister.com/api/v1/" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "key=YOUR_API_KEY&action=balance"
Python
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"}
JavaScript
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"}
PHP
$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

Response — HTTP 200
{
  "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):

YouTube
225 services
TikTok
177 services
Spotify
140 services
X (Twitter)
54 services
Telegram
50 services
Twitch
47 services
Snapchat
35 services
Audiomack
24 services
Kick
21 services
Website
18 services
Rumble
15 services
Boomplay
13 services
LinkedIn
12 services
SoundCloud
12 services
Shopee
10 services
Discord
10 services
Clubhouse
10 services
Reddit
8 services
VK
8 services
Tidal
7 services
Bluesky
6 services
Trovo
6 services
IMDb
6 services
Pinterest
5 services
Likee
5 services
Deezer
4 services
Dribbble
4 services
SnackVideo
4 services
Kwai
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)

FieldTypeDescription
service_namestringHuman-readable name. Example: "Buy Spotify Plays"
service_idstringUnique identifier. Use this in add_order. Example: "MM1030"
min_quantityintegerMinimum order quantity across all variants
max_quantityintegerMaximum order quantity across all variants
price_starts_fromnumberLowest price per 1,000 units in USD across all variants. Example: 1.25 means $1.25 per 1,000
catalog_variantsarrayArray of variant objects. Each variant has different country, order type, or price.

Variant fields (inside catalog_variants)

FieldTypeDescription
order_typestringType of order. Examples: "Spotify Track", "Video Views", "Channel Followers". Can be absent (default type).
countrystringTarget country. "Worldwide" if not country-specific. Examples: "USA", "Brazil", "India".
min_quantityintegerMinimum order quantity for this variant
max_quantityintegerMaximum order quantity for this variant
price_starts_fromnumberPrice per 1,000 units for this variant in USD
profile_link_typestringType of link expected. "URL" or "Profile URL" or "Username".
profile_link_labelstringHuman-readable instruction for the link field. Example: "Enter Spotify Track URL"
live_package_typestringPresent on live-stream services. Example: "One Time Package"
add_form_str_one_labelstringLabel for an extra option field. Example: "Chat Message Language"
add_form_str_one_optionsarrayAvailable values for the extra option. Example: ["English"]
add_form_str_two_labelstringLabel for a second extra option. Example: "Live Stream Duration"
add_form_str_two_optionsarrayAvailable values for the second option. Example: ["1 Hour"]
comment_typestringPresent on comment-type services. Indicates the comment format expected.

Real service example (Spotify Plays)

JSON — one service entry
{
  "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.

POSThttps://www.mediamister.com/api/v1/Get Balance

Returns your wallet balance in USD. Use this before you place orders. It confirms your API key works.

ParameterValue
keyYour API keyREQUIRED
actionbalanceREQUIRED

Success response

JSON
{
  "balance": 991,
  "currency": "USD"
}
Response FieldTypeDescription
balancenumberCurrent wallet balance in USD. 0 if empty.
currencystringAlways "USD".
POSThttps://www.mediamister.com/api/v1/Get Services

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.

ParameterValue
keyYour API keyREQUIRED
actionservicesREQUIRED

Response

Returns a JSON array of service objects. See Service Object Schema for the complete field reference. Response size is approximately 500KB.

POSThttps://www.mediamister.com/api/v1/Add Order

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.

ParameterDescription
keyYour API keyREQUIRED
actionaddREQUIRED
service_idService ID from the services list. Example: "MM1030"REQUIRED
linkTarget URL. Profile, post, video, or track link. Must be a real URL — placeholder text like "your_link" returns an error.REQUIRED
quantityNumber of units. Must be within the service's min/max range for the selected variant.REQUIRED
runsNumber of delivery runs for drip-feed. Default: 1 (deliver all at once).OPTIONAL
intervalMinutes between drip-feed runs. Default: 0. Only used when runs > 1.OPTIONAL
ParametersDescription
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 TypeExtra ParametersExample
Defaultservice_id, link, quantityStandard followers/likes/views
Packageservice_id, linkPre-packaged bundles (no quantity)
Custom Commentsservice_id, link, quantity, commentsNewline-separated custom comments
Mentionsservice_id, link, quantity, usernamesNewline-separated usernames to mention
Comment Repliesservice_id, link, quantity, username, commentsReply to a specific comment
Pollservice_id, link, quantity, answer_numberPoll answer number to vote for
Subscriptionsservice_id, link, quantity, min_sub, max_subSubscription duration range
Invites from Groupsservice_id, link, quantity, groupsGroup invite targets

Success response

JSON
{
  "order": 123456
}
Response FieldTypeDescription
orderintegerInternal order ID. Use Order Status to get the submission ID (e.g. API100025).

Full example: order 5,000 Spotify plays

cURL
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

Invalid service ID
{
  "error": "Invalid service ID",
  "error_code": "INVALID_SERVICE"
}
Quantity out of range (real response)
{
  "error": "Quantity must be between 25 and 5000",
  "error_code": "QUANTITY_OUT_OF_RANGE",
  "min_quantity": 25,
  "max_quantity": 5000
}
Missing required field (real response)
{
  "error": "Missing required field: service_id",
  "error_code": "MISSING_REQUIRED_FIELD",
  "field": "service_id"
}
POSThttps://www.mediamister.com/api/v1/Order Status

Check the status of one order. Use the submission ID (e.g. API100025).

ParameterDescription
keyYour API keyREQUIRED
actionstatusREQUIRED
orderSubmission ID. Example: "API100025"REQUIRED

Response

JSON
{
  "status": "In Progress",
  "submission_id": "API100025",
  "charge": "5.00",
  "start_count": "0",
  "remains": "5000",
  "currency": "USD"
}
Response FieldTypeDescription
statusstringCurrent status. See Status Values.
submission_idstringOrder identifier. Use this for status checks and refills.
chargestringAmount charged in USD.
start_countstringStarting count before delivery began. Empty if not started.
remainsstringRemaining units to deliver. 0 if completed.
currencystringAlways "USD".
POSThttps://www.mediamister.com/api/v1/Multi Order Status

Check up to 100 orders at once. Comma-separate the submission IDs.

ParameterDescription
keyYour API keyREQUIRED
actionmultiStatusREQUIRED
ordersComma-separated submission IDs. Example: "API100025,API100026,API100027". Maximum 100.REQUIRED

Response

JSON
{
  "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"
  }
}
POSThttps://www.mediamister.com/api/v1/Refill

Request a refill for a completed order. Some services include refill guarantees. Check the service details.

ParameterDescription
keyYour API keyREQUIRED
actionrefillREQUIRED
refillSubmission ID to refill. Example: "API100025"REQUIRED

Response

JSON
{
  "refill": 98765
}
POSThttps://www.mediamister.com/api/v1/Refill Status

Check the status of one or more refill requests.

ParameterDescription
keyYour API keyREQUIRED
actionrefill_statusREQUIRED
refill_idComma-separated refill IDs. Example: "98765,98766"REQUIRED
POSThttps://www.mediamister.com/api/v1/Cancel Order

Cancel one or more orders. Only orders in Pending status can be canceled. Not all services support cancellation.

ParameterDescription
keyYour API keyREQUIRED
actioncancelREQUIRED
ordersComma-separated submission IDs. Example: "API100025,API100026"REQUIRED

Order Status Values

An order moves through these states. Poll with get_order_status to track progress.

⏳ Pending
Queued. Not yet started.
🔄 In Progress
Delivery is active.
✅ Completed
Delivery finished.
📊 Partial
Partially delivered.
❌ Canceled
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

FamilyRangeWhat it covers
Authentication1xxAPI key and rate-limit errors
Request Validation2xxMissing fields, invalid action, invalid IDs
Service / Catalog3xxService or product resolution failures
Order4xxQuantity, balance, and order lifecycle errors
Refill5xxRefill request and status errors
Server9xxInternal processing and fetch failures

Complete Error Code List

CodeError CodeMessageWhen
101INVALID_API_KEYInvalid API keyKey is wrong or inactive
102RATE_LIMIT_EXCEEDEDRate limit exceeded. Please try again later.Too many requests in 1 minute
201INVALID_ACTIONInvalid action. Supported actions: add, status, multiStatus, services, balance, refill, refill_status, cancelUnknown action value
202MISSING_REQUIRED_FIELDMissing required field: [field]Required parameter not sent
203MISSING_ORDER_IDMissing order ID(s)order/orders param not sent for status/cancel
204MISSING_ORDERS_PARAMMissing orders parametermultiStatus without orders param
205INVALID_ORDER_IDSNo valid order IDs providedorders is empty or has only invalid IDs
206TOO_MANY_ORDERSToo many order IDs. Maximum 100.Bulk request exceeds 100 orders
207MISSING_REFILL_IDMissing refill ID(s)refill/refill_id not sent
208INVALID_LINKLink cannot be the same as our code for the apiPlaceholder text submitted (e.g. "your_link")
301INVALID_SERVICEInvalid service IDService does not exist or is inactive
302PRODUCT_NOT_FOUNDNo matching product for this service, country, or quantityNo catalog row matches selections
401QUANTITY_OUT_OF_RANGEQuantity must be between [min] and [max]Quantity outside range — response includes min/max
402INSUFFICIENT_BALANCEInsufficient balanceWallet balance lower than order cost
403ORDER_CREATE_FAILEDFailed to create orderOrder could not be saved after validation
404ORDER_NOT_FOUNDOrder not foundOrder ID invalid or does not belong to you
501REFILL_NOT_FOUNDRefill not foundRefill ID does not exist
900INTERNAL_ERRORInternal server errorUnexpected exception — retry
901BALANCE_FETCH_FAILEDFailed to get balanceBalance could not be retrieved
902SERVICES_FETCH_FAILEDFailed to get servicesServices list could not be retrieved
903STATUS_FETCH_FAILEDFailed to get order statusSingle status lookup failed
904STATUSES_FETCH_FAILEDFailed to get order statusesBulk status lookup failed
905ORDER_PROCESS_FAILEDFailed to process orderAdd-order handler failed
906REFILL_PROCESS_FAILEDFailed to process refill requestRefill could not be created
907REFILL_STATUS_FAILEDFailed to get refill statusRefill status lookup failed
908CANCEL_FAILEDFailed to cancel ordersCancel could not be completed

Endpoint-level errors

These errors occur when the request does not reach the API handler:

Wrong HTTP method
{
  "error": "Method not allowed. Use POST."
}
Missing key parameter (real response)
{
  "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.

Not Available via API

This service is not available to use from the API.
Instead, please use the custom place order method.

PHP cURL Preview

PHP Example Class

Complete PHP class for easy integration with the Media Mister API.

PHP Example Code
<?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

ScopeLimit
Per API key60 requests per minute

If you exceed the limit:

JSON
{
  "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
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
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
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
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
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_codeAction
INVALID_API_KEYAsk the user for a new key. Do not retry.
RATE_LIMIT_EXCEEDEDWait 60 seconds. Retry.
INSUFFICIENT_BALANCETell the user to add funds. Do not retry.
QUANTITY_OUT_OF_RANGERead min_quantity and max_quantity from the error. Adjust the quantity. Retry.
INTERNAL_ERRORWait 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 →