SocialCrawl

Post schema

The unified SocialCrawl post schema. Every field, its type, per-platform availability, and a machine-readable JSON Schema, generated from the canonical Zod source.

Post schema

Every SocialCrawl endpoint that returns a post gives you this exact shape, whatever the source platform. Write your parser once and the same code reads post data from every platform below. That is the unified schema: one contract instead of a dozen raw upstream formats.

Field reference

FieldTypeNullableDescription
idstringNoPlatform-specific post ID (always a string; numeric upstream IDs are stringified)
urlstringYesDirect URL to the post on the source platform
content.textstringYesPost caption, description, or text content
content.media_urlsstring or string[]YesURL(s) of the primary media. Single string for video/photo posts; array of strings for carousels.
content.thumbnail_urlstringYesURL to thumbnail image
content.duration_secondsintegerYesVideo/clip duration in seconds (null for non-video posts)
author.usernamestringYesAuthor username
author.display_namestringYesAuthor display name
author.avatar_urlstringYesURL to author profile picture
author.verifiedbooleanYesWhether the author account is verified
engagement.viewsintegerYesView count (if available). For Instagram video/reels this is the play count (video_play_count) — the headline 'Views' the IG app shows; the legacy 3-second-view count is preserved separately under post.ext.video_view_count on /v1/instagram/post.
engagement.likesintegerYesLike / reaction count
engagement.commentsintegerYesComment count. Note: on GET /v1/instagram/post this is Instagram's edge_media_to_parent_comment.count (top-level comments); the IG list endpoints report the mobile comment_count total (includes replies). Both land on this same field.
engagement.sharesintegerYesShare / repost / retweet count
engagement.savesintegerYesSave / bookmark count. null on Instagram — the save count is platform-private and Instagram exposes no numeric save metric on any surface (never fabricated).
flags.nsfwbooleanYesNSFW flag (null when platform does not surface)
flags.spoilerbooleanYesSpoiler flag (null when platform does not surface)
flags.pinnedbooleanYesPinned-to-profile flag (null when platform does not surface)
flags.deletedbooleanNoWhether the post is tombstoned (always present)
flags.likes_hiddenbooleanYesPresent and true when the creator has hidden the like count. engagement.likes is null in that case (never the platform's decoy preview number). Absent on normal posts.
flags.comments_hiddenbooleanYesPresent and true when the upstream reports the comment count as hidden. engagement.comments is null in that case. Absent on normal posts.
flags.shares_hiddenbooleanYes
flags.views_hiddenbooleanYes
flags.saves_hiddenbooleanYes
published_atstring or integerYesPost creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under post.ext.published_at_epoch for one deprecation cycle.

Extension fields (ext)

Platform-specific passthrough. Each field is present only on the platforms that expose it and is absent everywhere else, so treat every ext.* field as optional. These carry the richer, per-platform signals the unified leaves cannot hold, and the join keys that chain endpoints together.

FieldTypeNullableDescription
ext.music_idstringYesTikTok music/clip id (exact string) — pass to /v1/tiktok/song/videos?clipId= to find videos using the same sound
ext.subredditstringYesReddit subreddit name (search/list items) — pass to /v1/reddit/subreddit/details?subreddit=
ext.typestringYes
ext.content_typestringYes
ext.ticker_symbolsstring[]Yes
ext.video_view_countintegerYesInstagram reel legacy 3-second-view count. engagement.views carries the play count (the headline 'Views' the IG app shows); this preserves the older view count. Present only on /v1/instagram/post for video posts.
ext.published_at_epochintegerYesRaw Unix epoch for published_at (seconds, or milliseconds when the upstream sent millis). Present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 published_at string. Kept for one deprecation cycle for integrations pinned to the numeric form.
ext.usertagsstring[]Yes
ext.coauthorsstring[]Yes
ext.musicstringYes
ext.sponsor_tagsstring[]Yes
ext.locationstringYes
ext.reaction_countsstring[]Yes
ext.share_urnstringYes
ext.post_typestringYes
ext.download_media_urlsstring[]Yes
ext.tagsstring[]Yes
ext.categoryIdstringYes
ext.categoryTitlestringYes
ext.topicCategoriesstring[]Yes
ext.durationstringYes
ext.licensestringYes
ext.madeForKidsbooleanYes
ext.defaultAudioLanguagestringYes
ext.hasPaidProductPlacementbooleanYes
ext.captionstringYes
ext.positionintegerYes
ext.playlistIdstringYes
ext.videoOwnerChannelIdstringYes
ext.videoPublishedAtstringYes
ext.descriptionstringYes
ext.default_languagestringYes
ext.playlist_item_idstringYes
ext.playlist_owner_channel_idstringYes
ext.playlist_owner_titlestringYes

Platform availability

22 platforms return the Post shape. id, flags.deleted are never null on any platform. The fields below vary: yes means the platform populates it (the value may still be null); a blank means the platform never provides it, so it is always null.

Platformauthor.verifiedengagement.savescontent.duration_secondsengagement.sharesengagement.viewsurlauthor.avatar_urlengagement.commentscontent.media_urlscontent.thumbnail_urlengagement.likesauthor.username
Amazonyesyesyesyes
Blueskyyesyesyesyesyes
Facebookyesyesyesyesyesyesyesyesyesyesyesyes
GitHubyesyesyesyesyesyesyes
Googleyesyesyesyes
Hacker Newsyesyesyesyes
Instagramyesyesyesyesyesyesyesyesyesyesyesyes
Kickyesyesyesyesyesyesyesyesyesyesyes
Kwaiyesyesyesyesyesyesyesyesyesyesyesyes
LinkedInyesyesyes
Naveryesyesyes
Pinterestyesyesyesyesyesyesyesyesyesyesyesyes
Reddityesyesyesyesyesyesyesyesyesyesyesyes
Rumbleyesyesyesyesyesyes
Spotifyyesyesyesyesyesyes
Threadsyesyesyesyesyesyesyesyesyesyesyes
TikTokyesyesyesyesyesyesyesyesyesyesyesyes
TikTok Shopyesyesyesyesyes
Truth Socialyesyesyesyesyesyesyesyesyesyesyesyes
Twitchyesyesyesyesyesyesyesyesyesyesyes
Twitter/Xyesyesyesyesyesyesyesyesyesyesyesyes
YouTubeyesyesyesyesyesyesyesyesyes

Machine-readable schema

Validate responses programmatically against the JSON Schema (2020-12):

/schemas/post.json

Point a validator (Ajv, jsonschema, or your framework's) at that URL, or hand it to an agent so it can check the shape without a live call.

Returned by

Endpoints with the Post / PostList archetype return this shape:

Amazon · Bluesky · Facebook · GitHub · Google · Hacker News · Instagram · Kick · Kwai · LinkedIn · Naver · Pinterest · Reddit · Rumble · Spotify · Threads · TikTok · TikTok Shop · Truth Social · Twitch · Twitter/X · YouTube

See how the same fields map to each platform's raw upstream names in the cross-platform field equivalence table.

Post schema | SocialCrawl