Schedule a delivery
curl -X POST https://aisenseapi.com/services/v1/webhook_schedule \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/hook", "delay_seconds": 1200, "payload": {"job": 42}}'{
"ok": true,
"schedule_id": "b4ee9fc4-e939-47d7-b522-1a68e553c546",
"status": "scheduled",
"fire_at_timestamp": 1787181214,
"fire_at_datetime": "2026-08-19T23:13:34+00:00",
"result_url": "https://aisenseapi.com/services/v1/webhook_schedule/b4ee9fc4-e939-47d7-b522-1a68e553c546",
"wait_url": "https://aisenseapi.com/services/v1/webhook_schedule/b4ee9fc4-e939-47d7-b522-1a68e553c546/wait/25",
"expire_timestamp": 1787267614,
"expire_datetime": "2026-08-20T23:13:34+00:00"
}Keep the schedule_id. It is the only route back to the job, and there is no listing call that would find it for you. The result_url field saves you building that path by hand.
Give it a delay or a fire time
Send delay_seconds to count forward from now, or fire_at as a Unix timestamp. Pick one.
| Field | Type | Description |
|---|---|---|
| url | string | A public HTTP or HTTPS URL on port 80 or 443. |
| delay_seconds | integer | Seconds to the first delivery. |
| fire_at | integer | Unix time of the first delivery. |
| payload | object | The JSON body sent to the target. Maximum 32 KB. |
| every | integer | Optional repeat interval from 60 to 86400 seconds. |
The first fire time must sit between 5 seconds and 24 hours from creation. A recurring job must start before its fixed 24-hour end.
The resolution is one minute. Delivery runs once a minute, so a due job fires on the next worker pass. Schedule in minutes and treat finer timing as approximate.
curl -X POST https://aisenseapi.com/services/v1/webhook_schedule \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/hook", "delay_seconds": 2}'
{"error":"fire_at must be between 5 seconds and 24 hours from now."}A delay_seconds of 90000 draws the identical error, because it reaches past the 24-hour ceiling.
Repeat on a fixed grid
curl -X POST https://aisenseapi.com/services/v1/webhook_schedule \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/health","delay_seconds":60,"every":300,"payload":{"probe":"agent-7"}}'The interval stays on its original grid. If the worker misses a slot, that slot is counted in missed and skipped instead of being sent late. fires counts completed deliveries. Three consecutive transport failures stop a recurring job. A successful response clears the failure streak.
Read, wait or cancel
curl https://aisenseapi.com/services/v1/webhook_schedule/e12681a8-f24f-4f24-9e34-7bbb0a9f9a77/wait/25Add /wait/0 through /wait/25. The response adds waited_seconds and wait_reason, and returns early when the state changes or becomes terminal.
{
"ok": true,
"schedule_id": "e12681a8-f24f-4f24-9e34-7bbb0a9f9a77",
"status": "scheduled",
"url": "https://example.com/hook",
"created_at_timestamp": 1787180038,
"created_at_datetime": "2026-08-19T22:53:58+00:00",
"fire_at_timestamp": 1787180048,
"fire_at_datetime": "2026-08-19T22:54:08+00:00",
"attempts": 0
}Cancel a non-terminal job with:
curl -X DELETE https://aisenseapi.com/services/v1/webhook_schedule/{schedule_id}An unknown or expired identifier answers with HTTP 404. Cancelling a terminal job returns HTTP 409.
Status values
A job may report scheduled or retry while it is active. A one-shot job ends as fired, failed or cancelled. A recurring job normally ends as completed after its 24-hour window. It may also become failed, blocked or cancelled.
Fired means the target answered. It does not mean the target returned 2xx. The HTTP response is recorded in http_status, so a target that replies 500 is still a fired one-shot job.
{
"status": "fired",
"attempts": 1,
"http_status": 405,
"response_excerpt": "<!doctype html><html lang=\"en\"><head><title>Example Domain</title>...",
"fired_at_timestamp": 1787180101,
"fired_at_datetime": "2026-08-19T22:55:01+00:00"
}A one-shot transport failure is retried once. A recurring job stops after three consecutive transport failures. Results remain readable until the reported expiry.
How the free webhook schedule API endpoint delivers
- You post the job
The target and the payload are stored, and a
schedule_idcomes back immediately. Your own process is free to exit. - The clock runs on our side
Nothing is held open. No connection, no polling loop and no timer of yours has to survive the wait.
- The request goes out
At the fire time we send the payload to your URL and record what came back, including the HTTP status and an excerpt of the response body.
- You read the outcome
A GET on
result_urltells you which of the two end states the job reached, and how many attempts it took.
This is the timer an autonomous process does not otherwise have. A script that wants something to happen in twenty minutes usually has to stay alive for twenty minutes. Here it does not.
What it will not call
Private, loopback, link-local and reserved addresses are refused. The check runs at creation and again at delivery time, with the connection pinned to the address that was checked, so a hostname cannot pass validation and then quietly repoint at an internal service.
curl -X POST https://aisenseapi.com/services/v1/webhook_schedule \
-H "Content-Type: application/json" \
-d '{"url": "http://127.0.0.1/hook", "delay_seconds": 60}'
{"error":"Target address is private or reserved."}Redirects are never followed, and credentials in the URL are rejected outright. These guards are what keep a public scheduler from becoming a tool for reaching inside private networks.
Common uses
Most callers reach the free webhook schedule API endpoint from a pipeline rather than a browser. Four patterns come up again and again.
Agent wait states
Let an autonomous process pause and be woken by a callback instead of holding a connection.
Timeouts and reminders
Schedule a follow-up that fires unless something cancels it first.
Retry after a delay
Re-trigger a step a few minutes after a transient failure.
Deferred notifications
Send a message at a specific later time without running a scheduler yourself.
Privacy and limits
The target and payload are stored while the job is active. Keep secrets out of the payload. The schedule ID is a bearer secret and there is no list operation.
The target URL is capped at 2048 characters and the JSON payload at 32 KB. Each creator address may cause at most 1440 delivery attempts per 24 hours. The public service also shares one limit of 5000 incoming requests per IP per 24 hours.
Point the job at a target you control. Redirects, URL credentials and private or reserved targets are refused.