Бизнес-карты (tbank.business_cards)

Управление корпоративными картами: выпуск и перевыпуск виртуальных карт, реквизиты, блокировка, лимиты (расходный и на снятие наличных, в том числе пакетно) и списки карт компании.

  • Хосты: большинство методов — на business.tbank.ru/openapi по Bearer-токену; перевыпуск, общий расходный лимит, пакетная установка лимитов и методы v3 (списки заявок и карт компании) — на secured-openapi.tbank.ru по mTLS (cert).

  • Суммы: Decimal в рублях (пакетные лимиты v3 — целые). Провод: camelCase.

  • Клиенты: tbank.business_cards.BusinessCardsClient (async) и tbank.business_cards.sync.BusinessCardsClient (sync).

Выпуск виртуальной карты

from tbank.business_cards import BusinessCardsClient
from tbank.business_cards.models import CreateApplicationRequest
from tbank.business_cards.enums import CardNetwork

client = BusinessCardsClient(
    token="business-token",
    cert=("client.pem", "client-key.pem"),   # mTLS нужен для v3 и лимитов
)

app = await client.create_virtual_card_application(CreateApplicationRequest(
    employee_identification_application_id="emp-app-1",
    account_number="40802810000000000001",
    card_network=CardNetwork.MIR,
))
status = await client.get_virtual_card_application(app.card_issue_application_id)
if status.ucid:
    requisites = await client.get_virtual_card_requisites(status.ucid)
    print(requisites.number, requisites.cvc, requisites.expiry_date.month)

Лимиты и блокировка

from decimal import Decimal
from tbank.business_cards.models import (
    SetLimitRequest, BlockCardRequest, SetBatchLimitsRequest, BatchLimitItem, BatchLimitValue,
)
from tbank.business_cards.enums import InputLimitPeriod, CardBlockReason

# лимит на снятие наличных (Bearer) и общий расходный лимит (mTLS)
await client.set_cash_limit(ucid, SetLimitRequest(
    limit_value=Decimal("50000"), limit_period=InputLimitPeriod.MONTH,
))
await client.set_spend_limit(ucid, SetLimitRequest(
    limit_value=Decimal("200000"), limit_period=InputLimitPeriod.MONTH,
))
limits = await client.get_card_limits(ucid)
print(limits.spend_limit.limit_remain)

# пакетная установка лимитов (mTLS, до 10 000 карт)
await client.set_batch_limits(SetBatchLimitsRequest(limits=[
    BatchLimitItem(ucid=ucid, spend_limit=BatchLimitValue(
        limit_period=InputLimitPeriod.DAY, limit_value=100000)),
]))

# блокировка
await client.block_card(ucid, BlockCardRequest(reason=CardBlockReason.LOST))

Перевыпуск и списки

app = await client.reissue_virtual_card(ucid)         # mTLS → correlationId
result = await client.get_reissue_result(app.correlation_id)
if result.status.value == "READY":
    print(result.info.new_ucid)

await client.list_cards(account_number="40802810000000000001")
await client.list_company_cards()                     # v3, mTLS
await client.list_virtual_card_applications(limit=50, offset=0)   # v3, mTLS

Клиент

class tbank.business_cards.aio.BusinessCardsClient(token, *, base_url=None, secured_base_url=None, sandbox=False, cert=None, verify=True, retry=None, transport=None, secured_transport=None)[исходный код]

Базовые классы: BaseAsyncClient

Асинхронный клиент бизнес-карт: выпуск и перевыпуск виртуальных карт, реквизиты, блокировка, лимиты (в т.ч. пакетно) и списки карт.

Перевыпуск, общий расходный лимит, пакетная установка лимитов и методы v3 (список заявок и карт компании) идут на secured-хост и требуют mTLS-сертификата (cert); остальное — на обычном хосте по Bearer. Суммы — Decimal в рублях, провод — camelCase.

Параметры:
decimal_body: ClassVar[bool] = True

True → тело парсится с parse_float=Decimal (точные денежные суммы).

async list_cards(*, account_number=None, offset=None, limit=None)[исходный код]

Список бизнес-карт компании.

Параметры:
  • account_number (str | None)

  • offset (int | None)

  • limit (int | None)

Тип результата:

CardInfoSeq

