Last updated October 1, 2026
x_monitor is twitr.sh's Twitter monitoring tool. It watches one X account or one keyword query in real time and sends an event for every new post, reply, repost, quote or mention. On account monitors it also reports profile changes. Events reach your code by HMAC-signed webhook or a free polling feed. A monitor is prepaid by the hour, about $0.025 an hour or $0.61 for a full day. It stops at expiry unless you extend it, so it can't run up an open-ended bill. It is made for developers and AI agents, not as a dashboard.
| Monitor | Input | Good for |
|---|---|---|
| Account | {"username":"vercel"} | Competitor launches, executive posts, profile changes, impersonation |
| Keyword | {"query":"acme OR @acmehq"} | Brand mentions, hashtags, cashtags, product names, support requests |
Keyword queries use X search syntax and can be up to 512 characters, so from:, OR, hashtags and cashtags all work. You can buy 1 to 168 hours per purchase and keep up to 720 hours (30 days) prepaid ahead.
| Group | Event types | Applies to |
|---|---|---|
| Post events (10) | tweet.new · tweet.reply · tweet.retweet · tweet.quote · tweet.media · tweet.link · tweet.poll · tweet.mention · tweet.hashtag · tweet.longform | Account and keyword monitors |
| Profile events (11) | profile.avatar.changed · profile.banner.changed · profile.name.changed · profile.username.changed · profile.bio.changed · profile.location.changed · profile.url.changed · profile.verified.changed · profile.protected.changed · profile.pinned_tweet.changed · profile.unavailable.changed | Account monitors only |
| Lifecycle | monitor.expired · monitor.deleted | Fires once when a monitor ends |
By default a monitor sends every event that applies to it. You can pass eventTypes to narrow it, for example to only tweet.new. The lifecycle event means silence is never ambiguous: either nothing happened, or you were told the monitor ended.
| Window | Price | Notes |
|---|---|---|
| 1 hour | $0.0264 | Includes the one-time setup lookup |
| 24 hours | $0.606 | The most common window |
| 7 days (168 h) | $4.23 | Most you can buy in one purchase |
| 30 days (720 h) | About $18.15 | Create plus extends; the longest prepaid window |
| Each extra hour | $0.0252 | Extend at least 5 minutes before expiry |
Polling and webhook delivery are free. Hours are prepaid and aren't refunded if you delete early. You can pay with USDC via x402 on Base or MPP on Tempo, or from a card-funded balance. For comparison, polling a search yourself on any paid API means paying for every read, and an always-on stream means keeping a connection alive.
# 1) create a keyword monitor for 24 prepaid hours
# first request returns 402 with the price ($0.606); the wallet pays and retries
npx agentcash fetch https://twitr.sh/api/tools/x_monitor -m POST \
-H 'Idempotency-Key: acme-alerts-001' \
-b '{"action":"create","query":"acme OR @acmehq","eventTypes":["tweet.new","tweet.quote"],"hours":24}'
# -> { monitor: { monitor_id: "mn_...", expires_at, ... }, events_url }
# 2a) pull: poll the feed for free (wallet-signed)
npx agentcash fetch "https://twitr.sh/api/monitors/mn_.../events?after=<last id>"
# 2b) push: register a webhook once (free); the secret is returned once
npx agentcash fetch https://twitr.sh/api/webhooks -m POST \
-b '{"url":"https://your-app.example/hooks","eventTypes":["tweet.new","tweet.quote"]}'
# 3) keep it running: extend before it expires
npx agentcash fetch https://twitr.sh/api/tools/x_monitor -m POST \
-H 'Idempotency-Key: acme-alerts-002' \
-b '{"action":"extend","monitorId":"mn_...","hours":48}'The Idempotency-Key is required. If a retry reuses the same key, it returns the original monitor instead of charging twice. Prefer a card balance? Send Authorization: Bearer tw_live_… with plain curl instead. Every field is in the docs and on the x_monitor page.
Each delivery is a POST with X-Twitr-Signature, X-Twitr-Timestamp, X-Twitr-Delivery and X-Twitr-Event headers. The body has type, id, delivery_id, monitor_id, timestamps, source and data. Verify it before you trust it:
import crypto from "node:crypto";
// rawBody: the exact bytes you received, before JSON parsing
export function verifyTwitr(rawBody, headers, secret) {
const ts = headers["x-twitr-timestamp"]; // unix time in ms
const sig = headers["x-twitr-signature"] ?? ""; // "sha256=<hex>"
if (Math.abs(Date.now() - Number(ts)) > 5 * 60_000) return false;
const expected =
"sha256=" + crypto.createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
return sig.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}Respond with a 2xx within 10 seconds and do slow work afterwards. Dedupe on delivery_id and id. Failed deliveries retry with backoff over about 36 minutes, up to 6 attempts. After 50 consecutive failures the webhook pauses, and a successful /test call turns it back on.
| Approach | How it works | Trade-offs |
|---|---|---|
| Social listening dashboards | Alerts and reports inside an app, usually on a subscription | Great for marketing teams; harder to wire into your own code or agent |
| Official X API filtered stream | Keep a streaming connection open; pay-per-use allows 1,000 rules of up to 1,024 characters and 1 connection | Sanctioned by X; needs a developer app and reconnect handling |
| Polling search yourself | Re-run a search on a timer | Simple, but you pay per poll and latency depends on how often you poll |
| twitterapi.io filter rules | Webhook or WebSocket rules, checked every 0.05 s to 24 h | Fine-grained intervals; needs a twitterapi.io API key |
| twitr.sh x_monitor | One paid call creates a monitor; events by webhook or free polling | Prepaid with a hard stop; one account or query per monitor |
| Use case | Monitor setup | Typical cost |
|---|---|---|
| Brand mention alerts | query: "acme OR @acmehq", eventTypes: tweet.new | $0.61 a day |
| Competitor launch watch | username: "competitor", eventTypes: tweet.new, tweet.link | $4.23 a week |
| Ticker or cashtag chatter | query: "$ACME", eventTypes: tweet.new | $0.61 a day |
| Event hashtag, live | query: "#launchweek", hours: 72 | $1.82 for three days |
| Impersonation and profile changes | username: "yourbrand", eventTypes: the 11 profile events | $4.23 a week |
| Support inbox on X | query: "@yourbrand", eventTypes: tweet.mention | $0.61 a day |
Each row is one monitor, and you can run several side by side. Narrowing eventTypesdoesn't change the hourly price, but it keeps your webhook quiet and your agent focused on what matters. For a support inbox, send tweet.mention events to an agent that drafts replies, and approve them before anything is posted.
Yes. Install the skills with npx skills add lnvestor/twitr-skillsand say “Watch @competitor and tell me when they announce something.” The x-twitter-monitor skill creates the monitor, checks the feed and extends it when you ask. Point a webhook at Claude, OpenClaw, Hermes or your own endpoint to act the moment a post lands. With a connected account, the x-presence skill can draft replies for you to approve. See connect Claude to Twitter, /skills and /tools.
Comparing costs with the official API? See Twitter API vs twitr.sh, X API pricing and X API alternatives. If an account you're watching suddenly goes quiet, the free shadowban checker and X algorithm checker can tell you whether its reach dropped.
One that delivers events to your code instead of a dashboard. twitr.sh's x_monitor watches an X account or keyword query and sends every new post, reply, repost, quote or mention to a signed webhook or a free polling feed. It is prepaid at about $0.025 per hour.
POST to https://twitr.sh/api/tools/x_monitor with action create, your keyword query in X search syntax (up to 512 characters) and the number of hours. Pay the quoted price, then poll the free events feed or register a webhook to receive alerts.
About $0.025 per hour: $0.0264 for the first hour including setup, $0.606 for 24 hours and $4.23 for a full week. Polling events and receiving webhooks are free.
The monitor stops and is removed at its expiry time, and a final monitor.expired event fires so you know it ended. Extend it at least 5 minutes before expiry to keep it running. Nothing is billed after expiry.
No. Hours are prepaid, and deleting a monitor early doesn't refund the remaining time. Buy short windows and extend them if you are unsure how long you need.
Yes. Each monitor watches one account or one keyword query, so create one per target. One webhook receives events from every monitor your wallet owns, and you can register up to 3 webhooks per wallet.
Yes. Create a keyword monitor whose query is the hashtag or cashtag, for example #launchweek or $ACME. It accepts X search syntax, so you can combine terms with OR or exclude words. Every new matching post becomes a tweet.new event.
Yes, on account monitors. There are 11 profile events, covering avatar, banner, display name, username, bio, location, URL, verified status, protected status, pinned post and the account becoming unavailable.
Yes. GET /api/monitors/{id}/events is free with a sign-in from the paying wallet. It returns events newer than your cursor, keeps 500 events for 24 hours and allows 60 reads per minute.
Recompute HMAC-SHA256 of the X-Twitr-Timestamp header, a dot and the raw body, using your webhook secret. Compare it with the X-Twitr-Signature header (sha256=<hex>) in constant time, reject timestamps older than 5 minutes, and dedupe on delivery_id and id.
USDC via x402 on Base or MPP on Tempo, or from a card-funded balance with a twitr.sh API key. Solana isn't offered for monitors because a monitor needs a recoverable owner wallet.
No. A monitor is one paid call to twitr.sh. There is no X developer app, filtered-stream rule set or long-lived connection to manage.