Docs

Send a reminder or call a webhook on a recurring schedule. Choose a random time within your window or a fixed time in your timezone.

For email reminders without code, create a reminder in the dashboard.

Create your first event

  1. Sign in, then open Settings and create an API key. Copy it when it appears; it is shown once.
  2. Save this example as event.json. It sends a screen-break reminder to your account email on weekdays.
{
  "name": "Take a screen break",
  "scheduleType": "random",
  "interval": 1,
  "frequency": 1,
  "betweenTimeStart": "10:00",
  "betweenTimeEnd": "16:00",
  "timezone": "America/Toronto",
  "daysOfWeek": [
    1,
    2,
    3,
    4,
    5
  ],
  "actionType": "EMAIL",
  "content": "Stand up and look away from your screen.",
  "contentType": "static"
}

Replace both placeholders below, then run the command. This creates an enabled event. Keep the same request ID and body when retrying this request; use a new ID for a new event.

curl https://untimely.app/api/events \
  -X POST \
  -H 'Authorization: Bearer <UNTIMELY_API_KEY>' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: <UNIQUE_REQUEST_ID>' \
  --data @event.json

The API returns 201 when it creates an event. Check your events and their schedule status:

curl https://untimely.app/api/events \
  -H 'Authorization: Bearer <UNTIMELY_API_KEY>'

Choose when it runs

Random schedules use interval (1–365 days) and frequency (1–5 runs per interval). Set betweenTimeStart and betweenTimeEnd in 24-hour time. Runs are selected from eligible days inside that interval; they are not guaranteed to be evenly spaced.

Fixed schedules use scheduleType: "deterministic", fixedTime, and a required IANA timezone. They run at the chosen time on each eligible day in the interval. Frequency does not control fixed schedules.

daysOfWeek uses 0 for Sunday through 6 for Saturday. Omit it to allow every day. An interval is a scheduling period, not a calendar-week label. Use [1] to select Mondays, as in the webhook example below.

Use an IANA timezone such as America/Toronto for local wall-clock times. Random schedules default to UTC when timezone is omitted. Local times follow the timezone's daylight-saving rules; inspect upcoming runs around clock changes.

Choose what happens

The free plan includes up to 3 events, email reminders, and webhooks. Paused events still count toward that limit. Pro removes the event limit and adds Slack, generated content, and a two-step generate-and-deliver pipeline. See pricing.

EMAIL sends to your account email. WEBHOOK calls your configured URL with a method, headers, and optional body. SLACK needs a Slack incoming webhook URL and Pro.

Use contentType: "static" for text you write. With Pro, "gpt" generates content from your prompt. A Pro tools tuple can also pair an LLM generate step with an email, webhook, or Slack delivery step. The OpenAPI schema describes those fields.

This fixed-time example calls a webhook on Mondays. Replace the example URL with your endpoint before sending it to POST /api/events.

{
  "name": "Monday follow-up",
  "scheduleType": "deterministic",
  "interval": 7,
  "fixedTime": "09:30",
  "timezone": "America/Toronto",
  "daysOfWeek": [
    1
  ],
  "actionType": "WEBHOOK",
  "content": "Run the follow-up workflow.",
  "contentType": "static",
  "webhook": {
    "method": "POST",
    "url": "https://example.com/untimely-hook",
    "headers": [
      {
        "key": "Content-Type",
        "value": "application/json"
      }
    ],
    "body": "{\"source\":\"untimely\"}"
  }
}

Read, change, or pause an event

Send Authorization: Bearer <UNTIMELY_API_KEY> on each request. API keys are created by signed-in users in dashboard settings.

  • GET /api/events lists recent events and status.
  • POST /api/events creates an event.
  • GET /api/events/{id} reads an event.
  • PATCH /api/events/{id} updates it. Send {"enabled": false} to pause.
  • DELETE /api/events/{id} removes it.
  • GET /api/events/{id}/schedules/{scheduleId} reads a run and its action attempts.

On create, reuse an Idempotency-Key only with the same request body. Reusing it with different content returns 409. If a request fails, read the returned error before retrying: invalid fields, credentials, and plan limits need a correction.

Read the full API reference for request schemas and responses.

Connect an MCP client

The Untimely MCP package is not currently available on the public npm registry. There is no public install command to use yet. Connect your agent through the HTTP API above.

The MCP implementation supports creating, listing, reading, updating, and deleting events, inspecting a run, and sending a test delivery. Those capabilities use the same account and plan limits. A test delivery sends a real message or webhook request.

Check what was delivered

Delivery is at-least-once, so retries can produce duplicates. Make webhook handlers safe to repeat. Creating an event with an idempotency key does not deduplicate its later webhook deliveries.

Fixed time is a scheduled target, not a guarantee of execution at an exact second. Use event history to inspect successful, failed, and missed runs. Read the delivery and retry policy.

Give your agent the docs

Start with https://untimely.app/agents.md. It is a public integration guide. Give the agent an API key through its credential settings, and keep keys out of prompts and source control.