async get_card(ucid)[исходный код]

Карточка бизнес-карты по её UCID.

Параметры:

ucid (int)

Тип результата:

CardInfo

async get_virtual_card_requisites(ucid)[исходный код]

Реквизиты виртуальной карты (номер, CVC, срок действия).

Параметры:

ucid (int)

Тип результата:

VirtualCardRequisites

async block_card(ucid, request)[исходный код]

Заблокировать карту.

Параметры:
Тип результата:

None

async list_company_cards(*, account_number=None, offset=None, limit=None)[исходный код]

Список карт компании (v3, mTLS).

Параметры:
  • account_number (str | None)

  • offset (int | None)

  • limit (int | None)

Тип результата:

CompanyCardsResponse

async create_virtual_card_application(request)[исходный код]

Создать заявку на выпуск виртуальной карты.

Параметры:

request (CreateApplicationRequest)

Тип результата:

CreateApplicationResult

async get_virtual_card_application(application_id)[исходный код]

Статус заявки на выпуск виртуальной карты.

Параметры:

application_id (str)

Тип результата:

CardIssueApplicationStatusResult

async list_virtual_card_applications(*, limit, offset)[исходный код]

Список заявок на выпуск виртуальных карт (v3, mTLS).

Параметры:
Тип результата:

List[VirtualCardApplication]

async reissue_virtual_card(ucid)[исходный код]

Перевыпустить виртуальную карту (mTLS). Возвращает correlationId.

Параметры:

ucid (int)

Тип результата:

ReissueApplication

async get_reissue_result(correlation_id)[исходный код]

Результат перевыпуска виртуальной карты.

Параметры:

correlation_id (str)

Тип результата:

ReissueVirtualCardResult

async get_card_limits(ucid)[исходный код]

Текущие лимиты карты (расходный и на снятие наличных).

Параметры:

ucid (int)

Тип результата:

CardLimits

async set_cash_limit(ucid, request)[исходный код]

Установить лимит на снятие наличных.

Параметры:
Тип результата:

None

async set_spend_limit(ucid, request)[исходный код]

Установить общий расходный лимит (mTLS).

Параметры:
Тип результата:

None

async set_batch_limits(request)[исходный код]

Пакетно установить лимиты для списка карт (v3, mTLS).

Параметры:

request (SetBatchLimitsRequest)

Тип результата:

SetBatchLimitsResult

Модели

class tbank.business_cards.models.BusinessCardModel[исходный код]

Базовые классы: BaseModel

Базовая модель домена: snake_case в Python, camelCase на проводе.

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CardInfo(*, ucid, accountNumber, cardBin, cardLastFourDigits, isActive, status, embossedName)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CardInfoSeq(*, offset, limit, totalNumber, cards=None)[исходный код]

Базовые классы: BusinessCardModel

Страница карт (метод /api/v1/card).

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.ExpiryDate(*, year, month)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.VirtualCardRequisites(*, number, embossedName, cvc, expiryDate)[исходный код]

Базовые классы: BusinessCardModel

Реквизиты виртуальной карты (полный номер, CVC, срок).

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CompanyCard(*, ucid, accountNumber, cardBin, cardLastFourDigits, embossedName, isActive, isVirtual, status)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CompanyCardsResponse(*, cards=<factory>, offset, limit, total=None)[исходный код]

Базовые классы: BusinessCardModel

Список карт компании (метод /api/v3/company/card).

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CreateApplicationRequest(*, employeeIdentificationApplicationId, accountNumber, cardNetwork)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
  • employeeIdentificationApplicationId (str)

  • accountNumber (str)

  • cardNetwork (CardNetwork)

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CreateApplicationResult(*, cardIssueApplicationId)[исходный код]

Базовые классы: BusinessCardModel

Параметры:

cardIssueApplicationId (str)

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CardIssueApplicationStatusResult(*, cardIssueApplicationId, status, failedReason=None, ucid=None)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.VirtualCardApplication(*, cardIssueApplicationId, status, ucid=None)[исходный код]

Базовые классы: BusinessCardModel

Заявка на виртуальную карту (метод /api/v3/card/virtual/issue/application).

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.ReissueRequest(*, ucid)[исходный код]

Базовые классы: BusinessCardModel

Параметры:

