Spotify Partner API

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


Авторизация

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

Authorization: Bearer pk_partner_key
Content-Type: application/json

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


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

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:

spotify_premium_full_auto_1        $2.20
spotify_premium_full_auto_3        $5.95
spotify_premium_full_auto_6        $11.65
spotify_premium_full_auto_12       $21.50
spotify_premium_full_auto_1duo     $2.85
spotify_premium_full_auto_3duo     $8.00
spotify_premium_full_auto_6duo     $15.35
spotify_premium_full_auto_12duo    $30.50
spotify_premium_full_auto_1fam     $4.40
spotify_premium_full_auto_2fam     $8.00
spotify_premium_full_auto_3fam     $11.40
spotify_premium_full_auto_addduo   $0.00

Pairing использует те же цены. В SKU нужно заменить full_auto на pairing:

spotify_premium_pairing_1          $2.20
spotify_premium_pairing_3          $5.95
spotify_premium_pairing_6          $11.65
spotify_premium_pairing_12         $21.50
spotify_premium_pairing_1duo       $2.85
spotify_premium_pairing_3duo       $8.00
spotify_premium_pairing_6duo       $15.35
spotify_premium_pairing_12duo      $30.50
spotify_premium_pairing_1fam       $4.40
spotify_premium_pairing_2fam       $8.00
spotify_premium_pairing_3fam       $11.40
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())
```


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

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"
ORDER_ID = 1

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    запросить новую pairing-ссылку
continue  подтвердить продолжение обработки
cancel    остановить заказ и вернуть баланс, если возврат доступен
password  отправить новый пароль

Примеры:

```python
import requests

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

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

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

password_response = requests.post(
    f"{BASE_URL}/orders/{ORDER_ID}/actions/password",
    headers=headers,
    json={"password": "new_password"},
    timeout=20,
)
print(password_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.


Pairing

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

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

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

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


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

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

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

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

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

✅ Заказ выполнен
Продукт: Spotify Premium Pairing - 6 months
Номер заказа: #1
Стоимость: $11.65
Баланс: $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.

Список доступных сетей:
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",
  "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 не создаются заявки CryptoBot и Bybit UID.


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

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

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

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

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

3. Отправьте точную сумму на address из ответа.

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())
```

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

pending     заявка создана, ожидает оплату или проверку hash
paid        платеж подтвержден, баланс пополнен
failed      заявка отклонена

Минимальные суммы и комиссии могут отличаться по монете и сети. Перед созданием заявки всегда используйте GET /topups/crypto/methods и проверяйте address, pay_amount и pay_symbol из ответа POST /topups/crypto.


Ошибки

invalid api key - неверный API ключ
insufficient partner balance - недостаточно баланса партнера
service_balance_empty - сервис временно недоступен
service_temporarily_unavailable - сервис временно недоступен
unknown product_id - неизвестный product_id
unknown item_id - неизвестный item_id
order not found - заказ не найден
