Comment
The schema-2 comment object. Every field, its type, and which platforms fill it.
Any endpoint that returns comments or replies returns them in this shape, whichever platform they came from. One parser reads comments from every platform that has them. This page describes schema 2, which every key gets from October 4, 2026; what changed is on Schema 2.
Where comments sit in data
| Endpoint returns | Path |
|---|---|
| One comment | data.comment |
| A list of comments or replies | data.items[].comment |
A list also carries data.total (the platform's own total, not the size of this page) and data.truncated, true when the platform cut the thread short (Reddit's "more replies" threshold). Both are null when the platform does not say. The next page is in pagination.next_cursor.
Example
One row from /v1/twitter/tweet/replies, shortened:
{
"success": true,
"platform": "twitter",
"endpoint": "/v1/twitter/tweet/replies",
"schema_version": "2",
"data": {
"items": [
{
"comment": {
"id": "2106150051978662105",
"url": "https://x.com/bobcarter101/status/2106150051978662105",
"parent_id": null,
"post_id": "2106061652617568263",
"text": "@NASA @Space_Station skills required; watching SpaceX’s live stream.",
"author": {
"id": null,
"username": "bobcarter101",
"display_name": "Bob Carter",
"avatar_url": "https://pbs.twimg.com/profile_images/…",
"verified": true
},
"engagement": { "likes": 3, "replies": 2 },
"flags": { "pinned": null, "deleted": false },
"published_at": "2026-10-02T22:31:17.000Z",
"language": "en",
"replies": null,
"ext": { "author_followers": 4909, "quote_count": 0, "views": 681 }
}
}
],
"total": null,
"truncated": null
},
"pagination": { "next_cursor": "v2c.ouEEuPti…", "has_more": true, "page_size": 36 },
"unavailable": ["items[].comment.author.id"],
"credits_used": 10,
"credits_remaining": 9990,
"request_id": "req_48e49dfbad28",
"cached": false,
"idempotent_replay": false,
"charge_reason": "miss",
"free_call": false
}X gives no author ID on replies, so every row has author.id: null and the response says so in unavailable.
Fields
Every field is always present; a value the platform does not give is null.
| Field | Type | Nullable | Description |
|---|---|---|---|
id | string | No | The platform's ID for the comment, always a string. |
url | string | Yes | Link to the comment on the platform. |
parent_id | string | Yes | ID of the comment this one replies to. null on a top-level comment, on every platform. A reply carries its parent comment's ID, never the post's. |
post_id | string | Yes | ID of the post the comment belongs to. |
text | string | Yes | The comment text. Placeholders such as [deleted] or [removed] become null, so you never see them as text. |
author.id | string | Yes | The commenter's platform ID. On Reddit it is the account's t2_… ID, prefix kept. null where the source gives none: on LinkedIn the source gives no member URN for commenters, so it is null there (join on username), and the numeric member id is in ext.author_member_id. |
author.username | string | Yes | The commenter's handle. null when the comment was removed. |
author.display_name | string | Yes | The commenter's display name. On Reddit usually null: Reddit shows a username, and the t2_… ID that arrives in this place goes to author.id. |
author.avatar_url | string | Yes | The commenter's profile picture. |
author.verified | boolean | Yes | Whether the commenter is verified. |
engagement.likes | integer | Yes | Likes or upvotes. null when not shown, and on Reddit when the score is below zero (see ext.score). |
engagement.replies | integer | Yes | Number of replies. 0 when the platform reports the count and there are none; null only when the platform gives no reply count. |
flags.pinned | boolean | Yes | Pinned by the post's author. null when the platform does not say. |
flags.deleted | boolean | No | The comment was deleted or removed. Always true or false. |
published_at | string | Yes | When the comment was posted, as ISO 8601 in UTC, ending in Z. |
language | string | Yes | The comment's language as the platform states it, such as en. null when the platform gives no tag. We do not detect languages. |
replies | object[] | Yes | Replies the platform returned inline, each a full comment object with its own replies. Filled on Reddit. null where the platform returns none inline: fetch them from the platform's replies endpoint with this comment's id. |
ext | object | Yes | Platform-specific fields. See below. |
Fetching replies
Replies endpoints take the platform's own identifiers, which every comment carries:
| Platform | Call |
|---|---|
| YouTube | /v1/youtube/video/comment/replies?continuationToken= with the top-level comment.id |
/v1/facebook/post/comment/replies with the comment's ext.feedback_id and ext.expansion_token | |
Replies arrive inline in replies. When data.truncated is true, page on with pagination.next_cursor. |
Extension fields (ext)
Platform-specific extras. Each one appears only where the platform provides it, so treat every ext field as optional. ext is null when a comment has no extras. Keys are snake_case on every platform, _id values are strings and _at values are ISO 8601 UTC times. ext never carries our cursors or tokens.
| Field | Type | Nullable | Description |
|---|---|---|---|
ext.depth | integer | Yes | Reddit nesting level: 0 for a top-level comment, 1 for a direct reply, and so on. Present when a flat thread was rebuilt into replies[], so you can check the nesting yourself. |
ext.feedback_id | string | Yes | Facebook comment ID used by /v1/facebook/post/comment/replies. |
ext.expansion_token | string | Yes | Facebook token used by /v1/facebook/post/comment/replies. |
ext.ip_location | string | Yes | Location the platform displays for the commenter, where shown. |
ext.urn | string | Yes | LinkedIn comment URN. |
ext.reaction_counts | string[] | Yes | Counts broken down by reaction type. |
ext.is_edited | boolean | Yes | true when the comment was edited. |
ext.author_headline | string | Yes | LinkedIn headline of the commenter. |
ext.updated_at | string | Yes | When the comment was last updated. |
ext.author_url | string | Yes | Link to the commenter's profile. |
ext.viewer_rating | string | Yes | YouTube viewer rating value. |
ext.text_original | string | Yes | The comment text in its original, unformatted form. |
ext.preview_replies | object[] | Yes | A few replies shown with the comment. |
ext.lookup | string | Yes | Details of how a single comment was located, on single-comment endpoints. |
ext.post_title | string | Yes | Title of the parent post. |
ext.post_url | string | Yes | Link to the parent post. |
ext.subreddit | string | Yes | Subreddit of the parent post. |
ext.subreddit_subscribers | integer | Yes | Subscriber count of that subreddit. |
ext.post_score | integer | Yes | Score of the parent post. |
ext.post_comment_count | integer | Yes | Comment count of the parent post. |
ext.post_author | string | Yes | Author of the parent post. |
ext.post_published_at | string | Yes | When the parent post was published. |
ext.post_flair | string | Yes | Flair on the parent post. |
ext.is_submitter | boolean | Yes | true when the commenter also wrote the post. |
ext.edited_at | string | Yes | When the comment was edited. |
ext.controversiality | integer | Yes | Reddit controversiality flag. |
ext.author_followers | integer | Yes | The commenter's follower count as included in the row. A snapshot, not live. Present on every /v1/twitter/tweet/replies row. |
ext.author_following | integer | Yes | The commenter's following count as included in the row. Also a snapshot. |
ext.author_posts_count | integer | Yes | The commenter's post count as included in the row. Also a snapshot. |
ext.quote_count | integer | Yes | Number of quote posts of this comment, where reported. On X a reply is itself a post. |
ext.views | integer | Yes | Views of the comment, where reported. Public on X replies from about 2022 onward. |
ext.saves | integer | Yes | Bookmarks of the comment, where reported (X). |
ext.score | integer | Yes | Reddit only. A comment score below zero. engagement.likes is then null, because a negative score is not a like count. |
Which platforms fill which fields
Every platform that returns comments uses this shape. id and flags.deleted are never null. The table covers the platforms the API launched with that return comments. The others return the same shape, and each response's unavailable list names the fields it could not fill. yes means the platform can fill the field (it may still be null on a given row); a blank means it never does.
| Platform | parent_id | author.verified | flags.pinned | url | post_id | author.avatar_url | author.display_name | engagement.replies | author.username | engagement.likes |
|---|---|---|---|---|---|---|---|---|---|---|
| yes | yes | yes | yes | |||||||
| yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | |
| yes | yes | yes | ||||||||
| yes | yes | yes | yes | yes | yes | yes | ||||
| Threads | yes | yes | yes | yes | yes | yes | yes | |||
| TikTok | yes | yes | yes | yes | yes | yes | yes | yes | yes | |
| Twitter/X | yes | yes | yes | yes | yes | yes | yes | yes | ||
| YouTube | yes | yes | yes | yes | yes |
parent_id is filled on replies only; top-level comments carry null everywhere. On Reddit, replies are nested in replies[] rather than counted. On Facebook, an opaque pfbid… profile ID goes to author.id, not author.username. On Reddit, the account's t2_ ID goes to author.id.
unavailable
When a field the platform normally fills is null on every comment in a response, the response lists its path in unavailable, for example "items[].comment.author.id". Fields a platform never shows are never listed: the comment url on TikTok, author.username on Facebook and author.display_name on Reddit.
Returned by
Endpoints that return a comment or a list of comments use this shape on:
Facebook · Instagram · LinkedIn · Reddit · Threads · TikTok · Twitter/X · YouTube
To see which native platform field feeds each unified field, read Field equivalence.