Skip to content

API Enterno.io

Programmatic access to all enterno.io tools: HTTP headers, DNS, SSL, ping, IP geolocation, health scores, monitors and status pages. REST API with JSON responses.

Interactive documentation (Swagger) → MCP Server (Claude Desktop) →

Authentication

All API v4 requests require a key via X-API-Key header. Use X-Idempotency-Key to safely retry write requests.

Saved in the browser. Used by all forms below.

Get an API key by creating an account or in your dashboard.

curl -H "X-API-Key: YOUR_KEY" \
  "https://enterno.io/api/v4/webhooks"

Every response includes an X-Request-Id header for tracing.

Idempotency Key

Add X-Idempotency-Key: unique-id to any write request. Enterno.io returns the cached response for duplicate requests within 60 seconds.

curl -X POST "https://enterno.io/api/v4/webhooks" \
  -H "X-API-Key: YOUR_KEY" \
  -H "X-Idempotency-Key: create-wh-001" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://your-app.com/hook"}'

Response Format

API v4 uses the same JSON envelope as v3 with "api_version": "4.0" in meta.

{
  "data": { ... },
  "meta": {
    "request_id": "a1b2c3d4e5f6a7b8c9d0e1f2",
    "duration_ms": 8,
    "cached": false,
    "api_version": "4.0"
  }
}

On error:

{
  "error": {
    "code": "not_found",
    "message": "Resource not found"
  },
  "meta": {
    "request_id": "a1b2c3d4e5f6a7b8c9d0e1f2",
    "duration_ms": 2,
    "api_version": "4.0"
  }
}

Rate Limits

Rate limit information is included in response headers:

HeaderDescription
X-RateLimit-LimitMaximum requests per minute
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when rate limit resets
Retry-AfterSeconds to wait (only on 429)
Plan Requests/min Daily Limit Scopes
Free10100check, dns
Pro605 000check, dns, ssl, ip, ping, monitors, webhook
Business12050 000check, dns, ssl, ip, ping, monitors, webhook

Scopes

Each API key has a set of permitted scopes. A request to an inaccessible endpoint will return a 403 error.

Scope Endpoint Description
check/api/v3/check.phpHTTP header check + health score
dns/api/v3/dns.phpDNS lookup + DNSSEC
ssl/api/v3/ssl.phpSSL/TLS check + chain details
ip/api/v3/ip.phpIP geolocation
ping/api/v3/ping.phpPing, port check, traceroute
monitors/api/v3/monitors.phpMonitor CRUD + status pages
webhook/api/v4/webhooks, /api/v4/eventsWebhook subscription and event log CRUD

Webhooks — Manage Subscriptions

Create webhook subscriptions to receive HTTP POST notifications when monitors, SSL certificates, or domains change state.

Supported event types

ScopeDescription
monitor.downMonitor went down
monitor.upMonitor recovered
monitor.degradedMonitor response degraded
ssl.expiringSSL certificate expiring soon
ssl.expiredSSL certificate expired
domain.expiringDomain expiring soon
testManual test event

Webhook limits by plan

Plan Max webhooks Event restrictions
Free1monitor.down, monitor.up, test
Starter5All events
Pro20All events
Business50All events

List webhooks

GET /api/v4/webhooks scope: webhook

Returns all webhook subscriptions for the authenticated user.

curl -H "X-API-Key: YOUR_KEY" \
  "https://enterno.io/api/v4/webhooks"

Create webhook

POST /api/v4/webhooks scope: webhook
NameTypeRequiredDescription
urlstringYesDestination URL (HTTPS required)
namestringNoSubscription name (optional)
secretstringNoHMAC-SHA256 secret for payload signature (optional)
eventsarrayNoEvent types to subscribe to (default: all)
curl -X POST "https://enterno.io/api/v4/webhooks" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-app.com/hooks/enterno",
    "name": "Production alerts",
    "events": ["monitor.down", "monitor.up", "ssl.expiring"]
  }'

Response

{
  "data": {
    "id": 12,
    "name": "Production alerts",
    "url": "https://your-app.com/hooks/enterno",
    "secret": "ent_wh_sk_***",
    "events": ["monitor.down", "monitor.up", "ssl.expiring"],
    "is_active": true,
    "created_at": "2026-03-28T06:00:00Z"
  },
  "meta": {"request_id": "...", "duration_ms": 18, "api_version": "4.0"}
}

Update webhook

