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.
Получить ключGet a key
- Откройте @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.
- В главном меню бота нажмите кнопку API, затем «Получить ключ».In the bot's main menu tap API, then “Get key”.
- Ключ вида
fs_live_…всегда можно скопировать кнопкой «Скопировать ключ» в разделе API в боте. Никому его не передавайте. Если ключ попал к чужим - нажмите «Перевыпустить ключ»: старый перестанет работать сразу.You can always copy thefs_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:
# 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.
{ "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 error | refunded: 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 | ТоварProduct | quantity | recipient |
|---|---|---|---|
stars | Telegram Stars | звёзд, от 50 до 25 000stars, 50 to 25,000 | @username в TelegramTelegram @username |
premium | Telegram Premium | месяцев: 3, 6 или 12months: 3, 6 or 12 | @username в TelegramTelegram @username |
ton | Пополнение TONTON top-up | TON, от 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 | |
esim | eSIM с интернетом для поездок (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_rentusername_rentnumber_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:
{ "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 key | 60 в минуту60 per minute | 429 rate_limited + Retry-After |
| Цены, каталог, заказы и действияPrices, catalog, orders and actions | 30 в минуту (входят в общие 60; чтение заказов сюда не входит)30 per minute (within the 60; reading orders is not counted) | 429 rate_limited + Retry-After |
| Незавершённых заказовActive orders | 5 одновременно5 at a time | 429 too_many_active_orders + Retry-After |
| Неудачных заказовFailed orders | 30 в час30 per hour | 429 too_many_failed_orders + Retry-After |
| Неверных ключей с одного IPInvalid keys from one IP | 20 в минуту20 per minute | 429 rate_limited + Retry-After |
| Обновление заказов у исполнителя при чтенииLive order refresh on read | 30 в минуту30 per minute | без ошибки: сверх лимита заказ отдаётся с последними известными даннымиno error: above the limit the order is returned with the last known data |
| Размер запросаRequest size | 16 KB | 413 too_large |
ОшибкиErrors
| HTTP | code | Что делатьWhat to do |
|---|---|---|
| 400 | bad_request | Тело - не JSON-объектBody is not a JSON object |
| 401 | unauthorized | Нет ключа или он неверный/отключёнMissing, wrong or disabled key |
| 402 | insufficient_balance | Пополните баланс в боте (в ответе - нужная сумма)Top up in the bot (the reply includes the price) |
| 403 | product_unavailable | Товар временно снят с продажиProduct is temporarily unavailable |
| 403 | forbidden | Доступ закрыт - напишите в поддержку @FoxyStarsSupportAccess denied - contact support at @FoxyStarsSupport |
| 404 | not_found | Нет такого заказа или методаNo such order or endpoint |
| 405 | method_not_allowed | Не тот HTTP-метод (GET/POST)Wrong HTTP method (GET/POST) |
| 409 | custom_id_conflict | custom_id уже занят другим заказомcustom_id is already used by another order |
| 409 | lot_unavailable | Лот занят или снят с аренды - выберите другойThe lot is taken or no longer for rent - pick another |
| 409 | rental_expired | Аренда уже закончиласьThe rental has ended |
| 409 | login_not_started | Сначала начните вход в Telegram по номеруStart the Telegram login with the number first |
| 409 | subscription_not_found | Подписки для продления больше нет - купите новуюThe subscription to extend no longer exists - buy a new one |
| 409 | proxy_expired | Прокси истекли - продлить нельзя, купите новыеProxies have expired - buy new ones |
| 409 | topup_unavailable | Эту eSIM пополнить нельзя (истекла или отменена)This eSIM can't be topped up (expired or cancelled) |
| 409 | cancel_unavailable | Заказ SMM нельзя отменить: уже выполнен или услуга не поддерживает отменуThe SMM order can't be canceled: it is already done or the service does not support cancel |
| 409 | refill_unavailable | Восстановление недоступно для этого заказаRefill is not available for this order |
| 409 | link_busy | На эту ссылку уже выполняется SMM-заказAn SMM order for this link is already running |
| 409 | order_not_completed | Действие доступно только для выполненного заказаThe action is only available for a completed order |
| 409 | too_early | Номер SMS пока нельзя отменить - подождите Retry-After секундThe SMS number can't be cancelled yet - wait Retry-After seconds |
| 409 | sms_received | SMS уже пришла - номер нельзя отменить с возвратомAn SMS already arrived - the number can't be cancelled with a refund |
| 409 | order_not_active | Номер SMS уже не активен (завершён или отменён)The SMS number is no longer active (finished or cancelled) |
| 409 | renew_unavailable | В заказе нечего продлеватьNothing to renew in this order |
| 409 | price_changed | Цена выше вашего max_pricePrice is above your max_price |
| 413 | too_large | Тело запроса больше 16 KBRequest body is over 16 KB |
| 422 | bind_failed | Привязка не прошла - возьмите свежую ссылку tc:// и повторитеBinding failed - get a fresh tc:// link and retry |
| 422 | validation_error | Неверный параметр - подробности в messageInvalid parameter - see message |
| 422 | invalid_recipient | Получатель не найден: пользователь Telegram, аккаунт Steam или канал розыгрышаRecipient not found: a Telegram user, a Steam account or a giveaway channel |
| 422 | recipient_rejected | Получателю нельзя это купить (например, Premium уже есть)This can't be bought for the recipient (e.g. already has Premium) |
| 429 | rate_limited | Подождите Retry-After секундWait Retry-After seconds |
| 429 | too_many_active_orders | Дождитесь завершения текущих заказовWait for active orders to finish |
| 429 | too_many_failed_orders | Слишком много неудачных заказов за час - проверьте данные заказов и повторите позжеToo many failed orders in an hour - check your order data and retry later |
| 500 | internal_error | Повторите позже с тем же custom_idRetry later with the same custom_id |
| 503 | out_of_stock | Товар временно закончился - повторите позжеTemporarily out of stock - retry later |
| 503 | upstream_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.
{ "ok": true, "data": { "balance": "1250.00", "currency": "RUB" } }GET/products
Список товаров и допустимое количество.
Products and allowed quantities.
{ "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.
{ "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.
{ "ok": true, "data": { "product": "giftcard", "brands": [
{ "brand": "xbox", "title": "Xbox" }, { "brand": "roblox", "title": "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:
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": { "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.
{ "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 } } }{ "ok": true, "data": { "product": "proxy", "version": "ipv6", "countries": ["de", "nl", "ru", "us", ...] } }Заказ, цена и готовый результат:
Order, price and the completed result:
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).
{ "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" }, ...
] } }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).
{ "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.
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.
{ "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 }, ... ] } }{ "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).
{ "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 |
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=.
{ "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.
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.
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.
{ "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).
{ "ok": true, "data": { "product": "vpn", "currency": "RUB", "plans": [
{ "plan": "1m", "title": "1 month", "days": 30, "devices": 5, "price": "150.00" }, ...
] } }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).
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.
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.
{ "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 refill | POST /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 cancel | POST /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 |
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_id | string | обязательноrequired | Ваш уникальный номер заказа, 1-64 символаYour unique order id, 1-64 characters |
product | string | обязательноrequired | Код товара из GET /productsProduct code from GET /products |
quantity | integer | stars / premium / ton | Количество (см. «Товары»)Quantity (see Products) |
recipient | string | stars / premium / ton | @username получателяRecipient @username |
params | object | остальные товарыother products | Параметры товара (см. «Товары»)Product parameters (see Products) |
max_price | string | нетoptional | Потолок цены в рубляхPrice ceiling in RUB |
{ "custom_id": "order-1001", "product": "stars", "quantity": 100, "recipient": "@durov", "max_price": "150.00" }{ "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:
{ "ok": true, "data": { "order_id": 123, "status": "completed", "refunded": false, "error": null, "receipt": "37004512", ... } }Поля заказа:
Order fields:
| ПолеField | ТипType | Что этоMeaning |
|---|---|---|
order_id | integer | Номер заказа в APIOrder id in the API |
custom_id | string | Ваш номер заказаYour order id |
product | string | Код товара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 | |
params | object | Параметры заказа после проверки: ваши (например, получатель без @) и дополненные нами (например, страна и номинал карты, параметры eSIM)Order parameters after validation: yours (e.g. the recipient without @) plus what we filled in (e.g. card country and value, eSIM details) |
price | string | Цена заказа в рубляхOrder price in RUB |
charged | string | Сколько реально списано с баланса (цена минус возврат)Actually charged from the balance (price minus refund) |
refunded_amount | string | Сколько вернули на баланс (у SMM - и частичный возврат, у SMS - за номер без SMS)Returned to the balance (for SMM including a partial refund, for SMS - for a number that got no SMS) |
status | string | pending, processing, completed или failedpending, processing, completed or failed |
refunded | boolean | true - заказ не выполнен, деньги вернули целикомtrue - the order failed and was fully refunded |
error | object | Причина неудачи: code и message, иначе nullFailure reason: code and message, otherwise null |
result | object | Что получил покупатель - своё у каждого товара (см. «Товары»)What the buyer received - specific to each product (see Products) |
receipt | string | Номер заказа, как в истории покупок ботаOrder number as in the bot's purchase history |
created_at, updated_at | string | Время создания и последнего изменения (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.
curl "https://api.foxystarsshop.com/orders?ids=123,124,125" -H "Authorization: Bearer $KEY"
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"])
const API = "https://api.foxystarsshop.com"; const H = { Authorization: "Bearer fs_live_...", "Content-Type": "application/json" }; const r = await fetch(`${API}/orders`, { method: "POST", headers: H, body: JSON.stringify({ custom_id: crypto.randomUUID(), product: "premium", quantity: 3, recipient: "@durov", }) }).then(r => r.json()); if (!r.ok) throw new Error(r.error.code); let o; do { await new Promise(s => setTimeout(s, 4000)); o = (await fetch(`${API}/orders/${r.data.order_id}`, { headers: H }).then(r => r.json())).data; } while (o.status === "pending" || o.status === "processing"); console.log(o.status, o.error);
<?php $api = "https://api.foxystarsshop.com"; $h = ["Authorization: Bearer fs_live_...", "Content-Type: application/json"]; function call($m, $url, $h, $body = null) { $c = curl_init($url); curl_setopt_array($c, [CURLOPT_CUSTOMREQUEST => $m, CURLOPT_HTTPHEADER => $h, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60]); if ($body) curl_setopt($c, CURLOPT_POSTFIELDS, json_encode($body)); return json_decode(curl_exec($c), true); } $r = call("POST", "$api/orders", $h, ["custom_id" => "shop-" . time(), "product" => "ton", "quantity" => 5, "recipient" => "@durov"]); if (!$r["ok"]) die($r["error"]["code"]); do { sleep(4); $o = call("GET", "$api/orders/" . $r["data"]["order_id"], $h)["data"]; } while (in_array($o["status"], ["pending", "processing"])); echo $o["status"];
БезопасностьSecurity
Все запросы - только по HTTPS. Вы покупаете у нас по ценам бота и сами назначаете цену своим клиентам.
All requests go over HTTPS only. You buy from us at the bot's prices and set your own prices for your customers.
