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

ParamTypeRequiredDescription
urlstringYesURL 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

ParamTypeRequiredDescription
urlstringYesURL to monitor
intervalintegerNoCheck interval in seconds (default: 300, min varies by plan)
webhook_urlstringNoURL to receive status change alerts
namestringNoFriendly 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
ParamTypeDescription
limitintegerNumber 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

PlanPriceMonitorsMin IntervalPings/mo
Free$055 min200
Starter$9/mo202 min5,000
Pro$29/mo501 min25,000
Business$79/mo20030 sec100,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