ТехподдержкаПоддержкаSupport→

API FoxyStars

FoxyStars API позволяет перепродавать наши товары где угодно: на своём сайте, в Telegram-боте, приложении или магазине. Заказы выполняются автоматически и оплачиваются с вашего баланса в @FoxyStarsShopBot по тем же ценам, что в боте, а цену для своих клиентов вы назначаете сами. Сейчас доступны Telegram Stars, Premium, TON, пополнение Steam, пополнение игр и сервисов (Xbox, PlayStation, Apple, Google Play, Discord Nitro, Roblox и другие), прокси, eSIM, SMM-продвижение, номера для приёма SMS, аренда NFT-подарков, юзернеймов и номеров +888, подписка VPN, аккаунты Netflix и HDrezka, розыгрыши в каналах и пополнение Telegram Ads - список постоянно пополняется.

FoxyStars API lets you resell our products anywhere: on your website, Telegram bot, app or store. Orders are fulfilled automatically and paid from your balance in @FoxyStarsShopBot at the same prices as in the bot, while you set your own price for your customers. Available now: Telegram Stars, Premium, TON, Steam top-ups, game and service top-ups (Xbox, PlayStation, Apple, Google Play, Discord Nitro, Roblox and more), proxies, eSIM, SMM promotion, numbers to receive SMS codes, rental of NFT gifts, usernames and +888 numbers, VPN subscriptions, Netflix and HDrezka accounts, channel giveaways and Telegram Ads top-ups, with more on the way.

Базовый адресBase URL: https://api.foxystarsshop.com ФорматFormat: JSON ВалютаCurrency: RUB

Получить ключGet a key

  1. Откройте @FoxyStarsShopBot и пополните баланс - с него оплачиваются заказы через API. Ключ выдаётся, когда сумма ваших пополнений за всё время достигнет 1000 ₽: деньги остаются на балансе и идут на заказы.Open @FoxyStarsShopBot and top up your balance - API orders are paid from it. The key is issued once your top-ups reach 1000 RUB in total: the money stays on your balance and is spent on orders.
  2. В главном меню бота нажмите кнопку API, затем «Получить ключ».In the bot's main menu tap API, then “Get key”.
  3. Ключ вида fs_live_… всегда можно скопировать кнопкой «Скопировать ключ» в разделе API в боте. Никому его не передавайте. Если ключ попал к чужим - нажмите «Перевыпустить ключ»: старый перестанет работать сразу.You can always copy the fs_live_… key with the “Copy key” button in the bot's API section. Don't share it. If someone else got it, tap “Reissue key”: the old one stops working immediately.

АвторизацияAuthentication

Передавайте ключ в заголовке каждого запроса:

Send the key in a header of every request:

Authorization: Bearer fs_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Можно и заголовком X-API-Key: fs_live_…. Без ключа или с неверным ключом - ответ 401 unauthorized.The X-API-Key: fs_live_… header works too. No key or a wrong key returns 401 unauthorized.

Быстрый стартQuick start

Четыре запроса - и первый заказ готов:

Four requests to your first order:

bash
# 1. балансbalance
curl https://api.foxystarsshop.com/balance -H "Authorization: Bearer $KEY"

# 2. цена 100 звёздprice for 100 stars
curl "https://api.foxystarsshop.com/price?product=stars&quantity=100" -H "Authorization: Bearer $KEY"

# 3. заказorder
curl -X POST https://api.foxystarsshop.com/orders -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"custom_id":"order-1001","product":"stars","quantity":100,"recipient":"@durov"}'

# 4. статус заказа (опрашивайте раз в 3-5 секунд)order status (poll every 3-5 seconds)
curl https://api.foxystarsshop.com/orders/123 -H "Authorization: Bearer $KEY"

Формат ответаResponse format

Успех - "ok": true и данные в data. Ошибка - "ok": false и объект error с машинным кодом и понятным описанием.

Success is "ok": true with the payload in data. An error is "ok": false with an error object holding a machine code and a readable message.

json
{ "ok": true,  "data": { "balance": "1250.00", "currency": "RUB" } }

{ "ok": false, "error": { "code": "insufficient_balance", "message": "not enough balance, top it up in the bot", "price": "146.00" } }
Все суммы - строки в рублях с копейками ("146.00"): так не теряется точность. Время - UTC в формате ISO 8601.All amounts are strings in rubles with kopecks ("146.00") so no precision is lost. Times are UTC in ISO 8601.

Заказы и статусыOrders & statuses

Заказ выполняется в фоне: POST /orders сразу отвечает 202 со статусом pending, дальше вы опрашиваете GET /orders/{id}. Обычно заказ выполняется за 10-60 секунд. Уведомлений о готовности (webhook) нет: статус узнавайте запросом, а за многими заказами удобно следить одним запросом GET /orders?ids=1,2,3.

Orders run in the background: POST /orders replies 202 with status pending right away, then you poll GET /orders/{id}. An order usually completes in 10-60 seconds. There are no ready notifications (webhooks): check the status with a request, and track many orders at once with GET /orders?ids=1,2,3.

СтатусStatusЧто значитMeaningДеньгиMoney
pendingПринят, ждёт выполненияAccepted, waitingещё не списаныnot charged yet
processingОтправляем получателюBeing deliveredсписаныcharged
completedВыполнен, товар у получателя. receipt - номер заказа, как в ботеDone, delivered. receipt is the order number, same as in the botсписаныcharged
failedНе выполнен, причина в errorNot done, reason in errorrefunded: true - списывали и вернули на баланс; false - не списывалиrefunded: true - charged and returned to balance; false - never charged

Сколько реально списано - в полях заказа charged и refunded_amount (у SMM они учитывают и частичный возврат за невыполненную часть, у SMS - возврат за номер, на который не пришла SMS).

How much was actually charged is in the order's charged and refunded_amount fields (for SMM they include a partial refund for the undelivered part, for SMS - the refund for a number that got no SMS).

