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 inCUEAPI_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: settransport="worker"and runpip 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 onAuthenticationErrororCueLimitExceededError. Waite.retry_afterseconds onRateLimitError.
cueapi-sdk
Your agents are failing silently. CueAPI tells you when and why.
Cron has no concept of success. Cue does.
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:
basic_usage.py- create, list, pause, delete cueswebhook_handler.py- FastAPI handler with signature verificationworker_setup.py- worker daemon for private network agents
Links
- Dashboard - manage cues and view executions
- Documentation - full guides and API reference
- API Reference - all endpoints
- cueapi-core - open source server
- cueapi.ai - hosted service, free tier available
- Changelog - full version history
License
MIT. See LICENSE.
Built by Vector Apps
Project details
Release history Release notifications | RSS feed
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d8766b5abe1a6ed5ce96878d6549d157cd7f21754af31a80bb6fd4928b9085eb
|
|
| MD5 |
f4a60d82a4fb7dcd8df04aec88196002
|
|
| BLAKE2b-256 |
0a102dc439d52728e3ddc4c76281bf422405fc1677db33b2ca4e47c438b23624
|
Provenance
The following attestation bundles were made for cueapi_sdk-0.1.0.tar.gz:
Publisher:
publish.yml on cueapi/cueapi-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cueapi_sdk-0.1.0.tar.gz -
Subject digest:
d8766b5abe1a6ed5ce96878d6549d157cd7f21754af31a80bb6fd4928b9085eb - Sigstore transparency entry: 1190711849
- Sigstore integration time:
-
Permalink:
cueapi/cueapi-python@2d7147f06db7f0fe128a3a98c2b2c2eebf0f54dc -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/cueapi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2d7147f06db7f0fe128a3a98c2b2c2eebf0f54dc -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
841a09b5c7e0b83858cd5e2c9b532f551d24d6fc4cc19f921790cd4ded5b52a1
|
|
| MD5 |
3dea7bbaf21f6636980dcaccb73a0fa0
|
|
| BLAKE2b-256 |
82e4f6f9b20643311db1e4f16cd83b56c68f8f6e3df2a3001f3a9e2a27556208
|
Provenance
The following attestation bundles were made for cueapi_sdk-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on cueapi/cueapi-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cueapi_sdk-0.1.0-py3-none-any.whl -
Subject digest:
841a09b5c7e0b83858cd5e2c9b532f551d24d6fc4cc19f921790cd4ded5b52a1 - Sigstore transparency entry: 1190711861
- Sigstore integration time:
-
Permalink:
cueapi/cueapi-python@2d7147f06db7f0fe128a3a98c2b2c2eebf0f54dc -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/cueapi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2d7147f06db7f0fe128a3a98c2b2c2eebf0f54dc -
Trigger Event:
push
-
Statement type: