Skip to main content

Official Python SDK for CueAPI — open-source execution accountability primitive for AI agents. Schedule agent work, require evidence-backed outcomes, and gate execution with write-once verification.

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 {"success": true} or {"success": false, "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

See it in action

CueAPI Live Execution Feed


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 {"success": true, "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


Releases

Releases are published to PyPI with PEP 740 attestations via GitHub Actions Trusted Publishing.


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.3.tar.gz (22.8 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.3-py3-none-any.whl (18.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: cueapi_sdk-0.1.3.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for cueapi_sdk-0.1.3.tar.gz
Algorithm Hash digest
SHA256 efff9f530711846db923aae600b5200bdd691452d5e292a976f9e45d0f33ca30
MD5 5e3b1de6d9e718d9e698352d914135b8
BLAKE2b-256 295578a97ec37a86adc5b3c556c07ac398774cf878be09b2fdbea3f2fbcb959d

See more details on using hashes here.

File details

Details for the file cueapi_sdk-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: cueapi_sdk-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 18.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for cueapi_sdk-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 50ab77ccbd4003f38e106b2912bca30b7eeeee84d794ec1ee4b3f206dc703cb2
MD5 cdb85dd3a6bab744efc63b822d279e5f
BLAKE2b-256 368f8c0ba3e011e48d1be069834cd38398f51bd47802755a5bee7e7affd76877

See more details on using hashes here.

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