Если заказ не выполнился, сумма возвращается на баланс автоматически. Если сервис, через который выполняется заказ, не ответил (обрыв связи, перезапуск), заказ остаётся processing, пока результат не подтвердится - обычно это минуты: выдача подтвердилась - completed, отказ подтвердился - failed с возвратом. Вслепую деньги не возвращаются и повторно не списываются. Если заказ Steam или подарочной карты позже отменится на стороне сервиса, заказ станет failed с кодом supplier_cancelled, а деньги вернутся на баланс. Если заказ отменили вручную с нашей стороны (по обращению), код будет cancelled, деньги тоже вернутся на баланс.If an order fails, the amount returns to your balance automatically. If the service fulfilling the order did not answer (connection drop, restart), the order stays processing until the outcome is confirmed - usually minutes: delivery confirmed - completed, refusal confirmed - failed with a refund. Money is never refunded blindly or charged twice. If a Steam or gift card order is later cancelled on the service side, the order becomes failed with code supplier_cancelled and the money returns to your balance. If we cancel an order manually on our side (on request), the code is cancelled and the money also returns to your balance.

result.status: "checking" (SMM, розыгрыши, реклама, продление прокси) - заказ мог уже уйти в работу, но подтверждение не дошло: заказ проверяет наша поддержка вручную, деньги списаны. Если заказ не выполнен, поддержка вернёт их на баланс.

result.status: "checking" (SMM, giveaways, ads, proxy renewal) - the order may already be in progress but the confirmation was lost: our support checks it manually, the money is charged. If it was not fulfilled, support returns it to your balance.

custom_id и повторыcustom_id & retries

custom_id - ваш уникальный номер заказа (1-64 символа, например номер заказа на вашем сайте). Он защищает от двойной оплаты:

custom_id is your unique order id (1-64 characters, e.g. the order number on your website). It protects from double charges:

• Повтор запроса с тем же custom_id и теми же данными вернёт уже созданный заказ а в ответе рядом с data будет "idempotent_replay": true - второй раз ничего не спишется.
• Тот же custom_id с другими данными (в том числе с другим max_price) - ошибка 409 custom_id_conflict.
• Оборвалась связь, пришёл таймаут или 5xx? Повторите запрос с тем же custom_id - это безопасно.
• Заказ со статусом failed окончательный: чтобы попробовать снова, создайте заказ с новым custom_id.

• Repeating a request with the same custom_id and the same data returns the existing order and the reply has "idempotent_replay": true next to data - nothing is charged twice.
• The same custom_id with different data (including a different max_price) is a 409 custom_id_conflict.
• Connection dropped, timeout or 5xx? Retry with the same custom_id - it is safe.
• An order with status failed is final: to try again, create an order with a new custom_id.

Необязательный max_price - потолок цены: если цена успела вырасти выше него, заказ не создаётся (409 price_changed, в ответе текущая цена).

Optional max_price is a price ceiling: if the price has risen above it, no order is created (409 price_changed, the current price is in the reply).

ТоварыProducts

productТоварProductquantityrecipient
starsTelegram Starsзвёзд, от 50 до 25 000stars, 50 to 25,000@username в TelegramTelegram @username
premiumTelegram Premiumмесяцев: 3, 6 или 12months: 3, 6 or 12@username в TelegramTelegram @username
tonПополнение TONTON top-upTON, от 1 до 10 000TON, 1 to 10,000@username в TelegramTelegram @username
steamПополнение SteamSteam top-upв params: login - логин Steam, amount_usd - сколько долларов зачислить, от 1 до 500 (до центов, например "5.00")in params: login - Steam login, amount_usd - dollars to credit, 1 to 500 (cents allowed, e.g. "5.00")
giftcardПополнение игр и сервисов - 19 штук: Xbox, PlayStation, Apple, Google Play, Discord Nitro, Roblox, Netflix, Valorant и другие (полный список)Top-ups for games and services - 19 of them: Xbox, PlayStation, Apple, Google Play, Discord Nitro, Roblox, Netflix, Valorant and more (full list)в params: brand и service_id из GET /catalog. Код карты придёт в result.codesin params: brand and service_id from GET /catalog. The card code comes in result.codes
proxyПрокси IPv4 / IPv6 (HTTP, HTTPS, SOCKS5)IPv4 / IPv6 proxies (HTTP, HTTPS, SOCKS5)в params: version (ipv4 - личные, ipv4_shared - общие, ipv6), country из GET /catalog, period - дней, count - от 1 до 10in params: version (ipv4 dedicated, ipv4_shared shared, ipv6), country from GET /catalog, period in days, count 1 to 10
esimeSIM с интернетом для поездок (200+ стран и регионы)Travel data eSIM (200+ countries and regions)в params: plan_id из GET /catalog. В result - iccid и строка lpa для установкиin params: plan_id from GET /catalog. result has iccid and the lpa install string
smmПродвижение: подписчики, просмотры, реакции, лайки (Telegram, YouTube, TikTok, VK и др.)Promotion: followers, views, reactions, likes (Telegram, YouTube, TikTok, VK and more)в params: service_id из GET /catalog, link, quantity (+ доп. поле, если услуга его требует)in params: service_id from GET /catalog, link, quantity (+ an extra field if the service needs one)
smsНомер для приёма SMS с кодом (Telegram, WhatsApp, Google и ещё 800 сервисов)A number to receive an SMS code (Telegram, WhatsApp, Google and 800 more services)в params: service и country из GET /catalogin params: service and country from GET /catalog
nft_rent
username_rent
number_rent
Аренда NFT-подарков Telegram, юзернеймов и анонимных номеров +888Rental of Telegram NFT gifts, usernames and anonymous +888 numbersв params: address лота из GET /catalog и days; для продления своей аренды - extend: truein params: lot address from GET /catalog and days; to extend your own rental - extend: true
vpnПодписка VPN (VLESS, WireGuard, AmneziaWG)VPN subscription (VLESS, WireGuard, AmneziaWG)в params: plan из GET /catalog; для продления - subscription_order_idin params: plan from GET /catalog; to extend - subscription_order_id
cinemaОбщий аккаунт Netflix или HDrezka на срокShared Netflix or HDrezka account for a termв params: service (netflix, hdrezka) и months из GET /catalog; для продления - extend_order_idin params: service (netflix, hdrezka) and months from GET /catalog; to extend - extend_order_id
giveawayРозыгрыш звёзд или Telegram Premium в каналеTelegram Stars or Premium giveaway in a channelв params: kind, channel, winners и stars или months - см. нижеin params: kind, channel, winners and stars or months - see below
adsПополнение рекламного кабинета Telegram AdsTelegram Ads account top-upв params: link (ссылка на оплату из кабинета) и ton - от 20 до 10 000in params: link (payment link from the ads account) and ton - 20 to 10,000
proxy_renewПродление прокси из заказа proxyRenewal of proxies from a proxy orderв params: order_id заказа прокси и period - дней (3, 7, 14, 30, 60, 90)in params: order_id of the proxy order and period in days (3, 7, 14, 30, 60, 90)
esim_topupПополнение трафика eSIM из заказа esimData top-up for an eSIM from an esim orderв params: order_id заказа eSIM и package_id из GET /catalogin params: order_id of the eSIM order and package_id from GET /catalog

