Skip to main content

The official Python SDK for CueAPI — scheduling infrastructure for agents

Project description

For AI agents: This is the official Python SDK for CueAPI. Run pip install cueapi-sdk. Your API key is in CUEAPI_API_KEY. Create a client: client = CueAPI(os.environ["CUEAPI_API_KEY"]). Schedule a task: client.cues.create(name="task-name", cron="0 9 * * *", callback="https://your-handler.com", payload={}). For agents without a public URL: set transport="worker" and run pip install cueapi-worker, then define a handler with @worker.handler("task-name") returning {"status": "success"} or {"status": "failure", "error": "reason"}. List executions: client.executions.list(). Get one: client.executions.get("exec_id"). Do not retry on AuthenticationError or CueLimitExceededError. Wait e.retry_after seconds on RateLimitError.

cueapi-sdk

Your agents are failing silently. CueAPI tells you when and why.

Cron has no concept of success. Cue does.

PyPI version Python License Tests Docs

The official Python SDK for CueAPI. Open source execution accountability for AI agents.


Install

pip install cueapi-sdk

Quickstart

from cueapi import CueAPI

client = CueAPI("cue_sk_your_key")

# Schedule an agent to run every morning
cue = client.cues.create(
    name="morning-agent-brief",
    cron="0 9 * * *",
    timezone="America/Los_Angeles",
    callback="https://your-agent.com/run",
    payload={"task": "daily_brief"},
)

print(f"Scheduled. Next run: {cue.next_run}")
# Scheduled. Next run: 2026-03-28T09:00:00-08:00

Why CueAPI over cron?

Your agent ran at 3am. Did it succeed? Cron does not know.

CueAPI tracks every execution separately from delivery, so you always know what happened.

# Check what actually happened
execution = client.executions.get("exec_01HX...")
print(execution.outcome)      # "success" or "failure" -- reported by your handler
print(execution.attempts)     # 1 (or 2, 3 if it had to retry)
print(execution.delivered_at) # exactly when it was delivered
print(execution.status)       # "delivered", "failed", "retrying"

What you get that cron cannot give you:

  • Execution history with outcome tracking
  • Automatic retries with exponential backoff (1, 5, 15 min)
  • Email + webhook alerts when all retries exhaust
  • Worker transport with no public URL needed
  • Signed webhook payloads

Two transport modes

Webhook (default)

CueAPI POSTs a signed payload to your URL when a cue fires:

cue = client.cues.create(
    name="data-sync",
    cron="0 */6 * * *",
    callback="https://your-app.com/webhook",
    payload={"pipeline": "sync"},
)

Your handler receives the payload, processes it, and CueAPI records the outcome.

Worker (no public URL needed)

For agents running locally, in private networks, or behind firewalls. Your daemon polls CueAPI instead of waiting for inbound requests.

pip install cueapi-worker
from cueapi_worker import Worker

worker = Worker(api_key="cue_sk_your_key")

@worker.handler("run-agent")
def handle(payload):
    result = run_my_agent(payload["task"])
    return {"status": "success", "summary": result}

worker.start()  # polls continuously, no inbound firewall rules needed

Create the cue with transport="worker":

cue = client.cues.create(
    name="nightly-pipeline",
    cron="0 2 * * *",
    transport="worker",
    payload={"pipeline": "etl"},
)

Webhook verification

Always verify incoming webhook signatures before processing:

from cueapi import verify_webhook

@app.post("/webhook")
def handle_cue(request: Request):
    is_valid = verify_webhook(
        payload=request.body,
        signature=request.headers["X-CueAPI-Signature"],
        timestamp=request.headers["X-CueAPI-Timestamp"],
        secret="whsec_your_secret",
        tolerance=300,  # seconds, default
    )

    if not is_valid:
        return {"error": "invalid signature"}, 401

    data = request.json()
    run_task(data["payload"])
    return {"outcome": "success"}

Signatures use HMAC-SHA256 in v1={hex} format. The tolerance parameter rejects replayed requests older than 5 minutes.


Error handling

