{"openapi":"3.1.0","info":{"title":"XPOZ API","version":"1.0.0","description":"Social media data API for Twitter/X, Instagram, Reddit, and TikTok.\n\n**Data endpoints** (`/api/data/*`) are authenticated with an API access key and are metered against the account's credits. Most stored-data endpoints share the same query options: `fields` selects which attributes to return, `since`/`until` bound the date range, and `responseType` picks between a synchronous first page (`fast`), a full paged query run as a background operation (`paging`), and a CSV export (`csv`). `/live` endpoints fetch from the platform on demand and page with a cursor instead.\n\n**Account, billing, and crawl-settings endpoints** are used by the XPOZ dashboard and authenticate with the user's session."},"servers":[{"url":"/","description":"This server"}],"tags":[{"name":"Twitter (live)","description":"On-demand Twitter/X fetches straight from the platform, cursor-paginated. Not available for trial access keys."},{"name":"Instagram (live)","description":"On-demand Instagram fetches straight from the platform, cursor-paginated. Not available for trial access keys."},{"name":"Reddit (live)","description":"On-demand Reddit fetches straight from the platform, cursor-paginated. Not available for trial access keys."},{"name":"TikTok (live)","description":"On-demand TikTok fetches straight from the platform, cursor-paginated. Not available for trial access keys."},{"name":"Operations","description":"Polling for background operations started with `responseType=paging`."},{"name":"Account","description":"Access keys, plan, and usage of the signed-in user."},{"name":"Billing","description":"Stripe checkout, subscription changes, and add-on purchases."},{"name":"Crawl Settings","description":"Tracked items collected on a schedule."},{"name":"System Status","description":"Platform status page and notifications."},{"name":"Platform","description":"Health, metrics, and this spec."}],"paths":{"/api/data/twitter/posts/live":{"get":{"tags":["Twitter (live)"],"summary":"Search tweets (live)","description":"Search tweets on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryQ"},{"$ref":"#/components/parameters/Since"},{"$ref":"#/components/parameters/Until"},{"name":"lang","in":"query","required":false,"description":"BCP-47 language code filter.","schema":{"type":"string"}},{"name":"countryCode","in":"query","required":false,"description":"ISO country code filter.","schema":{"type":"string"}},{"name":"sortBy","in":"query","required":false,"description":"Sort order.","schema":{"type":"string","enum":["relevance","latest"]}},{"$ref":"#/components/parameters/TweetFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterPostsLive"}},"/api/data/twitter/posts/users/{username}/live":{"get":{"tags":["Twitter (live)"],"summary":"Get a user's tweets (live)","description":"Fetch a user's recent tweets on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Username"},{"$ref":"#/components/parameters/Since"},{"$ref":"#/components/parameters/Until"},{"$ref":"#/components/parameters/TweetFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterPostsUsersUsernameLive"}},"/api/data/twitter/posts/{id}/live":{"get":{"tags":["Twitter (live)"],"summary":"Get a tweet (live)","description":"Fetch a single tweet on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TwitterPostId"},{"$ref":"#/components/parameters/TweetFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Post ID must be a numeric string`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterPostsIdLive"}},"/api/data/twitter/posts/{id}/comments/live":{"get":{"tags":["Twitter (live)"],"summary":"Get tweet replies (live)","description":"Fetch replies to a tweet on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TwitterPostId"},{"$ref":"#/components/parameters/TweetFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Post ID must be a numeric string`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterPostsIdCommentsLive"}},"/api/data/twitter/posts/{id}/quotes/live":{"get":{"tags":["Twitter (live)"],"summary":"Get tweet quotes (live)","description":"Fetch quote tweets on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TwitterPostId"},{"$ref":"#/components/parameters/TweetFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Post ID must be a numeric string`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterPostsIdQuotesLive"}},"/api/data/twitter/posts/{id}/interacting-users/live":{"get":{"tags":["Twitter (live)"],"summary":"Get tweet interacting users (live)","description":"Fetch users who commented on, quoted, or retweeted a tweet, on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TwitterPostId"},{"$ref":"#/components/parameters/TwitterInteractionType"},{"$ref":"#/components/parameters/TwitterUserFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Post ID must be a numeric string`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterPostsIdInteractingUsersLive"}},"/api/data/twitter/users/live":{"get":{"tags":["Twitter (live)"],"summary":"Search Twitter users (live)","description":"Search Twitter users on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryQ"},{"$ref":"#/components/parameters/TwitterUserFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterUsersLive"}},"/api/data/twitter/users/{username}/live":{"get":{"tags":["Twitter (live)"],"summary":"Get a Twitter user (live)","description":"Fetch a Twitter user profile on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Username"},{"$ref":"#/components/parameters/TwitterUserFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterUsersUsernameLive"}},"/api/data/twitter/users/{username}/connections/live":{"get":{"tags":["Twitter (live)"],"summary":"Get Twitter user connections (live)","description":"Fetch followers or following of a user on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Username"},{"$ref":"#/components/parameters/ConnectionType"},{"$ref":"#/components/parameters/TwitterUserFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTwitterUsersUsernameConnectionsLive"}},"/api/data/instagram/posts/live":{"get":{"tags":["Instagram (live)"],"summary":"Search Instagram posts (live)","description":"Search Instagram posts on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryQ"},{"$ref":"#/components/parameters/InstagramPostFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramPostsLive"}},"/api/data/instagram/posts/users/{identifier}/live":{"get":{"tags":["Instagram (live)"],"summary":"Get an Instagram user's posts (live)","description":"Fetch an Instagram user's recent posts on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Identifier"},{"$ref":"#/components/parameters/InstagramPostFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramPostsUsersIdentifierLive"}},"/api/data/instagram/posts/{id}/live":{"get":{"tags":["Instagram (live)"],"summary":"Get an Instagram post (live)","description":"Fetch a single Instagram post on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/InstagramLivePostId"},{"$ref":"#/components/parameters/InstagramPostFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid Instagram post ID. Must be a shortcode (e.g., \"DdaSlMIgeTm\") or strong_id format: media_id_user_id (e.g., \"3606450040306139062_4836333238\").`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramPostsIdLive"}},"/api/data/instagram/posts/{id}/comments/live":{"get":{"tags":["Instagram (live)"],"summary":"Get Instagram post comments (live)","description":"Fetch top-level comments of an Instagram post on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/InstagramLivePostId"},{"$ref":"#/components/parameters/InstagramCommentFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid Instagram post ID. Must be a shortcode (e.g., \"DdaSlMIgeTm\") or strong_id format: media_id_user_id (e.g., \"3606450040306139062_4836333238\").`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramPostsIdCommentsLive"}},"/api/data/instagram/posts/{id}/comments/{commentId}/live":{"get":{"tags":["Instagram (live)"],"summary":"Get an Instagram comment (live)","description":"Fetch a single top-level comment of an Instagram post on demand, by post ID and comment ID. Always returns `has_more: false`. Reply (child comment) IDs are not supported; page the parent comment's replies instead. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/InstagramLivePostId"},{"$ref":"#/components/parameters/InstagramCommentId"},{"$ref":"#/components/parameters/InstagramCommentFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid Instagram post ID. Must be a shortcode (e.g., \"DdaSlMIgeTm\") or strong_id format: media_id_user_id (e.g., \"3606450040306139062_4836333238\").`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramPostsIdCommentsCommentIdLive"}},"/api/data/instagram/posts/{id}/comments/{commentId}/replies/live":{"get":{"tags":["Instagram (live)"],"summary":"Get Instagram comment replies (live)","description":"Fetch replies to a top-level comment of an Instagram post on demand. Fetches directly from the platform and returns one page with a cursor, plus the top-level comment itself in `parent_comment`. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/InstagramLivePostId"},{"$ref":"#/components/parameters/InstagramCommentId"},{"$ref":"#/components/parameters/InstagramCommentFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramCommentRepliesCursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid Instagram post ID. Must be a shortcode (e.g., \"DdaSlMIgeTm\") or strong_id format: media_id_user_id (e.g., \"3606450040306139062_4836333238\").`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramPostsIdCommentsCommentIdRepliesLive"}},"/api/data/instagram/posts/{id}/interacting-users/live":{"get":{"tags":["Instagram (live)"],"summary":"Get Instagram post interacting users (live)","description":"Fetch users who commented on or liked an Instagram post, on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/InstagramLivePostId"},{"$ref":"#/components/parameters/InstagramInteractionType"},{"$ref":"#/components/parameters/InstagramUserFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid Instagram post ID. Must be a shortcode (e.g., \"DdaSlMIgeTm\") or strong_id format: media_id_user_id (e.g., \"3606450040306139062_4836333238\").`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramPostsIdInteractingUsersLive"}},"/api/data/instagram/users/live":{"get":{"tags":["Instagram (live)"],"summary":"Search Instagram users (live)","description":"Search Instagram users by name on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryName"},{"$ref":"#/components/parameters/InstagramUserFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramUsersLive"}},"/api/data/instagram/users/{identifier}/live":{"get":{"tags":["Instagram (live)"],"summary":"Get an Instagram user (live)","description":"Fetch an Instagram user profile on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Identifier"},{"$ref":"#/components/parameters/InstagramUserFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramUsersIdentifierLive"}},"/api/data/instagram/users/{identifier}/connections/live":{"get":{"tags":["Instagram (live)"],"summary":"Get Instagram user connections (live)","description":"Fetch followers or following of an Instagram user on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Identifier"},{"$ref":"#/components/parameters/ConnectionType"},{"$ref":"#/components/parameters/InstagramUserFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataInstagramUsersIdentifierConnectionsLive"}},"/api/data/reddit/posts/live":{"get":{"tags":["Reddit (live)"],"summary":"Search Reddit posts (live)","description":"Search Reddit posts by keyword on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryQ"},{"name":"sort","in":"query","required":false,"description":"Result order. Defaults to `relevance`. Ignored when `since`/`until` are set.","schema":{"type":"string","enum":["relevance","hot","top","new","comments"]}},{"name":"time","in":"query","required":false,"description":"Time window for `sort=top` or `sort=controversial`. Defaults to `all`.","schema":{"type":"string","enum":["hour","day","week","month","year","all"]}},{"name":"subreddit","in":"query","required":false,"description":"Restrict the search to one subreddit (name without `r/`).","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Start date (YYYY-MM-DD). With `since`/`until` the search returns posts only, 10 per page, and ignores `sort` and `time`.","schema":{"type":"string","format":"date"}},{"name":"until","in":"query","required":false,"description":"End date (YYYY-MM-DD). See `since`.","schema":{"type":"string","format":"date"}},{"$ref":"#/components/parameters/RedditPostFields"},{"$ref":"#/components/parameters/RedditLivePageSize"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditPostsLive"}},"/api/data/reddit/posts/users/{username}/live":{"get":{"tags":["Reddit (live)"],"summary":"Get a Reddit user's posts (live)","description":"Fetch the posts submitted by a Reddit user on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Username"},{"name":"sort","in":"query","required":false,"description":"Listing order. Defaults to `new`.","schema":{"type":"string","enum":["new","hot","top","controversial"]}},{"name":"time","in":"query","required":false,"description":"Time window for `sort=top` or `sort=controversial`. Defaults to `all`.","schema":{"type":"string","enum":["hour","day","week","month","year","all"]}},{"$ref":"#/components/parameters/RedditPostFields"},{"$ref":"#/components/parameters/RedditLivePageSize"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditPostsUsersUsernameLive"}},"/api/data/reddit/posts/subreddits/{name}/live":{"get":{"tags":["Reddit (live)"],"summary":"Get subreddit posts (live)","description":"Fetch the post listing of a subreddit on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/SubredditName"},{"name":"sort","in":"query","required":false,"description":"Listing order. Defaults to `new`.","schema":{"type":"string","enum":["hot","new","top","rising","controversial"]}},{"name":"time","in":"query","required":false,"description":"Time window for `sort=top` or `sort=controversial`. Defaults to `all`.","schema":{"type":"string","enum":["hour","day","week","month","year","all"]}},{"$ref":"#/components/parameters/RedditPostFields"},{"$ref":"#/components/parameters/RedditLivePageSize"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditPostsSubredditsNameLive"}},"/api/data/reddit/posts/ids/live":{"get":{"tags":["Reddit (live)"],"summary":"Get Reddit posts by IDs (live)","description":"Fetch up to 100 Reddit posts by ID in one call. IDs Reddit does not return are omitted from the results. Always returns `has_more: false`. Fetches directly from the platform. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"name":"ids","in":"query","required":true,"description":"Comma-separated post IDs (base-36, without the `t3_` prefix), up to 100.","style":"form","explode":false,"schema":{"type":"array","maxItems":100,"items":{"type":"string"}}},{"$ref":"#/components/parameters/RedditPostFields"}],"responses":{"200":{"description":"Results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditPostsIdsLive"}},"/api/data/reddit/posts/{id}/live":{"get":{"tags":["Reddit (live)"],"summary":"Get a Reddit post (live)","description":"Fetch a single Reddit post on demand. Always returns `has_more: false`. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/RedditPostId"},{"$ref":"#/components/parameters/RedditPostFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid Reddit post ID. Must be the base-36 post ID without the t3_ prefix (e.g., \"1wtde0i\").`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditPostsIdLive"}},"/api/data/reddit/posts/{id}/comments/live":{"get":{"tags":["Reddit (live)"],"summary":"Get Reddit post comments (live)","description":"Fetch the comment thread of a Reddit post on demand, flattened. Later pages expand \"load more\" batches and \"continue this thread\" branches; `rank` and `topLevelRank` continue across pages. A cursor expires shortly after the last page was fetched; restart from the first page if it does. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/RedditPostId"},{"name":"sort","in":"query","required":false,"description":"Thread order. Defaults to `best`.","schema":{"type":"string","enum":["best","top","new","controversial","old","qa"]}},{"$ref":"#/components/parameters/RedditCommentFields"},{"$ref":"#/components/parameters/RedditLiveCommentThreadPageSize"},{"name":"tree","in":"query","required":false,"description":"When `true`, replies are nested under their parent in a `replies` array (formatted with the same `fields`) instead of returned as a flat list.","schema":{"type":"boolean","default":false}},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid Reddit post ID. Must be the base-36 post ID without the t3_ prefix (e.g., \"1wtde0i\").`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditPostsIdCommentsLive"}},"/api/data/reddit/comments/users/{username}/live":{"get":{"tags":["Reddit (live)"],"summary":"Get a Reddit user's comments (live)","description":"Fetch the comments written by a Reddit user on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Username"},{"name":"sort","in":"query","required":false,"description":"Listing order. Defaults to `new`.","schema":{"type":"string","enum":["new","hot","top","controversial"]}},{"name":"time","in":"query","required":false,"description":"Time window for `sort=top` or `sort=controversial`. Defaults to `all`.","schema":{"type":"string","enum":["hour","day","week","month","year","all"]}},{"$ref":"#/components/parameters/RedditCommentFields"},{"$ref":"#/components/parameters/RedditLivePageSize"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditCommentsUsersUsernameLive"}},"/api/data/reddit/comments/ids/live":{"get":{"tags":["Reddit (live)"],"summary":"Get Reddit comments by IDs or permalink (live)","description":"Fetch up to 100 Reddit comments by ID, or one comment by permalink. Pass exactly one of `ids` or `url`. IDs Reddit does not return are omitted from the results. Always returns `has_more: false`. Fetches directly from the platform. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"name":"ids","in":"query","required":false,"description":"Comma-separated comment IDs (base-36, without the `t1_` prefix), up to 100.","style":"form","explode":false,"schema":{"type":"array","maxItems":100,"items":{"type":"string"}}},{"name":"url","in":"query","required":false,"description":"Comment permalink. Share links (`/s/...`) are not accepted; resolve them with `/api/data/reddit/resolve/live` first.","schema":{"type":"string"}},{"$ref":"#/components/parameters/RedditCommentFields"}],"responses":{"200":{"description":"Results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when neither or both of `ids` and `url` are given: `Exactly one of ids or url is required`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditCommentsIdsLive"}},"/api/data/reddit/comments/{id}/live":{"get":{"tags":["Reddit (live)"],"summary":"Get a Reddit comment (live)","description":"Fetch a single Reddit comment on demand. Always returns `has_more: false`. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/RedditCommentId"},{"$ref":"#/components/parameters/RedditCommentFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the comment ID is invalid: `Invalid Reddit comment ID. Must be the base-36 comment ID without the t1_ prefix (e.g., \"pct5d0m\").`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditCommentsIdLive"}},"/api/data/reddit/users/live":{"get":{"tags":["Reddit (live)"],"summary":"Search Reddit users (live)","description":"Search Reddit users by keyword on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryQ"},{"$ref":"#/components/parameters/RedditUserFields"},{"$ref":"#/components/parameters/RedditLivePageSize"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditUsersLive"}},"/api/data/reddit/users/{username}/live":{"get":{"tags":["Reddit (live)"],"summary":"Get a Reddit user (live)","description":"Fetch a Reddit user profile on demand. Always returns `has_more: false`. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/Username"},{"$ref":"#/components/parameters/RedditUserFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditUsersUsernameLive"}},"/api/data/reddit/subreddits/live":{"get":{"tags":["Reddit (live)"],"summary":"Search subreddits (live)","description":"Search subreddits by keyword on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryQ"},{"$ref":"#/components/parameters/RedditSubredditFields"},{"$ref":"#/components/parameters/RedditLivePageSize"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditSubredditsLive"}},"/api/data/reddit/subreddits/{name}/live":{"get":{"tags":["Reddit (live)"],"summary":"Get a subreddit (live)","description":"Fetch subreddit details on demand. Always returns `has_more: false`. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/SubredditName"},{"$ref":"#/components/parameters/RedditSubredditFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditSubredditsNameLive"}},"/api/data/reddit/resolve/live":{"get":{"tags":["Reddit (live)"],"summary":"Resolve a Reddit URL (live)","description":"Resolve a permalink or share link into its identifiers. Returns one result with `kind` (`post` or `comment`), `subreddit`, `postId`, `commentId` and `shortCode`. Resolving a share link calls Reddit once; a permalink is parsed locally. An expired or invalid share link returns 400. Fetches directly from the platform. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Reddit permalink or share link (`/s/...`) to resolve.","schema":{"type":"string"}}],"responses":{"200":{"description":"Results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataRedditResolveLive"}},"/api/data/tiktok/posts/live":{"get":{"tags":["TikTok (live)"],"summary":"Search TikTok posts (live)","description":"Search TikTok posts by keyword on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryQ"},{"$ref":"#/components/parameters/TiktokPostFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokPostsLive"}},"/api/data/tiktok/posts/hashtags/{hashtag}/live":{"get":{"tags":["TikTok (live)"],"summary":"Get TikTok posts by hashtag (live)","description":"Fetch posts carrying a hashtag on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokHashtag"},{"$ref":"#/components/parameters/TiktokPostFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokPostsHashtagsHashtagLive"}},"/api/data/tiktok/posts/sounds/{sound}/live":{"get":{"tags":["TikTok (live)"],"summary":"Get TikTok posts by sound (live)","description":"Fetch posts using a sound on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokSound"},{"$ref":"#/components/parameters/TiktokPostFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokPostsSoundsSoundLive"}},"/api/data/tiktok/posts/users/{identifier}/live":{"get":{"tags":["TikTok (live)"],"summary":"Get a TikTok user's posts (live)","description":"Fetch the posts of a TikTok user on demand, newest first. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokUsername"},{"$ref":"#/components/parameters/TiktokPostFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokPostsUsersIdentifierLive"}},"/api/data/tiktok/posts/{id}/live":{"get":{"tags":["TikTok (live)"],"summary":"Get a TikTok post (live)","description":"Fetch a single TikTok post on demand. Always returns `has_more: false`. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokPostId"},{"$ref":"#/components/parameters/TiktokPostFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid TikTok post ID. Must be a numeric value (max 50 digits).`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokPostsIdLive"}},"/api/data/tiktok/posts/{id}/comments/live":{"get":{"tags":["TikTok (live)"],"summary":"Get TikTok post comments (live)","description":"Fetch top-level comments of a TikTok post on demand. TikTok may re-serve comments on later pages. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokPostId"},{"$ref":"#/components/parameters/TiktokLiveCommentFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid TikTok post ID. Must be a numeric value (max 50 digits).`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokPostsIdCommentsLive"}},"/api/data/tiktok/posts/{id}/comments/{commentId}/live":{"get":{"tags":["TikTok (live)"],"summary":"Get a TikTok comment (live)","description":"Fetch a single comment of a TikTok post on demand, by post ID and comment ID. Always returns `has_more: false`. Reliable for top-level comments; a reply is often not found, in which case page the parent comment's replies instead. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokPostId"},{"$ref":"#/components/parameters/TiktokCommentId"},{"$ref":"#/components/parameters/TiktokLiveCommentFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid TikTok post ID. Must be a numeric value (max 50 digits).`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokPostsIdCommentsCommentIdLive"}},"/api/data/tiktok/posts/{id}/comments/{commentId}/replies/live":{"get":{"tags":["TikTok (live)"],"summary":"Get TikTok comment replies (live)","description":"Fetch replies to a top-level comment of a TikTok post on demand. Each reply carries `parentCommentId` (the top-level comment) and `replyToCommentId` (the reply it answers, `null` when it answers the top-level comment). The `replyCount` of the top-level comment can be higher than the number of replies served. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokPostId"},{"$ref":"#/components/parameters/TiktokCommentId"},{"$ref":"#/components/parameters/TiktokLiveCommentFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed. Also returned when the post ID is invalid: `Invalid TikTok post ID. Must be a numeric value (max 50 digits).`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokPostsIdCommentsCommentIdRepliesLive"}},"/api/data/tiktok/users/live":{"get":{"tags":["TikTok (live)"],"summary":"Search TikTok users (live)","description":"Search TikTok users by name on demand. Results can overlap across pages. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/QueryName"},{"$ref":"#/components/parameters/TiktokUserFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokUsersLive"}},"/api/data/tiktok/users/{identifier}/live":{"get":{"tags":["TikTok (live)"],"summary":"Get a TikTok user (live)","description":"Fetch a TikTok user profile by username on demand. Always returns `has_more: false`. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokUsername"},{"$ref":"#/components/parameters/TiktokUserFields"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokUsersIdentifierLive"}},"/api/data/tiktok/users/{identifier}/connections/live":{"get":{"tags":["TikTok (live)"],"summary":"Get TikTok user connections (live)","description":"Fetch followers or following of a TikTok user on demand. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/TiktokUsername"},{"$ref":"#/components/parameters/ConnectionType"},{"$ref":"#/components/parameters/TiktokUserFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokUsersIdentifierConnectionsLive"}},"/api/data/tiktok/sounds/live":{"get":{"tags":["TikTok (live)"],"summary":"Search TikTok sounds (live)","description":"Search TikTok sounds by keyword on demand. Results can overlap across pages. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"name":"keyword","in":"query","required":true,"description":"Keyword to search for. Must not be blank.","schema":{"type":"string"}},{"$ref":"#/components/parameters/TiktokMusicFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokSoundsLive"}},"/api/data/tiktok/hashtags/live":{"get":{"tags":["TikTok (live)"],"summary":"Search TikTok hashtags (live)","description":"Search TikTok hashtags by keyword on demand. Results can overlap across pages. Fetches directly from the platform and returns one page with a cursor. Not available for trial access keys.","security":[{"AccessKey":[]}],"parameters":[{"name":"keyword","in":"query","required":true,"description":"Keyword to search for. Must not be blank.","schema":{"type":"string"}},{"$ref":"#/components/parameters/TiktokHashtagFields"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"One page of results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CursorResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/TrialForbidden"},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataTiktokHashtagsLive"}},"/api/data/operations/{id}":{"get":{"tags":["Operations"],"summary":"Get operation status","description":"Poll a background operation started by a `responseType=paging` request. Poll every few seconds until `status` is `success`, `no_data`, or `error`. Completed operations expire 15 minutes after finishing.","security":[{"AccessKey":[]}],"parameters":[{"$ref":"#/components/parameters/OperationId"}],"responses":{"200":{"description":"Operation state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationState"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Unknown or expired operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"default":{"$ref":"#/components/responses/DataRouteError"}},"operationId":"getDataOperationsId"}},"/health":{"get":{"tags":["Platform"],"summary":"Health check","description":"Liveness and dependency health. Returns 503 when SingleStore is unhealthy.","security":[],"responses":{"200":{"description":"Healthy or degraded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}},"503":{"description":"Unhealthy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}},"operationId":"getHealth"}},"/metrics":{"get":{"tags":["Platform"],"summary":"Prometheus metrics","description":"Prometheus exposition format.","security":[],"responses":{"200":{"description":"Metrics.","content":{"text/plain":{"schema":{"type":"string"}}}}},"operationId":"getMetrics"}},"/openapi.yaml":{"get":{"tags":["Platform"],"summary":"OpenAPI spec (YAML)","description":"This document.","security":[],"responses":{"200":{"description":"Spec.","content":{"application/yaml":{"schema":{"type":"string"}}}}},"operationId":"getOpenapi.yaml"}},"/openapi.json":{"get":{"tags":["Platform"],"summary":"OpenAPI spec (JSON)","description":"This document.","security":[],"responses":{"200":{"description":"Spec.","content":{"application/json":{"schema":{"type":"object"}}}}},"operationId":"getOpenapi.json"}},"/api/status":{"get":{"tags":["System Status"],"summary":"Get platform status","description":"Current status per social platform. Returns 503 when overall status is `down`.","security":[],"responses":{"200":{"description":"Status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemStatus"}}}},"503":{"description":"Overall status is down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemStatus"}}}}},"operationId":"getStatus"},"put":{"tags":["System Status"],"summary":"Override platform status","description":"Manually set per-platform status. Requires an `@xpoz.ai` admin with the `updateSystemStatus` flag.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platforms":{"type":"object","minProperties":1,"propertyNames":{"enum":["twitter","instagram","reddit","tiktok"]},"additionalProperties":{"$ref":"#/components/schemas/PlatformStatus"}},"message":{"type":"string"}},"required":["platforms"]}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessFlag"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"403":{"$ref":"#/components/responses/NotAuthorized"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"putStatus"}},"/api/status/history":{"get":{"tags":["System Status"],"summary":"Get status history","description":"Hourly status per platform for the last 36 hours.","security":[],"responses":{"200":{"description":"History.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusHistory"}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"getStatusHistory"}},"/api/status/subscribe":{"post":{"tags":["System Status"],"summary":"Subscribe to status emails","description":"Subscribe an email to status change notifications for selected platforms.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"platforms":{"type":"array","minItems":1,"items":{"type":"string","enum":["twitter","instagram","reddit","tiktok"]}}},"required":["email","platforms"]}}}},"responses":{"200":{"description":"Subscribed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessFlag"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"postStatusSubscribe"}},"/api/status/unsubscribe":{"get":{"tags":["System Status"],"summary":"Unsubscribe from status emails","description":"Unsubscribe using the token from the notification email.","security":[],"parameters":[{"name":"token","in":"query","required":true,"description":"Unsubscribe token.","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Unsubscribed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessFlag"}}}},"400":{"description":"Missing, invalid, or expired token.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SimpleError"},{"$ref":"#/components/schemas/ErrorField"}]}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"getStatusUnsubscribe"}},"/api/tokens":{"get":{"tags":["Account"],"summary":"List access keys","description":"List the caller's active API access keys.","security":[{"UserSession":[]}],"responses":{"200":{"description":"Access keys.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/AccessKeyRecord"}},"count":{"type":"integer"}},"required":["success","data","count"]}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"getTokens"},"post":{"tags":["Account"],"summary":"Create an access key","description":"Create an API access key for the caller, or return the existing one (`isExisting: true`).","security":[{"UserSession":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string"}}}}}},"responses":{"200":{"description":"Access key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessKeyCreated"}}}},"400":{"description":"Missing user data on the session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"postTokens"}},"/api/tokens/rotate":{"post":{"tags":["Account"],"summary":"Rotate access key","description":"Revoke the caller's current access key and issue a new one.","security":[{"UserSession":[]}],"responses":{"200":{"description":"New access key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessKeyCreated"}}}},"400":{"description":"Missing user data on the session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"postTokensRotate"}},"/api/plan":{"get":{"tags":["Account"],"summary":"Get current plan","description":"The caller's subscription plan and its features.","security":[{"UserSession":[]}],"responses":{"200":{"description":"Plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plan"}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"getPlan"}},"/api/usage":{"get":{"tags":["Account"],"summary":"Get usage","description":"Credits and CSV rows used this period, plus purchased extras.","security":[{"UserSession":[]}],"responses":{"200":{"description":"Usage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"getUsage"}},"/api/usage-history":{"get":{"tags":["Account"],"summary":"Get usage history","description":"Credits and export rows used per time bucket.","security":[{"UserSession":[]}],"parameters":[{"name":"range","in":"query","required":false,"description":"Time range.","schema":{"type":"string","enum":["today","7d","current_month","lifetime"],"default":"current_month"}},{"name":"granularity","in":"query","required":false,"description":"Bucket size.","schema":{"type":"string","enum":["hour","day"],"default":"day"}}],"responses":{"200":{"description":"Usage history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageHistory"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"getUsageHistory"}},"/api/crawl/settings":{"get":{"tags":["Crawl Settings"],"summary":"Get tracked items","description":"The caller's tracked keywords, users, subreddits, and hashtags per platform.","security":[{"UserSession":[]}],"responses":{"200":{"description":"Tracked items, or `{success: true, data: null, message}` when none are configured.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CrawlSettings"},{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"null"},"message":{"type":"string"}}}]}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"getCrawlSettings"},"post":{"tags":["Crawl Settings"],"summary":"Replace tracked items","description":"Replace the caller's tracked items. Rejected when the plan limit is exceeded.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"$ref":"#/components/schemas/CrawlSettings"}},"required":["items"]}}}},"responses":{"200":{"description":"Saved settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlSettingsRecord"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"403":{"description":"Plan limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanLimitExceeded"}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"postCrawlSettings"}},"/api/crawl/settings/upload-csv":{"post":{"tags":["Crawl Settings"],"summary":"Parse a tracked-items CSV","description":"Parse a CSV (`platform,type,value,country`) into tracked items without saving. Max 5 MiB. Requires the `uploadCrawlSettingsCsv` flag.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}}}},"responses":{"200":{"description":"Parsed items.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"$ref":"#/components/schemas/CrawlSettings"}},"required":["success","data"]}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"403":{"description":"Missing flag or plan limit exceeded.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ErrorField"},{"$ref":"#/components/schemas/PlanLimitExceeded"}]}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"postCrawlSettingsUploadCsv"}},"/api/crawl/settings/export-csv":{"get":{"tags":["Crawl Settings"],"summary":"Export tracked items as CSV","description":"Download the caller's tracked items as `crawl-settings.csv`. Requires the `uploadCrawlSettingsCsv` flag.","security":[{"UserSession":[]}],"responses":{"200":{"description":"CSV file.","content":{"text/csv":{"schema":{"type":"string"}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"403":{"$ref":"#/components/responses/NotAuthorized"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"getCrawlSettingsExportCsv"}},"/api/crawl/tweet":{"post":{"tags":["Crawl Settings"],"summary":"Track a tweet","description":"Start collecting engagement on a tweet for a number of days. Requires the `trackTweets` flag.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tweetId":{"type":"string","pattern":"^\\d+$"},"days":{"type":"integer","minimum":1,"maximum":30,"default":7}},"required":["tweetId"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetBuildCreated"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"403":{"$ref":"#/components/responses/NotAuthorized"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"postCrawlTweet"},"get":{"tags":["Crawl Settings"],"summary":"List tracked tweets","description":"Tweet tracking requests of the caller. Requires the `trackTweets` flag.","security":[{"UserSession":[]}],"responses":{"200":{"description":"Requests.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TweetCrawlRequest"}}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"403":{"$ref":"#/components/responses/NotAuthorized"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyFailure"}}}}},"operationId":"getCrawlTweet"}},"/api/extra-credits/purchase":{"post":{"tags":["Billing"],"summary":"Buy extra credits","description":"Charge the saved payment method for extra credits.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"dollarsAmount":{"type":"integer","minimum":1}},"required":["dollarsAmount"]}}}},"responses":{"200":{"description":"Charged, or requires client-side confirmation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResult"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"402":{"description":"Card declined or payment rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentError"}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"postExtraCreditsPurchase"}},"/api/extra-credits/confirm":{"post":{"tags":["Billing"],"summary":"Confirm extra credits payment","description":"Finalize a purchase after the client confirmed the payment intent.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"paymentIntentId":{"type":"string","minLength":1}},"required":["paymentIntentId"]}}}},"responses":{"200":{"description":"Charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargeConfirmed"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"postExtraCreditsConfirm"}},"/api/extra-csv-rows/purchase":{"post":{"tags":["Billing"],"summary":"Buy extra CSV rows","description":"Charge the saved payment method for extra CSV export rows.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"dollarsAmount":{"type":"integer","minimum":1}},"required":["dollarsAmount"]}}}},"responses":{"200":{"description":"Charged, or requires client-side confirmation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResult"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"402":{"description":"Card declined or payment rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentError"}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"postExtraCsvRowsPurchase"}},"/api/extra-csv-rows/confirm":{"post":{"tags":["Billing"],"summary":"Confirm extra CSV rows payment","description":"Finalize a purchase after the client confirmed the payment intent.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"paymentIntentId":{"type":"string","minLength":1}},"required":["paymentIntentId"]}}}},"responses":{"200":{"description":"Charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargeConfirmed"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"postExtraCsvRowsConfirm"}},"/api/extra-tracked-items":{"get":{"tags":["Billing"],"summary":"Get extra tracked items","description":"Number of extra tracked items on the subscription.","security":[{"UserSession":[]}],"responses":{"200":{"description":"Quantity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtraTrackedItems"}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"getExtraTrackedItems"},"patch":{"tags":["Billing"],"summary":"Set extra tracked items","description":"Change the extra tracked items quantity on the subscription (prorated).","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"quantity":{"type":"integer","minimum":0}},"required":["quantity"]}}}},"responses":{"200":{"description":"Quantity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtraTrackedItems"}}}},"400":{"description":"Validation failed, reduction below current usage, or not available on the plan.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SimpleError"},{"$ref":"#/components/schemas/ErrorField"}]}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"402":{"description":"Card declined or payment rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentError"}}}},"404":{"description":"No active subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"patchExtraTrackedItems"}},"/api/stripe/create-checkout-session":{"post":{"tags":["Billing"],"summary":"Create a Stripe Checkout session","description":"Create a Checkout session for a subscription or one-time payment.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"priceId":{"type":"string"},"quantity":{"type":"integer","default":1},"mode":{"type":"string","enum":["subscription","payment"]},"successUrl":{"type":"string","format":"uri"},"cancelUrl":{"type":"string","format":"uri"},"customerEmail":{"type":"string","format":"email"},"descopeUserId":{"type":"string"},"metadata":{"type":"object","additionalProperties":{"type":"string"}}},"required":["priceId","successUrl","cancelUrl","descopeUserId"]}}}},"responses":{"200":{"description":"Session.","content":{"application/json":{"schema":{"type":"object","properties":{"sessionId":{"type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["sessionId","url"]}}}},"400":{"description":"Missing fields, or the user already has an active subscription.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"subscriptionId":{"type":"string"},"planId":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"postStripeCreateCheckoutSession"}},"/api/stripe/subscription":{"patch":{"tags":["Billing"],"summary":"Change subscription plan","description":"Switch the caller's active subscription to another plan and/or billing period.","security":[{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"planName":{"type":"string"},"billingPeriod":{"type":"string","enum":["monthly","annual"]}},"required":["planName"]}}}},"responses":{"200":{"description":"Changed.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"subscription":{"type":"object","properties":{"planName":{"type":"string"},"billingPeriod":{"type":"string","enum":["monthly","annual"]}},"required":["planName","billingPeriod"]}},"required":["success","message","subscription"]}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}},"401":{"$ref":"#/components/responses/UnauthorizedMessage"},"404":{"description":"No active subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}},"operationId":"patchStripeSubscription"}},"/api/stripe/webhooks":{"post":{"tags":["Billing"],"summary":"Stripe webhook","description":"Receives Stripe events. The raw body is verified against the `stripe-signature` header.","security":[],"parameters":[{"name":"stripe-signature","in":"header","required":true,"schema":{"type":"string"},"description":"Stripe webhook signature."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StripeWebhookEvent"}}}},"responses":{"200":{"description":"Received.","content":{"application/json":{"schema":{"type":"object","properties":{"received":{"type":"boolean","const":true}},"required":["received"]}}}},"400":{"description":"Missing or invalid signature.","content":{"text/plain":{"schema":{"type":"string"}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}},"operationId":"postStripeWebhooks"}},"/api/trial/token":{"post":{"tags":["Billing"],"summary":"Create a trial token (deprecated)","description":"Trial tokens are no longer issued.","security":[],"responses":{"410":{"description":"Gone.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}}},"deprecated":true,"operationId":"postTrialToken"}}},"components":{"securitySchemes":{"AccessKey":{"type":"http","scheme":"bearer","description":"XPOZ API access key, created from the dashboard or `POST /api/tokens`. Send as `Authorization: Bearer <access key>`."},"UserSession":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Descope session JWT of a logged-in dashboard user. Send as `Authorization: Bearer <session JWT>`."}},"parameters":{"Page":{"name":"page","in":"query","required":false,"description":"Page number (1-based). Used with `responseType=paging`.","schema":{"type":"integer","minimum":1}},"TableName":{"name":"tableName","in":"query","required":false,"description":"Result table name returned by a previous page; pass it back to continue paging the same result set.","schema":{"type":"string"}},"ResponseType":{"name":"responseType","in":"query","required":false,"description":"`fast` returns the first page synchronously (up to 300 rows). `paging` runs the full query and returns an operation to poll (or the first page when async operations are unavailable). `csv` queues a CSV export and returns its operation ID.","schema":{"type":"string","enum":["fast","paging","csv"],"default":"fast"}},"ResponseTypeNonCsv":{"name":"responseType","in":"query","required":false,"description":"`fast` returns the first page synchronously (up to 300 rows). `paging` runs the full query and returns an operation to poll. CSV export is not available on this endpoint.","schema":{"type":"string","enum":["fast","paging"],"default":"fast"}},"ForceLatest":{"name":"forceLatest","in":"query","required":false,"description":"Force a fresh fetch from the platform instead of serving cached data.","schema":{"type":"string","enum":["true","1","false","0"]}},"Limit":{"name":"limit","in":"query","required":false,"description":"Maximum number of results.","schema":{"type":"integer","minimum":1,"maximum":500000}},"Since":{"name":"since","in":"query","required":false,"description":"Start date (inclusive), YYYY-MM-DD.","schema":{"type":"string","format":"date"}},"Until":{"name":"until","in":"query","required":false,"description":"End date (inclusive), YYYY-MM-DD.","schema":{"type":"string","format":"date"}},"Cursor":{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from `next_page_cursor` of the previous page.","schema":{"type":"string"}},"IdentifierType":{"name":"identifierType","in":"query","required":false,"description":"Whether the path identifier is a platform user ID or a username.","schema":{"type":"string","enum":["id","username"],"default":"username"}},"ConnectionType":{"name":"connectionType","in":"query","required":true,"description":"Which side of the follow graph to return.","schema":{"type":"string","enum":["followers","following"]}},"TwitterInteractionType":{"name":"interactionType","in":"query","required":true,"description":"Kind of interaction to list users for.","schema":{"type":"string","enum":["commenters","quoters","retweeters"]}},"InstagramInteractionType":{"name":"interactionType","in":"query","required":true,"description":"Kind of interaction to list users for.","schema":{"type":"string","enum":["commenters","likers"]}},"QueryQ":{"name":"q","in":"query","required":true,"description":"Search query (Lucene-style keyword syntax). Must not be blank.","schema":{"type":"string"}},"QueryName":{"name":"name","in":"query","required":true,"description":"Name to search for. Must not be blank.","schema":{"type":"string"}},"TwitterPostId":{"name":"id","in":"path","required":true,"description":"Tweet ID (numeric string).","schema":{"type":"string","pattern":"^\\d+$"}},"InstagramPostId":{"name":"id","in":"path","required":true,"description":"Instagram post strong ID in `media_id_user_id` format, e.g. `3606450040306139062_4836333238`.","schema":{"type":"string","pattern":"^\\d+_\\d+$"}},"InstagramLivePostId":{"name":"id","in":"path","required":true,"description":"Instagram post shortcode (e.g. `DdaSlMIgeTm`, as in `instagram.com/p/DdaSlMIgeTm`) or strong ID in `media_id_user_id` format (e.g. `3606450040306139062_4836333238`).","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]+$"}},"InstagramCommentId":{"name":"commentId","in":"path","required":true,"description":"ID of the top-level comment.","schema":{"type":"string"}},"TiktokPostId":{"name":"id","in":"path","required":true,"description":"TikTok post ID (numeric, max 50 digits).","schema":{"type":"string","pattern":"^\\d{1,50}$"}},"TiktokCommentId":{"name":"commentId","in":"path","required":true,"description":"TikTok comment ID.","schema":{"type":"string"}},"TiktokSoundId":{"name":"soundId","in":"path","required":true,"description":"TikTok sound (music) ID.","schema":{"type":"string"}},"TiktokSound":{"name":"sound","in":"path","required":true,"description":"TikTok sound (music) ID, or its exact track title.","schema":{"type":"string"}},"TiktokHashtag":{"name":"hashtag","in":"path","required":true,"description":"TikTok hashtag ID (numeric) or hashtag name without the leading `#`. Names must match a hashtag exactly.","schema":{"type":"string"}},"TiktokUsername":{"name":"identifier","in":"path","required":true,"description":"TikTok username, without the leading `@`.","schema":{"type":"string"}},"Username":{"name":"username","in":"path","required":true,"description":"Username (without `@`).","schema":{"type":"string"}},"Identifier":{"name":"identifier","in":"path","required":true,"description":"User identifier; interpreted according to `identifierType` where supported, otherwise a username.","schema":{"type":"string"}},"RedditPostId":{"name":"id","in":"path","required":true,"description":"Reddit post ID.","schema":{"type":"string"}},"RedditCommentId":{"name":"id","in":"path","required":true,"description":"Reddit comment ID.","schema":{"type":"string"}},"SubredditName":{"name":"name","in":"path","required":true,"description":"Subreddit name (without `r/`).","schema":{"type":"string"}},"OperationId":{"name":"id","in":"path","required":true,"description":"Operation ID returned by a `responseType=paging` request, e.g. `op_2f1c...`.","schema":{"type":"string"}},"TweetFields":{"name":"fields","in":"query","required":false,"description":"Tweet fields to return. Comma-separated. Allowed values: id, authorId, authorUsername, text, bookmarkCount, impressionCount, likeCount, lang, possiblySensitive, deleted, suspended, quoteCount, replyCount, retweetCount, isRetweet, hasBirdwatchNotes, birdwatchNotesId, birdwatchNotesText, birdwatchNotesUrl, status, conversationId, quotedTweetId, retweetedTweetId, replyToTweetId, replyToUserId, replyToUsername, originalTweetId, editedTweets, hashtags, mentions, mediaUrls, urls, grokGeneratedContent, source, placeName, placeCountry, placeCountryCode, placeBoundingBoxCoordinates, placeCentroid, createdAt, createdAtDate.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","authorId","authorUsername","text","bookmarkCount","impressionCount","likeCount","lang","possiblySensitive","deleted","suspended","quoteCount","replyCount","retweetCount","isRetweet","hasBirdwatchNotes","birdwatchNotesId","birdwatchNotesText","birdwatchNotesUrl","status","conversationId","quotedTweetId","retweetedTweetId","replyToTweetId","replyToUserId","replyToUsername","originalTweetId","editedTweets","hashtags","mentions","mediaUrls","urls","grokGeneratedContent","source","placeName","placeCountry","placeCountryCode","placeBoundingBoxCoordinates","placeCentroid","createdAt","createdAtDate"]}}},"TwitterUserFields":{"name":"fields","in":"query","required":false,"description":"Twitter user fields to return. Comma-separated. Allowed values: id, profileImageUrl, profileBannerUrl, profileInterstitialType, status, username, verifiedType, name, description, location, protected, verified, followersCount, followingCount, tweetCount, listedCount, likesCount, mediaCount, pinnedTweetId, source, nLang, nLangsFiltered, label, labelType, isVerified, modifiedAt, createdAt, verifiedSinceDatetime, accountBasedIn, locationAccurate, usernameChanges, lastUsernameChangeDatetime.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","profileImageUrl","profileBannerUrl","profileInterstitialType","status","username","verifiedType","name","description","location","protected","verified","followersCount","followingCount","tweetCount","listedCount","likesCount","mediaCount","pinnedTweetId","source","nLang","nLangsFiltered","label","labelType","isVerified","modifiedAt","createdAt","verifiedSinceDatetime","accountBasedIn","locationAccurate","usernameChanges","lastUsernameChangeDatetime"]}}},"InstagramPostFields":{"name":"fields","in":"query","required":false,"description":"Instagram post fields to return. Comma-separated. Allowed values: id, postType, userId, username, fullName, caption, mediaType, codeUrl, imageUrl, videoUrl, audioOnlyUrl, profilePicUrl, videoSubtitlesUri, subtitles, likeCount, commentCount, reshareCount, mediaRepostCount, saveCount, videoPlayCount, videoDuration, createdAt, createdAtTimestamp, createdAtDate, location, genAiChatWithAiCtaInfo, hasHighRiskGenAiInformTreatment.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","postType","userId","username","fullName","caption","mediaType","codeUrl","imageUrl","videoUrl","audioOnlyUrl","profilePicUrl","videoSubtitlesUri","subtitles","likeCount","commentCount","reshareCount","mediaRepostCount","saveCount","videoPlayCount","videoDuration","createdAt","createdAtTimestamp","createdAtDate","location","genAiChatWithAiCtaInfo","hasHighRiskGenAiInformTreatment"]}}},"InstagramCommentFields":{"name":"fields","in":"query","required":false,"description":"Instagram comment fields to return. Comma-separated. Allowed values: id, text, parentPostId, parentPostUserId, type, parentCommentId, repliedToCommentId, childCommentCount, userId, username, fullName, likeCount, status, isSpam, hasTranslation, createdAt, createdAtTimestamp, createdAtDate, images.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","text","parentPostId","parentPostUserId","type","parentCommentId","repliedToCommentId","childCommentCount","userId","username","fullName","likeCount","status","isSpam","hasTranslation","createdAt","createdAtTimestamp","createdAtDate","images"]}}},"InstagramUserFields":{"name":"fields","in":"query","required":false,"description":"Instagram user fields to return. Comma-separated. Allowed values: id, username, fullName, isPrivate, isVerified, followerCount, followingCount, mediaCount, biography, externalUrl, hasAnonymousProfilePicture, profilePicId, profilePicUrl, profileUrl.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","username","fullName","isPrivate","isVerified","followerCount","followingCount","mediaCount","biography","externalUrl","hasAnonymousProfilePicture","profilePicId","profilePicUrl","profileUrl"]}}},"InstagramUserFieldsWithAggregates":{"name":"fields","in":"query","required":false,"description":"Instagram user fields to return, plus per-user aggregates over the matching posts. Comma-separated. Allowed values: id, username, fullName, isPrivate, isVerified, followerCount, followingCount, mediaCount, biography, externalUrl, hasAnonymousProfilePicture, profilePicId, profilePicUrl, profileUrl, aggRelevance, relevantPostsCount, relevantPostsLikesSum, relevantPostsCommentsSum, relevantPostsResharesSum, relevantPostsMediaRepostsSum, relevantPostsSavesSum, relevantPostsVideoPlaysSum.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","username","fullName","isPrivate","isVerified","followerCount","followingCount","mediaCount","biography","externalUrl","hasAnonymousProfilePicture","profilePicId","profilePicUrl","profileUrl","aggRelevance","relevantPostsCount","relevantPostsLikesSum","relevantPostsCommentsSum","relevantPostsResharesSum","relevantPostsMediaRepostsSum","relevantPostsSavesSum","relevantPostsVideoPlaysSum"]}}},"RedditPostFields":{"name":"fields","in":"query","required":false,"description":"Reddit post fields to return. Comma-separated. Allowed values: id, title, selftext, url, permalink, postUrl, thumbnail, authorId, authorUsername, subredditName, subredditId, score, upvotes, downvotes, upvoteRatio, commentsCount, crosspostsCount, isSelf, isVideo, isOriginalContent, over18, spoiler, locked, stickied, archived, linkFlairText, postHint, domain, crosspostParent, createdAt, createdAtTimestamp, createdAtDate, selftextHtml, editedAt, removal.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","title","selftext","url","permalink","postUrl","thumbnail","authorId","authorUsername","subredditName","subredditId","score","upvotes","downvotes","upvoteRatio","commentsCount","crosspostsCount","isSelf","isVideo","isOriginalContent","over18","spoiler","locked","stickied","archived","linkFlairText","postHint","domain","crosspostParent","createdAt","createdAtTimestamp","createdAtDate","selftextHtml","editedAt","removal"]}}},"RedditCommentFields":{"name":"fields","in":"query","required":false,"description":"Reddit comment fields to return. Comma-separated. Allowed values: id, body, parentPostId, parentId, authorId, authorUsername, postSubredditName, postSubredditId, score, upvotes, downvotes, controversiality, depth, isSubmitter, stickied, collapsed, edited, distinguished, createdAt, createdAtTimestamp, createdAtDate, collapsedReasonCode, collapsedReason, removal, rank, topLevelRank.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","body","parentPostId","parentId","authorId","authorUsername","postSubredditName","postSubredditId","score","upvotes","downvotes","controversiality","depth","isSubmitter","stickied","collapsed","edited","distinguished","createdAt","createdAtTimestamp","createdAtDate","collapsedReasonCode","collapsedReason","removal","rank","topLevelRank"]}}},"RedditUserFields":{"name":"fields","in":"query","required":false,"description":"Reddit user fields to return. Comma-separated. Allowed values: id, username, profileUrl, profilePicUrl, snoovatarImg, linkKarma, commentKarma, totalKarma, awardeeKarma, awarderKarma, isGold, isMod, isEmployee, hasVerifiedEmail, isSuspended, verified, isBlocked, acceptFollowers, hasSubscribed, hideFromRobots, prefShowSnoovatar, profileDescription, profileBannerUrl, profileTitle, createdAt, createdAtTimestamp, createdAtDate.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","username","profileUrl","profilePicUrl","snoovatarImg","linkKarma","commentKarma","totalKarma","awardeeKarma","awarderKarma","isGold","isMod","isEmployee","hasVerifiedEmail","isSuspended","verified","isBlocked","acceptFollowers","hasSubscribed","hideFromRobots","prefShowSnoovatar","profileDescription","profileBannerUrl","profileTitle","createdAt","createdAtTimestamp","createdAtDate"]}}},"RedditUserFieldsWithAggregates":{"name":"fields","in":"query","required":false,"description":"Reddit user fields to return, plus per-user aggregates over the matching posts. Comma-separated. Allowed values: id, username, profileUrl, profilePicUrl, snoovatarImg, linkKarma, commentKarma, totalKarma, awardeeKarma, awarderKarma, isGold, isMod, isEmployee, hasVerifiedEmail, isSuspended, verified, isBlocked, acceptFollowers, hasSubscribed, hideFromRobots, prefShowSnoovatar, profileDescription, profileBannerUrl, profileTitle, createdAt, createdAtTimestamp, createdAtDate, aggRelevance, relevantPostsCount, relevantPostsUpvotesSum, relevantPostsCommentsCountSum.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","username","profileUrl","profilePicUrl","snoovatarImg","linkKarma","commentKarma","totalKarma","awardeeKarma","awarderKarma","isGold","isMod","isEmployee","hasVerifiedEmail","isSuspended","verified","isBlocked","acceptFollowers","hasSubscribed","hideFromRobots","prefShowSnoovatar","profileDescription","profileBannerUrl","profileTitle","createdAt","createdAtTimestamp","createdAtDate","aggRelevance","relevantPostsCount","relevantPostsUpvotesSum","relevantPostsCommentsCountSum"]}}},"RedditLivePageSize":{"name":"limit","in":"query","required":false,"description":"Items per page (1-100). Defaults to 100. Ignored by post search when `since`/`until` are set (10 per page).","schema":{"type":"integer","minimum":1,"maximum":100,"default":100}},"RedditLiveCommentThreadPageSize":{"name":"limit","in":"query","required":false,"description":"Comments per page (1-500). Defaults to 100. Pages that expand a \"load more\" batch are capped at 100.","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},"RedditSubredditFields":{"name":"fields","in":"query","required":false,"description":"Subreddit fields to return. Comma-separated. Allowed values: id, displayName, title, publicDescription, description, subscribersCount, activeUserCount, subredditType, over18, lang, url, subredditUrl, iconImg, bannerImg, headerImg, communityIcon, createdAt, createdAtTimestamp, createdAtDate, submissionType.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","displayName","title","publicDescription","description","subscribersCount","activeUserCount","subredditType","over18","lang","url","subredditUrl","iconImg","bannerImg","headerImg","communityIcon","createdAt","createdAtTimestamp","createdAtDate","submissionType"]}}},"RedditSubredditFieldsWithAggregates":{"name":"fields","in":"query","required":false,"description":"Subreddit fields to return, plus per-subreddit aggregates over the matching posts. Comma-separated. Allowed values: id, displayName, title, publicDescription, description, subscribersCount, activeUserCount, subredditType, over18, lang, url, subredditUrl, iconImg, bannerImg, headerImg, communityIcon, createdAt, createdAtTimestamp, createdAtDate, submissionType, aggRelevance, relevantPostsCount, relevantPostsUpvotesSum, relevantPostsCommentsCountSum.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","displayName","title","publicDescription","description","subscribersCount","activeUserCount","subredditType","over18","lang","url","subredditUrl","iconImg","bannerImg","headerImg","communityIcon","createdAt","createdAtTimestamp","createdAtDate","submissionType","aggRelevance","relevantPostsCount","relevantPostsUpvotesSum","relevantPostsCommentsCountSum"]}}},"TiktokPostFields":{"name":"fields","in":"query","required":false,"description":"TikTok post fields to return. Comma-separated. Allowed values: id, postType, isPrivate, videoThumbnail, description, descriptionLanguage, userId, username, nickname, collectCount, commentCount, likeCount, downloadCount, forwardCount, playCount, hashtags, duration, videoUrl, transcriptsJson, createdAt, createdAtTimestamp, createdAtDate.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","postType","isPrivate","videoThumbnail","description","descriptionLanguage","userId","username","nickname","collectCount","commentCount","likeCount","downloadCount","forwardCount","playCount","hashtags","duration","videoUrl","transcriptsJson","createdAt","createdAtTimestamp","createdAtDate"]}}},"TiktokCommentFields":{"name":"fields","in":"query","required":false,"description":"TikTok comment fields to return. Comma-separated. Allowed values: id, postId, userId, username, text, likeCount, createdAt, createdAtTimestamp, createdAtDate, imageUrls, stickerUrl.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","postId","userId","username","text","likeCount","createdAt","createdAtTimestamp","createdAtDate","imageUrls","stickerUrl"]}}},"TiktokLiveCommentFields":{"name":"fields","in":"query","required":false,"description":"TikTok live comment fields to return. Comma-separated. Allowed values: id, postId, userId, username, text, likeCount, createdAt, createdAtTimestamp, createdAtDate, imageUrls, stickerUrl, replyCount, parentCommentId, replyToCommentId. `replyCount` is the number of replies (`0` on replies), `parentCommentId` is the top-level comment a reply belongs to (`null` on top-level comments) and `replyToCommentId` is the reply a reply answers (`null` when it answers the top-level comment).","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","postId","userId","username","text","likeCount","createdAt","createdAtTimestamp","createdAtDate","imageUrls","stickerUrl","replyCount","parentCommentId","replyToCommentId"]}}},"TiktokUserFields":{"name":"fields","in":"query","required":false,"description":"TikTok user fields to return. Comma-separated. Allowed values: id, username, nickname, signature, secUid, avatar, isPrivate, isVerified, followerCount, followingCount, likeCount, postCount, language, region, createdAt, usernameModifyTime.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","username","nickname","signature","secUid","avatar","isPrivate","isVerified","followerCount","followingCount","likeCount","postCount","language","region","createdAt","usernameModifyTime"]}}},"TiktokUserFieldsWithAggregates":{"name":"fields","in":"query","required":false,"description":"TikTok user fields to return, plus per-user aggregates over the matching posts. Comma-separated. Allowed values: id, username, nickname, signature, secUid, avatar, isPrivate, isVerified, followerCount, followingCount, likeCount, postCount, language, region, createdAt, usernameModifyTime, aggRelevance, relevantPostsCount, relevantPostsLikesSum, relevantPostsCommentsSum, relevantPostsPlaysSum, relevantPostsForwardsSum.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","username","nickname","signature","secUid","avatar","isPrivate","isVerified","followerCount","followingCount","likeCount","postCount","language","region","createdAt","usernameModifyTime","aggRelevance","relevantPostsCount","relevantPostsLikesSum","relevantPostsCommentsSum","relevantPostsPlaysSum","relevantPostsForwardsSum"]}}},"TiktokMusicFields":{"name":"fields","in":"query","required":false,"description":"TikTok sound fields to return. Comma-separated. Allowed values: id, title, author, album, duration, userCount, isOriginal, isCommerceMusic, isOriginalSound.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","title","author","album","duration","userCount","isOriginal","isCommerceMusic","isOriginalSound"]}}},"TiktokHashtagFields":{"name":"fields","in":"query","required":false,"description":"TikTok hashtag fields to return. Comma-separated. Allowed values: id, name, viewCount, useCount, userCount, isCommerce.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["id","name","viewCount","useCount","userCount","isCommerce"]}}}},"schemas":{"DataSource":{"type":"string","enum":["database","api","hybrid"],"description":"Where the results came from."},"Pagination":{"type":"object","properties":{"totalRows":{"type":"integer"},"totalPages":{"type":"integer"},"resultsCount":{"type":"integer"},"pageSize":{"type":"integer"},"tableName":{"type":"string"}},"required":["resultsCount","pageSize","tableName"]},"ExportInfo":{"type":"object","properties":{"dataDumpExportOperationId":{"type":"string"}},"required":["dataDumpExportOperationId"]},"DataResponse":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Entity shaped by the requested `fields`."}},"count":{"type":"integer"},"dataSource":{"$ref":"#/components/schemas/DataSource"},"pagination":{"$ref":"#/components/schemas/Pagination"},"export":{"$ref":"#/components/schemas/ExportInfo"},"dbQuery":{"type":"string"}},"required":["results","count","dataSource"],"description":"Standard envelope for stored-data endpoints. `pagination` is present on paged results, `export` when a CSV export was queued, and `dbQuery` echoes the executed query. When nothing matched, `results` is empty and `count` is 0."},"ExportResponse":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Entity shaped by the requested `fields`."}},"count":{"type":"integer"},"dataSource":{"$ref":"#/components/schemas/DataSource"},"export":{"$ref":"#/components/schemas/ExportInfo"}},"required":["results","count","dataSource","export"],"description":"Returned for `responseType=csv`. `results` is always empty; poll the export operation ID."},"CursorResponse":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Entity shaped by the requested `fields`."}},"count":{"type":"integer"},"dataSource":{"$ref":"#/components/schemas/DataSource"},"has_more":{"type":"boolean"},"next_page_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["results","count","dataSource","has_more","next_page_cursor"],"description":"Envelope for on-demand `/live` endpoints: one provider page plus a cursor."},"InstagramCommentRepliesCursorResponse":{"allOf":[{"$ref":"#/components/schemas/CursorResponse"},{"type":"object","properties":{"parent_comment":{"anyOf":[{"type":"object","additionalProperties":true,"description":"The top-level comment the replies belong to, shaped by the requested `fields`."},{"type":"null"}]}},"required":["parent_comment"]}],"description":"Cursor envelope for Instagram comment replies, including the parent comment."},"OperationInit":{"type":"object","properties":{"operationId":{"type":"string","example":"op_3f9a2b1c4d5e6f708192a3b4c5d6e7f8"},"status":{"type":"string","enum":["running"]},"instructions":{"type":"string"}},"required":["operationId","status","instructions"],"description":"Returned when `responseType=paging` starts a background operation. Poll `GET /api/data/operations/{id}`."},"OperationState":{"type":"object","properties":{"operationId":{"type":"string"},"status":{"type":"string","enum":["running","success","error","no_data","cancelled"]},"result":{"description":"Present once the operation finished successfully. Holds the same envelope the synchronous endpoint would have returned.","anyOf":[{"$ref":"#/components/schemas/DataResponse"},{"$ref":"#/components/schemas/RedditPostWithComments"},{"$ref":"#/components/schemas/RedditSubredditWithPosts"}]},"error":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["operationId","status","createdAt","updatedAt"]},"RedditPostWithComments":{"type":"object","properties":{"post":{"type":"object","additionalProperties":true,"description":"Entity shaped by the requested `fields`."},"results":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Entity shaped by the requested `fields`."}},"count":{"type":"integer"},"dataSource":{"$ref":"#/components/schemas/DataSource"},"pagination":{"$ref":"#/components/schemas/Pagination"},"dbQuery":{"type":"string"}},"required":["post","results","count","dataSource"],"description":"A Reddit post plus a page of its comments."},"RedditSubredditWithPosts":{"type":"object","properties":{"subreddit":{"type":"object","additionalProperties":true,"description":"Entity shaped by the requested `fields`."},"results":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Entity shaped by the requested `fields`."}},"count":{"type":"integer"},"dataSource":{"$ref":"#/components/schemas/DataSource"},"pagination":{"$ref":"#/components/schemas/Pagination"},"dbQuery":{"type":"string"}},"required":["subreddit","results","count","dataSource"],"description":"A subreddit plus a page of its posts."},"TweetCountResponse":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Entity shaped by the requested `fields`."}},"count":{"type":"integer"},"dataSource":{"$ref":"#/components/schemas/DataSource"}},"required":["results","count","dataSource"],"description":"`results` is always empty; `count` is the number of matching tweets."},"SimpleError":{"type":"object","properties":{"success":{"type":"boolean","const":false},"message":{"type":"string"}},"required":["success","message"]},"DataRouteError":{"type":"object","properties":{"success":{"type":"boolean","const":false},"message":{"type":"string","description":"Endpoint-specific label, e.g. `Failed to retrieve Twitter posts`."},"error":{"type":"string","description":"Detail. `An unexpected error occurred` for unhandled failures."}},"required":["success","message","error"]},"TrialForbidden":{"type":"object","properties":{"success":{"type":"boolean","const":false},"code":{"type":"string","enum":["on_demand_not_available_in_trial"]},"message":{"type":"string"}},"required":["success","code","message"]},"MessageError":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"ErrorField":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"LegacyFailure":{"type":"object","properties":{"success":{"type":"boolean","const":false},"message":{"type":"string"},"error":{"type":"string"}},"required":["success","message"]},"PaymentError":{"type":"object","properties":{"error":{"type":"string","enum":["card_declined","payment_rejected"]},"declineCode":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]},"ServiceHealth":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"responseTime":{"type":"number"},"error":{"type":"string"}},"required":["status"]},"HealthStatus":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"version":{"type":"string"},"uptime":{"type":"number","description":"Seconds."},"timestamp":{"type":"string","format":"date-time"},"dependencies":{"type":"object","properties":{"singlestore":{"$ref":"#/components/schemas/ServiceHealth"}},"required":["singlestore"]}},"required":["status","version","uptime","timestamp","dependencies"]},"PlatformStatus":{"type":"string","enum":["up","degraded","down"]},"PlatformStatusDetail":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/PlatformStatus"},"errorStatus":{"type":"string"},"perfStatus":{"type":"string"},"totalExecutions":{"type":"integer"},"internalErrorRatePct":{"type":"number"},"p95Ms":{"type":"number"},"baselineP95Ms":{"type":"number"},"spikeRatio":{"type":"number"}}},"SystemStatus":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/PlatformStatus"},"updatedAt":{"type":"string","format":"date-time"},"message":{"type":"string"},"platforms":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/PlatformStatusDetail"}}},"required":["status","updatedAt","platforms"]},"StatusHistory":{"type":"object","properties":{"hoursBack":{"type":"integer"},"generatedAt":{"type":"string","format":"date-time"},"platforms":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","properties":{"hour":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["green","yellow","red","gray"]}},"required":["hour","status"]}}}},"required":["hoursBack","generatedAt","platforms"]},"SuccessFlag":{"type":"object","properties":{"success":{"type":"boolean","const":true}},"required":["success"]},"AccessKeyRecord":{"type":"object","properties":{"id":{"type":"string"},"descopeUserId":{"type":"string"},"userEmail":{"type":"string"},"userName":{"type":"string"},"authProvider":{"type":"string"},"authProviderId":{"type":"string"},"accessKeyId":{"type":"string"},"accessKey":{"type":"string"},"accessKeyPrefix":{"type":"string"},"keyName":{"type":"string"},"tenantId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"isActive":{"type":"boolean"},"metadata":{"type":"object"}}},"AccessKeyCreated":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","properties":{"id":{"type":"string"},"accessKey":{"type":"string"},"accessKeyPrefix":{"type":"string"},"keyName":{"type":"string"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","accessKey","accessKeyPrefix","keyName","createdAt"]},"message":{"type":"string"},"isExisting":{"type":"boolean"}},"required":["success","data","message","isExisting"]},"PlanFeatures":{"type":"object","properties":{"credits":{"type":"number"},"creditResetFrequency":{"type":"string","enum":["monthly","never"]},"extraCreditPrice":{"type":"number"},"trackedItems":{"type":"number"},"csvRowExportLimit":{"type":"number"},"extraCsvRowPrice":{"type":"number"},"extraTrackedItemPrice":{"type":"number"},"maxRowsPerExport":{"type":"number"}},"required":["credits","creditResetFrequency","extraCreditPrice","trackedItems","csvRowExportLimit","extraCsvRowPrice","extraTrackedItemPrice"]},"Plan":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"features":{"$ref":"#/components/schemas/PlanFeatures"},"stripeProductId":{"type":"string"},"extraTrackedItemPriceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"string"},"price":{"type":"number"},"currency":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","features","price","currency"]},"Usage":{"type":"object","properties":{"creditsUsed":{"type":"number"},"extraCreditsBalance":{"type":"number"},"csvRowsUsed":{"type":"number"},"extraCsvRowsBalance":{"type":"number"}},"required":["creditsUsed","extraCreditsBalance","csvRowsUsed","extraCsvRowsBalance"]},"UsageBucket":{"type":"object","properties":{"bucket":{"type":"string"},"subscriptionUsed":{"type":"number"},"extraUsed":{"type":"number"},"totalUsed":{"type":"number"},"extraPurchased":{"type":"number"}},"required":["bucket","subscriptionUsed","extraUsed","totalUsed","extraPurchased"]},"UsageHistory":{"type":"object","properties":{"range":{"type":"string","enum":["today","7d","current_month","lifetime"]},"granularity":{"type":"string","enum":["hour","day"]},"generatedAt":{"type":"string","format":"date-time"},"credits":{"type":"array","items":{"$ref":"#/components/schemas/UsageBucket"}},"exportRows":{"type":"array","items":{"$ref":"#/components/schemas/UsageBucket"}}},"required":["range","granularity","generatedAt","credits","exportRows"]},"TrackedKeyword":{"anyOf":[{"type":"string"},{"type":"object","properties":{"value":{"type":"string"},"country":{"type":"string","pattern":"^[A-Za-z]{2}$"}},"required":["value"]}]},"CrawlSettings":{"type":"object","properties":{"twitter":{"type":"object","properties":{"keywords":{"type":"array","items":{"$ref":"#/components/schemas/TrackedKeyword"}},"users":{"type":"array","items":{"type":"string"}}}},"instagram":{"type":"object","properties":{"keywords":{"type":"array","items":{"$ref":"#/components/schemas/TrackedKeyword"}},"users":{"type":"array","items":{"type":"string"}}}},"reddit":{"type":"object","properties":{"keywords":{"type":"array","items":{"$ref":"#/components/schemas/TrackedKeyword"}},"subreddits":{"type":"array","items":{"type":"string"}},"users":{"type":"array","items":{"type":"string"}}}},"tiktok":{"type":"object","properties":{"keywords":{"type":"array","items":{"$ref":"#/components/schemas/TrackedKeyword"}},"users":{"type":"array","items":{"type":"string"}},"hashtags":{"type":"array","items":{"type":"string"}}}}},"description":"Tracked items per platform."},"CrawlSettingsRecord":{"type":"object","properties":{"id":{"type":"string"},"tenantId":{"type":"string"},"userEmail":{"type":"string"},"items":{"$ref":"#/components/schemas/CrawlSettings"},"frequencyMinutes":{"type":"number"},"lastCrawledAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","tenantId","userEmail","items","frequencyMinutes","createdAt"]},"PlanLimitExceeded":{"type":"object","properties":{"success":{"type":"boolean","const":false},"error":{"type":"string","enum":["PLAN_LIMIT_EXCEEDED"]},"message":{"type":"string"},"data":{"type":"object","properties":{"currentCount":{"type":"integer"},"planTrackedItems":{"type":"integer"},"extraTrackedItems":{"type":"integer"},"planName":{"type":"string"}}}},"required":["success","error","message"]},"TrackedItem":{"type":"object","properties":{"phrase":{"type":"string","minLength":1},"type":{"type":"string","enum":["keyword","user","subreddit","hashtag"]},"platform":{"type":"string","enum":["twitter","instagram","reddit","tiktok"]}},"required":["phrase","type","platform"]},"PurchaseResult":{"anyOf":[{"type":"object","properties":{"charged":{"type":"boolean","const":true},"newBalance":{"type":"number"}},"required":["charged","newBalance"]},{"type":"object","properties":{"charged":{"type":"boolean","const":false},"requiresAction":{"type":"boolean","const":true},"paymentIntentClientSecret":{"type":"string"}},"required":["charged","requiresAction","paymentIntentClientSecret"]}],"description":"Either the charge succeeded, or the card requires additional action (3DS) and the client must confirm the payment intent, then call the matching `/confirm` endpoint."},"ChargeConfirmed":{"type":"object","properties":{"charged":{"type":"boolean","const":true},"newBalance":{"type":"number"}},"required":["charged","newBalance"]},"ExtraTrackedItems":{"type":"object","properties":{"extraTrackedItems":{"type":"integer"}},"required":["extraTrackedItems"]},"DatasetBuildCreated":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"}},"required":["id","status"]},"TweetCrawlRequest":{"type":"object","properties":{"id":{"type":"string"},"tweetId":{"type":"string"},"status":{"type":"string"},"endTime":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","tweetId","status","createdAt"]},"StripeWebhookEvent":{"type":"object","additionalProperties":true,"description":"Raw Stripe event payload. Handled types: `customer.subscription.created`, `customer.subscription.updated`, `customer.subscription.deleted`, `checkout.session.completed`, `payment_intent.succeeded`, `payment_intent.payment_failed`."}},"responses":{"Unauthorized":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"UnauthorizedMessage":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageError"}}}},"ValidationError":{"description":"Query or body validation failed. `message` joins all validation issues with `, `.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleError"}}}},"DataRouteError":{"description":"The request could not be fulfilled. Status is 400 for an empty or invalid search query, 402 when CSV export is blocked by plan limits, 500 otherwise.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRouteError"}}}},"TrialForbidden":{"description":"On-demand search is not available for trial access keys.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialForbidden"}}}},"NotAuthorized":{"description":"Caller lacks the required admin feature flag or `@xpoz.ai` email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorField"}}}}}}}