У звёзд, Premium и TON поля quantity и recipient передаются прямо в теле заказа. У остальных товаров параметры лежат в объекте params, например:

For Stars, Premium and TON the quantity and recipient fields go right in the order body. Other products take their parameters in a params object, for example:

json
{ "custom_id": "order-2001", "product": "steam", "params": { "login": "gabelogannewell", "amount_usd": "5.00" } }

Цена Steam: GET /price?product=steam&amount_usd=5.00. Логин проверяется до списания: несуществующий аккаунт - 422 invalid_recipient.Steam price: GET /price?product=steam&amount_usd=5.00. The login is checked before charging: an unknown account returns 422 invalid_recipient.

Telegram-получателя можно указать как @durov, durov или t.me/durov. Цены совпадают с ценами бота и меняются вместе с курсом - берите актуальную через GET /price. Другие товары бота появятся в API следующими обновлениями.A Telegram recipient can be @durov, durov or t.me/durov. Prices match the bot and follow the exchange rate - get the current one via GET /price. More of the bot's products will come to the API in later updates.

ЛимитыLimits

ЛимитLimitЗначениеValueПри превышенииWhen exceeded
Запросов на ключRequests per key60 в минуту60 per minute429 rate_limited + Retry-After
Цены, каталог, заказы и действияPrices, catalog, orders and actions30 в минуту (входят в общие 60; чтение заказов сюда не входит)30 per minute (within the 60; reading orders is not counted)429 rate_limited + Retry-After
Незавершённых заказовActive orders5 одновременно5 at a time429 too_many_active_orders + Retry-After
Неудачных заказовFailed orders30 в час30 per hour429 too_many_failed_orders + Retry-After
Неверных ключей с одного IPInvalid keys from one IP20 в минуту20 per minute429 rate_limited + Retry-After
Обновление заказов у исполнителя при чтенииLive order refresh on read30 в минуту30 per minuteбез ошибки: сверх лимита заказ отдаётся с последними известными даннымиno error: above the limit the order is returned with the last known data
Размер запросаRequest size16 KB413 too_large

ОшибкиErrors

HTTPcodeЧто делатьWhat to do
400bad_requestТело - не JSON-объектBody is not a JSON object
401unauthorizedНет ключа или он неверный/отключёнMissing, wrong or disabled key
402insufficient_balanceПополните баланс в боте (в ответе - нужная сумма)Top up in the bot (the reply includes the price)
403product_unavailableТовар временно снят с продажиProduct is temporarily unavailable
403forbiddenДоступ закрыт - напишите в поддержку @FoxyStarsSupportAccess denied - contact support at @FoxyStarsSupport
404not_foundНет такого заказа или методаNo such order or endpoint
405method_not_allowedНе тот HTTP-метод (GET/POST)Wrong HTTP method (GET/POST)
409custom_id_conflictcustom_id уже занят другим заказомcustom_id is already used by another order
409lot_unavailableЛот занят или снят с аренды - выберите другойThe lot is taken or no longer for rent - pick another
409rental_expiredАренда уже закончиласьThe rental has ended
409login_not_startedСначала начните вход в Telegram по номеруStart the Telegram login with the number first
409subscription_not_foundПодписки для продления больше нет - купите новуюThe subscription to extend no longer exists - buy a new one
409proxy_expiredПрокси истекли - продлить нельзя, купите новыеProxies have expired - buy new ones
409topup_unavailableЭту eSIM пополнить нельзя (истекла или отменена)This eSIM can't be topped up (expired or cancelled)
409cancel_unavailableЗаказ SMM нельзя отменить: уже выполнен или услуга не поддерживает отменуThe SMM order can't be canceled: it is already done or the service does not support cancel
409refill_unavailableВосстановление недоступно для этого заказаRefill is not available for this order
409link_busyНа эту ссылку уже выполняется SMM-заказAn SMM order for this link is already running
409order_not_completedДействие доступно только для выполненного заказаThe action is only available for a completed order
409too_earlyНомер SMS пока нельзя отменить - подождите Retry-After секундThe SMS number can't be cancelled yet - wait Retry-After seconds
409sms_receivedSMS уже пришла - номер нельзя отменить с возвратомAn SMS already arrived - the number can't be cancelled with a refund
409order_not_activeНомер SMS уже не активен (завершён или отменён)The SMS number is no longer active (finished or cancelled)
409renew_unavailableВ заказе нечего продлеватьNothing to renew in this order
409price_changedЦена выше вашего max_pricePrice is above your max_price
413too_largeТело запроса больше 16 KBRequest body is over 16 KB
422bind_failedПривязка не прошла - возьмите свежую ссылку tc:// и повторитеBinding failed - get a fresh tc:// link and retry
422validation_errorНеверный параметр - подробности в messageInvalid parameter - see message
422invalid_recipientПолучатель не найден: пользователь Telegram, аккаунт Steam или канал розыгрышаRecipient not found: a Telegram user, a Steam account or a giveaway channel
422recipient_rejectedПолучателю нельзя это купить (например, Premium уже есть)This can't be bought for the recipient (e.g. already has Premium)
429rate_limitedПодождите Retry-After секундWait Retry-After seconds
429too_many_active_ordersДождитесь завершения текущих заказовWait for active orders to finish
429too_many_failed_ordersСлишком много неудачных заказов за час - проверьте данные заказов и повторите позжеToo many failed orders in an hour - check your order data and retry later
500internal_errorПовторите позже с тем же custom_idRetry later with the same custom_id
503out_of_stockТовар временно закончился - повторите позжеTemporarily out of stock - retry later
503upstream_unavailableСервис не ответил - повторите с тем же custom_idThe service didn't respond - retry with the same custom_id

Если заказ уже создан, но не выполнился, причина будет в поле error самого заказа: price_changed, out_of_stock, insufficient_balance, supplier_error, supplier_cancelled, cancelled, upstream_unavailable, interrupted, product_unavailable, forbidden, lot_unavailable, link_busy, proxy_expired, subscription_not_found, internal_error.