from cueapi import (
    CueAPI,
    AuthenticationError,
    CueLimitExceededError,
    CueNotFoundError,
    InvalidScheduleError,
    RateLimitError,
    CueAPIServerError,
)

try:
    cue = client.cues.create(
        name="my-agent",
        cron="0 9 * * *",
        callback="https://example.com/run",
    )
except CueLimitExceededError:
    print("Plan limit reached. Upgrade at cueapi.ai")
except InvalidScheduleError as e:
    print(f"Bad cron expression: {e}")
except AuthenticationError:
    print("Invalid API key")
except RateLimitError as e:
    print(f"Rate limited. Retry after {e.retry_after}s")
except CueAPIServerError:
    print("Server error. CueAPI status at status.cueapi.ai")
Exception HTTP When
AuthenticationError 401 Invalid or missing API key
CueLimitExceededError 403 Plan cue limit reached
CueNotFoundError 404 Cue ID does not exist
InvalidScheduleError 400/422 Bad cron expression or request body
RateLimitError 429 Too many requests
CueAPIServerError 5xx Server error

Full method reference

CueAPI(api_key, *, base_url, timeout)

client = CueAPI(
    api_key="cue_sk_...",               # or set CUEAPI_API_KEY env var
    base_url="https://api.cueapi.ai",   # default
    timeout=30,                         # seconds, default
)

client.cues.create(**fields)

Parameter Type Description
name str Required. Unique name.
cron str Cron expression for recurring schedules.
at str or datetime ISO 8601 for one-time schedules.
timezone str IANA timezone (default "UTC").
callback str Webhook URL (required if transport="webhook").
transport str "webhook" (default) or "worker".
payload dict JSON payload included in each execution.
description str Optional description.
retry dict {"max_attempts": 3, "backoff_minutes": [1, 5, 15]}
on_failure dict {"email": true, "webhook": null, "pause": false}

Returns a Cue object.

Other cue methods

client.cues.list(limit=20, offset=0, status="active")  # CueList
client.cues.get("cue_abc123")                           # Cue
client.cues.update("cue_abc123", cron="0 10 * * *")    # Cue
client.cues.pause("cue_abc123")                        # Cue
client.cues.resume("cue_abc123")                       # Cue
client.cues.delete("cue_abc123")                       # None

Executions

client.executions.list(cue_id="cue_abc123", limit=20)  # ExecutionList
client.executions.get("exec_01HX...")                  # Execution

Examples

See /examples for working code:


Links


License

MIT. See LICENSE.


Built by Vector Apps

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

cueapi_sdk-0.1.0.tar.gz (16.0 kB view details)

Uploaded Source

Built Distribution

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

cueapi_sdk-0.1.0-py3-none-any.whl (13.6 kB view details)

Uploaded Python 3

File details

Details for the file cueapi_sdk-0.1.0.tar.gz.

File metadata

  • Download URL: cueapi_sdk-0.1.0.tar.gz
  • Upload date:
  • Size: 16.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cueapi_sdk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d8766b5abe1a6ed5ce96878d6549d157cd7f21754af31a80bb6fd4928b9085eb
MD5 f4a60d82a4fb7dcd8df04aec88196002
BLAKE2b-256 0a102dc439d52728e3ddc4c76281bf422405fc1677db33b2ca4e47c438b23624

See more details on using hashes here.

Provenance

The following attestation bundles were made for cueapi_sdk-0.1.0.tar.gz:

Publisher: publish.yml on cueapi/cueapi-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 cueapi_sdk-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: cueapi_sdk-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cueapi_sdk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 841a09b5c7e0b83858cd5e2c9b532f551d24d6fc4cc19f921790cd4ded5b52a1
MD5 3dea7bbaf21f6636980dcaccb73a0fa0
BLAKE2b-256 82e4f6f9b20643311db1e4f16cd83b56c68f8f6e3df2a3001f3a9e2a27556208

See more details on using hashes here.

Provenance

The following attestation bundles were made for cueapi_sdk-0.1.0-py3-none-any.whl:

Publisher: publish.yml on cueapi/cueapi-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