InsightSocial API
Unified schema

Post

The unified post object. Every field, its type, and which of the 9 platforms fill it.

Any endpoint that returns a post returns it in this shape, whichever platform it came from. Write one parser and it reads posts from all 9 platforms.

Fields

FieldTypeNullableDescription
idstringNoThe platform's ID for the post. Always a string, even when the platform uses numbers.
urlstringYesLink to the post on the platform.
content.textstringYesCaption, description or body text.
content.media_urlsstring or string[]YesMain media. A single URL for one photo or video, an array for a carousel.
content.thumbnail_urlstringYesThumbnail image.
content.duration_secondsintegerYesLength of a video or clip in seconds. null when the post is not a video.
author.usernamestringYesThe author's handle.
author.display_namestringYesThe author's display name.
author.avatar_urlstringYesThe author's profile picture.
author.verifiedbooleanYesWhether the author is verified.
engagement.viewsintegerYesViews where the platform shows them. On Instagram videos and reels this is the play count shown in the app, and it counts Instagram plays only, not views of a copy cross-posted to Facebook. Fetch the Facebook copy with /v1/facebook/post if you need both.
engagement.likesintegerYesLikes or reactions.
engagement.commentsintegerYesComment count. On /v1/instagram/post it counts top-level comments; the Instagram list endpoints count all comments including replies. Both use this field.
engagement.sharesintegerYesShares, reposts or retweets. On Instagram this is the Send count, available only from /v1/instagram/post/stats, /v1/instagram/profile/reels/full and /v1/instagram/profile/posts/full; other Instagram endpoints return null.
engagement.savesintegerYesSaves or bookmarks.
flags.nsfwbooleanYesMarked as adult content. null when the platform does not say.
flags.spoilerbooleanYesMarked as a spoiler. null when the platform does not say.
flags.pinnedbooleanYesPinned to the profile. null when the platform does not say.
flags.deletedbooleanNoThe post has been deleted or removed. Always present.
flags.likes_hiddenbooleanYestrue when the creator hides the like count; engagement.likes is then null, never a placeholder number. Absent on ordinary posts.
flags.comments_hiddenbooleanYestrue when the comment count is reported as hidden; engagement.comments is then null. Absent on ordinary posts.
flags.shares_hiddenbooleanYestrue when the share count is hidden.
flags.views_hiddenbooleanYestrue when the view count is hidden.
flags.saves_hiddenbooleanYestrue when the save count is hidden.
published_atstring or integerYesWhen the post was published, as an ISO 8601 UTC string. If the platform sent a Unix timestamp, it is converted and the original number is kept in ext.published_at_epoch.

Extension fields (ext)

Platform-specific extras. Each one appears only on platforms that provide it and is left out elsewhere, so treat all of them as optional. They hold detail the unified fields cannot, and the IDs that let you pass a result from one endpoint into the next.

