{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://socialcrawl.dev/schemas/author.json",
  "title": "SocialCrawl Author",
  "description": "Canonical unified author or creator profile object returned by every SocialCrawl endpoint with the Author/AuthorList archetype. Nullability is expressed via JSON Schema 2020-12 type arrays. Generated from the Zod schema in packages/social-api/src/schemas/canonical.ts.",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Platform-specific user ID (always a string; platform-specific prefixes like `did:`, `spotify:artist:`, `t2_` are stripped)"
    },
    "username": {
      "type": [
        "string",
        "null"
      ],
      "description": "User handle or username"
    },
    "display_name": {
      "type": [
        "string",
        "null"
      ],
      "description": "Display name or full name"
    },
    "avatar_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "URL to profile picture"
    },
    "bio": {
      "type": [
        "string",
        "null"
      ],
      "description": "Profile biography or description"
    },
    "verified": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Whether the account is verified"
    },
    "followers": {
      "type": [
        "number",
        "null"
      ],
      "description": "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": {
      "type": [
        "number",
        "null"
      ],
      "description": "Number of accounts followed"
    },
    "posts_count": {
      "type": [
        "number",
        "null"
      ],
      "description": "Total number of posts / videos / tracks / episodes"
    },
    "likes_count": {
      "type": [
        "number",
        "null"
      ],
      "description": "Total likes received across the author's content (when surfaced)"
    },
    "url": {
      "type": [
        "string",
        "null"
      ],
      "description": "Direct URL to the profile page"
    },
    "location": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO region code (e.g. `US`) or freeform location string when surfaced"
    },
    "external_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "Bio link / external website URL when surfaced by the platform"
    },
    "private": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Boolean at author.private"
    },
    "joined_at": {
      "type": [
        "string",
        "null"
      ],
      "description": "String at author.joined_at"
    },
    "last_post_at": {
      "type": [
        "string",
        "null"
      ],
      "description": "String at author.last_post_at"
    },
    "ext": {
      "type": [
        "object",
        "null"
      ],
      "description": "Nested object: author.ext",
      "properties": {
        "social_context": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.social_context"
        },
        "account_created": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.account_created"
        },
        "country": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.country"
        },
        "country_name": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.country_name"
        },
        "collects_received": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.collects_received"
        },
        "former_usernames": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.former_usernames",
          "items": {
            "type": "string",
            "description": "String at author.ext.former_usernames"
          }
        },
        "former_usernames_count": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Instagram profile/about: how many former usernames Instagram's \"About this account\" panel lists for the account. 0 when the panel lists none, null when the panel could not be read on this call (the response then carries a note saying so). A count above 0 means the handle was renamed at least once; the names themselves are not published."
        },
        "verified_at": {
          "type": [
            "string",
            "null"
          ],
          "description": "Instagram profile/about, opt-in (`include=verified_at`): the month Instagram verified the account, as the panel shows it (\"April 2024\"). A month, not a date. Null when the account is not verified or the panel shows no verification date. Absent unless requested."
        },
        "public_email": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.public_email"
        },
        "contact_email": {
          "type": [
            "string",
            "null"
          ],
          "description": "Opt-in (`contact_email=1` on instagram/profile, youtube/channel and youtube/channel/about). When the bio lists two or more email addresses, the one the creator gives for contacting them personally, copied verbatim. Null when there is one address or none, when every address belongs to a manager, agency or brand, or when the choice was not confident. `author.ext.public_email` (the first address in the bio) is unchanged."
        },
        "public_phone": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.public_phone"
        },
        "similar_source": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.similar_source"
        },
        "instagram_username": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.instagram_username"
        },
        "similar_via": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.similar_via"
        },
        "business_category": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.business_category"
        },
        "bio_links": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.bio_links",
          "items": {
            "type": "object",
            "description": "Nested object: author.ext.bio_links",
            "properties": {
              "title": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "String at author.ext.bio_links.title"
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "String at author.ext.bio_links.url"
              },
              "link_type": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "String at author.ext.bio_links.link_type"
              }
            }
          }
        },
        "is_business": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_business"
        },
        "is_professional": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_professional"
        },
        "creator_marketplace": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.creator_marketplace"
        },
        "verification_label": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.verification_label"
        },
        "fbid": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.fbid"
        },
        "hd_avatar_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.hd_avatar_url"
        },
        "website": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.website"
        },
        "cover_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.cover_url"
        },
        "page_active": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.page_active"
        },
        "employee_count": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.employee_count"
        },
        "employee_count_range": {
          "type": [
            "object",
            "null"
          ],
          "description": "Nested object: author.ext.employee_count_range",
          "properties": {
            "start": {
              "type": [
                "number",
                "null"
              ],
              "description": "Numeric at author.ext.employee_count_range.start"
            },
            "end": {
              "type": [
                "number",
                "null"
              ],
              "description": "Numeric at author.ext.employee_count_range.end"
            }
          }
        },
        "founded_year": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.founded_year"
        },
        "company_type": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.company_type"
        },
        "tagline": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.tagline"
        },
        "specialities": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.specialities",
          "items": {
            "type": "string",
            "description": "String at author.ext.specialities"
          }
        },
        "industries": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.industries",
          "items": {
            "type": "string",
            "description": "String at author.ext.industries"
          }
        },
        "headquarters": {
          "type": [
            "object",
            "null"
          ],
          "description": "Object at author.ext.headquarters"
        },
        "locations": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.locations",
          "items": {
            "description": "Leaf at author.ext.locations"
          }
        },
        "hashtags": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.hashtags",
          "items": {
            "description": "Leaf at author.ext.hashtags"
          }
        },
        "funding": {
          "type": [
            "object",
            "null"
          ],
          "description": "Object at author.ext.funding"
        },
        "address": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.address"
        },
        "price_range": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.price_range"
        },
        "rating": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.rating"
        },
        "rating_count": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.rating_count"
        },
        "talking_about_count": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.talking_about_count"
        },
        "business_hours": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.business_hours",
          "items": {
            "description": "Leaf at author.ext.business_hours"
          }
        },
        "links": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.links",
          "items": {
            "description": "Leaf at author.ext.links"
          }
        },
        "ad_library_page_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.ad_library_page_id"
        },
        "ad_library_status": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.ad_library_status"
        },
        "urn": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.urn"
        },
        "is_top_voice": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_top_voice"
        },
        "is_premium": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_premium"
        },
        "is_creator": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_creator"
        },
        "is_influencer": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_influencer"
        },
        "is_open_to_work": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_open_to_work"
        },
        "is_hiring": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_hiring"
        },
        "member_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.member_id"
        },
        "company_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.company_id"
        },
        "reaction_type": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.reaction_type"
        },
        "followers_approximate": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "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."
        },
        "counts_source": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "app",
            "web",
            null
          ],
          "description": "TikTok profile only. Which of TikTok's two live counter sets `author.followers`, `author.following`, `author.likes_count` and `author.posts_count` carry: `app` (TikTok's app counters, the default) or `web` (the website's `statsV2`, returned with `counts=web`). The two sets can differ by a few percent in either direction."
        },
        "keywords": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.keywords"
        },
        "total_views": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.total_views"
        },
        "joined_at_timestamp": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.joined_at_timestamp"
        },
        "topicCategories": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.topicCategories",
          "items": {
            "type": "string",
            "description": "String at author.ext.topicCategories"
          }
        },
        "bannerExternalUrl": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.bannerExternalUrl"
        },
        "madeForKids": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.madeForKids"
        },
        "hiddenSubscriberCount": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.hiddenSubscriberCount"
        },
        "related_playlists": {
          "type": [
            "object",
            "null"
          ],
          "description": "Object at author.ext.related_playlists"
        },
        "topic_ids": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.topic_ids",
          "items": {
            "type": "string",
            "description": "String at author.ext.topic_ids"
          }
        },
        "unsubscribed_trailer": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.unsubscribed_trailer"
        },
        "localizations": {
          "type": [
            "object",
            "null"
          ],
          "description": "Object at author.ext.localizations",
          "additionalProperties": {
            "type": "object",
            "description": "Nested object: author.ext.localizations.*",
            "properties": {
              "title": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "String at author.ext.localizations.*.title"
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "String at author.ext.localizations.*.description"
              }
            }
          }
        },
        "monthly_listeners": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.monthly_listeners"
        },
        "total_ratings": {
          "type": [
            "number",
            "null"
          ],
          "description": "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)"
        },
        "average_rating": {
          "type": [
            "number",
            "null"
          ],
          "description": "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"
        },
        "creator_username": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.creator_username"
        },
        "join_policy": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.join_policy"
        },
        "is_nsfw": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.is_nsfw"
        },
        "rules": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.rules",
          "items": {
            "type": "object",
            "description": "Object at author.ext.rules"
          }
        },
        "weekly_active_users": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.weekly_active_users"
        },
        "weekly_contributions": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.weekly_contributions"
        },
        "rules_text": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.rules_text"
        },
        "language": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.language"
        },
        "post_karma": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.post_karma"
        },
        "comment_karma": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.comment_karma"
        },
        "awardee_karma": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.awardee_karma"
        },
        "trophy_count": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.trophy_count"
        },
        "banner_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.banner_url"
        },
        "profile_title": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.profile_title"
        },
        "social_links": {
          "type": [
            "array",
            "null"
          ],
          "description": "Array at author.ext.social_links",
          "items": {
            "description": "Leaf at author.ext.social_links"
          }
        },
        "bio_link": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.bio_link"
        },
        "embed_html": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.embed_html"
        },
        "embed_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.embed_url"
        },
        "group": {
          "type": [
            "object",
            "null"
          ],
          "description": "Object at author.ext.group"
        },
        "search_hit": {
          "type": [
            "object",
            "null"
          ],
          "description": "Nested object: author.ext.search_hit",
          "properties": {
            "match": {
              "type": [
                "string",
                "null"
              ],
              "enum": [
                "group_page",
                "post_in_group",
                "channel_page",
                "post_in_channel",
                null
              ],
              "description": "Leaf at author.ext.search_hit.match"
            },
            "title": {
              "type": [
                "string",
                "null"
              ],
              "description": "String at author.ext.search_hit.title"
            },
            "snippet": {
              "type": [
                "string",
                "null"
              ],
              "description": "String at author.ext.search_hit.snippet"
            },
            "evidence_url": {
              "type": [
                "string",
                "null"
              ],
              "description": "String at author.ext.search_hit.evidence_url"
            },
            "matched_urls": {
              "type": [
                "array",
                "null"
              ],
              "description": "Array at author.ext.search_hit.matched_urls",
              "items": {
                "type": "string",
                "description": "String at author.ext.search_hit.matched_urls"
              }
            }
          }
        },
        "blog_name": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.blog_name"
        },
        "blog_no": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.blog_no"
        },
        "visitors_today": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.visitors_today"
        },
        "visitors_total": {
          "type": [
            "number",
            "null"
          ],
          "description": "Numeric at author.ext.visitors_total"
        },
        "topic": {
          "type": [
            "string",
            "null"
          ],
          "description": "String at author.ext.topic"
        },
        "power_blog": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.power_blog"
        },
        "official_blog": {
          "type": [
            "boolean",
            "null"
          ],
          "description": "Boolean at author.ext.official_blog"
        }
      }
    }
  },
  "additionalProperties": true
}
