# Enrich by handle analytics

Enrich a creator profile with performance analytics using their social media handle.
**What you get**
- Returns the performance-analytics subset of the [Enrich by handle full](/openapi/enrich-by-handle-full) response: engagement/growth detail, posting frequency, income estimates, audience data, and optional lookalike creator recommendations.
- No identity or contact fields, including email. Use [Enrich by handle profile](/openapi/enrich-by-handle-profile) for those.
- Works with Instagram, YouTube, TikTok, OnlyFans, Twitter and Twitch.
- Facebook, Pinterest, Snapchat, Discord and LinkedIn have no analytics data and are rejected with a `400`. Use [Enrich by handle profile](/openapi/enrich-by-handle-profile) for those.
- Optional lookalike inclusion setting available.

**Credits**
- 0.8 credits per successful request. If no data is returned, no credits are deducted.

<div class="ic-ai-prompt-root" data-endpoint="handle-analytics"></div>

Endpoint: POST /public/v1/creators/enrich/handle/analytics/
Version: 1.0.0
Security: Bearer

## Request fields (application/json):

  - `handle` (string, required)
    Creator identifier — username, profile URL, or YouTube channel ID (UC...).

  - `platform` (string, required)
    Platform to enrich from — only platforms with analytics data are accepted.
    Enum: "instagram", "onlyfans", "tiktok", "twitch", "twitter", "youtube"

  - `include_lookalikes` (boolean)
    Whether to include lookalike creator recommendations in the response.

