{"openapi":"3.1.0","info":{"title":"Luffy SMS API","version":"1.0.0","description":"REST API для одноразовых SMS-активаций. Общий баланс сайта, Telegram и API. Все суммы в RUB, даты — Unix-миллисекунды. 60 авторизованных запросов на аккаунт за календарную минуту. Только server-to-server по HTTPS. Получение и отзыв ключа: личный кабинет → API KEY. Документация: /docs."},"servers":[{"url":"https://luffysms.com/api/v1","description":"Luffy SMS · production"}],"security":[{"bearerAuth":[]}],"paths":{"/balance":{"get":{"operationId":"getBalance","summary":"Баланс аккаунта","responses":{"200":{"description":"Успешный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"}}}},"default":{"description":"Ошибка API. При 429 учитывайте Retry-After. Внешние прокси могут возвращать не-JSON.","headers":{"Retry-After":{"description":"Секунды до повтора при 429","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/services":{"get":{"operationId":"listServices","summary":"Каталог сервисов","responses":{"200":{"description":"Успешный запрос","content":{"application/json":{"schema":{"type":"object","properties":{"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}},"required":["services"]}}}},"default":{"description":"Ошибка API. При 429 учитывайте Retry-After. Внешние прокси могут возвращать не-JSON.","headers":{"Retry-After":{"description":"Секунды до повтора при 429","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/prices":{"get":{"operationId":"listPrices","summary":"Страны и цены для сервиса","parameters":[{"name":"service","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"}}],"responses":{"200":{"description":"Успешный запрос","content":{"application/json":{"schema":{"type":"object","properties":{"countries":{"type":"array","items":{"$ref":"#/components/schemas/CountryPrice"}}},"required":["countries"]}}}},"default":{"description":"Ошибка API. При 429 учитывайте Retry-After. Внешние прокси могут возвращать не-JSON.","headers":{"Retry-After":{"description":"Секунды до повтора при 429","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders":{"get":{"operationId":"listOrders","summary":"История заказов, до 50 записей","parameters":[{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"maximum":1000000,"default":0}}],"responses":{"200":{"description":"Успешный запрос","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Order"}},"hasMore":{"type":"boolean"}},"required":["items","hasMore"]}}}},"default":{"description":"Ошибка API. При 429 учитывайте Retry-After. Внешние прокси могут возвращать не-JSON.","headers":{"Retry-After":{"description":"Секунды до повтора при 429","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"buyNumber","summary":"Купить один номер","description":"Сохраните ключ операции и тело в своей БД ДО отправки. При таймауте, 5xx или pending=true повторяйте только исходный запрос с тем же Idempotency-Key. Не создавайте новый ключ для обхода незавершённой операции. Изменение параметров с прежним ключом возвращает 409. Лимит цены и баланс проверяются сервером.","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Уникален на уровне аккаунта, сохраняется при перевыпуске API-ключа. UUID подходит.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,80}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseInput"}}}},"responses":{"200":{"description":"Успешный запрос","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/PurchasedOrder"}},"required":["order"]}}}},"default":{"description":"Ошибка API. При 429 учитывайте Retry-After. Внешние прокси могут возвращать не-JSON.","headers":{"Retry-After":{"description":"Секунды до повтора при 429","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}":{"get":{"operationId":"getOrder","summary":"Статус заказа и SMS-код","description":"Опрос не чаще одного раза в 5 секунд. Прекращайте опрос после конечного статуса. Чужие заказы возвращают 404.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":999999999999999}}],"responses":{"200":{"description":"Успешный запрос","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/Order"}},"required":["order"]}}}},"default":{"description":"Ошибка API. При 429 учитывайте Retry-After. Внешние прокси могут возвращать не-JSON.","headers":{"Retry-After":{"description":"Секунды до повтора при 429","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}/cancel":{"post":{"operationId":"cancelOrder","summary":"Отменить заказ и вернуть средства","description":"Только свои поддерживаемые waiting-заказы без SMS после cancelAfter. Повторная отмена не создаёт второй возврат. Уже принятые покупки не отменяются отзывом API-ключа.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":999999999999999}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false}}}},"responses":{"200":{"description":"Успешный запрос","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]}}}},"default":{"description":"Ошибка API. При 429 учитывайте Retry-After. Внешние прокси могут возвращать не-JSON.","headers":{"Retry-After":{"description":"Секунды до повтора при 429","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Персональный lfy_live_… из кабинета. Никогда не помещайте ключ в URL или клиентский код."}},"schemas":{"Balance":{"type":"object","properties":{"balance":{"type":"number","description":"Сумма в RUB"},"currency":{"type":"string","const":"RUB"}},"required":["balance","currency"]},"Service":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"CountryPrice":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"iso":{"type":["string","null"]},"price":{"type":"number","description":"Сумма в RUB"},"count":{"type":"integer"}},"required":["id","name","iso","price","count"]},"PurchaseInput":{"type":"object","properties":{"service":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,40}$"},"country":{"type":"integer","minimum":0,"maximum":10000},"maxPrice":{"type":"number","minimum":0,"maximum":1000000,"multipleOf":0.01,"description":"Максимально допустимое списание в RUB, не более двух знаков после запятой"}},"required":["service","country","maxPrice"]},"PurchasedOrder":{"type":"object","properties":{"id":{"type":"integer"},"phone":{"type":"string"},"price":{"type":"number","description":"Сумма в RUB"},"serviceName":{"type":"string"},"countryName":{"type":"string"}},"required":["id","phone","price","serviceName","countryName"]},"Order":{"type":"object","properties":{"id":{"type":"integer"},"serviceName":{"type":"string"},"serviceId":{"type":"string"},"countryName":{"type":"string"},"phone":{"type":"string"},"status":{"type":"string","enum":["waiting","completed","cancelled","error"]},"code":{"type":["string","null"],"description":"Строка сохраняет начальные нули SMS-кода"},"price":{"type":"number","description":"Сумма в RUB"},"createdAt":{"type":"integer","format":"int64","description":"Unix-миллисекунды"},"cancelAfter":{"type":"integer","format":"int64","description":"Unix-миллисекунды; минимальный возраст отмены, обычно 2 минуты"}},"required":["id","serviceName","serviceId","countryName","phone","status","code","price","createdAt","cancelAfter"]},"Error":{"type":"object","required":["error","code"],"properties":{"error":{"type":"string"},"code":{"type":"string","enum":["invalid_request","invalid_api_key","forbidden","not_found","method_not_allowed","conflict","payload_too_large","unsupported_media_type","rate_limit_exceeded","service_unavailable"]},"pending":{"type":"boolean","description":"Не создавайте новую покупку; проверьте историю и сохраните исходный ключ операции"}}}}}}