jscheduler

Scheduled events, delivered over HTTP.

Give jscheduler a schedule and a JSON payload. When the minute arrives it POSTs the event to your endpoint and keeps trying until it gets a real answer. One-time, interval, or cron — no SDK, no runtime to host.

Quickstart

$ curl -fsSL https://cli.jscheduler.com/install.sh | bash$ jscheduler auth login --api-key jsk_...$ jscheduler endpoints create --url https://example.com/hooks$ jscheduler events create --name trial.expiring \
    --endpoint <endpoint-id-from-the-command-above> \
    --kind CRON --cron "0 9 * * MON-FRI"

The same API key works in the CLI and in plain HTTP. Full walkthrough in the docs.

How it works

  1. 01
    Define

    POST an endpoint ID, a name, a JSON payload, and a schedule. One-time and interval schedules have one-second resolution.

  2. 02
    Claim

    A worker leases due work with SKIP LOCKED, so more instances add throughput without firing an event twice.

  3. 03
    Dispatch

    The occurrence enters a durable outbox, then goes to the endpoint explicitly selected by the schedule.

  4. 04
    Prove

    Every attempt is recorded. Deduplicate on the occurrence id, and redrive anything that ended uncertain.

Schedules

ONE_TIME
fireAt: 2030-07-13T09:00:00Z

Once, at an exact minute.

INTERVAL
intervalSeconds: 15

Every N seconds from a start time, without drift.

CRON
0 9 * * MON-FRI

Five-field cron, evaluated in UTC.

Delivery

Retries

Retryable failures are retried with exponential backoff before a delivery is marked failed.

Idempotency

Every POST carries an Idempotency-Key header equal to the occurrence id. Retries reuse it.

Uncertain outcomes

Under NO_DUPLICATE_SENDS, an ambiguous network result stops as UNCERTAIN and waits for your redrive rather than risking a second send.

Endpoint auth

Per-endpoint tokens are encrypted at rest with AES-256-GCM and decrypted only at dispatch time.

Access

jscheduler is invite-only while it is early. Tell us what you would schedule and we will set up an organization and an API key.