Tochka API docs - Sandbox docs
Python-клиент для Tochka API на базе httpx и pydantic.
Сейчас библиотека покрывает:
tochka_py.accounts- работа со счетами:listtochka_py.customers- работа с клиентами:list,gettochka_py.statements- работа с выписками:init,get,wait_until_ready,init_and_waittochka_py.invoice- полный lifecycle работы со счетами:create,get_file,send_to_email,get_payment_status,deletetochka_py.closing_documents- работа с закрывающими документами:create,get_file,send_to_email,deletetochka_py.webhook- управление webhook-подписками и верификация входящих webhook JWT:create,edit,get,send_test,delete,WebhookVerifier
Поддерживаются синхронные и асинхронные вызовы, единый transport и типизированные модели запросов и ответов.
Также доступен CLI tochka-py для управления webhook-подписками.
pip install tochka_pyТребуется Python >=3.10.
Если запускаете CLI из репозитория и команда tochka-py отдает старую версию, активируйте локальное окружение через source .venv/bin/activate.
from tochka_py import TochkaClient
from tochka_py.invoice.types import (
ContentInvoice,
CounterpartType,
InvoiceCreateRequest,
InvoiceCreateRequestData,
InvoiceModel,
NdsKind,
PositionModel,
SecondSideModel,
UnitCode,
)
request = InvoiceCreateRequestData(
data=InvoiceCreateRequest(
account_id="12345123451234512345/044525104",
customer_code="1234567ab",
second_side=SecondSideModel(
tax_code="7707083893",
type=CounterpartType.COMPANY,
second_side_name='ООО "Покупатель"',
),
content=ContentInvoice(
invoice=InvoiceModel(
number="42",
total_amount=1000.0,
positions=[
PositionModel(
position_name="Консультационные услуги",
unit_code=UnitCode.PIECE,
nds_kind=NdsKind.WITHOUT_NDS,
price=1000.0,
quantity=1,
total_amount=1000.0,
)
],
)
),
)
)
with TochkaClient(token="your_token") as client:
response = client.invoice.create_sync(request)
print(response.data.document_id)Получение PDF, статуса оплаты, отправка на email и удаление:
from tochka_py.invoice.types import SendDocumentToEmailRequest
document_id = response.data.document_id
customer_code = request.customer_code
with TochkaClient(token="your_token") as client:
payment_status = client.invoice.get_payment_status_sync(customer_code, document_id)
pdf_file = client.invoice.get_file_sync(customer_code, document_id)
email_result = client.invoice.send_to_email_sync(
customer_code,
document_id,
SendDocumentToEmailRequest(email="test@example.com"),
)
delete_result = client.invoice.delete_sync(customer_code, document_id)
print(payment_status.data.payment_status)
print(pdf_file.filename, pdf_file.content_type, len(pdf_file.content))
print(email_result.data.result, delete_result.data.result)Создание закрывающего документа, например акта:
from decimal import Decimal
from tochka_py import TochkaClient
from tochka_py.closing_documents.types import (
ActModel,
ClosingDocumentCreateRequest,
ContentAct,
SecondSideModel,
)
from tochka_py.invoice.types import CounterpartType, NdsKind, PositionModel, UnitCode
request = ClosingDocumentCreateRequest(
account_id="12345123451234512345/044525104",
customer_code="1234567ab",
second_side=SecondSideModel(
tax_code="7707083893",
type=CounterpartType.COMPANY,
),
content=ContentAct(
act=ActModel(
number="ACT-42",
total_amount=Decimal("1000.00"),
positions=[
PositionModel(
position_name="Консультационные услуги",
unit_code=UnitCode.PIECE,
nds_kind=NdsKind.WITHOUT_NDS,
price=Decimal("1000.00"),
quantity=Decimal("1"),
total_amount=Decimal("1000.00"),
)
],
)
),
)
with TochkaClient(token="your_token") as client:
response = client.closing_documents.create_sync(request)
print(response.data.document_id)Создание выписки и ожидание готовности одним вызовом:
from datetime import date
from tochka_py import TochkaClient
from tochka_py.statements.types import StatementInitParameters, StatementInitRequest
request = StatementInitRequest(
statement=StatementInitParameters(
account_id="12345123451234512345/044525104",
start_date_time=date(2024, 1, 1),
end_date_time=date(2024, 1, 31),
)
)
with TochkaClient(token="your_token") as client:
response = client.statements.init_and_wait_sync(request, poll_interval=1.0, timeout=60.0)
statement = response.data.statements[0]
print(statement.statement_id, statement.status, len(statement.transactions or []))Управление webhook-подпиской:
from tochka_py import TochkaClient
from tochka_py.webhook.types import WebhookSubscription, WebhookType
with TochkaClient(token="your_token") as client:
response = client.webhooks.create_sync(
client_id="your_app_client_id",
request=WebhookSubscription(
webhooks_list=[
WebhookType.INCOMING_PAYMENT,
WebhookType.OUTGOING_PAYMENT,
],
url="https://app.example.com/tochka/webhook",
),
)
print(response.data.webhooks_list, response.data.url)Верификация и парсинг входящего webhook JWT:
from tochka_py.webhook.verifier import WebhookVerifier
raw_webhook_jwt = request_body.decode()
with WebhookVerifier() as verifier:
payload = verifier.decode_sync(raw_webhook_jwt)
print(payload.webhook_type, payload.customer_code)Повесить webhook одной командой:
export TOCHKA_API_TOKEN=your_token
tochka-py webhook set \
--client-id your_app_client_id \
--url https://app.example.com/tochka/webhook \
--event incomingPayment \
--event outgoingPaymentПолучить список счетов:
tochka-py accounts listПолучить список клиентов и карточку клиента:
tochka-py customers list
tochka-py customers get --customer-code 1234567abПосмотреть текущую подписку:
tochka-py webhook get --client-id your_app_client_idОтправить тестовый webhook:
tochka-py webhook test --client-id your_app_client_id --event incomingPaymentУдалить подписку:
tochka-py webhook delete --client-id your_app_client_idCLI использует:
TOCHKA_API_TOKENдля токенаTOCHKA_BASE_URLдля переопределения base URL--sandboxдля переключения наhttps://enter.tochka.com/sandbox/v2и дефолтный токенsandbox.jwt.token
Для sandbox можно использовать:
- base URL:
https://enter.tochka.com/sandbox/v2 - токен:
sandbox.jwt.token
from tochka_py import TochkaClientTochkaClient:
statements.init_sync(...)statements.init(...)statements.get_sync(...)statements.get(...)statements.wait_until_ready_sync(...)statements.wait_until_ready(...)statements.init_and_wait_sync(...)statements.init_and_wait(...)invoice.create_sync(...)invoice.create(...)invoice.get_file_sync(...)invoice.get_file(...)invoice.send_to_email_sync(...)invoice.send_to_email(...)invoice.get_payment_status_sync(...)invoice.get_payment_status(...)invoice.delete_sync(...)invoice.delete(...)closing_documents.create_sync(...)closing_documents.create(...)closing_documents.get_file_sync(...)closing_documents.get_file(...)closing_documents.send_to_email_sync(...)closing_documents.send_to_email(...)closing_documents.delete_sync(...)closing_documents.delete(...)webhooks.create_sync(...)webhooks.create(...)webhooks.edit_sync(...)webhooks.edit(...)webhooks.get_sync(...)webhooks.get(...)webhooks.send_test_sync(...)webhooks.send_test(...)webhooks.delete_sync(...)webhooks.delete(...)webhooks.set_sync(...)webhooks.set(...)
Библиотека поднимает исключения из tochka_py.core.errors, например:
AuthenticationErrorRequestValidationErrorNotFoundErrorServerError
У исключений доступны поля product, http_status, code, request_id и raw.
По умолчанию интеграционные тесты отключены.
Sandbox-интеграции лежат в tests/sandbox/ и разбиты по продуктам:
test_accounts.pytest_customers.pytest_statements.pytest_invoice.pytest_closing_documents.py
Запуск unit-тестов:
uv run pytest testsЗапуск integration:
uv run pytest tests -m integrationЗапуск отдельного sandbox-модуля:
uv run pytest tests/sandbox/test_statements.py -m integration