| HTTP Method | POST (GET is also accepted) |
| API URL | https://ufosmm.xyz/api/v2 |
| API Key | Create an account, then generate a key on the Account page |
| Content type | application/x-www-form-urlencoded (JSON body also accepted) |
| Response format | JSON. Errors are returned with HTTP 200 as {"error": "message"} |
| Rate limit | 120 requests per minute per API key |
Service list
| Parameters | Description |
|---|---|
| key | Your API key |
| action | services |
Rates are per 1000 in USD, with your personal discount and custom rates already applied.
Example response
[
{
"service": 4567,
"name": "TikTok Followers [Exclusive] | 30 Days Refill",
"type": "Default",
"category": "TikTok - Followers",
"rate": "9.00",
"min": "10",
"max": "150000",
"refill": true,
"cancel": false,
"dripfeed": true
},
{
"service": 3311,
"name": "Instagram Comments [Custom]",
"type": "Custom Comments",
"category": "Instagram - Comments",
"rate": "8.00",
"min": "10",
"max": "1500",
"refill": false,
"cancel": true,
"dripfeed": false
}
]Add order
| Parameters | Description |
|---|---|
| key | Your API key |
| action | add |
| service | Service ID |
| link | Link to page |
| quantity | Needed quantity |
| runs (optional) | Runs to deliver (drip-feed): the same order is placed this many times |
| interval (optional) | Interval in minutes between drip-feed runs |
The service type of every service is returned by action=services. Orders are validated against the service's min, max and increment; the charge is rate × quantity / 1000 with your personal discount and custom rates applied.
Example response
{
"order": 23501
}Order status
| Parameters | Description |
|---|---|
| key | Your API key |
| action | status |
| order | Order ID |
Possible statuses: Pending, In progress, Processing, Completed, Partial, Canceled, Fail, Error. Canceled, failed and partial orders are refunded to your balance automatically.
Example response
{
"charge": "0.27",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD"
}Multiple orders status
| Parameters | Description |
|---|---|
| key | Your API key |
| action | status |
| orders | Order IDs separated by comma (up to 100) |
Example response
{
"1": {
"charge": "0.27",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD"
},
"10": {
"error": "Incorrect order ID"
},
"100": {
"charge": "1.44",
"start_count": "234",
"status": "In progress",
"remains": "10",
"currency": "USD"
}
}Create refill
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill |
| order | Order ID |
Example response
{
"refill": "1"
}Create multiple refills
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill |
| orders | Order IDs separated by comma (up to 100) |
Example response
[
{
"order": 1,
"refill": 1
},
{
"order": 2,
"refill": {
"error": "Refill is not available for this order"
}
}
]Get refill status
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill_status |
| refill | Refill ID |
Possible statuses: Pending, In progress, Completed, Rejected. Multiple: pass refills with comma-separated IDs and an array is returned.
Example response
{
"status": "Completed"
}Cancel orders
| Parameters | Description |
|---|---|
| key | Your API key |
| action | cancel |
| orders | Order IDs separated by comma (up to 100) |
Only services with cancel enabled accept the request. When the cancel completes, the order status changes to Canceled and the unspent amount is refunded.
Example response
[
{
"order": 9,
"cancel": 1
},
{
"order": 2,
"cancel": {
"error": "Cancel is not available for this order"
}
}
]User balance
| Parameters | Description |
|---|---|
| key | Your API key |
| action | balance |
Example response
{
"balance": "100.84",
"currency": "USD"
}Errors
| Error | Meaning |
|---|---|
| Invalid API key | The key is missing, wrong, or the account is suspended |
| Incorrect request | Unknown action parameter |
| Incorrect service ID | The service does not exist or is disabled |
| Incorrect order ID | The order does not exist or belongs to another account |
| Not enough funds | Your balance does not cover the order charge |
| Minimum quantity is X / Maximum quantity is X | Quantity outside the service limits |
| You already have an active order for this link | The service does not accept duplicate links while an order is running |
| Too many requests, slow down | Rate limit exceeded, retry after a minute |
Example code
<?php
// NLO SMM API client - https://ufosmm.xyz/api
class NloApi
{
public $api_url = 'https://ufosmm.xyz/api/v2';
public $api_key = 'YOUR_API_KEY';
public function services() { return $this->connect(['action' => 'services']); }
public function balance() { return $this->connect(['action' => 'balance']); }
public function order($data) { return $this->connect(array_merge(['action' => 'add'], $data)); }
public function status($order_id) { return $this->connect(['action' => 'status', 'order' => $order_id]); }
public function multiStatus($order_ids) { return $this->connect(['action' => 'status', 'orders' => implode(',', (array)$order_ids)]); }
public function refill($order_id) { return $this->connect(['action' => 'refill', 'order' => $order_id]); }
public function refillStatus($refill_id) { return $this->connect(['action' => 'refill_status', 'refill' => $refill_id]); }
public function cancel($order_ids) { return $this->connect(['action' => 'cancel', 'orders' => implode(',', (array)$order_ids)]); }
private function connect($post)
{
$post['key'] = $this->api_key;
$ch = curl_init($this->api_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
}
$api = new NloApi();
$order = $api->order(['service' => 4567, 'link' => 'https://www.tiktok.com/@user', 'quantity' => 1000]);
$status = $api->status($order['order']);
print_r($status);