If an order was created but not completed, the reason is in the order's own error field: price_changed, out_of_stock, insufficient_balance, supplier_error, supplier_cancelled, cancelled, upstream_unavailable, interrupted, product_unavailable, forbidden, lot_unavailable, link_busy, proxy_expired, subscription_not_found, internal_error.

МетодыEndpoints

GET/balance

Баланс вашего аккаунта в боте.

Your account balance in the bot.

200
{ "ok": true, "data": { "balance": "1250.00", "currency": "RUB" } }

GET/products

Список товаров и допустимое количество.

Products and allowed quantities.

200
{ "ok": true, "data": [
  { "product": "stars", "title": "Telegram Stars", "recipient": "Telegram username",
    "quantity": { "min": 50, "max": 25000, "unit": "stars" } },
  { "product": "premium", "title": "Telegram Premium", "recipient": "Telegram username",
    "quantity": { "choices": [3, 6, 12], "unit": "months" } },
  { "product": "ton", "title": "TON top-up", "recipient": "Telegram username",
    "quantity": { "min": 1, "max": 10000, "unit": "TON" } },
  ... steam, giftcard, proxy, proxy_renew, esim, esim_topup, smm, sms, nft_rent, username_rent, number_rent, vpn, cinema, giveaway, ads
] }

GET/price?product=stars&quantity=100

Текущая цена. Параметры: product и параметры товара - те же, что в заказе, только строкой запроса. У звёзд, Premium и TON это quantity (получатель не нужен), у остальных - поля из params, например ?product=steam&amount_usd=5.00, ?product=esim&plan_id=..., ?product=smm&service_id=...&quantity=1000, ?product=proxy_renew&order_id=...&period=30.

Current price. Parameters: product plus the product's parameters - the same as in the order, just as a query string. For Stars, Premium and TON it is quantity (no recipient needed); for other products - the params fields, e.g. ?product=steam&amount_usd=5.00, ?product=esim&plan_id=..., ?product=smm&service_id=...&quantity=1000, ?product=proxy_renew&order_id=...&period=30.

200
{ "ok": true, "data": { "product": "stars", "quantity": 100, "unit_price": "1.46", "price": "146.00", "currency": "RUB" } }

Пополнения игр и сервисовGame and service top-ups

Все пополнения, кроме Steam, - это товар giftcard: в params передаётся brand из таблицы и service_id номинала из GET /catalog. Покупатель получает код в result.codes и активирует его сам. Steam - отдельный товар steam: деньги зачисляются прямо на аккаунт по логину.

All top-ups except Steam are the giftcard product: pass the brand from the table and the item's service_id from GET /catalog in params. The buyer gets a code in result.codes and redeems it. Steam is a separate steam product: money is credited straight to the account by login.

brandСервисService
xboxПополнение XboxXbox top-up
psnПополнение PlayStationPlayStation top-up
appleПополнение Apple (App Store, iTunes)Apple (App Store, iTunes) top-up
googleplayПополнение Google PlayGoogle Play top-up
discordПополнение Discord NitroDiscord Nitro top-up
robloxПополнение RobloxRoblox top-up
netflixПополнение NetflixNetflix top-up
valorantПополнение ValorantValorant top-up
lolПополнение League of LegendsLeague of Legends top-up
battlenetПополнение Battle.netBattle.net top-up
nintendoПополнение NintendoNintendo top-up
amazonПополнение AmazonAmazon top-up
twitchПополнение TwitchTwitch top-up
pubgПополнение PUBG MobilePUBG Mobile top-up
freefireПополнение Free FireFree Fire top-up
mlbbПополнение Mobile LegendsMobile Legends top-up
hokПополнение Honor of KingsHonor of Kings top-up
standoffПополнение Standoff 2Standoff 2 top-up
exitlagПополнение ExitLagExitLag top-up

Страны и номиналы у каждого сервиса свои и зависят от наличия - смотрите GET /catalog?product=giftcard&brand=.... Если номинал раскупили, он пропадает из каталога и появляется снова после завоза.Countries and denominations differ per service and depend on stock - see GET /catalog?product=giftcard&brand=.... Sold-out items disappear from the catalog and come back after restock.

GET/catalog?product=giftcard

Что именно можно купить у товаров с выбором: сначала список брендов, потом номиналы бренда с ценами. Показано только то, что сейчас в наличии.

What exactly can be bought for products with options: first the list of brands, then a brand's items with prices. Only items in stock are listed.

GET /catalog?product=giftcard
{ "ok": true, "data": { "product": "giftcard", "brands": [
  { "brand": "xbox", "title": "Xbox" }, { "brand": "roblox", "title": "Roblox" }, ...
] } }
GET /catalog?product=giftcard&brand=roblox
{ "ok": true, "data": { "product": "giftcard", "brand": "roblox", "currency": "RUB", "items": [
  { "service_id": 2618, "country": "GLOBAL", "nominal": "50 R$", "price": "89.81" }, ...
] } }

Заказ карты и её цена:

Ordering a card and checking its price:

json
POST /orders
{ "custom_id": "order-3001", "product": "giftcard", "params": { "brand": "roblox", "service_id": 2618 }, "max_price": "95.00" }

GET /price?product=giftcard&brand=roblox&service_id=2618

Готовый заказ:

A completed order:

result
"result": { "brand": "roblox", "service_id": 2618, "nominal": "50 R$", "country": "GLOBAL",
            "codes": ["XXXX-XXXX-XXXX"] }

Цены в каталоге обновляются раз в полчаса, при заказе цена считается заново (используйте max_price). Изредка код приходит с задержкой: тогда заказ уже completed, в result будет "codes": [] и "pending": true - запросите заказ ещё раз через минуту, код появится.Catalog prices refresh every 30 minutes; the price is recalculated when you order (use max_price). Rarely the code arrives with a delay: the order is already completed and result has "codes": [] and "pending": true - fetch the order again in a minute and the code will be there.

GET/catalog?product=proxy

Без version - версии и допустимые сроки, с version - страны, где они есть.

Without version: versions and allowed periods; with version: available countries.

