← Back to Docs

Run a One-Time Job at an Exact Time Without a Server

To run a one-time job at a specific time without a server, put the job behind a URL and have a hosted scheduler call that URL once at the date and time you set. RunLater sends the request in your time zone, retries it if it fails, logs the response, and then switches the schedule off.

1. Put the job behind a URL

RunLater sends an HTTP request and does not run your code, so the code needs a public address. Any of these works:

  • A serverless function or API route on the host you already use
  • A Zapier, Make or n8n webhook, which starts a workflow
  • A Slack or Discord webhook, when the job is one message
  • A third-party API that does the whole job in one call

Because the URL is public, make your own endpoint check a secret. See headers and auth.

2. Schedule the call

In the dashboard: New request, enter the URL, method, headers and body, choose One-time, then the date, time and time zone. Test sends it once right away, so you can check the receiving end first.

From code, with an API key from Settings:

curl https://runlater.app/api/v1/schedules \
  -H "Authorization: Bearer $RUNLATER_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/jobs/close-campaign",
    "headers": { "Authorization": "Bearer my-own-secret" },
    "body": { "campaign": "spring" },
    "run_at": "2026-12-31T23:59:00",
    "timezone": "America/Chicago"
  }'

From an AI agent, connect the MCP server and ask for it in plain words.

3. Know what happens at that time

  1. The scheduler checks for due requests every 10 seconds and sends yours.
  2. A 2xx response is a success. Any other response, a timeout or a network error is a failure, and RunLater retries up to the number you set (default 3, at most 10), waiting 1, 2, then 4 minutes by default.
  3. Status code, timing and the first 10,000 characters of the response go in Logs, kept 7, 30 or 90 days by plan.
  4. The schedule turns off. Nothing runs again unless you create a new one.

Limits

LimitValue
Time waiting for a response1 to 300 seconds, default 30
How far aheadTwo years from the API or MCP. The dashboard has no upper limit.
Request body64 KB from the API or MCP
Who it can callPublic http(s) URLs only

Three things to plan for

  • Long jobs. If the work takes longer than the timeout, have your endpoint start it, answer right away with a 2xx, and finish in the background where your host allows that.
  • The plan at run time. A one-time request that comes due after the workspace has used all its runs for the month is switched off without being sent, so keep a plan active with runs to spare until the job has run.
  • Repeat attempts. A retry after a timeout can repeat work that had finished. See how to stop a retried webhook from running twice.

Starter is $15/month for 250 scheduled requests and 25,000 runs. Plans have no free tier, and a 14-day trial starts with any of them.

Frequently asked questions

Do I need a server to run a job at a specific time?

You need no server of your own running the schedule. The job itself has to be reachable at a public URL, such as a serverless function or an automation webhook, and a hosted scheduler calls it at that time.

How precise is the timing?

RunLater checks for due requests every 10 seconds and sends them one after another. A request normally goes out within seconds of the time you set, and later if requests ahead of it are waiting on slow endpoints.

Can I cancel a one-time job before it runs?

Yes. Pause or delete it in the dashboard, or through the API or MCP. If a paused one-time request passes its run time, it will not resume, so send it with run now or create a new one.

What happens if the job fails?

Any response that is not 2xx, a timeout or a network error counts as a failure. RunLater retries up to the number you set, from 0 to 10, with waits that double each time. Every attempt is in the log.