Python client library for the Novitus NoviAPI fiscal printer REST API.
Project description
novitus-noviapi
Python client library for the Novitus NoviAPI fiscal printer REST API.
novitus-noviapi is the package name on PyPI. Import it as noviapi.
Features
- Sync and async clients with explicit endpoint methods
- Strict Pydantic request and response models
- Token lifecycle handling with retry on expired tokens
- Async client built on
httpxandanyio - Offline contract tests against a frozen NoviAPI OpenAPI snapshot
Installation
uv add novitus-noviapi
Pass an http:// or https:// base URL that points either at the printer root
or directly at a path ending with /api/v1. The client normalizes root URLs to
/api/v1, strips a trailing slash from /api/v1/, and rejects ambiguous subpaths.
from noviapi import NoviApiClient
with NoviApiClient('http://127.0.0.1:8888') as client:
client.comm_test()
Quick start
from decimal import Decimal
from noviapi import NoviApiClient
from noviapi.models import Article, Item, Receipt, Summary
client = NoviApiClient('http://127.0.0.1:8888/api/v1')
receipt = Receipt(
items=[
Item(
article=Article(
name='Coffee',
ptu='A',
quantity=Decimal('1'),
price=Decimal('10.00'),
value=Decimal('10.00'),
)
)
],
summary=Summary(total=Decimal('10.00'), pay_in=Decimal('10.00')),
)
created = client.receipt_send(receipt)
client.receipt_confirm(created.request.id)
Async quick start
from noviapi import NoviApiAsyncClient
from noviapi.exceptions import NoviApiTransportError
async def main() -> None:
async with NoviApiAsyncClient('http://127.0.0.1:8888/api/v1') as client:
try:
if not await client.comm_test():
raise RuntimeError('Printer returned an unexpected non-200 response')
except NoviApiTransportError:
raise RuntimeError('Printer is not reachable') from None
Authentication
- Most endpoint methods fetch and refresh tokens automatically.
comm_test()is the exception: it is intentionally auth-free.comm_test()returnsTruefor200 OK, returnsFalsefor unusual non-error responses such as redirects, and raises on transport errors or HTTP responses>= 400.- Use
token_get()when you need to inspect or bootstrap a token explicitly. - Use
token_refresh()when you need to force a refresh cycle yourself.
from noviapi import NoviApiClient
with NoviApiClient('http://127.0.0.1:8888/api/v1') as client:
token = client.token_get()
client.token_refresh(token.token)
Error handling
Transport problems and API errors are separated.
from noviapi import NoviApiClient
from noviapi.exceptions import (
AuthenticationError,
NoviApiTransportError,
TooManyTokenRequestsError,
)
with NoviApiClient('http://127.0.0.1:8888/api/v1') as client:
try:
queue = client.queue_check()
except TooManyTokenRequestsError as exc:
allowed_refresh_date = (
exc.detail.exception.allowed_refresh_date
if exc.detail is not None
else None
)
print(allowed_refresh_date)
except AuthenticationError:
print('Token rejected by printer')
except NoviApiTransportError:
print('Network error or invalid JSON response')
else:
print(queue.requests_in_queue)
Hardware testing
Hardware tests are opt-in and intended only for development against a real
device. The default hardware suite only covers comm_test() and queue_check()
so it does not print fiscal documents by accident.
Optional stateful coverage includes a read-only
status_send() / status_confirm() / status_check() device-status flow and a
non-fiscal document test in tests/hardware/test_nf_printout.py that prints
Greetings from the test suite!. Those tests require the extra
--run-hardware-stateful flag.
The non-fiscal document test still consumes paper, so run it only when that output is acceptable.
These hardware checks are manual and are not part of GitHub Actions. CI only covers contract, unit, integration, and packaging validation.
Long-poll timeout parameters are forwarded in milliseconds, matching the
NoviAPI contract.
The current supported printer matrix below reflects the minimum firmware versions declared by the printer manufacturer for NoviAPI support:
POINTfirmware1.00HD II Onlinefirmware3.50Deon Onlinefirmware310Bono Onlinefirmware300INFISfirmware1.30
This library has been personally verified on POINT firmware 1.00. Treat the
other entries as manufacturer-declared minimum supported versions until they are
individually exercised by this project's hardware validation.
Set the printer base URL and enable the hardware test marker explicitly:
export NOVIAPI_BASE_URL="http://192.168.1.50:8888/api/v1"
uv run pytest tests/hardware --run-hardware -m hardware
If --run-hardware is omitted, hardware tests are skipped. If
NOVIAPI_BASE_URL is missing, pytest fails fast with a usage error. Stateful
hardware tests also require --run-hardware-stateful.
See docs/hardware-testing.md for the full checklist, requirements, safety
notes, and recommended execution procedure.
See RC_CHECKLIST.md for the current release-candidate gate.
Status
This library started as one part of a larger project and was later extracted
into a standalone open-source package. It currently ships strict models,
explicit endpoint coverage, contract tests, lean release artifacts, artifact
install smoke checks, and a small hardware test suite. Hardware support remains
intentionally narrow and manual hardware validation still sits outside GitHub
Actions; the supported printer matrix lives in docs/hardware-testing.md.
The extraction and open-source work was sponsored by Diablaq, and Novitus provided a development kit for the project. Thank you!
Project details
Release history Release notifications | RSS feed
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 novitus_noviapi-0.2.0.tar.gz.
File metadata
- Download URL: novitus_noviapi-0.2.0.tar.gz
- Upload date:
- Size: 17.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Manjaro Linux","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 |
41ac463a515546182868afc5d1b0463bc3f3aa19fc21ea77413273edb9fba6ea
|
|
| MD5 |
8638a897c09be9ec44acb089721350f2
|
|
| BLAKE2b-256 |
782e582ae95d2c6c1a66966c95ef3e76b4ae3aad05ff87d5e251c24b17c31d3f
|
File details
Details for the file novitus_noviapi-0.2.0-py3-none-any.whl.
File metadata
- Download URL: novitus_noviapi-0.2.0-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Manjaro Linux","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 |
3253b4a877f4cfe8e9840bb41a4bb445ba94d8bee2f89780c0988dccc4c23ebb
|
|
| MD5 |
f72af11888dea57e6fb99e9484130fd5
|
|
| BLAKE2b-256 |
7ef15fc76f6901e94d996ace625a997364dacb1e6eaf402e45e175bb7fed394a
|