FieldTypeNullableDescription
ext.music_idstringYesTikTok sound ID. Pass it to /v1/tiktok/song/videos?clipId= to find other videos using the same sound.
ext.author_idstringYesThe creator's numeric platform ID. On TikTok search and list rows, /v1/tiktok/profile?user_id= accepts it and keeps working after a username change. On Instagram search/reels rows it is always present and works with /v1/instagram/basic-profile?userId=. On Facebook it appears when a numeric ID was available but no handle.
ext.author_followersintegerYesFollower count included in a search row, when that search carries one. Always null on Instagram rows now; call /v1/instagram/profile?handle= for the exact current count.
ext.author_followingintegerYesFollowing count included in the row, when present.
ext.author_posts_countintegerYesThe author's post count included in the row, when present.
ext.download_countintegerYesTikTok only. How many times the video was downloaded to a device. Separate from engagement.saves, which counts saves to an in-app collection.
ext.regionstringYesTikTok only. The ISO 3166-1 alpha-2 country the video is registered to, usually the creator's account country. It is not the viewer's country or a language. On /v1/tiktok/trending, /v1/tiktok/search and /v1/tiktok/search/top, filter on it to keep rows from one country.
ext.subredditstringYesReddit subreddit name on search and list rows. Pass it to /v1/reddit/subreddit/details?subreddit=.
ext.titlestringYesPost title, where the platform separates title from body.
ext.selftextstringYesReddit text-post body.
ext.upvote_ratiointegerYesReddit only. Share of votes that are upvotes, from 0 to 1. The value is a fraction even though the type says integer. Filled on /v1/reddit/search rows where available, null elsewhere.
ext.flairstringYesReddit post flair.
ext.content_languagestringYesThe language the platform itself assigned to the post, when it sends one (Reddit's tag, or TikTok's caption tag on /v1/tiktok/trending?feed=local). null when the platform could not tell. Never inferred by us; our own detection is computed.language.
ext.typestringYesPlatform's own post type.
ext.content_typestringYesPlatform's own content type.
ext.video_view_countintegerYesInstagram's old 3-second view count. No longer served, so new lookups do not carry it. Use engagement.views.
ext.ig_play_countintegerYesInstagram's own play count, shown separately so you can tell it apart from any combined figure. Present on /v1/instagram/post/stats, and on /v1/instagram/post for videos.
ext.repost_countintegerYesRepost count, where it is separate from shares.
ext.media_typestringYesPlatform's media type (photo, video, carousel and so on).
ext.text_truncatedbooleanYestrue when the text was cut short on this surface.
ext.ip_locationstringYesLocation the platform displays for the poster, where shown.
ext.carousel_countintegerYesNumber of items in a carousel.
ext.remix_countintegerYesNumber of remixes.
ext.facebook_likesintegerYesInstagram only. Facebook likes from a cross-post that were removed from engagement.likes, so that field matches what instagram.com shows. Add them back for a combined figure. Absent when nothing was removed or the like count is hidden. A response that removed anything also has a note in data._warnings.
ext.facebook_commentsintegerYesInstagram only. The comment equivalent of ext.facebook_likes. Each of the two appears only for the count it changed.
ext.published_at_epochintegerYesThe original Unix timestamp (seconds or milliseconds) when the platform sent one and it was converted into published_at.
ext.usertagsstring[]YesAccounts tagged in the post.
ext.coauthorsstring[]YesInstagram Collab posts. Every co-author as { id, username, full_name, is_verified, profile_pic_url }. A Collab post has one creator but shows on every co-author's grid, so post.author may not be the profile you asked for. All accounts on the post are post.author.username plus each username here. An empty array means not a Collab. Absent where there is no signal, including on /v1/instagram/post; use /v1/instagram/post/stats for a single post.
ext.musicstringYesMusic or sound attached to the post.
ext.sponsor_tagsstring[]YesSponsor or paid-partnership tags.
ext.locationstringYesLocation tagged on the post.
ext.quoted_poststringYesThreads quote posts. The quoted post as { id, url, author: { id, username }, text, media_urls, thumbnail_url }. A quote post often has no text or media of its own, and what you see on its page belongs to the quoted post by another author. It stays here so content.* always describes the outer post. Absent on posts that are not quotes.
ext.retweeted_poststringYesTwitter/X: the original post behind a retweet.
ext.quote_countintegerYesNumber of quote posts.
ext.all_media_urlsstring[]YesEvery media URL on the post.
ext.reaction_countsstring[]YesCounts broken down by reaction type.
ext.share_urnstringYesLinkedIn share URN.
ext.post_typestringYesPlatform's post type.
ext.activity_idstringYesLinkedIn activity ID.
ext.published_at_precisionstringYesHow precise published_at is when the platform shows only a relative or rounded time.
ext.author_urnstringYesLinkedIn URN of the author.
ext.author_headlinestringYesLinkedIn headline of the author.
ext.author_typestringYesWhether the LinkedIn author is a person or a company.
ext.is_repost_quotebooleanYestrue when a repost adds its own commentary.
ext.articlestringYesLinkedIn article attached to the post.
ext.reaction_typestringYesThe reaction a member left, on reaction lists.
ext.download_media_urlsstring[]YesDownloadable media URLs, when requested.
ext.tagsstring[]YesTags attached to the post.
ext.categoryIdstringYesYouTube category ID.
ext.categoryTitlestringYesYouTube category name.
ext.topicCategoriesstring[]YesYouTube topic categories.
ext.durationstringYesYouTube duration in its original format.
ext.licensestringYesYouTube license.
ext.madeForKidsbooleanYesYouTube made-for-kids flag.
ext.defaultAudioLanguagestringYesYouTube default audio language.
ext.hasPaidProductPlacementbooleanYesYouTube paid product placement flag.
ext.captionstringYesYouTube caption status.
ext.positionintegerYesPosition in a YouTube playlist.
ext.playlistIdstringYesYouTube playlist ID.
ext.videoOwnerChannelIdstringYesChannel that owns a video in a playlist.
ext.videoPublishedAtstringYesWhen a playlist video was published.
ext.descriptionstringYesFull description, where separate from content.text.
ext.default_languagestringYesDefault language set on the video.
ext.playlist_item_idstringYesYouTube playlist item ID.
ext.playlist_owner_channel_idstringYesChannel that owns the playlist.
ext.playlist_owner_titlestringYesName of the playlist owner.
ext.channel_idstringYesYouTube channel ID.
ext.published_labelstringYesThe relative time label the platform shows, such as "3 days ago".
ext.published_precisionstringYesHow precise the published time is.
ext.video_countintegerYesNumber of videos, on playlist or collection rows.
ext.commercestringYesShopping or commerce details attached to the post.
ext.on_screen_textsstring[]YesText shown on screen in the video.
ext.topic_tagstringYesThreads topic tag.
ext.topic_tag_idstringYesThreads topic tag ID.
ext.reshare_countintegerYesReshare count, where reported separately.
ext.adstringYesFacebook Ad Library details, on /v1/facebook/adlibrary/ad and /v1/facebook/adlibrary/company/ads rows: page_id, currency, spend, reach_estimate, publisher_platforms, categories, targeted_or_reached_countries, cta_text, cta_type, link_url, is_active, end_date_iso, display_format, title, video_hd_url, video_sd_url. Absent elsewhere.
ext.feedback_idstringYesFacebook feedback ID, used to fetch comments and replies.
ext.eventstringYesFacebook event details, including interested_count, going_count, end_timestamp and ticket_url.
ext.trendstringYesTikTok trend-board data. On /v1/tiktok/hashtags/popular: rank, country_code, period_days, posts and views for the period (not lifetime), industry, industry_id, industry_label for the first board read (null for the overall board), boards listing every board the hashtag ranks on as { industry, industry_id, industry_label, rank }, popularity_curve as { date, value } with value 0 to 100 relative to the period's peak, and top_creators. On /v1/tiktok/videos/popular: rank, country_code, period_days, order_by, period_views, organic_views, engagement_rate, six_second_view_through_rate, content_tags. Absent elsewhere.
ext.updated_atstringYesWhen the post was last edited, where shown.

Which platforms fill which fields

All 9 platforms return this shape. id and flags.deleted are never null. How to read the table: yes marks a field the platform is able to supply, though any single row can still have it null. An empty cell marks a field that platform never supplies, so expect null every time.

Platformauthor.verifiedengagement.savesengagement.sharescontent.duration_secondsengagement.viewsauthor.avatar_urlengagement.commentscontent.media_urlsurlengagement.likescontent.thumbnail_urlflags.pinned
Facebookyesyesyesyesyesyesyesyesyesyes
Instagramyesyesyesyesyesyesyesyesyesyesyes
LinkedInyesyesyesyesyesyesyesyesyes
Pinterestyesyesyesyesyesyesyesyesyesyesyes
Reddityesyesyesyesyesyesyesyesyes
Threadsyesyesyesyesyesyesyesyesyes
TikTokyesyesyesyesyesyesyesyesyesyesyesyes
Twitter/Xyesyesyesyesyesyesyesyesyesyes
YouTubeyesyesyesyesyesyesyesyes

Instagram saves come only from /v1/instagram/post/stats with include=saves. See Metric substitutions for the full list of per-platform nulls.

Returned by

Endpoints that return a post or a list of posts use this shape on:

Facebook · Instagram · LinkedIn · Pinterest · Reddit · Threads · TikTok · Twitter/X · YouTube

To see which native platform field feeds each unified field, read Field equivalence.

On this page