Skip to main content

midasbuy-sdk

Python-клиент для API активации кодов Midasbuy.

Есть бесплатный тариф: ключ выдаётся без регистрации и без оплаты. Это бета — лимиты временные и будут пересмотрены по её итогам.

pip install midasbuy-sdk

Как получить ключ

Напишите Telegram-боту @midasbuy_api_bot команду /free.

К заявке приложите ссылки на свои профили на площадках, где вы торгуете, и скриншоты-подтверждения. Это единственный барьер: он стоит не ради формальности, а чтобы бесплатные ключи не разошлись пачками по одноразовым аккаунтам.

Один бесплатный ключ в одни руки. Повторная заявка вернёт тот же ключ.

Первый вызов

Активация — задача про ожидание, а не про счёт: код уходит в Midas, и ответ приходит через секунды. Поэтому основной клиент асинхронный — пока одна активация идёт, остальные не стоят в очереди.

Методы сгруппированы по ресурсам: client.accounts, client.catalog, client.inventory, client.redeem, client.tasks, client.subscription.

Без base_url клиент бьёт в бесплатный контур — https://free.midasbuy-api.dev/v1. Платный хост передаётся явно: AsyncMidasbuyClient("ключ", base_url="https://api.ваш-домен/v1").

Аккаунт и игрок — разные вещи, и это главное, что нужно понять про activate.

  • account_id — Midas-аккаунт, с которого идёт активация. Его подключают один раз, дальше он живёт на сервере.
  • player_id — игрок, которому уходит товар. Может быть чужим: свой аккаунт активирует код на любой игровой ID.

player_id не обязателен: без него товар уходит на сам аккаунт — это дефолт для игр без персонажей.

import asyncio
from midasbuy_sdk import AccountStatus, AsyncMidasbuyClient


async def main() -> None:
    async with AsyncMidasbuyClient("ваш-ключ") as client:
        # 1. подключите Midas-аккаунт — С НЕГО будут идти активации.
        #    Ответ приходит сразу со статусом CONNECTING: вход выполняется на
        #    сервере, поэтому дождитесь CONNECTED, прежде чем активировать.
        account = await client.accounts.connect(
            country="RU", email="you@example.com", password="..."
        )
        while (state := (await client.accounts.get(account.account_id)).status) in (
            AccountStatus.connecting,
            AccountStatus.running,
        ):
            await asyncio.sleep(2)
        if state is not AccountStatus.connected:
            raise RuntimeError(f"аккаунт не подключился: {state}")

        # 2. активируйте код НА ИГРОКА и дождитесь результата — одним вызовом
        result = await client.redeem.activate_and_wait(
            "CODE-1234",
            account_id=account.account_id,   # с какого аккаунта
            game="pubgm",
            player_id="5544128792",          # какому игроку
        )
        print(result.status, result.granted_item)


asyncio.run(main())

Не знаете, тот ли это игрок — проверьте до списания кода:

who = await client.characters.lookup(
    account_id=account.account_id, game="pubgm", player_id="5544128792"
)
print(who.role_name, who.region, who.is_ban)

Пачкой — ровно то, ради чего нужен async:

async with AsyncMidasbuyClient("ваш-ключ") as client:
    jobs = await asyncio.gather(*(
        client.redeem.activate(code, account_id="acc_...", game="pubgm",
                               player_id=player)
        for code, player in codes_to_players
    ))
    rows = await client.redeem.status_batch([j.activation_id for j in jobs])

Синхронный клиент — то же самое без await, для скриптов и блокнотов, где событийный цикл дороже задачи:

from midasbuy_sdk import MidasbuyClient

with MidasbuyClient("ваш-ключ") as client:
    result = client.redeem.activate_and_wait(
        "CODE-1234", account_id="acc_...", game="pubgm", player_id="5544128792"
    )

Что делает клиент за вас

Ключ идемпотентности. Каждый POST уходит с Idempotency-Key, и повтор использует тот же ключ. Поэтому таймаут или 429 не превращают одну активацию в две. Свой ключ можно передать явно — тогда и ваш собственный ретрай схлопнется в одну операцию:

client.redeem.activate("CODE-1234", account_id="acc_...", game="pubgm", idempotency_key="order-42")

Отступ при 429. Превышение темпа — это не ошибка, а обратное давление: клиент ждёт Retry-After и продолжает. Исключение RateLimited вы увидите только когда ретраи кончились.

Типизированные модели. Ответы — это pydantic-модели, собранные из контракта API, а не сырые словари: поля и их типы известны заранее.

Списки и страницы

Списковые методы возвращают Page: сами элементы плюс total и has_more. Чтобы пройти всё, не считая офсеты руками, — iterate:

async for activation in client.redeem.iterate(limit=100):
    ...

Ошибки

Каждая — отдельный тип, у всех есть code и request_id (его удобно цитировать в поддержке).

  • RateLimited — слишком быстро. Поле retry_after, ничего не потрачено.
  • DailyCapReached — исчерпан суточный потолок активаций, в reset_at время сброса.
  • AuthFailed — ключ не принят. Сервис намеренно не уточняет, почему.
  • OutOfStock — кода такого номинала нет в вашем стоке.
  • NotFound — объекта нет либо он чужой; API эти случаи не различает.
  • WaitTimeout — wait_for не дождался. Активация всё ещё выполняется: опросите redeem.get позже. Повторно активировать код нельзя — он спишется дважды.

Ресурсы

  • accounts — connect(country=, email=, password=) · list() · get(account_id)
  • catalog — games() · items(game) · get_item(item_id)
  • inventory — add(items) · list() · stock()
  • redeem — activate(code, account_id=, game=) · activate_by_denomination(...) · activate_batch_by_denomination(...) · preview(...) · get(id) · list() · status_batch(ids) · wait_for(id) · activate_and_wait(...) · iterate()
  • tasks — batch(...) · package(...) · get(id) · list()
  • subscription — get() — состояние ключа: статус, срок, темп, остаток квоты

Про бету

Пока идёт бета, ограничитель — темп запросов, а не суточная квота: упёршись, вы получаете 429, ждёте и продолжаете работать. Суточный потолок активаций тоже есть, но он аварийный.

По итогам беты числа будут пересмотрены, и часть возможностей станет платной — о том, какие именно, сказано заранее: доставка результатов вебхуками, ссылки для выдачи и второй подключённый Midas-аккаунт.

Лицензия

MIT.

Release files for midasbuy-sdk 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for midasbuy-sdk 0.3.1
File Size Uploaded
midasbuy_sdk-0.3.1.tar.gz 40.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for midasbuy-sdk 0.3.1
File Interpreter ABI Platform
midasbuy_sdk-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 75.4 kB

Release files / midasbuy_sdk-0.3.1.tar.gz

Download URL midasbuy_sdk-0.3.1.tar.gz
Size 40.1 kB
Tags Source
SHA-256 checksum
How to use checksums
6fe48ad6b036aaecb3c69d40cc6ea9325031d5c7964a8d1a13a1f7d63dac172e
BLAKE2b-256 checksum
How to use checksums
39209460bcf235ac169444b1854efe0d11fc3a1a241de1f3f0afa770638e2fb1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 1, 2026.

Transparency log

Release files / midasbuy_sdk-0.3.1-py3-none-any.whl

Download URL midasbuy_sdk-0.3.1-py3-none-any.whl
Size 35.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8c82c4de88441cf7a435614189ec617aee9caef690babc68dd55cffa928d432c
BLAKE2b-256 checksum
How to use checksums
4a9f667cab294467ba61dc15f88f03fd5c685f6d953fa1875abc04d3981e79a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 1, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.0

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page