Processing Webhooks - API Reference
When a monitor detects an update (e.g., a new tweet from the target user), the API makes a POST request to your webhook URL. Each webhook request contains a single tweet or user profile. If the API detects multiple updates simultaneously, it dispatches an individual webhook request for each event.
The API first checks for a monitor-specific webhook_url (set using one of our “Create monitor” endpoints). If a monitor-specific webhook_url is not defined, it uses your default webhook URL.
Delivery guarantees
Failed requests are not retried. If your endpoint is down, times out, or returns an error, that event is not delivered again. Return HTTP status 200 as soon as you have accepted the payload, and do the processing afterwards — a slow handler is indistinguishable from a broken one.
Every event is recorded regardless of the outcome. Use Monitor event history to list what a monitor sent and to re-read any payload, which is how you backfill events your endpoint missed while it was down.
Events are deduplicated. The same detected event is never sent twice by the same monitor.
Ordering is not guaranteed. Two tweets detected at the same moment may arrive in either order. If order matters to you, sort on tweet_created_at rather than on arrival.
Delivery is billed at detection. An event your endpoint rejects is still billed, because the work of detecting it already happened.
Every request is signed. Your webhook URL is a public endpoint that anyone can POST to. Each delivery carries X-Timestamp, X-Event-Id and X-Signature headers so you can confirm it came from us — see Verifying webhooks.
Webhook Payload
Each request contains 3 properties:
eventdefines the type of event that triggered a webhook and will always be one ofnew_tweet,new_following,profile_update.datacontains the actual data of the event and is consistent with our tweet details or user details endpoints depending on the type of monitor.metacontains details of the monitor that triggered the event. User monitors reportmonitored_id_strandmonitored_username; search monitors reportmonitored_queryinstead.
{ "event": "new_tweet", "data": { // ... Tweet details ... }, "meta": { "monitor_id": "01hx1r99s0nsqq1ffdhmyyqbfr", "monitor_type": "user_tweets", "monitored_id_str": "44196397", "monitored_username": "elonmusk" }}Event Examples
{ "event": "new_following", "data": { "id": 295218901, "id_str": "295218901", "name": "vitalik.eth", "screen_name": "VitalikButerin", "location": "Earth", "url": null, "description": "mi pinxe lo crino tcati", "protected": false, "verified": true, "followers_count": 5702740, "friends_count": 465, "listed_count": 37058, "favourites_count": 8856, "statuses_count": 20628, "created_at": "2011-05-08T16:03:03.000000Z", "profile_banner_url": "https://pbs.twimg.com/profile_banners/295218901/1638557376", "profile_image_url_https": "https://pbs.twimg.com/profile_images/1880759276169224192/rXpjZO0A_normal.jpg", "can_dm": false }, "meta": { "monitor_id": "01jkt060zcz108b78fke6hm1g4", "monitor_type": "user_following", "monitored_id_str": "44196397", "monitored_username": "elonmusk" }}{ "event": "new_tweet", "data": { "tweet_created_at": "2025-02-12T02:43:10.000000Z", "id": 1889505498761703504, "id_str": "1889505498761703504", "conversation_id_str": "1889505498761703504", "text": null, "full_text": "Assange is right!", "source": "<a href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\">Twitter for iPhone<\/a>", "truncated": false, "in_reply_to_status_id": null, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_user_id_str": null, "in_reply_to_screen_name": null, "user": { "id": 44196397, "id_str": "44196397", "name": "Elon Musk", "screen_name": "elonmusk", "location": "", "url": null, "description": "", "protected": false, "verified": true, "followers_count": 217258406, "friends_count": 1013, "listed_count": 159662, "favourites_count": 122139, "statuses_count": 70054, "created_at": "2009-06-02T20:12:29.000000Z", "profile_banner_url": "https:\/\/pbs.twimg.com\/profile_banners\/44196397\/1726163678", "profile_image_url_https": "https:\/\/pbs.twimg.com\/profile_images\/1874558173962481664\/8HSTqIlD_normal.jpg", "can_dm": false }, "quoted_status_id": null, "quoted_status_id_str": "1889494636323885155", "is_quote_status": true, "quoted_status": { "tweet_created_at": "2025-02-12T02:00:01.000000Z", "id": 1889494636323885155, "id_str": "1889494636323885155", "conversation_id_str": "1889494636323885155", "text": null, "full_text": "\ud83d\udea8ASSANGE ON USAID: \u2018CIVIL SOCIETY IS A FABLE\u2019\n\nAssange exposed how NGOs have been co-opted into political weapons, arguing that civil society is no longer independent but a \u201cbuyer\u2019s market\u201d for influence:\n\n\u201cThe last forty years have seen a huge proliferation of think tanks and political NGOs whose purpose, beneath all the verbiage, is to execute political agendas by proxy.\u201d\n\nHe singled out USAID, Freedom House, and \u2018civil society\u2019 events as vehicles for Western political interests masquerading as grassroots activism.\n\nSource: @WikiLeaks", "source": "<a href=\"http:\/\/twitter.com\" rel=\"nofollow\">Twitter Web Client<\/a>", "truncated": false, "in_reply_to_status_id": null, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_user_id_str": null, "in_reply_to_screen_name": null, "user": { "id": 1319287761048723458, "id_str": "1319287761048723458", "name": "Mario Nawfal", "screen_name": "MarioNawfal", "location": "", "url": "https:\/\/roundtable.live", "description": "Largest Show on X | Founder @ibcgroupio", "protected": false, "verified": true, "followers_count": 2030538, "friends_count": 44251, "listed_count": 8614, "favourites_count": 144210, "statuses_count": 109900, "created_at": "2020-10-22T14:42:25.000000Z", "profile_banner_url": "https:\/\/pbs.twimg.com\/profile_banners\/1319287761048723458\/1736691634", "profile_image_url_https": "https:\/\/pbs.twimg.com\/profile_images\/1670905743619268609\/pYItlWat_normal.jpg", "can_dm": true }, "quoted_status_id": null, "quoted_status_id_str": null, "is_quote_status": false, "quoted_status": null, "retweeted_status": null, "quote_count": 16, "reply_count": 51, "retweet_count": 350, "favorite_count": 871, "views_count": 26067, "bookmark_count": 54, "lang": "en", "entities": { "user_mentions": [ { "id_str": "16589206", "name": "WikiLeaks", "screen_name": "WikiLeaks", "indices": [ 532, 542 ] } ], "urls": [], "hashtags": [], "symbols": [] }, "is_pinned": false }, "retweeted_status": null, "quote_count": 0, "reply_count": 7, "retweet_count": 0, "favorite_count": 1, "views_count": null, "bookmark_count": 2, "lang": "en", "entities": { "user_mentions": [], "urls": [], "hashtags": [], "symbols": [] }, "is_pinned": false }, "meta": { "monitor_id": "01jkt060zcz108b78fke6hm1g4", "monitor_type": "user_tweets", "monitored_id_str": "44196397", "monitored_username": "elonmusk" }}{ "event": "profile_update", "data": { "id": 44196397, "id_str": "44196397", "name": "Kekius Maximus", "screen_name": "elonmusk", "location": "", "url": null, "description": "", "protected": false, "verified": true, "followers_count": 217258406, "friends_count": 1013, "listed_count": 159662, "favourites_count": 122139, "statuses_count": 70054, "created_at": "2009-06-02T20:12:29.000000Z", "profile_banner_url": "https://pbs.twimg.com/profile_banners/44196397/1726163678", "profile_image_url_https": "https://pbs.twimg.com/profile_images/1874558173962481664/8HSTqIlD_normal.jpg", "can_dm": false, "changes": { "name": { "old": "Elon Musk", "new": "Kekius Maximus" } }, "meta": { "monitor_id": "01jkt060zcz108b78fke6hm1g4", "monitor_type": "user_profile", "monitored_id_str": "44196397", "monitored_username": "elonmusk" }}