GET /catalog?product=proxy
{ "ok": true, "data": { "product": "proxy", "versions": [
  { "version": "ipv4", "title": "Dedicated IPv4", "periods": [7, 14, 30, 60, 90] },
  { "version": "ipv4_shared", "title": "Shared IPv4", "periods": [7, 14, 30, 60, 90] },
  { "version": "ipv6", "title": "IPv6", "periods": [3, 7, 14, 30, 60, 90] }
], "count": { "min": 1, "max": 10 } } }
GET /catalog?product=proxy&version=ipv6
{ "ok": true, "data": { "product": "proxy", "version": "ipv6", "countries": ["de", "nl", "ru", "us", ...] } }

Заказ, цена и готовый результат:

Order, price and the completed result:

json
POST /orders
{ "custom_id": "order-4001", "product": "proxy",
  "params": { "version": "ipv4", "country": "de", "period": 30, "count": 2 } }

GET /price?product=proxy&version=ipv4&period=30&count=2

"result": { "version": "ipv4", "country": "de", "period": 30, "count": 2,
  "protocols": ["http", "https", "socks5"],
  "proxies": [ { "id": "10000001", "host": "203.0.113.10", "ip": "203.0.113.10", "port": 8000,
                 "user": "aB3dE", "pass": "fG7hJ", "expires_at": "2026-10-29T10:00:00Z" }, ... ] }

Если выдано меньше прокси, чем заказано, списывается только за выданные - price заказа уменьшится, разница вернётся на баланс. Купленные прокси видны в боте в разделе «Мои прокси» - там же их можно продлить.If fewer proxies are delivered than ordered, you pay only for those delivered: the order's price goes down and the difference returns to your balance. Purchased proxies also appear in the bot under "My proxies", where they can be renewed.

GET/catalog?product=esim

Без country - коды стран, где есть тарифы. С country=TR - тарифы страны, с country=REGIONAL - тарифы на несколько стран (в поле region).

Without country: country codes with plans. With country=TR: that country's plans; with country=REGIONAL: multi-country plans (see region).

GET /catalog?product=esim&country=TR
{ "ok": true, "data": { "product": "esim", "country": "TR", "currency": "RUB", "plans": [
  { "plan_id": "529faa9f-4ea7-49f1-abde-ca4d46352092", "country": "TR", "region": "",
    "data_gb": 0.5, "is_unlimited": false, "validity_days": 7, "price": "63.00" }, ...
] } }
json
POST /orders
{ "custom_id": "order-5001", "product": "esim", "params": { "plan_id": "529faa9f-4ea7-49f1-abde-ca4d46352092" } }

"result": { "plan_id": "529faa9f-...", "country": "TR", "data_gb": 0.5, "validity_days": 7,
            "iccid": "8997250000000000000", "lpa": "LPA:1$rsp-eu.example.com$ACTIVATION-CODE" }

Строку lpa закодируйте в QR-код - телефон установит eSIM, отсканировав его. Её же можно ввести вручную. Срок действия начинается при первом подключении к сети в стране тарифа.Encode the lpa string as a QR code: the phone installs the eSIM by scanning it. It can also be entered manually. Validity starts on first connection in the plan's country.

GET/catalog?product=smm

Три уровня: площадки → &platform=telegram типы услуг → &platform=telegram&type=views услуги. Цена услуги указана за price_per штук (обычно 1000).

Three levels: platforms → &platform=telegram service types → &platform=telegram&type=views services. A service's price is per price_per units (usually 1000).

GET /catalog?product=smm&platform=telegram&type=followers
{ "ok": true, "data": { "product": "smm", "currency": "RUB", "services": [
  { "service_id": 458, "name": "Быстрые подписчики", "price": "8.00", "price_per": 1000,
    "min": 10, "max": 40000, "guarantee_days": 0, "cancel": true, "input": null, "link": "url" }, ...
] } }

link: "url" - нужна полная ссылка с https://, "text" - @username или ключевое слово. Если input не null, передайте это поле в params: comments - список комментариев (тогда quantity не нужен: это число комментариев), keywords, username или poll_answer - номер варианта ответа. cancel: true - заказ этой услуги можно отменить, пока он не выполнен (см. «Отмена SMM» ниже). Для GET /price эти поля не нужны: у услуг с комментариями передайте quantity = число комментариев.

link: "url" means a full https:// link, "text" means @username or a keyword. If input is not null, pass that field in params: comments as a list of comments (then quantity is not needed: it equals the number of comments), keywords, username or poll_answer as the answer number. cancel: true means an order of this service can be canceled while it is not done yet (see "SMM cancel" below). GET /price does not need these fields: for comment services pass quantity = the number of comments.

json
POST /orders
{ "custom_id": "order-6001", "product": "smm",
  "params": { "service_id": 458, "link": "https://t.me/your_channel", "quantity": 1000 } }

"result": { "service_id": 458, "link": "https://t.me/your_channel", "quantity": 1000,
            "status": "in_progress", "remains": 400, "refunded": "0.00",
            "cancel_requested": false }

SMM-заказ выполняется от нескольких минут до суток. Статус заказа API станет completed, как только услугу приняли в работу, а ход выполнения смотрите в result.status: pending → in_progress → completed, либо partial (выполнено частично) / canceled. За невыполненную часть деньги сами возвращаются на баланс - сумма в result.refunded. checking - заказ проверяется вручную, при отмене деньги вернутся. Пока заказ на ссылку не завершён, второй на ту же ссылку и услугу не принимается (409 link_busy). Заказ, который ещё не выполнен, можно отменить - см. «Отмена SMM».

An SMM order takes from a few minutes to a day. The API order becomes completed as soon as the service accepts it; follow progress in result.status: pending → in_progress → completed, or partial (partially done) / canceled. Money for the undelivered part returns to your balance automatically, see result.refunded. checking means the order is being verified manually; if it's canceled, the money comes back. While an order for a link is running, a second one for the same link and service is rejected (409 link_busy). An order that is not done yet can be canceled - see "SMM cancel".

GET/catalog?product=sms

Номер для приёма SMS. Без service - список сервисов (популярные сверху, поиск &q=), с &service=tg - страны, где есть номера: цена и остаток.

A number to receive an SMS. Without service - the list of services (popular first, search with &q=); with &service=tg - countries with numbers, price and stock.

GET /catalog?product=sms&service=tg
{ "ok": true, "data": { "product": "sms", "service": "tg", "name": "Telegram", "currency": "RUB",
  "code_wait_minutes": 20, "countries": [ { "country": 6, "name": "Indonesia", "iso": "id", "price": "36.00", "count": 29920 }, ... ] } }
