API reference
Public
Public endpoints of the StatusTick REST API: a public status page, open a password-protected status page, count a view of a status page, the page's logo.
/v1/pages/{slug}The page as its visitors see it, by the slug in its address. Answers 404 for a page that is not public. A password-protected page answers 401 with its name only, unless X-Page-Access holds a valid access token from POST /v1/pages/{slug}/access; an answer to a call with that header is never stored by caches.
Path Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Header Parameters
Access token of a password-protected page.
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/v1/pages/acme"{ "id": "string", "name": "string", "slug": "string", "description": "string", "accentColor": "string", "logoURL": "string", "faviconURL": "string", "hidePoweredBy": true, "customCSS": "string", "uptimeRangeDays": 30, "uptimePeriods": [ "24h" ], "status": "string", "groups": [ { "name": "string", "components": [ { "id": "string", "name": "string", "description": "string", "status": "OPERATIONAL", "message": "string", "uptime": 0, "uptimes": [ { "period": "string", "uptime": 0 } ], "days": [ { "date": "2019-08-24", "uptime": 0 } ], "responseTimes": [ { "date": "2019-08-24", "avgMs": 0, "minMs": 0, "maxMs": 0 } ] } ] } ], "incidents": [ {} ], "maintenance": [ { "id": "string", "title": "string", "message": "string", "startsAt": "2019-08-24T14:15:22Z", "endsAt": "2019-08-24T14:15:22Z", "state": "UPCOMING", "componentIds": [ "string" ] } ], "subscriptions": { "email": true, "feeds": true }, "generatedAt": "2019-08-24T14:15:22Z"}/v1/pages/{slug}/accessChecks the page's password and answers with an access token for X-Page-Access, valid for 12 hours or until the page's password changes. At most 5 tries a minute per client IP and page, then 429 with Retry-After. Feeds, badges, the widget and subscriptions of a password-protected page answer 404.
Path Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/pages/acme/access" \ -H "Content-Type: application/json" \ -d '{ "password": "string" }'{ "accessToken": "string", "expiresAt": "2019-08-24T14:15:22Z"}/v1/pages/{slug}/viewSent by the public or password-protected page from the visitor's browser (for example with navigator.sendBeacon), so cached pages are counted too; no body. Bots are not counted. No cookie is set and the visitor's IP and user agent are not kept. Rate limited per client IP.
Path Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Response Body
application/json
application/json
curl -X POST "https://example.com/v1/pages/acme/view"/v1/pages/{slug}/logoPNG, JPEG or SVG. Use the page's logoURL; with its v the image is cached for a day.
Path Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Query Parameters
Response Body
application/json
curl -X GET "https://example.com/v1/pages/acme/logo"/v1/pages/{slug}/faviconPNG, ICO or SVG. Use the page's faviconURL; with its v the image is cached for a day.
Path Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Query Parameters
Response Body
application/json
curl -X GET "https://example.com/v1/pages/acme/favicon"/v1/pages/{slug}/feed.rssPath Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Response Body
application/rss+xml
application/json
curl -X GET "https://example.com/v1/pages/acme/feed.rss""string"/v1/pages/{slug}/feed.atomPath Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Response Body
application/atom+xml
application/json
curl -X GET "https://example.com/v1/pages/acme/feed.atom""string"/v1/pages/{slug}/feed.jsonPath Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Response Body
application/feed+json
application/json
curl -X GET "https://example.com/v1/pages/acme/feed.json"{}/v1/pages/{slug}/badge.svgPath Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Query Parameters
"status"Response Body
image/svg+xml
application/json
curl -X GET "https://example.com/v1/pages/acme/badge.svg""string"/v1/pages/{slug}/components/{componentId}/badge.svgPath Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Query Parameters
"status"Response Body
image/svg+xml
application/json
curl -X GET "https://example.com/v1/pages/acme/components/string/badge.svg""string"/v1/pages/{slug}/widget.jsAdd <script src="https://api.statustick.com/v1/pages/{slug}/widget.js" async></script> where the status should show.
Path Parameters
^[a-z0-9]+(?:-[a-z0-9]+)*$length <= 60Response Body
text/javascript
application/json
curl -X GET "https://example.com/v1/pages/acme/widget.js""string"curl -X GET "https://example.com/v1/vendors"[ { "id": "string", "name": "string", "category": "string", "statusPageURL": "string", "state": "string", "description": "string", "components": [ { "name": "string", "state": "string", "group": "string", "days": [ { "date": "2019-08-24", "state": "OPERATIONAL" } ] } ], "checkedAt": "2019-08-24T14:15:22Z", "changedAt": "2019-08-24T14:15:22Z", "lastReadAt": "2019-08-24T14:15:22Z", "officialState": "string", "openIncidents": [ {} ], "days": [ { "date": "2019-08-24", "state": "OPERATIONAL" } ], "incidentCount90d": 0, "lastIncidentAt": "2019-08-24T14:15:22Z" }]/v1/vendors/{vendorId}Path Parameters
Response Body
application/json
application/json
curl -X GET "https://example.com/v1/vendors/stripe"{ "id": "string", "name": "string", "category": "string", "statusPageURL": "string", "state": "string", "description": "string", "components": [ { "name": "string", "state": "string", "group": "string", "days": [ { "date": "2019-08-24", "state": "OPERATIONAL" } ] } ], "checkedAt": "2019-08-24T14:15:22Z", "changedAt": "2019-08-24T14:15:22Z", "lastReadAt": "2019-08-24T14:15:22Z", "officialState": "string", "openIncidents": [ {} ], "days": [ { "date": "2019-08-24", "state": "OPERATIONAL" } ], "incidentCount90d": 0, "lastIncidentAt": "2019-08-24T14:15:22Z"}/v1/drone-ipsAllow these in your firewall or WAF so checks are not blocked.
Response Body
application/json
curl -X GET "https://example.com/v1/drone-ips"{ "userAgent": "StatusTick/2.0 (+https://statustick.com/docs/checks)", "ipv4": [ "203.0.113.10" ], "ipv6": [ "2001:db8::10" ]}/v1/readiness-checksChecks a public web address from up to 5 regions at once and answers within about 25 seconds: reachability and response time per region, the HTTPS certificate (trust and days to expiry), whether http:// redirects to https://, a health endpoint (/health, /healthz, /api/health, /status), a status page (status.<domain> or a /status link on the home page) and security headers, each with a fix in plain words. No key and no account. Private, loopback, link-local, metadata and other internal addresses are refused, also after DNS resolution and on redirects. Nothing is stored. At most 5 checks per client IP in 10 minutes and 30 a minute in total, then 429 with Retry-After; browsers may call it only from the StatusTick site.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/readiness-checks" \ -H "Content-Type: application/json" \ -d '{ "url": "string" }'{ "url": "string", "checkedAt": "2019-08-24T14:15:22Z", "regions": [ { "region": "string", "name": "string", "reachable": true, "statusCode": 0, "responseTimeMs": 0, "error": "string" } ], "findings": [ { "key": "reachability", "status": "PASS", "title": "string", "detail": "string", "fix": "string" } ]}/v1/ssl-checksReads the certificate on port 443 from one region: the chain, issuer, expiry and days left, whether it matches the domain and is trusted, and the TLS versions the server accepts. host is a domain name; a pasted address such as https://myapp.com/login is read as its domain. No key and no account. Domains that resolve to private, loopback, link-local, metadata or other internal addresses are refused. Answers are kept 5 minutes per domain, and nothing is stored. SSL and DNS checks share a limit of 20 per client IP in 10 minutes and 120 a minute in total, then 429 with Retry-After; browsers may call it only from the StatusTick site.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/ssl-checks" \ -H "Content-Type: application/json" \ -d '{ "host": "string" }'{ "host": "string", "checkedAt": "2019-08-24T14:15:22Z", "region": "string", "certificate": { "valid": true, "error": "string", "subject": "string", "issuer": "string", "validFrom": "2019-08-24T14:15:22Z", "validTo": "2019-08-24T14:15:22Z", "daysLeft": 0, "hostnameMatch": true, "chain": [ { "subject": "string", "issuer": "string", "validTo": "2019-08-24T14:15:22Z" } ] }, "protocols": [ "TLSv1" ]}/v1/dns-checksResolves A, AAAA, CNAME, MX, TXT, NS and CAA records from 3 regions at once and marks where regions disagree. A domain without an address (only MX or TXT records, for example) is checked too. Domains that resolve to private or internal addresses are refused, and so is any answer that points to one. Answers are kept 5 minutes per domain, and nothing is stored. Shares its limits with POST /v1/ssl-checks.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/dns-checks" \ -H "Content-Type: application/json" \ -d '{ "host": "string" }'{ "host": "string", "checkedAt": "2019-08-24T14:15:22Z", "regions": [ { "region": "string", "name": "string" } ], "records": [ { "type": "A", "values": [ "string" ], "consistent": true, "differs": [ "string" ], "regions": [ { "region": "string", "values": [ "string" ], "error": "string" } ] } ]}