TwitterAPIs Docs
API ReferenceMonitoring

Account Monitor Health API

Returns a single-call summary of your entire monitoring setup: overall status, how many of your monitors are active vs paused, and how many delivery attempts in the last 24 hours were pending, delivered, or failed. Distinct from Monitor Health above, which reports one monitor's cursor state, not your whole account's. Cost: Free per call.

GET monitor/health returns an account-wide monitoring rollup in one call: status ("operational" or "degraded"), a monitors object with active/paused/total counts across every non-deleted monitor you own, and a deliveries_24h object with pending/delivered/failed counts across every delivery attempt in the last 24 hours. It costs 0 credits and takes no parameters. A key with no monitors gets a 200 with every count zeroed, never a 404.

GET
/monitor/health

Authorization

bearerAuth
AuthorizationBearer <token>

Pass your API key as a bearer token on every request: Authorization: Bearer <API_KEY>.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/monitor/health"
{  "status": "operational",  "monitors": {    "active": 3,    "paused": 1,    "total": 4  },  "deliveries_24h": {    "pending": 2,    "delivered": 150,    "failed": 1  }}
{  "error": "bad_request",  "message": "Missing or malformed parameter. Fix the request before retrying."}
{  "error": "unauthorized",  "message": "The API key is missing, malformed, or revoked. Check the Authorization header."}
{  "error": "insufficient_credits",  "message": "Your balance is exhausted. Top up your credits to continue."}
{  "error": "not_found",  "message": "The resource does not exist, for example a deleted tweet or a private account."}
{  "error": "rate_limited",  "message": "Too many requests. Back off and retry with exponential backoff."}
{  "error": "server_error",  "message": "Something failed on our side. Retry with backoff; if it persists, contact support."}

Pricing

UnitPrice
Per callFree

When to use

Use this endpoint to build an account-level monitoring dashboard or a single alerting check, instead of calling List Monitors and Monitor Health once per monitor id and aggregating the results yourself. Use Monitor Health (with an id) instead when you need one specific monitor's cursor position (last_tweet_id, last_poll_at), which this rollup does not carry.

Notes

  • No path parameter -- this is account-wide, scoped by your API key, unlike Monitor Health (GET monitor/{id}/health) which needs a specific monitor id.
  • An account with zero monitors gets 200 with every count at 0, matching the empty-array behavior of List Monitors, never a 404.
  • Create Monitor: Watch an X account for new posts and push them to your webhook(s).
  • List Monitors: List every monitor on your account.
  • Monitor Health: Check one monitor's poll status and last-seen tweet id.

FAQ

How is this different from GET monitor/{id}/health?

That endpoint reports ONE monitor's cursor state (last_tweet_id, last_poll_at, its own degraded flag) and 404s if the id is wrong or not yours. This endpoint reports your WHOLE account in one call (counts across every monitor plus 24h delivery outcomes) and never 404s, since there is no id to get wrong.

What counts as a "failed" delivery?

A delivery that exhausted its retry schedule without a successful webhook response (our internal dead-letter state). It is not the same as "pending", which includes deliveries still queued or mid-retry within the 24h window.

Does a paused monitor affect the status field?

Only if it is degraded AND active. A paused monitor is not being polled at all, so its degraded flag (a snapshot of its last active state) is excluded from the account-wide status calculation.

Does calling this endpoint cost anything?

No, the cost is 0, same as every other Monitoring read.