Skip to content

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.

A public status page

GET/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

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Header Parameters

X-Page-Access?string

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"}
POST/v1/pages/{slug}/access

Checks 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

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Request 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"}
POST/v1/pages/{slug}/view

Sent 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

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Response Body

application/json

application/json

curl -X POST "https://example.com/v1/pages/acme/view"
Empty
GET/v1/pages/{slug}/logo

PNG, JPEG or SVG. Use the page's logoURL; with its v the image is cached for a day.

Path Parameters

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Query Parameters

v?string

Response Body

application/json

curl -X GET "https://example.com/v1/pages/acme/logo"
Empty

The page's favicon

GET/v1/pages/{slug}/favicon

PNG, ICO or SVG. Use the page's faviconURL; with its v the image is cached for a day.

Path Parameters

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Query Parameters

v?string

Response Body

application/json

curl -X GET "https://example.com/v1/pages/acme/favicon"
Empty
GET/v1/pages/{slug}/feed.rss

Path Parameters

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Response Body

application/rss+xml

application/json

curl -X GET "https://example.com/v1/pages/acme/feed.rss"
"string"
GET/v1/pages/{slug}/feed.atom

Path Parameters

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Response Body

application/atom+xml

application/json

curl -X GET "https://example.com/v1/pages/acme/feed.atom"
"string"
GET/v1/pages/{slug}/feed.json

Path Parameters

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Response Body

application/feed+json

application/json

curl -X GET "https://example.com/v1/pages/acme/feed.json"
{}
GET/v1/pages/{slug}/badge.svg

Path Parameters

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Query Parameters

label?string
Default"status"

Response Body

image/svg+xml

application/json

curl -X GET "https://example.com/v1/pages/acme/badge.svg"
"string"
GET/v1/pages/{slug}/components/{componentId}/badge.svg

Path Parameters

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60
componentId*string

Query Parameters

label?string
Default"status"

Response Body

image/svg+xml

application/json

curl -X GET "https://example.com/v1/pages/acme/components/string/badge.svg"
"string"
GET/v1/pages/{slug}/widget.js

Add <script src="https://api.statustick.com/v1/pages/{slug}/widget.js" async></script> where the status should show.

Path Parameters

slug*string
Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Lengthlength <= 60

Response Body

text/javascript

application/json

curl -X GET "https://example.com/v1/pages/acme/widget.js"
"string"
GET/v1/vendors

Response Body

application/json

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"  }]
GET/v1/vendors/{vendorId}

Path Parameters

vendorId*string

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"}
GET/v1/drone-ips

Allow 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"  ]}
POST/v1/readiness-checks

Checks 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"    }  ]}
POST/v1/ssl-checks

Reads 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"  ]}
POST/v1/dns-checks

Resolves 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"        }      ]    }  ]}
All docs