Skip to main content
Events delivered by the X Activity API (via the persistent HTTP stream or webhooks) share a common envelope:
Event envelope
The examples below are representative real-world payloads with sample account identifiers and profile fields substituted for documentation. Field availability can vary based on account settings, expansions, and the object state at delivery time. See the introduction for the full list of supported event types and authentication requirements. Payload samples use Mintlify code blocks with titles, line numbers, and wrapping. Longer examples are expandable—click to expand and copy the full delivery body.

Post events

post.create

Fired when the filtered user creates a Post. The payload is a Post object; includes may contain related users and tweets.
post.create

post.delete

Fired when the filtered user deletes a Post. The payload contains the deleted Post ID and author ID.
post.delete

post.mention.create

Fired when someone @mentions the filtered user in a Post. Private event — requires user-context authentication.
post.mention.create

Like events

like.create

Fired when the filtered user likes a Post, or when one of their Posts is liked. Private event — requires user-context authentication. Supports an optional direction filter (inbound or outbound). The payload is a like object with the following fields: includes may contain the liked Post and related users.
like.create

Follow events

follow.follow

Fired when the filtered user follows another user, or is followed. The payload includes source (the follower) and target (the user being followed).
follow.follow

follow.unfollow

Fired when the filtered user unfollows another user, or is unfollowed. Same source / target shape as follow.follow.
follow.unfollow

Profile events

All profile.update.* events share a before / after payload shape. Supported types: profile.update.bio, profile.update.profile_picture, profile.update.banner_picture, profile.update.screenname, profile.update.handle, profile.update.geo, profile.update.url, profile.update.verified_badge, profile.update.affiliate_badge.

profile.update.bio

Fired when the filtered user updates their profile bio.
profile.update.bio

profile.update.profile_picture

Fired when the filtered user updates their profile picture.
profile.update.profile_picture

profile.update.banner_picture

Fired when the filtered user updates their profile banner.
profile.update.banner_picture

profile.update.screenname

Fired when the filtered user updates their display name.
profile.update.screenname

profile.update.geo

Fired when the filtered user updates their profile location.
profile.update.geo

profile.update.url

Fired when the filtered user updates their profile website URL.
profile.update.url

profile.update.handle

Fired when the filtered user updates their @handle. Same before / after payload shape as other profile events.

profile.update.verified_badge

Fired when the filtered user’s verified badge changes. Same before / after payload shape as other profile events.

profile.update.affiliate_badge

Fired when the filtered user’s affiliate badge changes. Same before / after payload shape as other profile events.

Chat events (XChat)

Encrypted chat payloads include opaque encoded fields used by the XChat client libraries. Private events — require user-context authentication. Encoded crypto fields below are truncated for readability; real deliveries include the full strings.

chat.received

chat.received

chat.sent

chat.sent

chat.conversation_join

Fired when a user joins an encrypted chat conversation. The payload shape matches other chat events (conversation identity and encoded crypto material). Private event — requires user-context authentication.

Legacy DM events

Legacy (unencrypted) DM events. Private events — require user-context authentication.

dm.sent

Fired when the filtered user sends an unencrypted DM. The payload includes direct_message_events and a users map.
dm.sent

dm.received

Fired when the filtered user receives an unencrypted DM. Same payload shape as dm.sent (direct_message_events plus a users map). Private event — requires user-context authentication.
dm.received

dm.read

Fired when a participant reads the filtered user’s unencrypted DM (read receipt). Private event — requires user-context authentication.

dm.indicate_typing

Fired when a participant is typing a message to the filtered user. Private event — requires user-context authentication.

News events

news.new

Filter by keyword. The payload includes Grok-curated news fields such as category, name, hook, summary, contexts, and related cluster post results.
news.new

Spaces events

spaces.start

Fired when the filtered user starts a Space. The payload includes the host user, broadcast_id, and an inner event_type of start.
spaces.start

spaces.end

Fired when the filtered user ends a Space. Same shape as spaces.start with an inner event_type of end.
spaces.end

Mute events

Mute events use a source / target user pair similar to follow events. Private events — require user-context authentication with the mute.read scope. The user_id filter matches the user performing the mute or unmute (not the account being muted).

mute.mute

Fired when the filtered user mutes another user.

mute.unmute

Fired when the filtered user unmutes another user.

Block events

Block events use a source / target user pair similar to follow events. Private events — require user-context authentication with the block.read scope. The user_id filter matches the user performing the block or unblock (not the account being blocked).

block.block

Fired when the filtered user blocks another user.

block.unblock

Fired when the filtered user unblocks another user.

OAuth events

oauth.revoke

Fired when a user revokes your application’s access. The filter may be empty. Use this to clean up local state for the revoked user.
oauth.revoke

Next steps

Introduction

Supported event types, privacy, and authentication

Quickstart

Create a subscription and receive events

Activity stream

Connect to the persistent HTTP stream

Webhooks

Deliver activity events to your webhook URL