## Response 200 fields (application/json):

  - `result` (object)

  - `result.audience_interests` (array)

  - `result.lookalikes` (array)

  - `result.instagram` (object)

  - `result.instagram.audience` (object)
    Audience insights returned when include_audience_data is enabled. Contains demographic breakdowns for followers, commenters, and likers.

  - `result.instagram.audience.audience_credibility_followers_histogram` (array)
    Distribution of follower credibility scores as a histogram.

  - `result.instagram.audience.audience_credibility_likers_histogram` (array)
    Distribution of liker credibility scores as a histogram.

  - `result.instagram.brand_affinity` (array)

  - `result.instagram.brand_affinity.name` (string)
    Name of the brand.

  - `result.instagram.brand_affinity.interest` (array)
    Interest categories associated with the brand.

  - `result.instagram.brands_found` (array)

  - `result.instagram.comments_median` (number)

  - `result.instagram.has_merch` (boolean)

  - `result.instagram.hashtags` (array)

  - `result.instagram.hashtags_count` (array)

  - `result.instagram.likes_median` (number)

  - `result.instagram.locations` (array)

  - `result.instagram.niche_sub_class` (array)

  - `result.instagram.past_sponsors` (array)

  - `result.instagram.past_sponsors.handle` (string)
    Handle of the mentioned sponsor.

  - `result.instagram.past_sponsors.post_count` (integer)
    Number of sponsored posts mentioning this handle.

  - `result.instagram.past_sponsors.first_seen` (string)
    Timestamp of the earliest sponsored post mentioning this handle, in ISO 8601 format.

  - `result.instagram.past_sponsors.last_seen` (string)
    Timestamp of the most recent sponsored post mentioning this handle, in ISO 8601 format.

  - `result.instagram.past_sponsors.post_ids` (array)
    IDs of the sponsored posts mentioning this handle.

  - `result.instagram.posting_frequency_recent_months` (number)

  - `result.instagram.promotes_affiliate_links` (boolean)

  - `result.instagram.reels_percentage_last_12_posts` (number)

  - `result.instagram.sponsored_posts` (array)

  - `result.instagram.sponsored_posts.post_id` (string)
    Platform-specific post identifier.

  - `result.instagram.sponsored_posts.created_at` (string)
    Timestamp the post was created, in ISO 8601 format.

  - `result.instagram.sponsored_posts.post_url` (string)
    URL to the post.

  - `result.instagram.sponsored_posts.media_type` (string)
    Type of media in the post, e.g. photo, video, carousel.

  - `result.instagram.sponsored_posts.thumbnail` (string)
    URL to the post's thumbnail image.

  - `result.instagram.sponsored_posts.caption` (string)
    Text caption of the post.

  - `result.instagram.sponsored_posts.mentions` (array)
    Handles mentioned in the post.

  - `result.instagram.sponsored_posts.hashtags` (array)
    Hashtags used in the post.

  - `result.instagram.sponsored_posts.engagement` (object)

  - `result.instagram.sponsored_posts.engagement.likes` (integer)
    Number of likes on the post.

  - `result.instagram.sponsored_posts.engagement.comments` (integer)
    Number of comments on the post.

  - `result.instagram.tagged` (array)

  - `result.youtube` (object)

  - `result.youtube.audience` (object)
    Audience insights returned when include_audience_data is enabled. Contains demographic breakdowns for followers, commenters, and likers.

  - `result.youtube.avg_views_long` (number)

  - `result.youtube.avg_views_shorts` (number)

  - `result.youtube.engagement_by_comments_and_views_long` (number)

  - `result.youtube.engagement_by_comments_and_views_shorts` (number)

  - `result.youtube.engagement_by_likes_and_views_long` (number)

  - `result.youtube.engagement_by_likes_and_views_shorts` (number)

  - `result.youtube.engagement_by_views_and_subs_long` (number)

  - `result.youtube.engagement_by_views_and_subs_shorts` (number)

  - `result.youtube.engagement_percent_long` (number)

  - `result.youtube.engagement_percent_shorts` (number)

  - `result.youtube.hashtags_count` (array)

  - `result.youtube.keywords` (array)

  - `result.youtube.last_long_video_upload_date` (string)

  - `result.youtube.last_short_video_upload_date` (string)

  - `result.youtube.least_views` (integer)

  - `result.youtube.median_views_long` (number)

  - `result.youtube.niche_sub_class` (array)

  - `result.youtube.posting_frequency` (number)

  - `result.youtube.posting_frequency_long` (number)

  - `result.youtube.posting_frequency_recent_months` (number)

  - `result.youtube.posting_frequency_shorts` (number)

  - `result.youtube.promotes_affiliate_links` (boolean)

  - `result.youtube.shorts_percentage` (number)

  - `result.youtube.topic_details` (array)

  - `result.youtube.total_comments_last_50` (integer)

  - `result.youtube.video_categories` (array)

  - `result.youtube.video_hashtags` (array)

  - `result.youtube.video_tags` (array)

  - `result.youtube.video_topics` (array)

  - `result.tiktok` (object)

  - `result.tiktok.audience` (object)
    Audience insights returned when include_audience_data is enabled. Contains demographic breakdowns for followers, commenters, and likers.

  - `result.tiktok.brands_found` (array)

  - `result.tiktok.challenges_list` (array)

  - `result.tiktok.comment_count_avg` (number)

  - `result.tiktok.comments_median` (number)

  - `result.tiktok.duration_avg` (number)

  - `result.tiktok.has_merch` (boolean)

  - `result.tiktok.hashtags` (array)

  - `result.tiktok.likes_median` (number)

  - `result.tiktok.niche_sub_class` (array)

  - `result.tiktok.play_count_avg` (number)

  - `result.tiktok.play_count_median` (number)

  - `result.tiktok.posting_frequency` (integer)

  - `result.tiktok.posting_frequency_recent_months` (number)

  - `result.tiktok.promotes_affiliate_links` (boolean)

  - `result.tiktok.reach_score` (number)

  - `result.tiktok.reach_score_list` (array)

  - `result.tiktok.saves_count_list` (array)

  - `result.tiktok.saves_median` (number)

  - `result.tiktok.shares_median` (number)

  - `result.tiktok.tagged` (array)

  - `result.tiktok.total_likes` (integer)

  - `result.tiktok.total_saves` (integer)

  - `result.tiktok.total_shares` (integer)

  - `result.onlyfans` (object)

  - `result.onlyfans.archived_posts_count` (integer)

  - `result.onlyfans.audios_count` (integer)

  - `result.onlyfans.avg_durations` (number)

  - `result.onlyfans.comments_median` (number)

  - `result.onlyfans.finished_streams_count` (integer)

  - `result.onlyfans.has_merch` (boolean)

  - `result.onlyfans.has_paid_partnership` (boolean)

  - `result.onlyfans.is_spotify_connected` (boolean)

  - `result.onlyfans.likes_median` (number)

  - `result.onlyfans.photos_count` (integer)

  - `result.onlyfans.post_dates` (array)

  - `result.onlyfans.post_durations` (array)

  - `result.onlyfans.posts_count` (integer)

  - `result.onlyfans.private_archived_posts_count` (integer)

  - `result.onlyfans.promotes_affiliate_links` (boolean)

  - `result.onlyfans.referal_bonus_sum_for_referer` (integer)

  - `result.onlyfans.tips_enabled` (boolean)

  - `result.onlyfans.tips_max` (integer)

  - `result.onlyfans.tips_min` (integer)

  - `result.onlyfans.tips_min_internal` (integer)

  - `result.onlyfans.tips_text_enabled` (boolean)

  - `result.onlyfans.total_likes` (integer)

  - `result.onlyfans.videos_count` (integer)

  - `result.twitter` (object)

  - `result.twitter.avg_quotes` (number)

  - `result.twitter.avg_reply` (number)

  - `result.twitter.avg_retweet` (number)

  - `result.twitter.avg_views` (number)

  - `result.twitter.creator_favorite_count` (integer)

  - `result.twitter.has_merch` (boolean)

  - `result.twitter.has_paid_partnership` (boolean)

  - `result.twitter.hashtags` (array)

  - `result.twitter.languages_tweet` (array)

  - `result.twitter.promotes_affiliate_links` (boolean)

  - `result.twitter.recommended_users` (array)

  - `result.twitter.retweet_users` (array)

  - `result.twitter.retweets_count` (array)

  - `result.twitter.tagged` (array)

  - `result.twitter.tagged_usernames` (array)

  - `result.twitter.tweets_count` (integer)

  - `result.twitter.tweets_frequency_recent_months` (number)

  - `result.twitch` (object)

  - `result.twitch.avg_views` (number)

  - `result.twitch.has_merch` (boolean)

  - `result.twitch.has_paid_partnership` (boolean)

  - `result.twitch.last_broadcast_game` (string)

  - `result.twitch.last_broadcast_id` (string)

  - `result.twitch.last_streamed` (string)

  - `result.twitch.primary_team_display_name` (string)

  - `result.twitch.primary_team_name` (string)

  - `result.twitch.promotes_affiliate_links` (boolean)

  - `result.twitch.streamed_hours_last_30_days` (number)

  - `result.twitch.streams_count_last_30_days` (integer)

  - `credits_cost` (number)
    Example: 0.8

