All notable changes to cueapi-sdk will be documented here.
client.cues.fire(auto_verify=False)body-verify mirror — OPT-IN (Mike body-verify directive 2026-05-11). Parallel toMessagesResource.send(auto_verify=True). Default OFF for cues fire because substrate's/v1/cues/{id}/fireechoes a pydantic-after-parse body that may include server-side default-population (verified empirically against staging CI ~23:48Z); diffing client's canonical-JSON vs substrate's parsed-defaulted echo would cause spurious mismatch. Callers can opt-in viaauto_verify=Truewhen they know substrate echo semantics match client serialization (typical for sha256-based constant-cost path). Implementation includes sha256 hex compare (constant-cost) with string-compare fallback on hash drift. On confirmed drift raisesBodyVerifyMismatchErrorwith diagnostic attributes includingmessage_id(= execution_id for fire). Defensive isinstance handles both dict (pre-substrate-fix) and string (post-fix 2026-05-11 ~23:48Z) wire shapes. When cueapi-primary locks per-field echo semantics for fire, default will flip to True.client.messages.send(auto_verify=True)body-verify defense (Mike directive 2026-05-11). Newauto_verifykwarg, defaultTrue. When set, the SDK sendsX-CueAPI-Verify-Echo: truerequest header. Substrate-side (Phase 1; cueapi-core's lane) echoes the body it received back in the response underbody_received. SDK diffs sent vs received and raisesBodyVerifyMismatchErroron drift (withsent_body,received_body,first_divergence_byte,message_idattributes for programmatic recovery / diagnostic output). Catches the caller-side shell-expansion bug class wherebody=f"... {dynamic_var} ..."or worsebody=os.popen(...)silently mutated body content upstream. Opt-out viaauto_verify=Falsefor perf-sensitive flows. Backward-compat: SDK no-ops when substrate omits the echo field (pre-Layer-1 behavior unchanged). New helper:cueapi.exceptions.first_divergence_byte(a, b)returns the byte index of the first differing position (pure function; re-usable cross-SDK).client.cues.bulk_delete(ids)— delete up to 100 cues in a single call. Returns{"deleted": [...], "skipped": [...]}. Per-ID atomic, not batch atomic. SendsX-Confirm-Destructive: trueheader automatically. WrapsPOST /v1/cues/bulk-delete(cueapi #650). Parity port of cueapi-cli #46. RaisesValueErrorclient-side on empty list or > 100 IDs.
client.cues.fire(cue_id, payload_override=None, merge_strategy=None)for ad-hoc one-shot triggers and for using cues as a messaging channel between agents. WrapsPOST /v1/cues/{id}/fire.client.executions.list_claimable(task=None, agent=None)for unclaimed worker-transport executions ready for processing. Filters server-side via task / agent query params; required for single-purpose workers.client.executions.claim(execution_id, worker_id=...)for atomic claim of a specific execution. Returns 409 if already claimed.client.executions.claim_next(worker_id=..., task=None)for the next available execution. Without task the server picks the oldest pending; with task the SDK fans out internally (list_claimable filtered, pick oldest, claim by ID) since the server's claim endpoint does not accept a task filter today.
__version__incueapi/__init__.pyhad drifted to 0.1.2 whilepyproject.tomlwas at 0.1.3. Both now aligned at 0.2.0.
client.executions.heartbeat(execution_id)currently sends an empty body and does NOT includeworker_idvia theX-Worker-Idrequest header that the server reads from. Worker-id is what the server uses to enforce ownership on the heartbeat (returns 403 on mismatch); without it the race-protection check is silently bypassed. A signature change to addworker_idis held pending technical review of the deprecation cadence.
- Initial release of the official Python SDK for CueAPI
- CueAPI client with full cues CRUD (create, list, get, update, delete, pause, resume)
- Executions client (list, get)
- Webhook transport support
- Worker transport support via cueapi-worker
- Webhook signature verification (verify_webhook) using HMAC-SHA256
- Typed exceptions: AuthenticationError, CueLimitExceededError, CueNotFoundError, InvalidScheduleError, RateLimitError, CueAPIServerError
- Python 3.9+ support
- 40 tests via pytest
- Working examples: basic_usage.py, webhook_handler.py, worker_setup.py