Spotify Partner API

Base URL:
https://api.averonpay.app


Авторизация

Каждый запрос должен содержать API ключ партнера:

Authorization: Bearer pk_partner_key
Content-Type: application/json

Партнер получает API ключ в личке Telegram-бота. В групповых чатах ключи не показываются.


Python: готовые сценарии

Установите библиотеку requests:

```bash
pip install requests
```

Небольшой клиент, который можно скопировать в проект:

```python
import requests


class AveronAPI:
    def __init__(self, token, base_url="https://api.averonpay.app"):
        self.base_url = base_url.rstrip("/")
        self.session = requests.Session()
        self.session.headers.update({
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json",
        })

    def request(self, method, path, **kwargs):
        response = self.session.request(
            method,
            f"{self.base_url}{path}",
            timeout=kwargs.pop("timeout", 30),
            **kwargs,
        )
        response.raise_for_status()
        return response.json()

    def create_order(self, product_id, item_id, fields, ref=None):
        return self.request("POST", "/orders", json={
            "product_id": product_id,
            "item_id": item_id,
            "ref": ref,
            "fields": fields,
        })

    def get_order(self, order_id):
        return self.request("GET", f"/orders/{order_id}")

    def list_orders(self, **filters):
        return self.request("GET", "/orders", params=filters)

    def order_action(self, order_id, action, **fields):
        return self.request(
            "POST",
            f"/orders/{order_id}/actions/{action}",
            json=fields,
        )

    def cancel_order(self, order_id):
        return self.request("POST", f"/orders/{order_id}/cancel")


api = AveronAPI("pk_partner_key")
print(api.request("GET", "/me"))
```

Создание Full Auto заказа:

```python
order = api.create_order(
    product_id="spotify_premium_full_auto",
    item_id="spotify_premium_full_auto_1",
    ref="my-order-1001",
    fields={
        "spotify_premium_full_auto_email": "user@example.com",
        "spotify_premium_full_auto_password": "password",
    },
)

print("Номер заказа:", order["order_id"])
print("Статус:", order["status"])
```

Ожидание завершения заказа через polling:

```python
import time


def wait_until_finished(api, order_id, timeout_seconds=900):
    deadline = time.monotonic() + timeout_seconds

    while time.monotonic() < deadline:
        order = api.get_order(order_id)
        print("Текущий статус:", order["status"])

        if order["status"] in {"done", "failed", "cancelled"}:
            return order

        time.sleep(5)

    raise TimeoutError("Заказ не завершился за отведенное время")


result = wait_until_finished(api, order["order_id"])
print(result)
```

Получение заказа по своему ref:

```python
orders = api.list_orders(ref="my-order-1001")
print(orders)
```

Отмена открытого заказа:

```python
cancelled = api.cancel_order(order["order_id"])
print(cancelled)
```


Проверка ключа