json
{ "custom_id": "sms-1", "product": "sms", "params": { "service": "tg", "country": 6 } }

Заказ станет completed, как только номер выдан. Дальше следите за result.status: waiting - ждём SMS, received - код в result.code (все коды - result.codes), finished - завершён, cancelled - отменён, деньги вернулись (result.refunded).

The order becomes completed once the number is issued. Then follow result.status: waiting - waiting for an SMS, received - the code is in result.code (all codes in result.codes), finished - done, cancelled - cancelled and refunded (result.refunded).

result
{ "number": "6281200000123", "service": "tg", "country": 6, "status": "received",
  "code": "Telegram code 12345", "codes": ["Telegram code 12345"], "expires_at": "2026-09-29T12:20:00Z", "refunded": "0.00" }
ДействиеActionЧто делаетWhat it does
POST /orders/{id}/cancelОтменить номер и вернуть деньги. Можно через 2 минуты после покупки и только если SMS ещё не приходила (раньше - 409 too_early + Retry-After, после кода - 409 sms_received)Cancel the number and refund. Possible 2 minutes after purchase and only if no SMS has arrived (earlier - 409 too_early + Retry-After, after a code - 409 sms_received)
POST /orders/{id}/resendЗапросить ещё одну SMS на тот же номер - после того как первый код пришёлRequest another SMS to the same number - after the first code has arrived
POST /orders/{id}/replaceЗаменить номер, если SMS не идёт: через 2 минуты после покупки, пока SMS не было. Деньги второй раз не списываются, в ответе новый numberReplace the number if no SMS is coming: 2 minutes after purchase while no SMS has arrived. No extra charge; the reply has the new number
POST /orders/{id}/finishЗавершить номер, когда все коды полученыFinish the number once you have all the codes
Не пришла SMS за время жизни номера (обычно 20 минут, у Яндекса 40, у Instagram час) - номер отменится сам, а деньги вернутся на баланс. Уведомлений нет: опрашивайте заказ, удобно пачкой через GET /orders?ids=....If no SMS arrives within the number's lifetime (usually 20 minutes, 40 for Yandex, an hour for Instagram), the number is cancelled automatically and the money returns to your balance. There are no notifications: poll the order, e.g. in batches with GET /orders?ids=....

GET/catalog?product=nft_rent

Лоты в аренду. У nft_rent сначала список коллекций, потом &collection=Voodoo%20Dolls - лоты коллекции. У username_rent и number_rent лоты сразу, есть поиск &q=. Везде есть &limit= (до 500) и &offset=.

Lots for rent. For nft_rent, first the list of collections, then &collection=Voodoo%20Dolls for its lots. username_rent and number_rent list lots directly, with &q= search. All support &limit= (up to 500) and &offset=.

GET /catalog?product=username_rent&limit=1
{ "ok": true, "data": { "product": "username_rent", "currency": "RUB", "fee": "8.29", "total": 100,
  "items": [ { "address": "EQClfmNWMmseqPzyYIgkvZgqPSj3gr0XWctbqxodOEY2F7Sl", "name": "@aibisai",
               "price_per_day": "1.51", "min_days": 1, "max_days": 180 } ] } }

Стоимость аренды = days × price_per_day + fee (разовый сбор сети), с округлением вверх. Точную сумму даёт GET /price?product=username_rent&address=...&days=1. Цену лота назначает его владелец и может поменять - используйте max_price.

Rental cost = days × price_per_day + fee (a one-time network fee), rounded up. The exact total comes from GET /price?product=username_rent&address=...&days=1. The lot owner sets and may change the price - use max_price.

json
POST /orders
{ "custom_id": "order-7001", "product": "username_rent",
  "params": { "address": "EQClfmNWMmseqPzyYIgkvZgqPSj3gr0XWctbqxodOEY2F7Sl", "days": 7 } }

"result": { "address": "EQClfm...", "name": "@aibisai", "days": 7, "extend": false,
            "rented_until": "2026-10-06T05:48:45Z" }

POST/orders/{order_id}/bind

