How requests are made
Every request names the service, comes from a known address, and carries a link that stops it. The page is written as much for people who find the requests in a log as for the people who schedule them.
Identification
Each request carries these headers. The stop token is unique to one job and changes whenever the job is resumed.
User-Agent: Mozilla/5.0 (compatible; cronjob.dev/1.0; +https://cronjob.dev/stop/<token>) From: stop+<token>@cronjob.dev X-CronJob-Stop: https://cronjob.dev/stop/<token> X-CronJob-Run: <job id>:<scheduled time>
Mail to the From address is answered with the stop link. Replying to it never stops anything on its own.
Addresses
Requests leave from a short, fixed set of addresses in the EU. The list is machine-readable at /ips and /ips.txt. Allowlisting what the endpoint returns keeps working when a node moves.
| Address |
|---|
| 165.227.168.138 |
| 174.138.11.112 |
| 54.38.224.71 |
Requests are made over IPv4. A hostname with no A record cannot be reached, and its runs are recorded as unknown rather than failed, because the limit belongs to the service.
Headers the service sets
| Header | Value | Changeable |
|---|---|---|
| Host | From the URL | No |
| User-Agent | As above | No |
| From | stop+<token>@cronjob.dev | No |
| X-CronJob-Stop | The stop URL for the job | No |
| X-CronJob-Run | Job id and scheduled time | No |
| Content-Type | text/plain; charset=utf-8 | Yes, with a body |
| Accept-Encoding | identity | No |
What happens to the response
The status line is read and the connection closes. The body is not read beyond what closing cleanly needs, and none of it is stored. A response slower than the job's timeout is recorded as a timeout.