ucid (int)

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.ReissueApplication(*, correlationId)[исходный код]

Базовые классы: BusinessCardModel

Параметры:

correlationId (str)

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.ReissuedVirtualCardInfo(*, oldUcid, newUcid, cardBin, cardLastFourDigits)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
  • oldUcid (int)

  • newUcid (int)

  • cardBin (str)

  • cardLastFourDigits (str)

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.ReissueVirtualCardResult(*, status, info=None)[исходный код]

Базовые классы: BusinessCardModel

Результат перевыпуска: info заполнен только при status == READY.

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.BlockCardRequest(*, reason, comment=None)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.SetLimitRequest(*, limitValue, limitPeriod)[исходный код]

Базовые классы: BusinessCardModel

Установка лимита (общий расходный или на наличные).

Параметры:
  • limitValue (Annotated[Decimal, PlainSerializer(func=~tbank.business_cards.models.<lambda>, return_type=float, when_used=json)])

  • limitPeriod (InputLimitPeriod)

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.SpendLimit(*, limitValue, limitRemain, limitPeriod)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CashLimit(*, limitValue, limitRemain, limitPeriod)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.CardLimits(*, ucid, spendLimit, cashLimit)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.BatchLimitValue(*, limitPeriod, limitValue)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.BatchLimitItem(*, ucid, spendLimit=None, cashLimit=None)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.SetBatchLimitsRequest(*, limits)[исходный код]

Базовые классы: BusinessCardModel

Параметры:

limits (List[BatchLimitItem])

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.BatchLimitResult(*, isSuccess, errorMessage=None)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
  • isSuccess (bool)

  • errorMessage (str | None)

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.BatchLimitResultItem(*, ucid, spendLimit=None, cashLimit=None)[исходный код]

Базовые классы: BusinessCardModel

Параметры:
model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

class tbank.business_cards.models.SetBatchLimitsResult(*, limits=<factory>)[исходный код]

Базовые классы: BusinessCardModel

Параметры:

limits (List[BatchLimitResultItem])

model_config = {'alias_generator': <function to_camel>, 'extra': 'ignore', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

Перечисления

class tbank.business_cards.enums.CardStatus(*values)[исходный код]

Базовые классы: str, Enum

Статус бизнес-карты.

NORM = 'NORM'
CLOSED = 'CLOSED'
BLOCKED = 'BLOCKED'
class tbank.business_cards.enums.CardNetwork(*values)[исходный код]

Базовые классы: str, Enum

Платёжная система карты.

MASTERCARD = 'MASTERCARD'
VISA = 'VISA'
MIR = 'MIR'
class tbank.business_cards.enums.CardBlockReason(*values)[исходный код]

Базовые классы: str, Enum

Причина блокировки карты.

LOST = 'LOST'
STOLEN = 'STOLEN'
BROKEN = 'BROKEN'
FRAUD = 'FRAUD'
CLIENT_INITIATED = 'CLIENTINITIATED'
class tbank.business_cards.enums.CardIssueApplicationStatus(*values)[исходный код]

Базовые классы: str, Enum

Статус заявки на выпуск виртуальной карты.

NEW = 'NEW'
IDENTIFICATION = 'IDENTIFICATION'
ISSUING = 'ISSUING'
CARD_ISSUED = 'CARD_ISSUED'
FAILED_FATAL = 'FAILED_FATAL'
FAILED_NON_FATAL = 'FAILED_NON_FATAL'
class tbank.business_cards.enums.InputLimitPeriod(*values)[исходный код]

Базовые классы: str, Enum

Период возобновления лимита (на запись).

DAY = 'DAY'
MONTH = 'MONTH'
IRREGULAR = 'IRREGULAR'
class tbank.business_cards.enums.OutputLimitPeriod(*values)[исходный код]

Базовые классы: str, Enum

Период возобновления лимита (в ответе).

DAY = 'DAY'
MONTH = 'MONTH'
IRREGULAR = 'IRREGULAR'
CUSTOM = 'CUSTOM'
class tbank.business_cards.enums.ReissueStatus(*values)[исходный код]

Базовые классы: str, Enum

Статус заявки на перевыпуск виртуальной карты.

READY = 'READY'
IN_PROGRESS = 'IN_PROGRESS'
ERROR = 'ERROR'