Metric substitutions and structural nulls
Where a platform's upstream cannot supply a canonical field, SocialCrawl returns an honest null rather than a fabricated value or a substituted metric. This page lists every structural null by platform.
Metric substitutions and structural nulls
SocialCrawl maps 48 platforms onto one canonical schema. Not every platform exposes every canonical field. When an upstream cannot supply a field, we follow one rule: return an honest null, never a fabricated value, and never a different metric wearing the field's name. Where a platform exposes a closely-related metric worth having, it goes under an ext.* namespace so the canonical leaf keeps meaning exactly what it says.
This page is the source of truth for those cases. If a field is listed here as a structural null for a platform, its absence is by upstream design, not a bug.
For how the derived computed block (engagement_rate, language, content_category, estimated_reach) is calculated, see Computed fields.
Metric substitutions
There are currently no metric substitutions anywhere in the API. Every canonical field holds the metric its name implies, or null. Where a platform exposes a closely-related metric that does not fit a canonical slot, it is namespaced under ext.* rather than folded into the nearest-looking leaf — see the Spotify entry below for the one case that used to work the other way.
Structural nulls by platform
These canonical fields are null across a platform's surfaces because the upstream never exposes them. They will not populate no matter how you call the endpoint.
post.engagement.savesis alwaysnull. Instagram exposes only a per-viewerviewer_has_savedboolean, never an aggregate count. This is platform-private.post.engagement.sharesisnullon the base endpoints. A reshare count is only available onpost/statsand the*-fullcomposites (instagram/profile/reels/full,instagram/profile/posts/full), which pull the mobilereshare_count. Read shares from those surfaces.post.engagement.views(and the shares count above) exist only on video media: reels, videos, and carousels containing a video. Photo posts and photo-only carousels have no public view or share count on Instagram, so both fields arenullthere on every endpoint, and the views-derivedcomputed.engagement_rateandcomputed.estimated_reacharenullwith them. Likes and comments populate on every media type.- Stories carry no engagement metrics at all. Story views, replies, likes, and reach are owner-only analytics Instagram exposes to no third party.
/v1/instagram/storiesreturns each active story's media, timestamps, and IDs with the engagement leavesnull; no API from any provider can return story metrics or story reach for an account you don't own.
YouTube
post.engagement.sharesandpost.engagement.savesarenull. Both are owner-only analytics upstream.
post.engagement.views,post.engagement.shares, andpost.engagement.savesarenull. Reddit does not expose view or share counts, and "saved" is a per-viewer flag upstream, never a count.author.verifiedisnull(not exposed).
post.engagement.savesisnull(not exposed).- On list surfaces, list-item
author.avatar_urlandpost.media_urlscan benullbecause the list-item shape is slimmer than the single-object shape.
Naver
Naver's Search corpora (blog, news, cafe, book, webkr, image, kin, shop, doc, encyc) are search indexes, not social feeds, so:
post.engagement.views,post.engagement.likes, andpost.engagement.commentsarenullon every Naver Search corpus. There are no engagement signals to return.author.avatar_url,post.media_urls, andpost.published_atvary by corpus and arenullon the corpora that do not carry them (for example news and image differ from blog).
Spotify
author.posts_countisnullfor artists. Spotify artists have no posts. The headline reach metric is surfaced separately asauthor.ext.monthly_listeners— it is not folded intoposts_count, because a listener figure sitting in a "number of posts" leaf corrupts any cross-platform posts aggregate.author.following,author.likes_count, andauthor.verifiedarenullfor artists (not exposed upstream).- Album, track, and podcast rows carry no
post.engagement.*.
Google Finance
quote.price.previous_closeisnullwhen the upstream quote omits it. It is a structural null, not a fixed value. It can be derived client-side from the current price and change when you need it.
Google Shopping
product.brandisnull. Google Shopping does not return a clean brand field. Only Amazon products carry a populatedbrand. If you need the brand for a Shopping product, it can often be lifted fromproduct.specifications[].
Other platforms
- Rumble: search (SERP) rows carry no
post.engagement.*,author.avatar_url, orpost.published_at. - Threads: slim search-user rows omit
author.avatar_url,author.bio, andauthor.followers. - Twitter/X: the single-tweet shape carries no
post.pinnedflag; it defaults tofalse. - GitHub:
author.avatar_urlisnullon several archetypes, and there is no like primitive sopost.engagement.likesisnull. - TikTok: root comments carry no
post.parent_idby design (only replies do). - Google Business:
business/updatesrows carry noauthor.username.
Changed defaults
Two endpoints apply a SocialCrawl-chosen default when you omit a sort/type parameter, so results are predictable:
google_play/app-reviews(andapp_store/app-reviews) defaultsort_byto newest-first when you omit it. Google Play's own upstream default is "most relevant"; we override it so an unspecified sort returns the newest reviews. The per-store value isnewestfor Google Play andmost_recentfor the App Store. Passing an explicitsort_byalways wins.instagram/search/hashtagdefaultstypetotopwhen you omit it. Passtype=recentortype=clipsto change it.
