Metric substitutions and structural nulls
Where a platform's upstream cannot supply a canonical field, SocialCrawl returns an honest null or a documented substitute rather than a fabricated value. This page lists every intentional substitution and structural null by platform.
Metric substitutions and structural nulls
SocialCrawl maps 43 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. In a few cases a platform exposes a closely-related metric that is genuinely useful, so we substitute it into the nearest canonical slot and document the swap here.
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. If it is listed as a substitution, the value is real but comes from a different upstream metric than the field name implies.
For how the derived computed block (engagement_rate, language, content_category, estimated_reach) is calculated, see Computed fields.
Metric substitutions
A substitution puts a real upstream metric into a canonical slot whose literal name differs, because it is the closest honest fit.
| Platform | Canonical field | Actually holds | Why |
|---|---|---|---|
| Spotify | author.posts_count | Monthly listeners | The artist object has no post count. Monthly listeners is Spotify's headline reach metric, so it fills the nearest count slot. author.following, author.likes_count, and author.verified stay null for artists (not exposed). |
When you read author.posts_count on a Spotify artist, treat it as monthly listeners. Every other platform's author.posts_count is a real post count.
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.
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
Beyond the monthly-listeners substitution above, artist objects return null for author.following, author.likes_count, and author.verified, and album/track/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.
