TwitterAPIs Docs
API ReferenceMonitoring

Update Monitor API

Partial update of an existing monitor. Send status to pause or resume it, webhook_ids to change which webhooks receive its events, or both in the same call (applied atomically). Resuming a paused monitor re-runs the same capacity and per-account cap checks as creating a new one, since it adds load back to the shared pool. Cost: Free per call.

POST monitor/{id} updates an existing monitor without recreating it. Send status to pause or resume delivery, webhook_ids to change which webhooks receive its events, domain_filter to change which posts get delivered, or any combination in one atomic call. It returns the monitor's full current state, including status, degraded, events_possibly_missed, and the updated webhook_ids, domain_filter, and updated_at.

POST
/monitor/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

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

In: header

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

application/json

application/json

application/json

curl -X POST "https://example.com/monitor/{id}" \  -H "Content-Type: application/json" \  -d '{}'
{  "id": "b6f2c1a4-9e3d-4c11-8a2f-7d5e6c9b0a11",  "subject": "from:elonmusk",  "kind": "account",  "status": "paused",  "degraded": false,  "events_possibly_missed": 0,  "webhook_ids": null,  "domain_filter": null,  "updated_at": "2026-08-13T11:00:00.000Z"}
{  "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": "forbidden",  "message": "The acting account is not authorized for this write action, or has no logged-in session."}
{  "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 pause a monitor temporarily, resume one, repoint an existing monitor at a different set of webhooks, or change/clear its domain_filter, without deleting and recreating it. Reach for it instead of a sibling monitor-creation endpoint whenever the monitor's query/subject itself is unchanged and only its delivery state, destination, or filter needs to change.

Notes

  • Replace {id} with the monitor's id from Create Monitor or List Monitors.
  • 400 bad_request if none of status, webhook_ids, or domain_filter is provided, or if status is anything other than exactly "active" or "paused".
  • 403 customer_slot_limit_reached or 503 capacity_unavailable are only possible when resuming (status: "active") a currently-paused monitor; pausing, or a webhook_ids/domain_filter-only update, never triggers either check.
  • A monitor's handle cannot be changed. Delete it and create a new one to watch a different account.
  • Passing domain_filter: null (or an empty string) clears an existing filter back to "deliver every new post"; omitting the field entirely leaves whatever filter is currently set unchanged.
  • 400 bad_request with message invalid domain filter "<raw>": must be a bare hostname or URL like "example.com" or "https://example.com/blog" if a non-empty domain_filter does not normalize to a valid hostname.
  • Create Monitor: Watch an X account for new posts and push them to your webhook(s).
  • List Monitors: List every monitor on your account.

FAQ

What happens to events fired while a monitor is paused?

They are not delivered while status is paused, and the response's events_possibly_missed counter increases to reflect them. Resuming the monitor (status: active) re-runs capacity and cap checks before delivery resumes, so a resume is not guaranteed to succeed silently if those checks fail.

Can I change webhook_ids and status in the same request?

Yes. All three fields (status, webhook_ids, domain_filter) are optional and independent, so a single POST can pause a monitor, swap its webhook_ids, and change its domain_filter atomically. The response reflects every change at once.

Does calling this endpoint cost anything?

No, the listed cost is 0. There is no per-call charge for pausing, resuming, repointing a monitor's webhooks, or changing its domain_filter.

How do I remove a domain_filter I previously set?

Send domain_filter: null (or an empty string) in the update body. Omitting the field entirely is different: it leaves the existing filter exactly as it was.