Документация API
Всё, что нужно для интеграции покупки Telegram-аккаунтов.
Введение
REST API для покупки Telegram-аккаунтов по странам — поштучно и оптом. Списание идёт с баланса, пополняемого криптовалютой. Все ответы в формате JSON. Базовый URL:
https://mukhatg.com/api/v1Авторизация
Каждый запрос должен содержать ваш API-ключ в заголовке x-api-key. Создать ключ можно в кабинете разработчика.
curl https://mukhatg.com/api/v1/profile \
-H "x-api-key: sk_live_ваш_ключ"Цены и скидки
Цена каждой страны рассчитывается автоматически с наценкой. Чем больше вы потратили за всё время, тем выше уровень и постоянная скидка от цены:
| Уровень | Порог трат | Скидка |
|---|---|---|
| Bronze | $50 | 2.5% |
| Silver | $200 | 5% |
| Gold | $500 | 7.5% |
| Platinum | $2000 | 10% |
Скидка применяется к финальной цене автоматически. Актуальные цены всегда возвращает эндпоинт каталога.
Ошибки
При ошибке возвращается соответствующий HTTP-код и тело с полями error и message.
{
"error": "insufficient_balance",
"message": "Not enough balance."
}| Код | Значение |
|---|---|
| 202 | Не ошибка: код ещё готовится, повторите через retry_after сек |
| 401 | Неверный или отсутствующий API-ключ |
| 402 | Недостаточно средств на балансе |
| 404 | Ресурс не найден |
| 409 | Нет в наличии / некорректный статус |
| 429 | Слишком много запросов |
| 502 | Ошибка вышестоящего провайдера |
GET /health
Проверка доступности сервиса и серверного времени. Не требует ключа.
{
"ok": true,
"time": "2026-07-19T12:00:00.000Z"
}GET /catalog
Список доступных стран с вашими персональными ценами (с учётом скидки уровня) и наличием.
curl https://mukhatg.com/api/v1/catalog \
-H "x-api-key: sk_live_ваш_ключ"{
"countries": [
{
"code": "US",
"name": "United States",
"price": 1.39,
"available": true
}
]
}GET /profile
Баланс, уровень скидки и суммарная статистика.
{
"balance": 42.5,
"tier": { "id": "silver", "name": "Silver", "discountPercent": 5 },
"totalSpent": 210.0
}POST /purchases
Создаёт покупку одного аккаунта. Стоимость сразу списывается с баланса, статус — PENDING. Далее запросите код.
curl -X POST https://mukhatg.com/api/v1/purchases \
-H "x-api-key: sk_live_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{ "country_code": "US" }'{
"purchase": {
"id": "pur_a1b2c3",
"mode": "single",
"country": "United States",
"country_code": "US",
"phone": "+1201555....",
"price": 1.39,
"quantity": 1,
"status": "PENDING",
"code": null,
"password": null,
"created_at": "2026-07-19T12:00:00.000Z"
}
}POST /purchases/:id/request-code
Запрашивает код входа для аккаунта. Эндпоинт асинхронный: код приходит от провайдера в течение 5–30 секунд, поэтому с первого раза он почти никогда не готов. В этом случае возвращается HTTP 202 со статусом code_pending. Это не ошибка — повторяйте запрос, пока не получите код.
Важно: статус 202 = «код ещё в пути». Дождитесь retry_after секунд и повторите тот же запрос (polling). Запросы идемпотентны — новый код не создаётся.
Статусы ответа
| HTTP | Статус | Что делать |
|---|---|---|
| 200 | SUCCESS | Код получен — забрать из ответа |
| 202 | code_pending | Подождать retry_after сек и повторить |
| 409 | — | Код уже выдан — забрать через GET /purchases/:id |
| 402 | insufficient_balance | Пополнить баланс |
Запрос
curl -X POST https://mukhatg.com/api/v1/purchases/prc_a1b2c3/request-code \
-H "x-api-key: sk_live_ваш_ключ"Ответ 202 — код ещё не пришёл (повторите запрос)
{
"status": "code_pending",
"message": "Code has not arrived yet. Please retry.",
"retry_after": 5
}Ответ 200 — код получен
{
"id": "prc_a1b2c3",
"status": "SUCCESS",
"code": "41 * * 1",
"two_fa_password": "..."
}Правильный вызов (polling)
Повторяйте запрос, пока не получите 200, уважая retry_after:
async function getCode(purchaseId, apiKey) {
const base = "https://mukhatg.com/api/v1"
for (let attempt = 0; attempt < 20; attempt++) {
const res = await fetch(
`${base}/purchases/${purchaseId}/request-code`,
{ method: "POST", headers: { "x-api-key": apiKey } },
)
// Код готов
if (res.status === 200) {
return await res.json() // { code, two_fa_password, ... }
}
// Код ещё не пришёл — ждём retry_after и повторяем
if (res.status === 202) {
const { retry_after } = await res.json()
await new Promise((r) => setTimeout(r, (retry_after ?? 5) * 1000))
continue
}
// Код уже выдавался ранее — забираем через GET
if (res.status === 409) {
const r = await fetch(`${base}/purchases/${purchaseId}`, {
headers: { "x-api-key": apiKey },
})
return await r.json()
}
throw new Error(`Unexpected status: ${res.status}`)
}
throw new Error("Код не пришёл за отведённое время")
}Альтернатива — вебхук (без polling)
Передайте callback_url — сервер ответит сразу, а код доставит на ваш вебхук, как только он появится. Ваш эндпоинт должен вернуть 200 в течение 5 секунд.
curl -X POST https://mukhatg.com/api/v1/purchases/prc_a1b2c3/request-code \
-H "x-api-key: sk_live_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{ "callback_url": "https://ваш-сайт/webhook" }'POST /purchases/:id/refund
Возврат средств, если код не был получен в течение 20 минут после покупки. Сумма возвращается на баланс.
{
"id": "prc_a1b2c3",
"status": "REFUNDED",
"refunded_at": "2026-07-19T12:05:00.000Z"
}Оптовые заказы
Заказ нескольких аккаунтов одной страны. Результат — ссылка на ZIP-архив. Оптовые заказы не подлежат возврату.
# Создать оптовый заказ
curl -X POST https://mukhatg.com/api/v1/bulk \
-H "x-api-key: sk_live_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{ "country": "US", "quantity": 10 }'
# Проверить статус
curl https://mukhatg.com/api/v1/bulk/blk_xxx -H "x-api-key: sk_live_ваш_ключ"
# Скачать архив
curl -L https://mukhatg.com/api/v1/bulk/blk_xxx/download \
-H "x-api-key: sk_live_ваш_ключ" -o accounts.zipВебхуки
Добавьте URL вебхука в кабинете, чтобы получать события в реальном времени. Мы отправляем POST с JSON и ждём ответ 200 в течение 5 секунд. При ошибке — до 3 повторов.
{
"event": "code.received",
"data": {
"id": "prc_a1b2c3",
"status": "SUCCESS",
"code": "41 * * 1"
}
}События: purchase.created, code.received, purchase.refunded, bulk.created.