GET /me

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.get(
    f"{BASE_URL}/me",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(response.json())
```

Ответ:
{
  "ok": true,
  "username": "@partner",
  "balance": 50.0,
  "api_key_prefix": "pk_xxxxxxx"
}


Каталог

GET /products

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.get(
    f"{BASE_URL}/products",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(response.json())
```

Доступные продукты:

spotify_premium_full_auto
spotify_premium_pairing

Full Auto:

Full Auto = цена Pairing + $0.10:

spotify_premium_full_auto_1        $2.20
spotify_premium_full_auto_3        $5.80
spotify_premium_full_auto_6        $11.30
spotify_premium_full_auto_9        $16.70
spotify_premium_full_auto_12       $21.60
spotify_premium_full_auto_1duo     $3.00
spotify_premium_full_auto_3duo     $8.00
spotify_premium_full_auto_6duo     $15.00
spotify_premium_full_auto_9duo     $22.80
spotify_premium_full_auto_12duo    $29.60
spotify_premium_full_auto_1fam     $4.10
spotify_premium_full_auto_2fam     $6.80
spotify_premium_full_auto_3fam     $10.10
spotify_premium_full_auto_addduo   $0.00

Pairing, базовые цены без пароля:

spotify_premium_pairing_1          $2.10
spotify_premium_pairing_3          $5.70
spotify_premium_pairing_6          $11.20
spotify_premium_pairing_9          $16.60
spotify_premium_pairing_12         $21.50
spotify_premium_pairing_1duo       $2.90
spotify_premium_pairing_3duo       $7.90
spotify_premium_pairing_6duo       $14.90
spotify_premium_pairing_9duo       $22.70
spotify_premium_pairing_12duo      $29.50
spotify_premium_pairing_1fam       $4.00
spotify_premium_pairing_2fam       $6.70
spotify_premium_pairing_3fam       $10.00
spotify_premium_pairing_addduo     $0.00


Создание заказа

POST /orders

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

payload = {
    "product_id": "spotify_premium_full_auto",
    "item_id": "spotify_premium_full_auto_1",
    "ref": "order-1001",
    "fields": {
        "spotify_premium_full_auto_email": "user@example.com",
        "spotify_premium_full_auto_password": "password",
    },
}

response = requests.post(
    f"{BASE_URL}/orders",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json=payload,
    timeout=30,
)
print(response.json())
```

Тело запроса:
{
  "product_id": "spotify_premium_full_auto",
  "item_id": "spotify_premium_full_auto_1",
  "ref": "order-1001",
  "fields": {
    "spotify_premium_full_auto_email": "user@example.com",
    "spotify_premium_full_auto_password": "password"
  }
}

ref - необязательный ID заказа в системе партнера. Лучше передавать уникальный ref, чтобы повторный запрос не создал дубль и не списал баланс второй раз.

Ответ:
{
  "ok": true,
  "order_id": 1,
  "ref": "order-1001",
  "product_id": "spotify_premium_full_auto",
  "item_id": "spotify_premium_full_auto_1",
  "status": "processing",
  "price": 2.2,
  "balance_before": 50.0,
  "balance_after": 47.8,
  "balance": 47.8,
  "pair_url": null,
  "error": "",
  "reason": "",
  "duplicate": false
}

Для Pairing API ждет ссылку до 18 секунд. Если ссылка успела создаться, pair_url вернется сразу в ответе POST /orders.
Если pair_url = null, заказ еще обрабатывается. Проверяйте GET /orders/{order_id} или ждите webhook.


Поля заказа

Full Auto:
{
  "spotify_premium_full_auto_email": "user@example.com",
  "spotify_premium_full_auto_password": "password"
}

Для spotify_premium_full_auto_addduo:
{
  "spotify_premium_full_auto_email": "user@example.com",
  "spotify_premium_full_auto_password": "password",
  "spotify_premium_full_auto_invite_link": "https://...",
  "spotify_premium_full_auto_address": "address"
}

Pairing:
{
  "spotify_premium_pairing_email": "user@example.com"
}

Для spotify_premium_pairing_addduo:
{
  "spotify_premium_pairing_email": "user@example.com",
  "spotify_premium_pairing_invite_link": "https://...",
  "spotify_premium_pairing_address": "address"
}


Получение заказа

GET /orders/{order_id}

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"
ORDER_ID = 1

response = requests.get(
    f"{BASE_URL}/orders/{ORDER_ID}",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(response.json())
```


Результат Duo-заказа

После выполнения обычного Duo-заказа с item_id вида spotify_premium_full_auto_1duo или spotify_premium_pairing_1duo API возвращает адрес подписки и ссылку-приглашение для второго участника в поле result.

Пример ответа GET /orders/{order_id}:
```json
{
  "ok": true,
  "order_id": 1,
  "ref": "order-1001",
  "product_id": "spotify_premium_full_auto",
  "item_id": "spotify_premium_full_auto_1duo",
  "status": "done",
  "pair_url": null,
  "error": "",
  "reason": "",
  "result": {
    "address": "Egyptian Army Bridge, Sheraton Al Matar, El Nozha, Cairo Governorate, Egypt",
    "invite_link": "https://www.spotify.com/..."
  },
  "refunded": false
}
```

address — адрес Spotify Duo, который нужно указать второму участнику при подключении.

invite_link — ссылка-приглашение для подключения второго участника к Duo.

До завершения заказа result может быть null. После выполнения эти же данные доступны при получении заказа, в списке заказов и в webhook со статусом done.


Подключение второго участника Duo

Этот сценарий добавляет второго участника в уже оформленную Duo-подписку. Сначала дождитесь, когда исходный заказ Duo перейдет в `done`, и возьмите из его `result` поля `invite_link` и `address`. Затем создайте отдельный заказ с `item_id` `spotify_premium_full_auto_addduo`.

У готового к использованию Duo-заказа `result` выглядит так:

```json
{
  "address": "Egyptian Army Bridge, Sheraton Al Matar, El Nozha, Cairo Governorate, Egypt",
  "invite_link": "https://www.spotify.com/..."
}
```

Full Auto: передайте почту и пароль второго аккаунта Spotify, а также `invite_link` и `address` из результата первого заказа.

```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

# Это ID уже выполненного заказа с тарифом *_duo.
duo_order_id = 123

duo_order = requests.get(
    f"{BASE_URL}/orders/{duo_order_id}",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
).json()

if duo_order["status"] != "done" or not duo_order.get("result"):
    raise RuntimeError("Duo-заказ еще не готов: дождитесь status=done")

duo_result = duo_order["result"]
payload = {
    "product_id": "spotify_premium_full_auto",
    "item_id": "spotify_premium_full_auto_addduo",
    "ref": "add-duo-member-1001",  # уникальный ID в вашей системе
    "fields": {
        "spotify_premium_full_auto_email": "second-user@example.com",
        "spotify_premium_full_auto_password": "spotify_password",
        "spotify_premium_full_auto_invite_link": duo_result["invite_link"],
        "spotify_premium_full_auto_address": duo_result["address"],
    },
}

response = requests.post(
    f"{BASE_URL}/orders",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json=payload,
    timeout=30,
)
response.raise_for_status()
print(response.json())
```

Pairing: пароль второго аккаунта не нужен. Используйте `spotify_premium_pairing_addduo` и передайте ту же почту, `invite_link` и `address`.

```python
payload = {
    "product_id": "spotify_premium_pairing",
    "item_id": "spotify_premium_pairing_addduo",
    "ref": "add-duo-member-pairing-1001",
    "fields": {
        "spotify_premium_pairing_email": "second-user@example.com",
        "spotify_premium_pairing_invite_link": duo_result["invite_link"],
        "spotify_premium_pairing_address": duo_result["address"],
    },
}

response = requests.post(
    f"{BASE_URL}/orders",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json=payload,
    timeout=30,
)
response.raise_for_status()
print(response.json())
```

Проверяйте статус созданного заказа через `GET /orders/{order_id}` или webhook. В текущем каталоге есть отдельный сценарий добавления участника только для Duo (`*_addduo`); для Family отдельного `*_addfam` заказа нет.


Список заказов

GET /orders?limit=50
GET /orders?ref=order-1001
GET /orders?status=processing

Примеры:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

headers = {"Authorization": f"Bearer {TOKEN}"}

orders = requests.get(
    f"{BASE_URL}/orders",
    headers=headers,
    params={"limit": 50},
    timeout=20,
)
print(orders.json())

by_ref = requests.get(
    f"{BASE_URL}/orders",
    headers=headers,
    params={"ref": "order-1001"},
    timeout=20,
)
print(by_ref.json())

by_status = requests.get(
    f"{BASE_URL}/orders",
    headers=headers,
    params={"status": "processing"},
    timeout=20,
)
print(by_status.json())
```


Отмена заказа

POST /orders/{order_id}/cancel

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.post(
    f"{BASE_URL}/orders/{ORDER_ID}/cancel",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(response.json())
```

Если по заказу доступен возврат, баланс партнера обновится автоматически.


Действия по заказу

POST /orders/{order_id}/actions/{action}

Иногда заказу нужен дополнительный шаг. Тогда статус становится waiting или pairing, а reason объясняет, что нужно сделать.

Доступные actions:

repair    если error начинается с pair_link_expired: запросить новую pairing-ссылку
continue  если error начинается с account_active: подтвердить добавление Premium поверх активной подписки
cancel    отказаться от продолжения и вернуть баланс, если возврат доступен

Не используйте continue для истекшей pairing-ссылки: в этом случае нужен repair.
После успешного repair новая pair_url обычно появляется через несколько секунд в GET /orders/{order_id} или webhook.

Примеры:

```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"
ORDER_ID = 1

headers = {"Authorization": f"Bearer {TOKEN}"}

repair_response = requests.post(
    f"{BASE_URL}/orders/{ORDER_ID}/actions/repair",
    headers=headers,
    timeout=20,
)
print(repair_response.json())

continue_response = requests.post(
    f"{BASE_URL}/orders/{ORDER_ID}/actions/continue",
    headers=headers,
    timeout=20,
)
print(continue_response.json())
```


Зависший заказ

POST /orders/{order_id}/stuck

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"
ORDER_ID = 1

response = requests.post(
    f"{BASE_URL}/orders/{ORDER_ID}/stuck",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(response.json())
```


Webhook партнера

Установить webhook:
POST /webhook

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.post(
    f"{BASE_URL}/webhook",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json={"url": "https://partner-site.example/hook"},
    timeout=20,
)
print(response.json())
```

Получить текущую настройку:
GET /webhook

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.get(
    f"{BASE_URL}/webhook",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(response.json())
```

Webhook отправляется при изменении статуса заказа.

Payload:
{
  "event": "order.status",
  "order_id": 1,
  "ref": "order-1001",
  "product_id": "spotify_premium_full_auto",
  "item_id": "spotify_premium_full_auto_1",
  "status": "pairing",
  "pair_url": "https://...",
  "error": "",
  "reason": "",
  "result": null,
  "refunded": false,
  "price": 2.2
}

Если заказ отменен или не выполнен, reason содержит причину, когда она доступна.

Каждый webhook содержит header:
X-Signature: sha256=...

Подпись - это HMAC-SHA256 от raw body с использованием webhook secret, который выдается при настройке webhook через POST /webhook.

Пример обработчика webhook на Python с Flask:

```python
import hashlib
import hmac

from flask import Flask, abort, request


app = Flask(__name__)
WEBHOOK_SECRET = "secret_from_post_webhook"


@app.post("/averon-webhook")
def averon_webhook():
    raw_body = request.get_data()
    received = request.headers.get("X-Signature", "")
    expected = "sha256=" + hmac.new(
        WEBHOOK_SECRET.encode(),
        raw_body,
        hashlib.sha256,
    ).hexdigest()

    if not hmac.compare_digest(received, expected):
        abort(401)

    event = request.get_json()
    order_id = event["order_id"]
    status = event["status"]
    print(f"Заказ #{order_id}: {status}")

    if status == "pairing":
        print("Откройте ссылку:", event["pair_url"])
    elif status in {"failed", "cancelled"}:
        print("Причина:", event.get("reason"))

    return {"ok": True}


if __name__ == "__main__":
    app.run(port=8000)
```

Публичный URL этого обработчика, например https://partner-site.example/averon-webhook, передайте в POST /webhook.


Pairing

Если статус заказа pairing, нужно открыть pair_url.

pair_url может прийти:

1. Сразу в ответе POST /orders, если ссылка успела создаться за первые секунды.
2. Позже в ответе GET /orders/{order_id}.
3. Позже через webhook со статусом pairing.

Если к партнеру привязана Telegram-конфа, бот также отправит уведомление туда.

Создание Pairing-заказа и ожидание ссылки на Python:

```python
import time

import requests


BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"
headers = {"Authorization": f"Bearer {TOKEN}"}

created = requests.post(
    f"{BASE_URL}/orders",
    headers=headers,
    json={
        "product_id": "spotify_premium_pairing",
        "item_id": "spotify_premium_pairing_1",
        "ref": "pairing-order-1002",
        "fields": {
            "spotify_premium_pairing_email": "user@example.com",
        },
    },
    timeout=30,
)
created.raise_for_status()
order = created.json()
order_id = order["order_id"]

for _ in range(12):
    if order.get("pair_url"):
        print("Откройте ссылку:", order["pair_url"])
        break

    if order["status"] in {"done", "failed", "cancelled"}:
        print("Заказ завершился:", order)
        break

    time.sleep(5)
    response = requests.get(
        f"{BASE_URL}/orders/{order_id}",
        headers=headers,
        timeout=20,
    )
    response.raise_for_status()
    order = response.json()
else:
    print("Ссылка еще не готова — продолжайте polling или ждите webhook")
```

Обновление истекшей ссылки на Python:

```python
order = requests.get(
    f"{BASE_URL}/orders/{order_id}",
    headers=headers,
    timeout=20,
).json()

if "pair_link_expired" in (order.get("error") or ""):
    repaired = requests.post(
        f"{BASE_URL}/orders/{order_id}/actions/repair",
        headers=headers,
        timeout=20,
    )
    repaired.raise_for_status()
    print(repaired.json())
```

Срок действия и автоматическая отмена

Pairing-ссылка обычно действует около 5 минут. Определяйте истечение по текущему состоянию заказа — status = waiting и error, содержащий pair_link_expired.

Для получения новой ссылки вызовите POST /orders/{order_id}/actions/repair. Успешный repair создает новую ссылку с новым сроком действия. Сам вызов GET /orders/{order_id} ссылку не продлевает.

Если предыдущий repair еще обрабатывается или действие недоступно для текущего состояния заказа, API возвращает HTTP 409 с error = order_action_conflict. Обновите заказ через GET /orders/{order_id} и повторяйте repair только после появления pair_link_expired.

Если pairing долго не завершен и ссылка не обновляется, заказ может быть автоматически отменен примерно через час с возвратом баланса. В таком случае заказ получает status = cancelled, error = pair_link_timeout и refunded = true. Это время ориентировочное: repair может продлить жизненный цикл заказа, поэтому клиентской интеграции не следует самостоятельно считать заказ отмененным по локальному таймеру — дождитесь cancelled/failed через GET или webhook.


Telegram-уведомления в конфе

Если у партнера привязана конфа, бот автоматически отправляет туда уведомления по заказам.

Примеры заголовков:

⌛ Заказ принят
🔗 Требуется сопряжение
✅ Заказ выполнен
❌ Заказ отменен
❌ Заказ не выполнен
⚠️ Заказ ожидает действие

Пример сообщения:

✅ Заказ выполнен
Продукт: Spotify Premium Pairing - 6 months
Номер заказа: #1
Стоимость: $11.20
Баланс: $25.90 -> $14.25
Данные заказа:
email: user@example.com
План: 6
Активен до: 2027-02-19

Для Full Auto заказов также показывается password, если он был передан в fields.


Статусы

processing  заказ принят
working     заказ в работе
pairing     нужно открыть pair_url
waiting     требуется действие партнера
pending     ожидание
done        выполнен
failed      не выполнен
cancelled   отменен


Пополнение баланса

Пополнение через API доступно для Crypto и счетов LZT Market.

Список доступных сетей:
GET /topups/crypto/methods

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.get(
    f"{BASE_URL}/topups/crypto/methods",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(response.json())
```

Создать заявку:
POST /topups/crypto

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.post(
    f"{BASE_URL}/topups/crypto",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json={"amount": 10, "trade_type": "usdt.trc20"},
    timeout=20,
)
print(response.json())
```

Ответ:
{
  "ok": true,
  "topup_id": 1,
  "status": "pending",
  "amount": 10.0,
  "currency": "USD",
  "method": "Crypto",
  "trade_type": "usdt.trc20",
  "title": "USDT TRC20",
  "pay_amount": "10.00",
  "pay_symbol": "USDT",
  "address": "wallet_address",
  "address_transfer_warning": "⚠️ Запрещено выводить средства на этот адрес из Crypto Bot или xRocket: такой перевод может не быть распознан и зачислен.",
  "memo": "",
  "memo_required": false,
  "tx_hash": null
}

После оплаты отправьте tx hash:
POST /topups/{topup_id}/tx

Пример:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"
TOPUP_ID = 1

response = requests.post(
    f"{BASE_URL}/topups/{TOPUP_ID}/tx",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json={"tx_hash": "transaction_hash"},
    timeout=20,
)
print(response.json())
```

Проверить заявку:
GET /topups/{topup_id}

Через API также можно создать счёт LZT Market или заявку на перевод по Bybit UID.


Пополнение баланса через API

Через API можно создавать Crypto-пополнения, счета LZT Market и заявки на перевод по Bybit UID.

Порядок работы:

1. Получите список доступных сетей:
GET /topups/crypto/methods

2. Создайте заявку на пополнение:
POST /topups/crypto

3. Отправьте точную сумму на address из ответа. Не выводите средства на этот адрес из Crypto Bot или xRocket: такие переводы могут не быть распознаны и зачислены.

4. После оплаты передайте hash транзакции:
POST /topups/{topup_id}/tx

5. Проверьте статус заявки:
GET /topups/{topup_id}

Доступные trade_type зависят от настроек сервиса. Список нужно брать из GET /topups/crypto/methods.

Пример создания заявки:
```json
{
  "amount": 10,
  "trade_type": "usdt.trc20"
}
```

Пример Python:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

headers = {
    "Authorization": f"Bearer {TOKEN}",
    "Content-Type": "application/json",
}

methods = requests.get(
    f"{BASE_URL}/topups/crypto/methods",
    headers=headers,
    timeout=20,
)
print(methods.json())

topup = requests.post(
    f"{BASE_URL}/topups/crypto",
    headers=headers,
    json={
        "amount": 10,
        "trade_type": "usdt.trc20",
    },
    timeout=20,
)
topup_data = topup.json()
print(topup_data)

topup_id = topup_data["topup_id"]
address = topup_data["address"]
pay_amount = topup_data["pay_amount"]
pay_symbol = topup_data["pay_symbol"]

print(f"Send {pay_amount} {pay_symbol} to {address}")

# После оплаты замените transaction_hash на реальный hash транзакции.
tx = requests.post(
    f"{BASE_URL}/topups/{topup_id}/tx",
    headers=headers,
    json={"tx_hash": "transaction_hash"},
    timeout=20,
)
print(tx.json())

status = requests.get(
    f"{BASE_URL}/topups/{topup_id}",
    headers=headers,
    timeout=20,
)
print(status.json())
```

LZT Market

1. Получите доступные платёжные способы:
GET /topups/payment/methods

2. Создайте счёт:
POST /topups/payment

Тело запроса:
```json
{
  "amount": 10,
  "payment_method": "lzt"
}
```

В ответе используйте `pay_url` для оплаты. Поле `amount` — сумма, которая будет зачислена на баланс; `pay_amount` — сумма счёта с учётом настроенной комиссии.

Пример Python:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"
headers = {"Authorization": f"Bearer {TOKEN}"}

topup = requests.post(
    f"{BASE_URL}/topups/payment",
    headers=headers,
    json={"amount": 10, "payment_method": "lzt"},
    timeout=20,
).json()

print("Оплатить:", topup["pay_url"])

# Webhook LZT зачисляет платёж автоматически. Этот запрос можно использовать
# для ручной проверки или polling до terminal status.
checked = requests.post(
    f"{BASE_URL}/topups/{topup['topup_id']}/check",
    headers=headers,
    timeout=20,
).json()
print(checked)
```

Bybit UID

1. Создайте заявку:
POST /topups/bybit

Тело запроса:
```json
{
  "amount": 10
}
```

В ответе `address` содержит Bybit UID, `pay_amount` — точную сумму перевода, а `pay_symbol` всегда равен `USDT`. Выполните внутренний перевод USDT через Bybit на указанный UID.

2. После перевода отправьте его `txID`:
POST /topups/{topup_id}/bybit-tx

Тело запроса:
```json
{
  "tx_id": "1234567890"
}
```

Пример Python:
```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"
headers = {"Authorization": f"Bearer {TOKEN}"}

topup = requests.post(
    f"{BASE_URL}/topups/bybit",
    headers=headers,
    json={"amount": 10},
    timeout=20,
).json()

print(f"Перевести {topup['pay_amount']} {topup['pay_symbol']} на UID {topup['address']}")

# После внутреннего перевода замените значение на реальный txID из Bybit.
confirmed = requests.post(
    f"{BASE_URL}/topups/{topup['topup_id']}/bybit-tx",
    headers=headers,
    json={"tx_id": "1234567890"},
    timeout=20,
).json()
print(confirmed)
```

Один `txID` можно использовать только один раз. Перевод должен быть выполнен после создания заявки, иметь статус зачисленного и соответствовать монете и сумме заявки.

Получить текущее состояние без обращения к платёжному провайдеру:
GET /topups/{topup_id}

Статусы заявки:

pending     заявка создана, ожидает оплату или проверку hash
completed   платеж подтвержден, баланс пополнен
cancelled   заявка или истёкший счёт отменены

Минимальные суммы и комиссии могут отличаться по монете и сети. Перед созданием заявки всегда используйте GET /topups/crypto/methods и проверяйте address, pay_amount, pay_symbol, memo и address_transfer_warning из ответа POST /topups/crypto. Для XRP поле memo — обязательный Destination Tag: перевод без него не будет зачислен. Вывод из Crypto Bot или xRocket на выданный on-chain address запрещен: перевод может не быть распознан и зачислен.


Ошибки

invalid api key - неверный API ключ
insufficient partner balance - недостаточно баланса партнера
service_balance_empty - сервис временно недоступен
service_temporarily_unavailable - сервис временно недоступен
order_action_conflict - действие конфликтует с текущим состоянием заказа (HTTP 409)
request_rejected - запрос отклонен из-за параметров или текущего состояния (HTTP 400, 404, 422 или 429)
unknown product_id - неизвестный product_id
unknown item_id - неизвестный item_id
order not found - заказ не найден


Неверный пароль в Full Auto

Если Spotify отклонил пароль от аккаунта, заказ возвращается со статусом failed и точным кодом причины login_wrong_password.

Пример ответа GET /orders/{order_id}; webhook содержит те же status и reason:

```json
{
  "ok": true,
  "order_id": 1,
  "status": "failed",
  "error": "",
  "reason": "login_wrong_password"
}
```

login_wrong_password означает, что исходный API-заказ завершён. Запросите у клиента новый пароль и создайте новый API-заказ с теми же product_id, item_id и остальными fields. В новом запросе обязательно используйте новый уникальный ref, иначе API вернёт предыдущий заказ как duplicate.

```python
import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.post(
    f"{BASE_URL}/orders",
    headers={
        "Authorization": f"Bearer {TOKEN}",
        "Content-Type": "application/json",
    },
    json={
        "product_id": "spotify_premium_full_auto",
        "item_id": "spotify_premium_full_auto_1",
        "ref": "order-1001-password-retry-1",
        "fields": {
            "spotify_premium_full_auto_email": "user@example.com",
            "spotify_premium_full_auto_password": "new_password",
        },
    },
    timeout=20,
)
print(response.json())
```
