API Documentation
Base URL: https://cronping.grabshot.dev
Authentication
Pass your API key via the x-api-key header or key query parameter.
curl "https://cronping.grabshot.dev/v1/monitors" \
-H "x-api-key: crp_your_api_key_here"
One-Off Ping
POST /v1/ping
GET /v1/ping?url={url}
Quick check if a URL is up. Works without auth for demo purposes.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | URL to ping |
Example
curl "https://cronping.grabshot.dev/v1/ping?url=https://google.com"
Response
{
"success": true,
"is_up": true,
"status_code": 200,
"response_time_ms": 142,
"url": "https://google.com",
"headers": { "content-type": "text/html; charset=UTF-8", ... }
}
Create Monitor
POST /v1/monitors
Body Parameters
| Param | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | URL to monitor |
| interval | integer | No | Check interval in seconds (default: 300, min varies by plan) |
| webhook_url | string | No | URL to receive status change alerts |
| name | string | No | Friendly name for the monitor |
curl
curl -X POST "https://cronping.grabshot.dev/v1/monitors" \
-H "x-api-key: crp_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"interval": 300,
"webhook_url": "https://hooks.slack.com/...",
"name": "My Website"
}'
Node.js
const res = await fetch('https://cronping.grabshot.dev/v1/monitors', {
method: 'POST',
headers: {
'x-api-key': 'crp_your_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com',
interval: 300,
webhook_url: 'https://hooks.slack.com/...'
})
});
const data = await res.json();
Python
import requests
res = requests.post(
'https://cronping.grabshot.dev/v1/monitors',
headers={'x-api-key': 'crp_your_key'},
json={
'url': 'https://example.com',
'interval': 300,
'webhook_url': 'https://hooks.slack.com/...'
}
)
data = res.json()
List Monitors
GET /v1/monitors
curl "https://cronping.grabshot.dev/v1/monitors" \
-H "x-api-key: crp_your_key"
Monitor History
GET /v1/monitors/:id/history
| Param | Type | Description |
|---|---|---|
| limit | integer | Number of records (default: 100, max: 1000) |
curl "https://cronping.grabshot.dev/v1/monitors/1/history?limit=50" \
-H "x-api-key: crp_your_key"
Response
{
"success": true,
"monitor": { "id": 1, "url": "https://example.com", "name": "My Website", "status": "up" },
"uptime_percent": 99.85,
"avg_response_time_ms": 234,
"history": [
{ "status_code": 200, "response_time_ms": 142, "is_up": 1, "error": null, "created_at": "2026-02-18T..." },
...
],
"count": 50
}
Delete Monitor
DELETE /v1/monitors/:id
curl -X DELETE "https://cronping.grabshot.dev/v1/monitors/1" \
-H "x-api-key: crp_your_key"
Webhook Payload
When a monitor goes down (after 3 consecutive failures) or recovers, CronPing sends a POST to your webhook URL:
{
"event": "monitor.down",
"monitor": {
"id": 1,
"url": "https://example.com",
"name": "My Website"
},
"result": {
"status_code": null,
"response_time_ms": 10000,
"error": "Timeout after 10000ms"
},
"timestamp": "2026-02-18T01:23:45.678Z"
}
Events: monitor.down and monitor.up
Plans & Limits
| Plan | Price | Monitors | Min Interval | Pings/mo |
|---|---|---|---|---|
| Free | $0 | 5 | 5 min | 200 |
| Starter | $9/mo | 20 | 2 min | 5,000 |
| Pro | $29/mo | 50 | 1 min | 25,000 |
| Business | $79/mo | 200 | 30 sec | 100,000 |
Account & Keys
POST /v1/register — Create account (body: {email})
POST /v1/login — Verify API key (body: {key})
POST /v1/recover — Recover key by email (body: {email})
GET /v1/account — Account info + usage
GET /v1/health — Service health check