Versiebeheer

Beleid

Het voorvoegsel /v1 verandert alleen als het wire-formaat breekt. Een veld toevoegen aan een payload is geen brekende wijziging — parseer soepel en negeer wat u niet kent. Wanneer iets moet verdwijnen, markeren we het hier als verouderd en houden we het minstens 180 dagen werkend. GET /v1/meta/versions geeft deze tabel terug.

Versie

VersieStatusWijzigingen
2026-10-05huidigtweet.edit: an edited post is delivered as tweet.edit, carrying the new version and edit_of, the version it replaces (it used to arrive as a new tweet.create)
account.status: the account became protected, suspended or unavailable (deactivated, deleted, not visible), or active again; d carries old, new and X's reason
a new account category in GET /v1/meta/event-types; subscriptions that take every type ([]) receive the two new types, explicit lists do not change
post events carry author as a full User (bio, avatar, banner, counts, verification, location, link, join date), the same object as a search.match author; a thin first frame carries the account as last read
every event's target carries name, the account's display name, beside id and screen_name
2026-10-04ondersteunda thin first frame carries author.screen_name and a url with the account's handle (it had neither)
post payloads carry kind_final; a thin first tweet.create can still turn out to be a quote, and the update that settles it is tweet.quote with kind_was: tweet
an update that changes a post's type reaches every key whose choice includes either type (it was filtered by the new type only, so a key taking tweet.create but not tweet.quote never learned its post was a quote)
tweet.delete ts is when the deletion was detected; it was the deleted post's own time
post payloads carry article for X Articles: title, preview, full text, cover and images
Target push_ready means every event type the subscription asks for is collected live
documented: system.hello targets is the count when the connection opened and replay_from echoes ?last_id=; close code 1012 and how to resume
a monitored account is its user id: POST /v1/monitor/targets and batch items take user_id instead of screen_name, and /v1/monitor/targets/{target} takes the user id, the current handle or a former handle
an account that changes its handle keeps being delivered, later events carry the new target.screen_name, and profile.screen_name / profile.name report the change; Target objects carry previous_screen_names
two keys asking for the same unknown account at once are both subscribed (the second request used to replace the first)
2026-09-26ondersteundthe WebSocket reads Authorization: Bearer like every REST endpoint; before this, only X-API-Key and ?api_key= were read there although the authentication guide listed all three, so a Bearer-only client was closed with 4001
a 4001 close reason names the problem: missing_api_key, invalid_api_key or key_revoked (documented)
2026-09-25ondersteunda subscription can be narrowed to chosen event types: event_types on POST /v1/monitor/targets and on batch add items, and PATCH /v1/monitor/targets/{screen_name}; null or [] means every type
Target objects carry event_types and event_types_all
the filter applies to the stream, webhooks and GET /v1/events alike; an open connection picks up a change on its next refresh
2026-09-17ondersteundevery key is served alike: the tier and priority fields, PATCH /v1/monitor/targets/{screen_name}, the batch patch op and the tier:ultra scope are gone; subscriptions cannot be narrowed by event type
keywords no longer take interval_s; how often a keyword is searched is decided on our side
keyword matches reach only the keys that watch the keyword; there is no operator broadcast
event envelope no longer carries src or lat; payloads no longer carry push_type, x_push_ts, ts_estimated, confirmed, deep
/v1/status reports component state only; /v1/meta/event-types reports category and second_frame
Authorization: Bearer accepted alongside X-API-Key
401 key_revoked distinguished from invalid_api_key
402 plan_limit replaces target_limit and keyword_limit
X-RateLimit-* headers and 429 rate_limited per key
Idempotency-Key on writes, ETag / If-None-Match on reads, If-Match on PATCH
POST /v1/monitor/targets:batch
GET /v1/monitor/targets/{screen_name} with queued / failed resolution state
cursor paging on /v1/monitor/targets and /v1/events
/v1/meta/* public metadata
PUT /v1/account/webhook keeps the secret when the URL is unchanged
2026-09-08ondersteundInitial v1: targets, keywords, stream, replay, webhooks, reads