Scheduleit

Quickstart

Five minutes from curl to a live delivery. You'll mint an API key, schedule a one-shot webhook, and watch Scheduleit fire it.

1. Get a project-scoped API key

  1. Sign in at getscheduleit.app.
  2. Open a project (or create one).
  3. Click Issue project-scoped key and copy the key — it's shown once. It looks like sk_ followed by 64 hex characters.

Event operations need a project-scoped key (the button above issues exactly that). The project is taken from the key, so you never pass a project id in requests. Treat the key as a secret — never commit or log it.

2. Set up somewhere to receive the webhook

For a throwaway target, open webhook.site and copy your unique URL. Any endpoint that accepts a POST works; you just want to see the delivery arrive.

3. Schedule your first event

Schedule a one-shot webhook a minute into the future. Replace the key and the target URL:

curl -sS -X POST https://getscheduleit.app/api/events \
  -H "Authorization: Bearer sk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "schedule": { "kind": "oneshot", "fireAt": "2026-07-04T12:00:00Z" },
    "target":   { "channel": "webhook", "url": "https://webhook.site/YOUR-ID" },
    "payloadBase64": "eyJoZWxsbyI6IndvcmxkIn0="
  }'
  • schedule — when to fire. Here, once at fireAt (an ISO-8601 UTC time, Z suffix required). See Scheduling for intervals and cron.
  • target — where to deliver. A webhook target needs a url; see the Webhook channel. For email, see the Email channel.
  • payloadBase64 (optional) — the bytes to deliver as the request body, base64-encoded. Above is {"hello":"world"}; generate your own with printf '{"hello":"world"}' | base64. Up to 1 MB decoded.
  • idempotencyKey (optional) — a string (≤200 chars); a repeat POST with the same key in the same project returns the existing event instead of creating a duplicate.

The response is 201 Created with the stored event — note state is scheduled and nextFireAt is when it will fire:

{
  "id": "0f9c2b6e-1a3d-4c7e-9b2a-8d5e1f0a4c33",
  "state": "scheduled",
  "schedule": { "kind": "oneshot", "fireAt": "2026-07-04T12:00:00.000Z" },
  "target": { "channel": "webhook", "url": "https://webhook.site/YOUR-ID" },
  "nextFireAt": "2026-07-04T12:00:00.000Z",
  "attempts": 0,
  "lastError": null
}

A fireAt in the past isn't an error — the event fires on the next poll, effectively immediately. Handy for testing.

4. Watch it fire

Grab the id from the response. Fetch the event (the header is elided here and below — every request needs it):

curl -sS https://getscheduleit.app/api/events/0f9c2b6e-...

After the fire time, state moves to delivered (or dead_letter if every attempt failed). For the per-attempt history — status codes, timestamps, retries — read the deliveries:

curl -sS https://getscheduleit.app/api/events/0f9c2b6e-.../deliveries

To call off a still-pending event:

curl -sS -X DELETE https://getscheduleit.app/api/events/0f9c2b6e-...

Next steps