Scheduler Service API
Tenant-facing cron-as-a-service: schedule management, run history, and delivery-attempt inspection.
Semantics (public contract)
- Granularity: 1 minute.
cron_expris 5-field standard cron (no seconds field). - Run materialisation is exactly-once per
(schedule_id, scheduled_for)occurrence. - Delivery is at-least-once. A run's
actionis attempted until it succeeds (HTTP 2xx forwebhook, publish forevent) or its retry policy is exhausted. Receivers MUST dedupe onX-Idempotency-Key(see thescheduleDeliverywebhook below). - Timezones: IANA names, DST-aware. A local time skipped by spring-forward fires at
the first valid instant after the gap; an ambiguous fall-back time fires once, at the
first occurrence.
scheduled_foris always the canonical, un-jittered planned instant. - Jitter is deterministic per schedule (
hash(schedule_id) mod jitter_seconds) and moves only the actual fire time, neverscheduled_for, the idempotency key, or history.
Authorization
Every endpoint requires a tenant access token. Mutating endpoints — create,
update, delete, pause, resume, and trigger — additionally require the
tenant_admin role: a schedule is a standing outbound-HTTP capability of the
platform, so an end-user token (role=user, minted for call participants) is
refused with 403 forbidden. Read endpoints are available to any token carrying
the tenant.
Rate limits
POST /v1/schedules and POST /v1/schedules/{id}/trigger are rate limited per
tenant (not per token subject, which a tenant mints freely). Exceeding a budget
returns 429 rate_limited with a Retry-After header. Outbound delivery is
additionally capped per tenant and per destination host; a delivery held back by
that cap is postponed, not failed, and costs the run no attempt.
Standard errors
All non-2xx responses use the Error envelope:
{ "error": { "code", "message", "request_id" } }.
Common codes: validation_failed, invalid_cron, invalid_timezone,
invalid_target_url, payload_too_large, interval_too_short, name_taken,
schedule_limit_exceeded, not_found, invalid_state, rate_limited.
Pagination
List endpoints take limit (default 50, max 200) and offset (default 0) and return
a named array plus total.
Authentication
- HTTP: Bearer Auth
Security Scheme Type: | http |
|---|---|
HTTP Authorization Scheme: | bearer |
Bearer format: | JWT |