Для nft_rent и username_rent: привязать арендованный лот к аккаунту Fragment покупателя. Передайте ссылку TON Connect из Fragment (начинается с tc://). Работает, пока аренда действует.

For nft_rent and username_rent: bind the rented lot to the buyer's Fragment account. Pass the TON Connect link from Fragment (starts with tc://). Works while the rental is active.

json
POST /orders/8/bind
{ "link": "tc://?v=2&id=..." }

{ "ok": true, "data": { "order_id": 8, "address": "EQClfm...", "bound": true } }

POST/orders/{order_id}/login-code

Для number_rent: код входа в Telegram по арендованному номеру. Сначала начните вход в Telegram с этим номером, потом запросите код. Пока вход не начат - 409 login_not_started.

For number_rent: the Telegram login code for the rented number. Start logging in to Telegram with the number first, then request the code. Until then you get 409 login_not_started.

200
{ "ok": true, "data": { "order_id": 9, "address": "EQBNcg...", "code": "12345" } }

Продление: новый заказ с тем же address и extend: true - дни добавятся к текущему сроку. Продлить можно только свою действующую аренду и только если владелец лота это разрешает.Extending: a new order with the same address and extend: true - days are added to the current term. Only your own active rental can be extended, and only if the lot owner allows it.

GET/catalog?product=vpn

Тарифы VPN. Каждый заказ - отдельная подписка со своей ссылкой: отдайте её клиенту, по ней он подключит устройства (число устройств - в devices).

VPN plans. Each order is a separate subscription with its own link: give it to your customer to connect their devices (device limit in devices).

GET /catalog?product=vpn
{ "ok": true, "data": { "product": "vpn", "currency": "RUB", "plans": [
  { "plan": "1m", "title": "1 month", "days": 30, "devices": 5, "price": "150.00" }, ...
] } }
json
POST /orders
{ "custom_id": "order-8001", "product": "vpn", "params": { "plan": "1m" } }

"result": { "plan": "1m", "days": 30, "devices": 5, "subscription_order_id": 9,
            "subscription_url": "https://vpnbest.net/v17h...", "expires_at": "2026-10-29T05:53:21Z" }

Продление: новый заказ с "subscription_order_id": 9 (номер заказа, которым подписка была куплена) - дни добавятся к той же подписке, ссылка не меняется. В expires_at заказа всегда актуальный срок.

Extending: a new order with "subscription_order_id": 9 (the order that bought the subscription) - days are added to the same subscription and the link stays the same. The order's expires_at always shows the current term.

GET/catalog?product=cinema

Сервисы и сроки с ценами. Заказ выполняется сразу, данные для входа - в result.credentials (логин:пароль).

Services and terms with prices. The order completes immediately; login data is in result.credentials (login:password).

json
POST /orders
{ "custom_id": "order-9001", "product": "cinema", "params": { "service": "netflix", "months": 1 } }

"result": { "service": "netflix", "months": 1, "credentials": "login:password",
            "expires_at": "2026-10-29T06:00:00Z", "expired": false }

Аккаунт общий: менять его данные нельзя. Если данные аккаунта сменятся, в заказе сразу будут новые - запрашивайте заказ, когда клиенту нужно войти. После окончания срока credentials становится null.

The account is shared: its login data must not be changed. If the account data changes, the order shows the new data right away - fetch the order when your customer needs to log in. After the term ends, credentials becomes null.

GET/catalog?product=giveaway

Розыгрыш оформляется в канале с публичным @username. У звёзд stars - это общий банк на всех победителей (у каждого не меньше 100 звёзд), допустимые банки зависят от числа победителей: GET /catalog?product=giveaway&winners=5. У Premium months - срок подписки каждому победителю. Цена зависит от канала, приза и числа победителей - смотрите GET /price.

The giveaway is set up in a channel with a public @username. For Stars, stars is one prize pool shared by all winners (at least 100 stars each); allowed pools depend on the number of winners: GET /catalog?product=giveaway&winners=5. For Premium, months is the subscription each winner gets. The price depends on the channel, prize and winners - use GET /price.

json
GET /price?product=giveaway&kind=stars&channel=your_channel&winners=5&stars=1000

POST /orders
{ "custom_id": "order-10001", "product": "giveaway",
  "params": { "kind": "stars", "channel": "@your_channel", "winners": 5, "stars": 1000 } }

"result": { "kind": "stars", "channel": "your_channel", "winners": 5, "stars": 1000, "status": "completed" }

После оплаты розыгрыш появится в канале: Настройки канала → Статистика → Голоса → «Предоплаченные розыгрыши», там задаются условия и срок. result.status: "checking" - оплата проверяется вручную, при неудаче деньги вернутся.

After payment the giveaway appears in the channel: Channel settings → Statistics → Boosts → "Prepaid giveaways", where you set its terms and end date. result.status: "checking" means the payment is being verified manually; if it failed, the money comes back.

POST/orders ads

Пополнение Telegram Ads: в кабинете ads.telegram.org нажмите «Add funds» - откроется Fragment, скопируйте оттуда ссылку на оплату. Деньги появляются в кабинете в течение нескольких минут.

Telegram Ads top-up: in ads.telegram.org tap "Add funds" - Fragment opens; copy the payment link from there. Funds appear in the ads account within a few minutes.

json
{ "custom_id": "order-11001", "product": "ads",
  "params": { "link": "https://fragment.com/ads/pay?account=XN-9In...", "ton": 20 } }

После покупки: продления и пополненияAfter purchase: renewals and top-ups

ЧтоWhatКакHow
Продлить проксиRenew proxiesЗаказ proxy_renew с order_id заказа прокси - продлеваются все его действующие прокси (истёкшие пропускаются). Новый срок виден и в исходном заказе. Если истекли все - proxy_expiredA proxy_renew order with the proxy order_id - all its active proxies are renewed (expired ones are skipped). The new term also shows in the original order. If all have expired - proxy_expired
Пополнить eSIMTop up an eSIMПакеты для конкретной eSIM: GET /catalog?product=esim_topup&order_id=..., затем заказ esim_topup. Переустанавливать eSIM не нужноPackages for that eSIM: GET /catalog?product=esim_topup&order_id=..., then an esim_topup order. No need to reinstall the eSIM
Продлить арендуExtend a rentalЗаказ того же *_rent с тем же address и "extend": trueAn order of the same *_rent with the same address and "extend": true
Продлить VPNExtend VPNЗаказ vpn с subscription_order_idA vpn order with subscription_order_id
Продлить Netflix / HDrezkaExtend Netflix / HDrezkaЗаказ cinema с тем же service и extend_order_id - срок добавится к исходному доступу, данные для входа те жеA cinema order with the same service and extend_order_id - the term is added to the original access, same login data
Восстановление SMMSMM refillPOST /orders/{order_id}/refill - бесплатно, для услуг с гарантией, не чаще раза в 10 минут (чаще - 429 rate_limited с заголовком Retry-After). Ответ: refill_requested: true и номер заявки refill_id. Нет гарантии - 409 refill_unavailablePOST /orders/{order_id}/refill - free, for services with a guarantee, at most once per 10 minutes (more often - 429 rate_limited with a Retry-After header). Reply: refill_requested: true and the request id refill_id. No guarantee - 409 refill_unavailable
Отмена SMMSMM cancelPOST /orders/{order_id}/cancel - заявка на отмену, пока result.status - pending или in_progress и у услуги в каталоге cancel: true. Ответ: cancel_requested: true. Деньги не возвращаются в момент заявки: когда отмена пройдёт, result.status станет canceled (вернётся вся сумма) или partial (часть уже выполнена - вернётся невыполненная), сумма - в result.refunded. Если отмена не прошла, заказ выполнится как обычно, а cancel_requested снова станет false. Не чаще раза в минуту (чаще - 429 rate_limited). Нельзя отменить - 409 cancel_unavailablePOST /orders/{order_id}/cancel - a cancellation request while result.status is pending or in_progress and the service has cancel: true in the catalog. Reply: cancel_requested: true. The money is not returned at request time: once the cancellation goes through, result.status becomes canceled (the full amount returns) or partial (part is already done - the undone part returns), the amount is in result.refunded. If the cancellation does not go through, the order completes as usual and cancel_requested becomes false again. At most once per minute (more often - 429 rate_limited). Can't be canceled - 409 cancel_unavailable
json
POST /orders
{ "custom_id": "renew-1", "product": "proxy_renew", "params": { "order_id": 6, "period": 30 } }

GET /catalog?product=esim_topup&order_id=7
POST /orders
{ "custom_id": "topup-1", "product": "esim_topup", "params": { "order_id": 7, "package_id": "tp_..." } }

POST/orders

Создать заказ. Получатель и цена проверяются сразу - до списания денег.

Create an order. The recipient and price are checked right away - before any money is charged.

ПолеFieldТипTypeОписаниеDescription
custom_idstringобязательноrequiredВаш уникальный номер заказа, 1-64 символаYour unique order id, 1-64 characters
productstringобязательноrequiredКод товара из GET /productsProduct code from GET /products
quantityintegerstars / premium / tonКоличество (см. «Товары»)Quantity (see Products)
recipientstringstars / premium / ton@username получателяRecipient @username
paramsobjectостальные товарыother productsПараметры товара (см. «Товары»)Product parameters (see Products)
max_pricestringнетoptionalПотолок цены в рубляхPrice ceiling in RUB
request
{ "custom_id": "order-1001", "product": "stars", "quantity": 100, "recipient": "@durov", "max_price": "150.00" }
202
{ "ok": true, "data": {
  "order_id": 123, "custom_id": "order-1001", "product": "stars", "quantity": 100,
  "recipient": "durov", "params": { "quantity": 100, "recipient": "durov" },
  "price": "146.00", "currency": "RUB", "status": "pending",
  "refunded": false, "charged": "0.00", "refunded_amount": "0.00",
  "error": null, "result": null, "receipt": null,
  "created_at": "2026-09-29T10:00:00Z", "updated_at": "2026-09-29T10:00:00Z" } }

Повтор с тем же custom_id отвечает 200 и "idempotent_replay": true.A retry with the same custom_id replies 200 and "idempotent_replay": true.

GET/orders/{order_id}

Заказ по номеру. Ответ - тот же объект заказа, что выше. В result у выполненного заказа - то, что получил покупатель (для Steam - login, amount_usd и credited: done или in_progress, если зачисление ещё идёт). Готовый заказ выглядит так:

An order by its id. Returns the same order object. For a completed order, result holds what the buyer received (for Steam: login, amount_usd and credited: done, or in_progress while crediting is still running). A finished order looks like this:

200
{ "ok": true, "data": { "order_id": 123, "status": "completed", "refunded": false, "error": null, "receipt": "37004512", ... } }

Поля заказа:

Order fields:

ПолеFieldТипTypeЧто этоMeaning
order_idintegerНомер заказа в APIOrder id in the API
custom_idstringВаш номер заказаYour order id
productstringКод товараProduct code
quantity, recipientКоличество и получатель - имеют смысл у звёзд, Premium и TON. У остальных товаров здесь служебные значения: смотрите params и resultQuantity and recipient - meaningful for Stars, Premium and TON. For other products these are internal values: use params and result
paramsobjectПараметры заказа после проверки: ваши (например, получатель без @) и дополненные нами (например, страна и номинал карты, параметры eSIM)Order parameters after validation: yours (e.g. the recipient without @) plus what we filled in (e.g. card country and value, eSIM details)
pricestringЦена заказа в рубляхOrder price in RUB
chargedstringСколько реально списано с баланса (цена минус возврат)Actually charged from the balance (price minus refund)
refunded_amountstringСколько вернули на баланс (у SMM - и частичный возврат, у SMS - за номер без SMS)Returned to the balance (for SMM including a partial refund, for SMS - for a number that got no SMS)
statusstringpending, processing, completed или failedpending, processing, completed or failed
refundedbooleantrue - заказ не выполнен, деньги вернули целикомtrue - the order failed and was fully refunded
errorobjectПричина неудачи: code и message, иначе nullFailure reason: code and message, otherwise null
resultobjectЧто получил покупатель - своё у каждого товара (см. «Товары»)What the buyer received - specific to each product (see Products)
receiptstringНомер заказа, как в истории покупок ботаOrder number as in the bot's purchase history
created_at, updated_atstringВремя создания и последнего изменения (UTC)Created and last updated time (UTC)

GET/orders

Ваши заказы, новые первыми. Параметры: limit (1-100, по умолчанию 20), offset, фильтры status (pending, processing, completed, failed) и product. С параметром custom_id вернёт один заказ по вашему номеру.

Your orders, newest first. Parameters: limit (1-100, default 20), offset, filters status (pending, processing, completed, failed) and product. With custom_id it returns a single order by your id.

Статус многих заказов одним запросом: ids - до 100 номеров через запятую. Ответ - список в том же порядке; неизвестный номер придёт с error.code: "not_found". Так удобно следить за пачкой SMM-заказов, не тратя лимит запросов.

Status of many orders in one request: ids - up to 100 ids, comma-separated. The reply is a list in the same order; an unknown id comes back with error.code: "not_found". Handy for tracking a batch of SMM orders without spending the request limit.

bash
curl "https://api.foxystarsshop.com/orders?ids=123,124,125" -H "Authorization: Bearer $KEY"
bash
curl "https://api.foxystarsshop.com/orders?custom_id=order-1001" -H "Authorization: Bearer $KEY"

Примеры кодаCode examples

Заказ с ожиданием результата:

Create an order and wait for the result:

import time, uuid, requests

API = "https://api.foxystarsshop.com"
H = {"Authorization": "Bearer fs_live_..."}

order = requests.post(f"{API}/orders", headers=H, timeout=60, json={
    "custom_id": str(uuid.uuid4()),   # your order number
    "product": "stars", "quantity": 100, "recipient": "@durov",
}).json()
if not order["ok"]:
    raise SystemExit(order["error"])

oid = order["data"]["order_id"]
while True:
    o = requests.get(f"{API}/orders/{oid}", headers=H, timeout=30).json()["data"]
    if o["status"] in ("completed", "failed"):
        break
    time.sleep(4)
print(o["status"], o["error"])

БезопасностьSecurity

Ключ даёт право тратить ваш баланс. Храните его только на своём сервере: не вставляйте в код сайта, который видит браузер, в мобильное приложение или в открытый репозиторий. Если ключ мог утечь - сразу перевыпустите его в боте.The key can spend your balance. Keep it on your server only: never put it in browser-side website code, a mobile app or a public repository. If it may have leaked, reissue it in the bot right away.

Все запросы - только по HTTPS. Вы покупаете у нас по ценам бота и сами назначаете цену своим клиентам.

All requests go over HTTPS only. You buy from us at the bot's prices and set your own prices for your customers.