TwitterAPIs Docs
API ReferenceUser Reads

Bookmark Folder API | Read an X Bookmark Folder

Fetch the tweets inside one of the caller's own bookmark folders, identified by folder_id (from Bookmark Folders). Cursor-paginated. Requires a registered session. Billed at $0.0008 per call. Cost: $0.0008 per call.

Bookmark Folder Timeline returns the tweets saved inside one specific bookmark folder (X's internal name: collection) belonging to the caller's own account, cursor-paginated, newest first. Requires a registered session and the folder's id from Bookmark Folders.

GET
/user/bookmark_folder_timeline

Authorization

bearerAuth
AuthorizationBearer <token>

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

In: header

Query Parameters

folder_id*string

The bookmark folder's id, from user/bookmark_folders.

cursor?string

Pagination cursor from a previous response's next_cursor.

fields?string

Comma-separated list of dotted field paths to keep in the response (one parameter, never repeated), applied to every object in the returned lists and to nested objects (for example fields=id,text,author.username; the list's own name may prefix a path, fields=tweets.id). A path prefix that lands on an array applies to each element (media.media_url_https). Pagination and envelope keys (next_cursor, cursor, has_more, count, partial, error, message, reason) are always kept. Unknown paths are ignored; up to 50 paths of up to 6 segments. Projection never changes status codes or billing, and applies to data reads only: account, feedback, session status, monitor (other than deliveries), webhook and stream-compat reads return their bodies unchanged.

compact?string

Set to 1 (or true) to apply the built-in compact preset: ids, url, text, created_at, lang, the engagement counts, the is_retweet/is_reply/is_quote flags, conversation ids, the author's id/username/name/followers_count/verification, and the quoted or retweeted tweet's id/url/author username. The preset trims what it recognises and leaves alone what it would empty, so it never turns a body into {}. Combine with fields to add paths on top of the preset. Typically cuts a tweet page by 70 to 90 percent for LLM tool callers.

paid_promotion?string

Filter this page's tweets by X's Paid partnership label: only keeps tweets whose is_paid_promotion is true, exclude keeps the rest. Omit it for every tweet. It filters the page X returned and does not fetch more, so a filtered page can hold fewer tweets than asked for, or none, while next_cursor still pages on. The response carries paid_promotion_filter { mode, kept, removed }, and count reflects what is returned. Any other value is a 400. Billing is the same as without it.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/user/bookmark_folder_timeline?folder_id=2073826456430592429&fields=id%2Ctext%2Ccreated_at%2Cauthor.username&compact=1&paid_promotion=only"
{  "folder_id": "2073826456430592429",  "count": 1,  "next_cursor": "-1783273732069",  "tweets": [    {      "id": "2073438646657564825",      "text": "https://t.co/dYukCmrM45",      "created_at": "Sat Jul 04 16:07:50 +0000 2026",      "author": {        "id": "1451118635108478976",        "username": "natiakourdadze",        "name": "Natia Kurdadze"      },      "favorite_count": 41,      "retweet_count": 5,      "view_count": 6332    }  ]}
{  "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": "X refused this resource for the acting account: on a read, the account is not a participant in the DM thread, the target is protected or has blocked it, or the session was attestation-blocked for calling from a datacenter or rotating IP; on a write, the account is not authorized for the action or has no logged-in session. The credentials are still valid, so do not re-register."}
{  "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 call$0.0008
Per 1,000 calls$0.80
Per 1,000 records (~20 per call)~$0.04

When to use

Use it once you already have a folder_id from Bookmark Folders and want the tweets organized inside that one folder. To read your entire flat bookmarks list instead, use Bookmarks.

Notes

  • Needs a session for the account you are reading: either register one once (POST /customer/session), or pass per-call inline credentials as x-auth-token and x-ct0 request headers, which let a single API key act as many accounts. Returns 409 session_required if neither is supplied, 401 session_dead when the session has expired.
  • No count parameter exists for this op; only cursor pagination.
  • Stop paginating when the tweets array comes back empty.

Pagination

This endpoint is cursor-paginated and returns roughly 20 records per call. Pass the next_cursor from each response back as the cursor parameter to read the next page. Stop when the records array comes back empty: follower-graph endpoints return a non-null cursor even on the final page, so the empty array is the only reliable stop signal. See Pagination for the full loop.

  • Bookmark Folders: List your registered account's bookmark folders.
  • Bookmarks: List your registered account's bookmarked tweets, most recent first.
  • Bookmark Search: Full-text search within your registered account's bookmarks.

FAQ

Where do I get a folder_id?

From user/bookmark_folders, which lists your own folders.

Can I read someone else's folder?

No. This only reaches folders belonging to the account behind your registered session.

Does this take a count parameter like Bookmarks does?

No. This endpoint is cursor-paginated only; there is no page-size parameter to set.