Tochka API wrapper for Python built on top of httpx and pydantic
Project description
tochka_py
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)
Closing Documents
Создание закрывающего документа, например акта:
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)
Statements
Создание выписки и ожидание готовности одним вызовом:
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 []))
Webhooks
Управление 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)
CLI
Повесить 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_id
CLI использует:
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
Структура API
from tochka_py import TochkaClient
TochkaClient:
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
По умолчанию интеграционные тесты отключены.
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
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tochka_py-0.0.6.tar.gz.
File metadata
- Download URL: tochka_py-0.0.6.tar.gz
- Upload date:
- Size: 64.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.1 {"installer":{"name":"uv","version":"0.10.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1411fda60baec20c92d789a3e2fdabf9d50a6ded654d5ed52fa7b0e709c1a7a6
|
|
| MD5 |
47c95ef17b562fa6ea51ecd84222a08d
|
|
| BLAKE2b-256 |
d380413ef44a0fa88257138ee8fa7479439b8e7a6be90a3581f6f0cb5aedcbd2
|
File details
Details for the file tochka_py-0.0.6-py3-none-any.whl.
File metadata
- Download URL: tochka_py-0.0.6-py3-none-any.whl
- Upload date:
- Size: 29.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.1 {"installer":{"name":"uv","version":"0.10.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a3dc81346d367a8cfc77d8b609863ccdada734a4a9f4bfe47b9bc642fbb2941
|
|
| MD5 |
2ef0096a3daa8c8bf9cc3f186b24db81
|
|
| BLAKE2b-256 |
dd6caf37a428cf261442699f606d60bbc7f72919c60ef65ca1698f4844991d46
|