Chronary Python SDK
The official Python client for the Chronary calendar-as-a-service API.
Installation
pip install chronary
Requires Python 3.10+.
Quickstart
Synchronous
from chronary import Chronary
client = Chronary(api_key="chr_sk_...")
# Create a calendar
calendar = client.calendars.create(name="Sales Team", timezone="America/New_York")
# Create an event
event = client.events.create(
calendar.id,
title="Strategy Sync",
start_time="2026-03-28T14:00:00Z",
end_time="2026-03-28T14:30:00Z",
)
# Check availability
free_slots = client.availability.get(
"agt_abc123",
start="2026-03-28T09:00:00Z",
end="2026-03-28T17:00:00Z",
slot_duration="30m",
)
Asynchronous
from chronary import AsyncChronary
async with AsyncChronary(api_key="chr_sk_...") as client:
agent = await client.agents.create(name="Support Bot", type="ai")
calendars = await client.agents.calendars.list(agent.id)
Configuration
Environment variable
export CHRONARY_API_KEY="chr_sk_..."
# No api_key argument needed when the env var is set
client = Chronary()
Custom options
client = Chronary(
api_key="chr_sk_...",
base_url="https://api.chronary.ai", # default
timeout=60.0, # seconds, default 60
max_retries=2, # default 2
)
Custom httpx client
import httpx
transport = httpx.HTTPTransport(retries=3)
http_client = httpx.Client(transport=transport)
client = Chronary(api_key="chr_sk_...", httpx_client=http_client)
Resources
| Resource | Accessor | Methods |
|---|---|---|
| Agents | client.agents |
create, list, get, update, delete |
| Calendars | client.calendars |
create, list, get, update, delete |
| Events | client.events |
create, list, get, update, delete |
| Webhooks | client.webhooks |
create, list, get, update, delete |
| iCal Subscriptions | client.ical_subscriptions |
create, list, get, update, delete, sync |
| Availability | client.availability |
get, get_calendar, find_meeting_time |
| Usage | client.usage |
get |
Agent-scoped resources
# Calendars owned by an agent
client.agents.calendars.create("agt_abc123", name="My Cal", timezone="UTC")
client.agents.calendars.list("agt_abc123")
# Events across all of an agent's calendars
client.agents.events.list("agt_abc123", start_after="2026-03-01T00:00:00Z")
# Agent availability
client.agents.availability.get("agt_abc123", start="...", end="...")
Pagination
List methods return a pager with auto_paging_iter() for transparent pagination:
pager = client.agents.list()
# Iterate through all pages automatically
for agent in pager.auto_paging_iter():
print(agent.name)
# Or access the current page directly
print(pager.data) # list of items
print(pager.total) # total count
print(pager.has_more) # whether more pages exist
Error handling
from chronary import Chronary, NotFoundError, RateLimitError, APIError
client = Chronary()
try:
agent = client.agents.get("agt_nonexistent")
except NotFoundError:
print("Agent not found")
except RateLimitError:
print("Slow down")
except APIError as e:
print(f"{e.status_code}: {e.message}")
All errors carry .status_code, .message, .request_id, .error_type, and .body.
Per-request options
Override retries on a per-call basis:
agent = client.agents.get("agt_abc123", max_retries=5)
Webhook verification
Verify incoming webhook signatures using HMAC-SHA256:
from chronary.webhook import verify_signature, SignatureVerificationError
try:
verify_signature(
payload=request.body,
headers=request.headers,
secret=webhook_secret,
)
# signature valid — process the event
except SignatureVerificationError:
# reject the request (e.g. return 401)
...
Request IDs
Every response model carries an _request_id attribute for correlating with server logs:
agent = client.agents.get("agt_abc123")
print(agent._request_id) # "req_..."
Plans & limits
Chronary enforces a per-key rate limit and per-org monthly quotas that vary by plan:
| Free | Pro | |
|---|---|---|
| Rate limit | 10 req/s | 50 req/s |
| Webhook delivery retries | 4 | 8 |
| Agents | 3 | 50 |
| Calendars | 10 | 250 |
| Events / mo | 2,500 | 125,000 |
| API calls / mo | 50,000 | 1,000,000 |
| Pro-only features | — | Scheduling proposals, temporal holds, cross-calendar availability, per-agent API keys (chr_ak_*) |
Pro-only feature calls raise APIError (status 403) on Free. The SDK automatically retries 429 and 5xx responses with exponential backoff (max_retries). See https://docs.chronary.ai/resources/rate-limits/ for the full matrix.
License
Apache-2.0
Metadata
Release files for chronary 0.7.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| chronary-0.7.1.tar.gz | 54.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| chronary-0.7.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 102.3 kB
Release files / chronary-0.7.1.tar.gz
| Download URL | chronary-0.7.1.tar.gz |
|---|---|
| Size | 54.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c98698442ccb564890453e6f4f351c1017c655a4518e488c4c79ae3acddcb80e
|
|
BLAKE2b-256 checksum How to use checksums |
ad10b099ec8aa1b84872fe930c33d3e2ad15f43d697dc4add7cc69b52d76f563
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logRelease files / chronary-0.7.1-py3-none-any.whl
| Download URL | chronary-0.7.1-py3-none-any.whl |
|---|---|
| Size | 47.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6f70d68a67b4d309de6ea8115ad097aed76021efbdd8a96eac110c6b51e5e3e5
|
|
BLAKE2b-256 checksum How to use checksums |
b053632fca3bccc8eeb5e7951fe8d2391ed826998360a744ef1cd929823aad10
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency log