zapi-lib
Minimal Zabbix JSON-RPC API client for Python — a thin,
httpx-only wrapper around the single /api_jsonrpc.php endpoint.
Spun out of zapi-mcp so that tools which only
need the API client — e.g. speedtest-z —
can depend on it without pulling in the MCP server stack (mcp, starlette, uvicorn, …).
Features
- Version-adaptive auth:
user+authfield (Zabbix ≤ 6.2) andusername+Authorization: Bearer(6.4 / 7.0), degrading to the proven path automatically. - Read helpers:
get_hosts,get_items,get_problems,count_problems,get_events,get_maintenances. - Write helpers:
set_host_tag(idempotent host-tag upsert that preserves other tags),acknowledge_problem,set_maintenance/set_maintenance_for_hosts(idempotent maintenance windows, bylocationtag or by exact host name). - Provisioning (
ZapiProvisioner): config-driven client that auto-creates trapper hosts/items stamped with a managed-by tag —create_host,update_host,create_item,update_item, plusensure_group/get_host_ids/get_item_ids. - Escape hatch:
call(method, params)invokes any JSON-RPC method directly. - A single runtime dependency:
httpx.
Install
pip install zapi-lib
Usage
from zapi_lib import ZapiClient, tag_filter
with ZapiClient("https://zabbix.example.com", "api-user", "api-pass") as z:
hosts = z.get_hosts(tags=[tag_filter("speedtest-z")])
z.set_host_tag("eduroam", "speedtest-z", "0.10.0")
The URL may be given with or without the /api_jsonrpc.php suffix.
set_maintenance(location, since, till, name, description) opens an idempotent
maintenance window over hosts carrying a matching location tag;
set_maintenance_for_hosts(hosts, since, till, name, description) does the same over an
explicit list of exact host (technical) names instead, for when the affected hosts don't
share a tag or precise host-level control is wanted. Both are plain ZapiClient methods —
no provisioning config required.
Both accept a keyword-only overwrite=False. The window name is name + the start time,
so re-announcing the same planned outage with a corrected end time collides with the
window already created for it. By default that collision is a no-op (the historical
idempotent behaviour) and the correction is silently dropped. Pass overwrite=True to
treat the collision as a correction and update active_since/active_till/timeperiods/
description in place instead. hostids is never sent on update, so an overwrite moves
the schedule but never re-targets the window, and a repeat call with identical values still
issues no write at all.
Note what overwrite does not cover: the start time is part of the window name, so a
re-announcement that moves the start produces a different name, creates a second window,
and leaves the earlier one in place. Two overlapping windows over-suppress rather than
under-suppress, so it is the milder failure, but the stale window has to be removed by hand.
Only enable it where name + start time provably identifies one real-world event — a name
generated from a site and its start time qualifies; a free-text name chosen per call does
not, because two unrelated maintenances can then share a name and overwriting would
silently reschedule someone else's window. get_maintenances() reads all maintenance windows back
(hosts, host groups, time periods, tags) as raw API rows; deciding whether a given window
is currently active is left to the caller.
Provisioning (config-driven)
ZapiProvisioner extends ZapiClient for metric-collection scripts that register the
targets they push values to. It reads connection and provisioning defaults from a
config.ini [zabbix] section and auto-creates trapper hosts/items tagged with a
managed-by marker:
[zabbix]
url = https://zabbix.example.com/api_jsonrpc.php
id = api-user ; or `user`
pw = api-pass ; or `password`
group = DefaultGroup ; default host group for created/updated hosts
location = tokyo ; optional; added as a `location` tag
tag = my-collector ; optional; managed-by marker tag on hosts/items
from zapi_lib import ZapiProvisioner
with ZapiProvisioner.from_config() as z: # ./config.ini, then ~/.config.ini
z.show_version()
host_ids = z.get_host_ids("pool-a") or z.create_host("pool-a", location="tokyo")
host_id = host_ids[0]
if not z.get_item_ids(host_id, "usage"):
z.create_item(host_id, "usage", value_type=0)
update_host replaces the host's groups and tags (use set_host_tag to upsert a single
tag instead).
License
MIT
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 zapi_lib-0.8.0.tar.gz.
File metadata
- Download URL: zapi_lib-0.8.0.tar.gz
- Upload date:
- Size: 27.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fd35ce056a4448c5fd53f204373fb6ac11176b1ff845c53c2c2b18a117ee14b
|
|
| MD5 |
529f9c7dbe53d122f08a4bf7465d887a
|
|
| BLAKE2b-256 |
abba200be63e4eedf0b3e3cffa1ecdfb08adb33f76d7defa4daa9a724fd47d22
|
Provenance
The following attestation bundles were made for zapi_lib-0.8.0.tar.gz:
Publisher:
release.yml on shigechika/zapi-lib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zapi_lib-0.8.0.tar.gz -
Subject digest:
8fd35ce056a4448c5fd53f204373fb6ac11176b1ff845c53c2c2b18a117ee14b - Sigstore transparency entry: 2706090836
- Sigstore integration time:
-
Permalink:
shigechika/zapi-lib@b54b60c2b208bc0c25aa2980d30448f0507cae2b -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/shigechika
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b54b60c2b208bc0c25aa2980d30448f0507cae2b -
Trigger Event:
release
-
Statement type:
File details
Details for the file zapi_lib-0.8.0-py3-none-any.whl.
File metadata
- Download URL: zapi_lib-0.8.0-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
566345fb6be1e9f9809d392a011806d20becd304a3553a0cc6bd4a875791648d
|
|
| MD5 |
5afc346aee0b57b549b215bbc7e24f71
|
|
| BLAKE2b-256 |
2c0ca574dcd71884a8a0b3e1ac9b73c5cd1aeb47880581119da116ec1258a286
|
Provenance
The following attestation bundles were made for zapi_lib-0.8.0-py3-none-any.whl:
Publisher:
release.yml on shigechika/zapi-lib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zapi_lib-0.8.0-py3-none-any.whl -
Subject digest:
566345fb6be1e9f9809d392a011806d20becd304a3553a0cc6bd4a875791648d - Sigstore transparency entry: 2706090868
- Sigstore integration time:
-
Permalink:
shigechika/zapi-lib@b54b60c2b208bc0c25aa2980d30448f0507cae2b -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/shigechika
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b54b60c2b208bc0c25aa2980d30448f0507cae2b -
Trigger Event:
release
-
Statement type: