View as Markdown

Rate limits

The API is free to read, so it is rate limited to keep it fast for everyone. Limits apply per API token, in one-minute windows.

What Limit
Reads (GET) 300 requests per minute per token
Writes (everything else, including quotes and payments) 60 requests per minute per token
Failed authentication 60 per minute per IP address
Quotes without an account 30 per minute per IP address
Paid monitors 1,000 per workspace

Headers

Successful responses report the current window:

Header Meaning
RateLimit-Limit Requests allowed in this window
RateLimit-Remaining Requests left in this window
RateLimit-Reset Seconds until the window resets

When you go over, the response is 429 Too Many Requests with "error": "rate_limited" and a Retry-After header in seconds. Wait that long, then continue.

import time, requests

def get(url, key):
    while True:
        response = requests.get(url, headers={"X-API-Key": key})
        if response.status_code != 429:
            return response
        time.sleep(int(response.headers.get("Retry-After", "5")))

Polling status

Monitors are checked on their own schedule (every 10 seconds at the fastest), so polling more often than a monitor's interval returns the same answer. To watch many monitors, call GET /api/v1/monitors once per interval instead of fetching each monitor; it returns every monitor's current_status. To be told about outages instead of polling, add a notification contact.

Fair use

UpHeron monitors services you operate or are allowed to monitor. Using monitors to load-test, flood or probe third-party services is not allowed. Tokens or workspaces used for abuse are revoked without refund.