PUT /api/v4/webhooks?id=N scope: webhook
curl -X PUT "https://enterno.io/api/v4/webhooks?id=12" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"is_active": false}'

Delete webhook

DELETE /api/v4/webhooks?id=N scope: webhook
curl -X DELETE "https://enterno.io/api/v4/webhooks?id=12" \
  -H "X-API-Key: YOUR_KEY"

Verifying webhook signatures

Every delivery to your webhook URL is signed with your shared secret. Two headers enable request-integrity + replay-protection checks:

Header Value Purpose
X-Enterno-Timestamp Unix timestamp (seconds) at dispatch Reject if > 300 s skew from receiver clock
X-Enterno-Signature-V2 sha256=<hex> HMAC-SHA256(secret, timestamp + "." + body)
X-Enterno-Signature sha256=<hex> Legacy — HMAC over body only, no replay protection. Kept for existing integrations. Will be removed 2026-07-01.

PHP verifier (recommended)

<?php
$secret  = getenv('ENTERNO_WEBHOOK_SECRET');          // your shared secret
$ts      = $_SERVER['HTTP_X_ENTERNO_TIMESTAMP'] ?? '';
$sig     = $_SERVER['HTTP_X_ENTERNO_SIGNATURE_V2'] ?? '';
$body    = file_get_contents('php://input');

// 1. Replay window — reject timestamps older than 5 minutes
if (abs(time() - (int)$ts) > 300) {
    http_response_code(400);
    exit('stale timestamp');
}

// 2. Compute expected signature
$expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $secret);

// 3. Timing-safe compare
if (!hash_equals($expected, $sig)) {
    http_response_code(401);
    exit('bad signature');
}

$payload = json_decode($body, true);
// …handle the event…

Node.js verifier

const crypto = require('crypto');

function verify(req, secret) {
  const ts   = req.headers['x-enterno-timestamp'];
  const sig  = req.headers['x-enterno-signature-v2'];
  const body = req.rawBody;                             // use a raw-body parser

  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300)
    throw new Error('stale timestamp');

  const expected =
    'sha256=' + crypto.createHmac('sha256', secret)
                      .update(ts + '.' + body)
                      .digest('hex');

  if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig)))
    throw new Error('bad signature');
}

Migration window: legacy X-Enterno-Signature (body-only, no timestamp) is still sent alongside V2 until 2026-07-01. If you still depend on it, migrate to V2 before that date.

Send test event

POST /api/v4/webhooks?action=test&id=N scope: webhook
curl -X POST "https://enterno.io/api/v4/webhooks?action=test&id=12" \
  -H "X-API-Key: YOUR_KEY"

Events — Delivery History

View webhook delivery attempts, retry counts, response codes, and failure reasons.

GET /api/v4/events scope: webhook
NameTypeDescription
webhook_idintegerFilter by webhook ID (optional)
event_typestringFilter by event type
statusstringFilter: delivered, retrying, failed, dead, pending
pageintegerPage number (default 1)
per_pageintegerItems per page, max 100 (default 25)
curl -H "X-API-Key: YOUR_KEY" \
  "https://enterno.io/api/v4/events?webhook_id=12&status=failed"

Response

{
  "data": [
    {
      "id": 501,
      "webhook_id": 12,
      "event_type": "monitor.down",
      "status": "delivered",
      "http_status_code": 200,
      "attempts": 1,
      "created_at": "2026-03-28T06:05:00Z",
      "delivered_at": "2026-03-28T06:05:01Z"
    }
  ],
  "meta": {
    "request_id": "...",
    "duration_ms": 12,
    "api_version": "4.0",
    "pagination": {"total": 1, "page": 1, "per_page": 25, "pages": 1}
  }
}

Error Codes

HTTP Code Error Code Description
400missing_parameterMissing or invalid parameters
401auth_requiredMissing API key
401invalid_api_keyInvalid or inactive API key
403insufficient_scopeKey does not have the required scope
404not_foundResource not found
405method_not_allowedHTTP method not allowed
409conflictIdempotent request already in progress
429rate_limit_exceededRate limit exceeded
429daily_limit_exceededDaily API request limit exceeded

Migrate from v3

Authentication, rate limits, and response format are identical to v3. Switch to /api/v4/ paths and add the webhook scope to your API key for webhook and event endpoints.

v3v4
/api/v3/check.phpUse v3 — identical in v4
/api/v3/monitors.phpUse v3 — identical in v4
Webhooks (UI only)/api/v4/webhooks
Event log (UI only)/api/v4/events