## Response 400 fields (application/json):

  - `error` (any)
    Human-readable description of what went wrong. Shape varies per endpoint: string on most paths, DRF field-error object on validation paths of creators_api enrich/* and enrichment_batch_api create, list of strings on discovery filter validation. See the per-endpoint example response.
    Example: Insufficient credits.

  - `error_code` (string, required)
    Machine-readable snake_case slug identifying the error class. Stable across API versions; **the only field guaranteed present on every public-API error**. Use for programmatic branching instead of parsing `error`.
    Example: insufficient_credits

  - `message` (string)
    Optional long-form detail sibling to `error`. Present on endpoints that historically returned both a short label and a long explanation (rate limits, polling, batch state, insufficient_credits on resume).
    Example: Poll every 30-60 seconds. Excessive polling results in rate limiting.

  - `retry_after` (integer)
    Seconds the caller should wait before retrying. Present on 429s where the OLD endpoint set it; mirrored in the `Retry-After` HTTP header.
    Example: 60

  - `available_credits` (number)
    Credits currently available. Present on the 403 insufficient_credits response of `POST /public/v1/enrichment/batch/{id}/resume/`.

  - `required_minimum` (number)
    Minimum credits needed. Pairs with `available_credits`.

  - `current_status` (string)
    Current resource state. Present on 400 responses where the operation requires a different state (e.g. `batch_not_ready`, `batch_not_resumable`).

  - `active_batches` (integer)
    Active batch count when `error_code: batch_limit_reached`.

  - `max_allowed` (integer)
    Per-client batch ceiling. Pairs with `active_batches`.

## Response 403 fields (application/json):

  - `error` (any)
    Human-readable description of what went wrong. Shape varies per endpoint: string on most paths, DRF field-error object on validation paths of creators_api enrich/* and enrichment_batch_api create, list of strings on discovery filter validation. See the per-endpoint example response.
    Example: Insufficient credits.

  - `error_code` (string, required)
    Machine-readable snake_case slug identifying the error class. Stable across API versions; **the only field guaranteed present on every public-API error**. Use for programmatic branching instead of parsing `error`.
    Example: insufficient_credits

  - `message` (string)
    Optional long-form detail sibling to `error`. Present on endpoints that historically returned both a short label and a long explanation (rate limits, polling, batch state, insufficient_credits on resume).
    Example: Poll every 30-60 seconds. Excessive polling results in rate limiting.

  - `retry_after` (integer)
    Seconds the caller should wait before retrying. Present on 429s where the OLD endpoint set it; mirrored in the `Retry-After` HTTP header.
    Example: 60

  - `available_credits` (number)
    Credits currently available. Present on the 403 insufficient_credits response of `POST /public/v1/enrichment/batch/{id}/resume/`.

  - `required_minimum` (number)
    Minimum credits needed. Pairs with `available_credits`.

  - `current_status` (string)
    Current resource state. Present on 400 responses where the operation requires a different state (e.g. `batch_not_ready`, `batch_not_resumable`).

  - `active_batches` (integer)
    Active batch count when `error_code: batch_limit_reached`.

  - `max_allowed` (integer)
    Per-client batch ceiling. Pairs with `active_batches`.

## Response 429 fields (application/json):

  - `error` (any)
    Human-readable description of what went wrong. Shape varies per endpoint: string on most paths, DRF field-error object on validation paths of creators_api enrich/* and enrichment_batch_api create, list of strings on discovery filter validation. See the per-endpoint example response.
    Example: Insufficient credits.

  - `error_code` (string, required)
    Machine-readable snake_case slug identifying the error class. Stable across API versions; **the only field guaranteed present on every public-API error**. Use for programmatic branching instead of parsing `error`.
    Example: insufficient_credits

  - `message` (string)
    Optional long-form detail sibling to `error`. Present on endpoints that historically returned both a short label and a long explanation (rate limits, polling, batch state, insufficient_credits on resume).
    Example: Poll every 30-60 seconds. Excessive polling results in rate limiting.

  - `retry_after` (integer)
    Seconds the caller should wait before retrying. Present on 429s where the OLD endpoint set it; mirrored in the `Retry-After` HTTP header.
    Example: 60

  - `available_credits` (number)
    Credits currently available. Present on the 403 insufficient_credits response of `POST /public/v1/enrichment/batch/{id}/resume/`.

  - `required_minimum` (number)
    Minimum credits needed. Pairs with `available_credits`.

  - `current_status` (string)
    Current resource state. Present on 400 responses where the operation requires a different state (e.g. `batch_not_ready`, `batch_not_resumable`).

  - `active_batches` (integer)
    Active batch count when `error_code: batch_limit_reached`.

  - `max_allowed` (integer)
    Per-client batch ceiling. Pairs with `active_batches`.

