# Author schema (/docs/schema/author) {/* AUTO-GENERATED. Do not hand-edit. Source: packages/social-api/src/docs/generate-schema-pages.ts Regenerate with: pnpm -F @repo/social-api generate:docs Field tables derive from the canonical Zod schemas (packages/social-api/src/schemas/canonical.ts); availability + equivalence derive from the registry fieldMaps. */} Author schema [#author-schema] Every SocialCrawl endpoint that returns a author or creator profile gives you this exact shape, whatever the source platform. Write your parser once and the same code reads author data from every platform below. That is the unified schema: one contract instead of a dozen raw upstream formats. Field reference [#field-reference] | Field | Type | Nullable | Description | | -------------- | --------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `id` | `string` | No | Platform-specific user ID (always a string; platform-specific prefixes like `did:`, `spotify:artist:`, `t2_` are stripped) | | `username` | `string` | Yes | User handle or username | | `display_name` | `string` | Yes | Display name or full name | | `avatar_url` | `string` | Yes | URL to profile picture | | `bio` | `string` | Yes | Profile biography or description | | `verified` | `boolean` | Yes | Whether the account is verified | | `followers` | `integer` | Yes | Follower or subscriber count as an integer. Exact on Instagram and on TikTok when the source exposes an unrounded figure. YouTube above 1,000 subscribers is YouTube's published three-significant-figure figure. When the integer is a published/rounded value, `author.ext.followers_approximate` is true. | | `following` | `integer` | Yes | Number of accounts followed | | `posts_count` | `integer` | Yes | Total number of posts / videos / tracks / episodes | | `likes_count` | `integer` | Yes | Total likes received across the author's content (when surfaced) | | `url` | `string` | Yes | Direct URL to the profile page | | `location` | `string` | Yes | ISO region code (e.g. `US`) or freeform location string when surfaced | | `external_url` | `string` | Yes | Bio link / external website URL when surfaced by the platform | | `private` | `boolean` | Yes | | | `joined_at` | `string` | Yes | | Extension fields (`ext`) [#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. | Field | Type | Nullable | Description | | -------------------------------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `ext.social_context` | `string` | Yes | | | `ext.account_created` | `string` | Yes | | | `ext.country` | `string` | Yes | | | `ext.former_usernames` | `string[]` | Yes | | | `ext.public_email` | `string` | Yes | | | `ext.public_phone` | `string` | Yes | | | `ext.business_category` | `string` | Yes | | | `ext.hd_avatar_url` | `string` | Yes | | | `ext.website` | `string` | Yes | | | `ext.cover_url` | `string` | Yes | | | `ext.page_active` | `boolean` | Yes | | | `ext.employee_count` | `integer` | Yes | | | `ext.employee_count_range.start` | `integer` | Yes | | | `ext.employee_count_range.end` | `integer` | Yes | | | `ext.founded_year` | `integer` | Yes | | | `ext.specialities` | `string[]` | Yes | | | `ext.industries` | `string[]` | Yes | | | `ext.headquarters` | `string` | Yes | | | `ext.locations` | `string[]` | Yes | | | `ext.hashtags` | `string[]` | Yes | | | `ext.funding` | `string` | Yes | | | `ext.address` | `string` | Yes | | | `ext.price_range` | `string` | Yes | | | `ext.rating` | `string` | Yes | | | `ext.rating_count` | `integer` | Yes | | | `ext.talking_about_count` | `integer` | Yes | | | `ext.business_hours` | `string[]` | Yes | | | `ext.links` | `string[]` | Yes | | | `ext.ad_library_page_id` | `string` | Yes | | | `ext.ad_library_status` | `string` | Yes | | | `ext.urn` | `string` | Yes | | | `ext.is_top_voice` | `boolean` | Yes | | | `ext.is_premium` | `boolean` | Yes | | | `ext.followers_approximate` | `boolean` | Yes | True when `author.followers` is a published or rounded figure rather than an unrounded census: LinkedIn people-list display buckets, TikTok `stats.followerCount` when the exact sibling is absent, and YouTube subscriber counts at or above 1,000. Null or absent on exact counts. | | `ext.keywords` | `string` | Yes | | | `ext.topicCategories` | `string[]` | Yes | | | `ext.bannerExternalUrl` | `string` | Yes | | | `ext.madeForKids` | `boolean` | Yes | | | `ext.hiddenSubscriberCount` | `boolean` | Yes | | | `ext.related_playlists` | `string` | Yes | | | `ext.topic_ids` | `string[]` | Yes | | | `ext.unsubscribed_trailer` | `string` | Yes | | | `ext.monthly_listeners` | `integer` | Yes | | | `ext.total_ratings` | `integer` | Yes | Spotify podcasts only: how many listeners have rated the show. Cumulative over the show's whole run, so it reflects longevity as well as size, and it is NOT an audience count (Spotify publishes no play, download, subscriber or follower count for a podcast) | | `ext.average_rating` | `integer` | Yes | Spotify podcasts only: mean listener rating from 0 to 5. Fractional (e.g. 4.66) despite the integer type this schema emits for every numeric leaf | | `ext.creator_username` | `string` | Yes | | | `ext.join_policy` | `string` | Yes | | | `ext.is_nsfw` | `boolean` | Yes | | | `ext.weekly_active_users` | `integer` | Yes | | | `ext.weekly_contributions` | `integer` | Yes | | | `ext.bio_link` | `string` | Yes | | | `ext.group` | `string` | Yes | | Platform availability [#platform-availability] 24 platforms return the `Author` shape. `id` 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.
| Platform | `following` | `joined_at` | `private` | `url` | `verified` | `posts_count` | `likes_count` | `followers` | `avatar_url` | `bio` | `location` | `external_url` | | ------------ | ----------- | ----------- | --------- | ----- | ---------- | ------------- | ------------- | ----------- | ------------ | ----- | ---------- | -------------- | | Apple Music | | | | yes | | | | | yes | | | | | Bluesky | yes | yes | | | | yes | | yes | yes | yes | | | | Facebook | | yes | yes | yes | yes | | yes | yes | yes | yes | yes | | | GitHub | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | | | | Google | | | | | | | | | | | yes | | | Hacker News | | yes | | | | | yes | | | yes | | | | Instagram | yes | | yes | yes | yes | yes | | yes | yes | yes | | yes | | Komi | | | | | | | | | yes | yes | | yes | | Kwai | yes | | yes | yes | yes | yes | yes | yes | yes | yes | | | | LinkBio | | | | | | | | | | | | yes | | LinkedIn | yes | | | yes | yes | | | yes | | yes | yes | | | LinkMe | | | | | yes | yes | | yes | yes | yes | | | | Linktree | | | | | | | | | yes | yes | | | | Pillar | | | | | | | | | | | yes | | | Reddit | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | | | | Snapchat | yes | yes | yes | yes | yes | yes | | yes | yes | yes | | | | Spotify | | | | | | | | yes | yes | yes | | | | Threads | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | | | | TikTok | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | | | Trustpilot | | | | | | yes | | | | | | yes | | Truth Social | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | | | | Twitch | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | | | | Twitter/X | yes | yes | yes | yes | yes | yes | | yes | yes | yes | | | | YouTube | | yes | | | | yes | | yes | yes | yes | | |
Machine-readable schema [#machine-readable-schema] Validate responses programmatically against the JSON Schema (2020-12): [`/schemas/author.json`](/schemas/author.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 [#returned-by] Endpoints with the `Author` / `AuthorList` archetype return this shape: [Apple Music](/platforms/apple_music) · [Bluesky](/platforms/bluesky) · [Facebook](/platforms/facebook) · [GitHub](/platforms/github) · [Google](/platforms/google) · [Hacker News](/platforms/hackernews) · [Instagram](/platforms/instagram) · [Komi](/platforms/komi) · [Kwai](/platforms/kwai) · [LinkBio](/platforms/linkbio) · [LinkedIn](/platforms/linkedin) · [LinkMe](/platforms/linkme) · [Linktree](/platforms/linktree) · [Pillar](/platforms/pillar) · [Reddit](/platforms/reddit) · [Snapchat](/platforms/snapchat) · [Spotify](/platforms/spotify) · [Threads](/platforms/threads) · [TikTok](/platforms/tiktok) · [Trustpilot](/platforms/trustpilot) · [Truth Social](/platforms/truthsocial) · [Twitch](/platforms/twitch) · [Twitter/X](/platforms/twitter) · [YouTube](/platforms/youtube) See how the same fields map to each platform's raw upstream names in the [cross-platform field equivalence table](/docs/schema/field-equivalence.md).