Order programmatically with the same account and balance you use in the Telegram bot.
The API follows the standard SMM panel API v2 format, so most panels, scripts and resellers' software work with it as is.
| Endpoint | https://gniorder.com/api |
|---|---|
| Method | POST (GET also works, but POST is recommended) |
| Format | JSON response, application/x-www-form-urlencoded request |
| Currency | All amounts are in USD |
| Parameter | Description |
|---|---|
key | Your API key (required in every request) |
action | One of services, add, status, balance |
Returns the list of active services you can order. Use the service value as the service ID when ordering.
| Parameter | Description |
|---|---|
key | Your API key |
action | services |
curl -X POST https://gniorder.com/api \ -d key='YOUR_API_KEY' \ -d action='services'
<?php
$ch = curl_init('https://gniorder.com/api');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'services',
]),
]);
$response = json_decode(curl_exec($ch), true);
print_r($response);import requests
response = requests.post("https://gniorder.com/api", data={
"key": "YOUR_API_KEY",
"action": "services",
})
print(response.json())const params = new URLSearchParams({
key: 'YOUR_API_KEY',
action: 'services',
});
const res = await fetch('https://gniorder.com/api', { method: 'POST', body: params });
console.log(await res.json());[
{
"service": "12",
"name": "Telegram Channel Members",
"type": "Default",
"category": "Telegram",
"rate": "1.5",
"min": "100",
"max": "50000",
"desc": ""
},
{
"service": "13",
"name": "Instagram Custom Comments",
"type": "Custom Comments",
"category": "Instagram",
"rate": "4",
"min": "5",
"max": "500",
"desc": ""
}
]| Field | Description |
|---|---|
service | Service ID to use in add |
name, category, desc | Service title, category and description |
type | Default (link + quantity) or Custom Comments (link + comments) |
rate | Price in USD per 1000 units |
min, max | Allowed quantity range per order |
Places a new order. The cost is deducted from your balance immediately. If the order cannot be placed, you are not charged.
| Parameter | Description |
|---|---|
key | Your API key |
action | add |
service | Service ID from services |
link | Target link (e.g. https://t.me/example) or @username |
quantity | Quantity, between the service min and max |
comments | Only for Custom Comments services: one comment per line. quantity is not needed; it equals the number of lines. |
Price = rate × quantity / 1000.
curl -X POST https://gniorder.com/api \ -d key='YOUR_API_KEY' \ -d action='add' \ -d service='12' \ -d link='https://t.me/example' \ -d quantity='1000'
<?php
$ch = curl_init('https://gniorder.com/api');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'add',
'service' => '12',
'link' => 'https://t.me/example',
'quantity' => '1000',
]),
]);
$response = json_decode(curl_exec($ch), true);
print_r($response);import requests
response = requests.post("https://gniorder.com/api", data={
"key": "YOUR_API_KEY",
"action": "add",
"service": "12",
"link": "https://t.me/example",
"quantity": "1000",
})
print(response.json())const params = new URLSearchParams({
key: 'YOUR_API_KEY',
action: 'add',
service: '12',
link: 'https://t.me/example',
quantity: '1000',
});
const res = await fetch('https://gniorder.com/api', { method: 'POST', body: params });
console.log(await res.json());curl -X POST https://gniorder.com/api \ -d key=YOUR_API_KEY -d action=add -d service=13 \ -d link='https://instagram.com/p/xyz' \ --data-urlencode $'comments=Great post!\nLove it\nAmazing work'
{
"order": 10025
}order is your tracking code. Use it with the status action.
{
"error": "Insufficient balance."
}Returns the status of one order, or of up to 100 orders in a single request.
| Parameter | Description |
|---|---|
key | Your API key |
action | status |
order | One tracking code (single order) |
orders | Comma separated tracking codes, e.g. 10025,10026 (use instead of order) |
curl -X POST https://gniorder.com/api \ -d key='YOUR_API_KEY' \ -d action='status' \ -d order='10025'
<?php
$ch = curl_init('https://gniorder.com/api');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'status',
'order' => '10025',
]),
]);
$response = json_decode(curl_exec($ch), true);
print_r($response);import requests
response = requests.post("https://gniorder.com/api", data={
"key": "YOUR_API_KEY",
"action": "status",
"order": "10025",
})
print(response.json())const params = new URLSearchParams({
key: 'YOUR_API_KEY',
action: 'status',
order: '10025',
});
const res = await fetch('https://gniorder.com/api', { method: 'POST', body: params });
console.log(await res.json());{
"charge": "1.5",
"start_count": "2310",
"status": "In progress",
"remains": "400",
"currency": "USD"
}curl -X POST https://gniorder.com/api \ -d key='YOUR_API_KEY' \ -d action='status' \ -d orders='10025,10026,99999'
<?php
$ch = curl_init('https://gniorder.com/api');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'status',
'orders' => '10025,10026,99999',
]),
]);
$response = json_decode(curl_exec($ch), true);
print_r($response);import requests
response = requests.post("https://gniorder.com/api", data={
"key": "YOUR_API_KEY",
"action": "status",
"orders": "10025,10026,99999",
})
print(response.json())const params = new URLSearchParams({
key: 'YOUR_API_KEY',
action: 'status',
orders: '10025,10026,99999',
});
const res = await fetch('https://gniorder.com/api', { method: 'POST', body: params });
console.log(await res.json());{
"10025": {
"charge": "1.5",
"start_count": "2310",
"status": "In progress",
"remains": "400",
"currency": "USD"
},
"10026": {
"charge": "0.8",
"start_count": "0",
"status": "Completed",
"remains": "0",
"currency": "USD"
},
"99999": {
"error": "Incorrect order ID"
}
}| Status | Meaning |
|---|---|
Pending | Received, waiting to start |
Processing | Being prepared |
In progress | Running; remains shows what is left |
Completed | Finished |
Partial | Partly delivered. The undelivered part is refunded to your balance automatically |
Canceled | Canceled. The full cost is refunded to your balance automatically |
Returns your current balance.
| Parameter | Description |
|---|---|
key | Your API key |
action | balance |
curl -X POST https://gniorder.com/api \ -d key='YOUR_API_KEY' \ -d action='balance'
<?php
$ch = curl_init('https://gniorder.com/api');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'balance',
]),
]);
$response = json_decode(curl_exec($ch), true);
print_r($response);import requests
response = requests.post("https://gniorder.com/api", data={
"key": "YOUR_API_KEY",
"action": "balance",
})
print(response.json())const params = new URLSearchParams({
key: 'YOUR_API_KEY',
action: 'balance',
});
const res = await fetch('https://gniorder.com/api', { method: 'POST', body: params });
console.log(await res.json());{
"balance": "12.5",
"currency": "USD"
}Add funds from the Telegram bot (💰 Add funds).
On failure the response is a JSON object with an error field. Always check for it before reading other fields.
{
"error": "Invalid API key"
}| Error message | Cause |
|---|---|
Incorrect request | Missing or invalid key, action or required parameters |
Invalid API key | Wrong key, or the account is not approved or is blocked |
Service is offline | Ordering is temporarily disabled |
Incorrect service ID | The service does not exist |
Incorrect quantity | Quantity is not a whole number |
Quantity must be between X and Y. | Out of the service's min/max range |
Insufficient balance. | Balance is lower than the order cost |
This service is not available. | The service is currently disabled |
Incorrect order ID | Order not found on your account |
status no more than once per minute per order; use the multi-order form for many orders.status before retrying, to avoid duplicate orders.rate) can change; always read the current value from services.