Быстрый старт
- Откройте главный бот Green Like: Профиль → API для партнёров. В зеркалах API недоступен.
- Нажмите «Создать API-ключ», скопируйте его и сохраните в переменной окружения своего проекта.
- Выполните запрос
servicesи сохраните нужныйservice— ID услуги. - Перед созданием заказа проверьте баланс через
balance, затем отправьтеadd. - Сохраните полученный
orderи периодически проверяйте его черезstatus.
action, определяющее операцию.Как работает API
Единый баланс
Деньги списываются с того же баланса, который отображается в профиле бота.
Актуальные цены
Каталог возвращает текущие цены главного бота.
Только главный бот
API-ключ, баланс и заказы привязаны к профилю главного Green Like. Зеркала API не выдают.
Свои ID заказов
В ответе возвращается внутренний ID Green Like. ID поставщика не раскрывается.
Все суммы указаны в российских рублях. Поле rate в каталоге — стоимость 1000 единиц услуги. Итоговая стоимость заказа рассчитывается сервером с учётом количества и округления до копеек.
Авторизация
Каждый запрос к /api/v2 должен содержать действующий API-ключ. Поддерживаются два способа.
Рекомендуемый: Bearer-заголовок
Authorization: Bearer ВАШ_API_КЛЮЧ
Совместимый: поле key
key=ВАШ_API_КЛЮЧ
- Не вставляйте ключ в ссылку и не отправляйте запросы методом GET.
- Не храните ключ в открытом репозитории, JavaScript-коде браузера или логах.
- Используйте переменную окружения, например
GREENLIKE_API_KEY.
Формат запросов
Endpoint принимает только POST. Доступны два формата тела:
application/x-www-form-urlencoded— максимальная совместимость;application/json— удобно для современных приложений.
Ответ всегда приходит в JSON, UTF-8. Успешный ответ зависит от метода. Ошибка имеет единый вид:
{
"error": "Описание ошибки на русском языке"
}error. Поэтому всегда проверяйте наличие этого поля, а не только HTTP-код.Получение каталога
Возвращает все активные услуги, текущие цены и допустимые ограничения. Получайте каталог регулярно: цены, названия и лимиты могут изменяться.
Запрос
curl -X POST 'https://api.greenlike.5-104-72-53.sslip.io/api/v2' \ -H 'Authorization: Bearer ВАШ_API_КЛЮЧ' \ -d 'action=services'
Ответ
[
{
"service": 123,
"name": "Telegram просмотры — Россия",
"type": "Default",
"platform": "Telegram",
"category": "Просмотры",
"group": "Один пост",
"description": "Быстрый старт. Просмотры из России...",
"average_time": "12 мин.",
"rate": "75.00",
"min": 100,
"max": 100000,
"refill": false,
"cancel": false
}
]Поля услуги
| Поле | Тип | Описание |
|---|---|---|
service | integer | Уникальный ID услуги. Передаётся в метод add. |
name | string | Название услуги для отображения пользователю. |
type | string | Тип услуги поставщика. |
platform | string | Площадка услуги: Telegram, Instagram, TikTok, YouTube и другие. |
category | string | Раздел каталога. |
group | string | Более точная группа внутри раздела: география, вид публикации или другой признак. |
description | string | Полное актуальное описание, требования к ссылке, скорость и особенности услуги. Может содержать переносы строк. |
average_time | string | Среднее фактическое время выполнения, например 12 мин. или 1 ч. 6 мин.. Пустая строка означает отсутствие статистики. |
rate | string | Цена за 1000 единиц в RUB. |
min | integer | Минимальное количество для одного заказа. |
max | integer | Максимальное количество для одного заказа. |
refill | boolean | Заявлена ли возможность восстановления. |
cancel | boolean | Заявлена ли возможность отмены. |
Создание заказа
Создаёт заказ, списывает его стоимость с общего баланса и возвращает внутренний ID.
Параметры
| Поле | Обязательность | Описание |
|---|---|---|
service | обязательно | ID активной услуги из services. |
link | обязательно | Публичная ссылка http:// или https://, подходящая выбранной услуге. |
quantity | обязательно | Целое число в диапазоне min…max. |
idempotency_key | необязательно, рекомендуется | Уникальный ID заказа в вашей системе: 8–100 символов A-Z a-z 0-9 . _ : -. |
Запрос
curl -X POST 'https://api.greenlike.5-104-72-53.sslip.io/api/v2' \ -H 'Authorization: Bearer ВАШ_API_КЛЮЧ' \ -d 'action=add' \ -d 'service=123' \ -d 'link=https://t.me/channel/10' \ -d 'quantity=1000' \ -d 'idempotency_key=my-order-2026-0001'
Успешный ответ
{
"order": 1254
}Один idempotency_key можно повторять только с теми же service, link и quantity. Повтор с другими параметрами будет отклонён.
Проверки перед отправкой
- Услуга всё ещё присутствует в свежем каталоге.
- Количество попадает в
min…max. - Формат ссылки соответствует описанию услуги.
- На балансе достаточно средств с небольшим запасом на изменение цены.
Если поставщик вообще не принял заявку, API вернёт ошибку, а зарезервированная сумма не останется списанной. После принятия поставщиком заказ считается созданным.
Проверка заказа
Возвращает текущее состояние заказа, его стоимость и оставшееся количество. Ключ может просматривать только заказы, созданные через него.
Параметры
| Поле | Обязательность | Описание |
|---|---|---|
order | обязательно | ID из ответа метода add. |
Запрос и ответ
curl -X POST 'https://api.greenlike.5-104-72-53.sslip.io/api/v2' \
-H 'Authorization: Bearer ВАШ_API_КЛЮЧ' \
-d 'action=status' \
-d 'order=1254'
{
"charge": "75.00",
"start_count": null,
"status": "In progress",
"remains": 420,
"currency": "RUB"
}| Поле | Описание |
|---|---|
charge | Фактически списанная сумма. |
start_count | Стартовое значение; сейчас может быть null. |
status | Текущий статус поставщика. |
remains | Оставшееся невыполненное количество. |
currency | Валюта списания — RUB. |
Основные статусы
| Статус | Что означает |
|---|---|
| Pending | Заказ принят и ожидает запуска. |
| In progress | Заказ выполняется. |
| Completed | Заказ выполнен. |
| Partial | Заказ выполнен частично. |
| Canceled | Заказ отменён поставщиком. |
| Error | Заказ не был создан из-за ошибки. |
Рекомендуемый интервал проверки активного заказа — 30–120 секунд. После конечного статуса постоянный опрос не нужен.
Проверка баланса
Возвращает тот же баланс, который пользователь видит в профиле выбранного бота.
curl -X POST 'https://api.greenlike.5-104-72-53.sslip.io/api/v2' \
-H 'Authorization: Bearer ВАШ_API_КЛЮЧ' \
-d 'action=balance'
{
"balance": "1540.75",
"currency": "RUB"
}Поля денежных значений возвращаются строками. Не используйте float для финансовых расчётов — применяйте Decimal или аналогичный денежный тип.
Ошибки и HTTP-коды
| HTTP | Когда возвращается | Что делать |
|---|---|---|
200 | Успех или логическая ошибка параметров с полем error. | Разобрать JSON и проверить error. |
401 | Ключ неверный, отключён или перевыпущен. | Проверить ключ; при необходимости создать новый. |
405 | Использован не POST-запрос. | Переключить метод на POST. |
413 | Слишком большое тело запроса. | Передавать только необходимые поля. |
429 | Превышен лимит запросов. | Подождать и повторить с экспоненциальной задержкой. |
500 | Временная внутренняя ошибка. | Не создавать новый заказ вслепую; повторить с тем же idempotency_key. |
Частые сообщения
| Ошибка | Причина |
|---|---|
| Неверный или неактивный API-ключ | Ошибка в ключе либо он был перевыпущен. |
| Услуга не найдена или отключена | Каталог устарел; запросите services заново. |
| Допустимое количество: … | quantity находится за пределами услуги. |
| Недостаточно средств | Пополните общий баланс в профиле бота. |
| Заказ не найден | ID неверный или заказ создан другим API-ключом/в другом боте. |
| Поставщик временно не принял заказ | Повторите позже с новым idempotency_key. |
Лимиты и безопасность
- До 120 API-запросов в минуту на один ключ.
- До 20 новых заказов в минуту на один ключ.
- Запросы принимаются только по HTTPS.
- Действует один API-ключ на аккаунт главного бота.
- Перевыпуск не удаляет историю старых API-заказов, но отключает прежний секрет.
При HTTP 429 используйте задержки 2, 4, 8, 16 секунд. Не делайте мгновенные бесконечные повторы.
Готовые примеры кода
Python · requests
import os
import requests
API_URL = "https://api.greenlike.5-104-72-53.sslip.io/api/v2"
API_KEY = os.environ["GREENLIKE_API_KEY"]
def greenlike(action, **params):
response = requests.post(
API_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
json={"action": action, **params},
timeout=60,
)
response.raise_for_status()
data = response.json()
if "error" in data:
raise RuntimeError(data["error"])
return data
services = greenlike("services")
order = greenlike(
"add",
service=services[0]["service"],
link="https://t.me/channel/10",
quantity=1000,
idempotency_key="my-order-2026-0001",
)
print(order["order"])JavaScript · Node.js 18+
const API_URL = "https://api.greenlike.5-104-72-53.sslip.io/api/v2";
const API_KEY = process.env.GREENLIKE_API_KEY;
async function greenlike(action, params = {}) {
const response = await fetch(API_URL, {
method: "POST",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ action, ...params })
});
const data = await response.json();
if (!response.ok || data.error) throw new Error(data.error || `HTTP ${response.status}`);
return data;
}
const result = await greenlike("add", {
service: 123,
link: "https://t.me/channel/10",
quantity: 1000,
idempotency_key: "my-order-2026-0001"
});
console.log(result.order);PHP · cURL
<?php
$apiUrl = 'https://api.greenlike.5-104-72-53.sslip.io/api/v2';
$apiKey = getenv('GREENLIKE_API_KEY');
$payload = [
'action' => 'balance',
];
$curl = curl_init($apiUrl);
curl_setopt_array($curl, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_TIMEOUT => 60,
]);
$data = json_decode(curl_exec($curl), true);
curl_close($curl);
if (isset($data['error'])) {
throw new RuntimeException($data['error']);
}
print_r($data);aiogram · обработчик заказа
import os
import uuid
import aiohttp
async def create_order(service_id: int, link: str, quantity: int):
payload = {
"action": "add",
"service": service_id,
"link": link,
"quantity": quantity,
"idempotency_key": str(uuid.uuid4()),
}
headers = {"Authorization": f"Bearer {os.environ['GREENLIKE_API_KEY']}"}
timeout = aiohttp.ClientTimeout(total=60)
async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.post("https://api.greenlike.5-104-72-53.sslip.io/api/v2", json=payload, headers=headers) as response:
data = await response.json()
if response.status != 200 or "error" in data:
raise RuntimeError(data.get("error", f"HTTP {response.status}"))
return int(data["order"])Чек-лист интеграции
- Ключ хранится на сервере в переменной окружения.
- Каталог и цены обновляются автоматически хотя бы раз в час.
- Перед заказом проверяются
min,max, ссылка и баланс. - У каждого заказа есть постоянный уникальный
idempotency_key. - ID из ответа
addсохраняется в вашей базе. - Обрабатывается поле
errorдаже при HTTP 200. - Для HTTP 429 и 500 настроены ограниченные повторы с задержкой.
- Активные заказы проверяются не чаще одного раза в 30 секунд.