Access
Your API key
Checking authentication...
Keep the key on your server. Never put it in a URL, browser JavaScript, repository or analytics.
Reseller API
Connect your service to the catalog, balance and orders of your TGLift account.
Access
Checking authentication...
Keep the key on your server. Never put it in a URL, browser JavaScript, repository or analytics.
Connection
https://tglift.ru/api/v1X-API-Key: tgl_...Idempotency-Key is requiredContract
| HTTP | URL | Purpose | Main parameters |
|---|---|---|---|
| GET | /api/v1/services | Available TGLift services | locale, currency |
| GET | /api/v1/balance | Account balance | currency |
| GET | /api/v1/orders | Orders, newest first | limit 1-100, offset |
| POST | /api/v1/orders | Create an order | service, fields from orderRequirements |
| GET | /api/v1/orders/{RQ-ID} | Get one order | TGLift order ID only |
| POST | /api/v1/orders/{RQ-ID}/cancel | Request cancellation | The service must support cancellation |
| POST | /api/v1/orders/{RQ-ID}/refill | Request a refill | The service must support refill |
Mutating operations accept POST only. Calling add, cancel or refill through GET returns 405 method_not_allowed.
GET /services
Fetch the catalog before creating an order. The rate field is your public TGLift price in the selected currency. pricingUnit=1000_units means a price per 1,000 units; package means a fixed package price.
[
{
"service": "631",
"name": "Telegram subscribers",
"type": "Default",
"category": "Telegram - Subscribers",
"rate": "250.00",
"ratePer": 1000,
"pricingUnit": "1000_units",
"currency": "RUB",
"min": 100,
"max": 100000,
"refill": true,
"cancel": false,
"orderRequirements": {
"type": "default",
"requiresLink": true,
"requiresQuantity": true,
"quantityFrom": null,
"fields": []
}
}
]
orderRequirements
Do not infer fields from the service name. Use the selected service's orderRequirements; it declares whether a link, quantity and special fields are required.
| type | Fields | Quantity source |
|---|---|---|
default | link, quantity | quantity |
package | link | Fixed package |
custom_comments, custom_replies | link, fields.comments | Number of non-empty lines |
seo | link, quantity, fields.keywords | quantity |
poll | link, quantity, fields.pollAnswer | quantity |
invites_from_groups | link, quantity, fields.groups | quantity |
comment_likes, comment_replies | link, quantity, fields.username | quantity |
mentions_* | username, usernames, hashtag, hashtags or mediaUrl as declared in fields | As declared by quantityFrom |
subscriptions | username, min, max, delay; optional posts, oldPosts, expiry | max |
For JSON requests, put special values inside fields. For application/x-www-form-urlencoded, send them at the top level.
curl -X POST "https://tglift.ru/api/v1/orders" \
-H "X-API-Key: tgl_xxx" \
-H "Idempotency-Key: order-20260722-0001" \
-H "Content-Type: application/json" \
--data '{
"service": "631",
"link": "https://t.me/example_channel/10",
"quantity": 1000,
"locale": "en",
"currency": "USD"
}'
{
"order": "RQ-MRX1ABC2-12AB34",
"status": "pending",
"idempotentReplay": false
}
For a network retry, send the same request with the same key. The API returns the same order with idempotentReplay: true.
GET /orders/{RQ-ID}
{
"order": "RQ-MRX1ABC2-12AB34",
"service": "631",
"status": "in_progress",
"statusMessage": "",
"charge": "250.00",
"currency": "RUB",
"link": "https://t.me/example_channel/10",
"quantity": 1000,
"remains": 420,
"startCount": 15000,
"refundedAmount": "0.00",
"cancelRequestedAt": null,
"refillRequestedAt": null,
"createdAt": "2026-07-22T10:00:00.000Z",
"updatedAt": "2026-07-22T10:05:00.000Z"
}
remains and startCount may be null until values are available. Every public order identifier is a TGLift identifier.
OrderStatus
| Status | Meaning | Integration action |
|---|---|---|
pending | Accepted and waiting to start | Poll at a reasonable interval |
in_progress | Currently running | Continue polling |
completed | Fully completed | Final status |
partial | Partially completed | Final; unused remainder may be refunded automatically |
canceled | Canceled | Final; inspect refundedAmount |
failed | Could not start or complete | Do not automatically retry with a new key; inspect the order |
cancel_requested | Cancellation requested | Wait for a final status |
payment_required | Not enough balance to continue | Add funds |
under_review | TGLift is verifying the processing result | Do not create a duplicate; wait for an update |
{
"ok": false,
"error": "Error description",
"code": "invalid_request",
"requestId": "REQ-...",
"details": {}
}
Keep requestId for support diagnostics. Never send your secret API key in a support request.
Reliability
X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset.Retry-After. For 5xx responses, use exponential backoff with jitter.Idempotency-Key. A network retry of that same order uses the original key and identical parameters.SDK examples
const response = await fetch("https://tglift.ru/api/v1/orders", {
method: "POST",
headers: {
"X-API-Key": process.env.TGLIFT_API_KEY,
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json"
},
body: JSON.stringify({ service: "631", link, quantity: 1000 })
});
const data = await response.json();
if (!response.ok) throw new Error(`${data.code}: ${data.error}`);
import os, uuid, requests
response = requests.post(
"https://tglift.ru/api/v1/orders",
headers={
"X-API-Key": os.environ["TGLIFT_API_KEY"],
"Idempotency-Key": str(uuid.uuid4()),
},
json={"service": "631", "link": link, "quantity": 1000},
timeout=30,
)
response.raise_for_status()
print(response.json())
$payload = json_encode([
"service" => "631",
"link" => $link,
"quantity" => 1000
]);
$ch = curl_init("https://tglift.ru/api/v1/orders");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"X-API-Key: " . getenv("TGLIFT_API_KEY"),
"Idempotency-Key: " . bin2hex(random_bytes(16)),
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30
]);
echo curl_exec($ch);
Compatibility
Existing integrations may continue to send POST /api/v1 with an action field: services, balance, orders, add, status, cancel or refill. New integrations should use the REST endpoints above. Mutating legacy actions also accept POST only.