Skip to main content

Python client library for the Chronary calendar-as-a-service API

Project description

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

is_valid = verify_signature(
    payload=request.body,
    signature=request.headers["X-Chronary-Signature"],
    secret=webhook_secret,
)

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

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

chronary-0.3.1.tar.gz (46.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chronary-0.3.1-py3-none-any.whl (42.6 kB view details)

Uploaded Python 3

File details

Details for the file chronary-0.3.1.tar.gz.

File metadata

  • Download URL: chronary-0.3.1.tar.gz
  • Upload date:
  • Size: 46.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for chronary-0.3.1.tar.gz
Algorithm Hash digest
SHA256 59743e4f18481898e5985824ae57ac264ef73c5927b2872a44f498dc70449019
MD5 ae668e4649b3045eee689eb4cdc5f5fd
BLAKE2b-256 62e26dad718f22cbf85c4c8add7b8557adcbf69ade0c0bc7455c88c004006da2

See more details on using hashes here.

Provenance

The following attestation bundles were made for chronary-0.3.1.tar.gz:

Publisher: release-artifact.yml on Chronary/chronary-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file chronary-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: chronary-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 42.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for chronary-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7337eb9b9b0820bb86d624d6828ea337e10f5cc744f79cdf39627cfcc458fb14
MD5 7243b9911521c9f92262560a4e158ac2
BLAKE2b-256 9df195c1b620336bef48e512dc5519d05afa56262dbcbfea35015636fcc8098b

See more details on using hashes here.

Provenance

The following attestation bundles were made for chronary-0.3.1-py3-none-any.whl:

Publisher: release-artifact.yml on Chronary/chronary-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page