Blog

Social Media Profile API: Fetch User Profile Data Across Platforms (2026)

Erwan Prost

Erwan Prost

· 15 min read

On this page

A social media profile API returns the identity data attached to a social account — display name, handle, avatar URL, bio, follower count — through one interface instead of one client per platform. It reads what a platform calls its user or account node: Instagram's biography, a Facebook Page's about, TikTok's bio_description, a YouTube channel's snippet.description. One call, one shape, regardless of which network the account lives on.

But "social media profile API" means two very different things, and the gap between them is the whole story. One is reading the profiles of accounts your users have connected to you, through each platform's official API under an OAuth grant. The other is looking up arbitrary third-party users by handle, which almost no official API allows and which in practice means scraping. This guide separates them, then shows the compliant path with real request and response shapes.

What is a social media profile API?

A social media profile API is an abstraction over each platform's user or account endpoint. It returns profile metadata — the descriptive fields about an account rather than its content or its inbound messages — in one consistent object. If a unified social inbox API answers "what did people say to us", a profile API answers a smaller and more boring question: who is this account, and what does it currently look like?

The word "profile" is where the category splits. Searches for social media profile api, social media user profile api, and social data api land on two incompatible products. The distinction is not marketing. It determines whether your integration is a durable OAuth relationship or a scraper that dies the first time a platform tightens its bot detection.

Connected-account profile APIThird-party profile lookup
What it readsProfiles of accounts your users authorizedAny public profile, by handle or URL
AuthorizationOAuth grant from the account ownerNone — the subject never consents
Official API supportEvery major platform exposes itOnly X and YouTube among major networks
Compliance postureInside platform terms by constructionBreaches ToS on most platforms; GDPR exposure
StabilitySurvives platform changes; tokens refreshBreaks on layout, rate-limit, or bot-detection changes
Typical useDashboards, client reporting, account healthInfluencer discovery, lead scraping, competitor tracking

SocialAPI.ai sits entirely on the left column. Every profile field it returns comes from the platform's own API, under a token the account owner granted. That is a deliberate product boundary and it is also the reason the data does not silently rot: an official field keeps its meaning across a platform version bump, while a scraped selector does not. The same principle runs through the one API for all social networks model.

What profile data does each platform's official API expose?

Every major platform exposes profile data for an account that authorized your app. What differs is the field names, the number of calls, and the scopes. Below is what each official API returns for the five fields people actually want. Cells show the platform's own field name so you can see how little agreement there is.

PlatformDisplay nameHandleAvatarBioFollower count
Instagramnameusernameprofile_picture_urlbiographyfollowers_count — same call
Facebook Pagenameusernamepictureaboutfollowers_count — same call
TikTokdisplay_nameusernameavatar_urlbio_descriptionfollower_count — extra scope
YouTubesnippet.titlesnippet.customUrlsnippet.thumbnailssnippet.descriptionstatistics.subscriberCount — extra part
X (Twitter)nameusernameprofile_image_urldescriptionpublic_metrics.followers_count
Threadsnameusernamethreads_profile_picture_urlthreads_biographySeparate insights call
Pinterestbusiness_nameusernameprofile_imageaboutfollower_count — same call
LinkedIn (member)nameNot exposedpictureNot exposedNot exposed
LinkedIn (organization)localizedNamevanityNamelogoV2localizedDescription (admin)Separate networkSizes call
Google Business ProfiletitleNot exposedNot on the location resourceprofile.descriptionLegacy v4 endpoint only

Three patterns are worth naming. First, bio has six different names across ten rows, which is the entire argument for normalization in one line. Second, follower count is not uniformly a profile field: Threads puts it behind a threads_insights metric call, LinkedIn organizations behind networkSizes, TikTok behind the user.info.stats scope, and YouTube behind a different part on the same request.

Third, some fields simply do not exist. LinkedIn's OpenID Connect userinfo response carries no handle, no bio, and no follower count for a member — only sub, name, picture, and email claims. A Google Business Profile location has a title and a description but no username and no avatar on the location resource itself. An honest profile API returns null there rather than inventing a value, and that honesty is easier to build on than a fabricated uniformity.

One number deserves a warning label. YouTube documents that subscriberCount is rounded down to three significant figures, and a channel can hide the count entirely via statistics.hiddenSubscriberCount. If you are building client reporting on subscriber deltas, that rounding is a real floor on your resolution — a channel at 12,400 and one at 12,499 report identically.

Official profile APIs vs scraping: what's compliant?

Here is the fact that reframes the entire category. For an account that authorized your app, every major platform has an official profile endpoint. For an arbitrary account you have no relationship with, only two of the major networks offer genuine public lookup: X, through GET /2/users/by/username/:username with an app-only bearer token, and YouTube, through channels.list with forHandle and an API key.

Everywhere else the door is closed by design. Instagram's user node is app-user-scoped, so /me is the only subject you can read. TikTok's /v2/user/info/ takes no username parameter at all — it returns the bearer token's user or nothing. Threads documentation states outright that you may only fetch the profile of the app-scoped user. Facebook Page reads require a Page access token granted by a Page admin. Pinterest's /v5/user_account has no lookup parameter either.

If a vendor sells "look up any Instagram profile by username", there is no official API behind it. That is scraping with a REST wrapper.

The consequences are not theoretical, and they arrive in three layers. Platform terms are explicit: Meta's Terms of Service prohibit accessing or collecting data from its products by automated means without prior permission, and LinkedIn's User Agreement bars using "crawlers, browser plugins and add-ons or any other technology" to scrape or copy the Services, naming profiles specifically. X's Developer Policy restricts republishing content accessed by means other than the X API.

Operational risk is the second layer. A scraper depends on undocumented HTML and unauthenticated endpoints, so it breaks without warning, and the accounts or IPs it runs through get banned rather than rate-limited. You find out when a customer dashboard goes blank, not when a 501 arrives. There is no support channel for a scraper, because the relationship you are relying on was never established.

GDPR is the third and the one most teams underweight. A name, an avatar, a bio, and a handle together are personal data about an identifiable person. Collecting them without the subject's knowledge leaves you without a straightforward legal basis, without a way to honour an erasure request you cannot trace, and holding a dataset you cannot lawfully explain. An OAuth grant from the account owner solves all three at once, because consent is the mechanism rather than an afterthought.

SocialAPI.ai never scrapes. Every profile field described in this guide comes from the platform's official API, read with a token the account owner granted through OAuth and stored encrypted at rest. That is why the connect flow exists at all: the grant is the product. It is also why there is no "look up any user" endpoint in the reference, and there will not be one.

How do you fetch profile data with one API?

Three steps: connect the account, let the user authorize on the platform, then read the normalized profile. POST /v1/accounts/connect starts the flow and returns an auth_url. Send the user there. SocialAPI.ai handles the platform callback, exchanges the code, persists the token encrypted, and redirects the user to your redirect_uri with an account_id.

bash
# 1. Start the connection. Returns 202 with an auth_url to send the user to.
curl -X POST https://api.social-api.ai/v1/accounts/connect \
  -H "Authorization: Bearer $SOCAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "instagram",
    "redirect_uri": "https://app.example.com/oauth/callback",
    "state": "session_abc123"
  }'

# 2. The user authorizes; your redirect_uri receives:
#    ?status=success&platform=instagram&state=session_abc123
#      &account_id=acc_01HZ9X3Q4R5M6N7P8V2K0W1J

# 3. Read every connected profile in one call.
curl https://api.social-api.ai/v1/accounts \
  -H "Authorization: Bearer $SOCAPI_KEY"

Step three is the payoff. GET /v1/accounts returns every connected account across every platform in one array, each as the same Account object. Instagram, a Facebook Page, a TikTok creator, and a YouTube channel all come back with name, username, profile_picture_url, and bio in the same positions — no per-platform parsing, no switch statement on platform.

json
{
  "count": 2,
  "data": [
    {
      "id": "acc_01HZ9X3Q4R5M6N7P8V2K0W1J",
      "platform": "instagram",
      "name": "Acme Corp",
      "username": "acmecorp",
      "profile_picture_url": "https://scontent.cdninstagram.com/v/...",
      "bio": "Sustainable apparel. Shipping worldwide.",
      "brand_id": "b7e2c1a0-4f3d-11ee-be56-0242ac120002",
      "status": "active"
    },
    {
      "id": "acc_01HZ9X3Q4R5M6N7P8V2K0W2M",
      "platform": "youtube",
      "name": "Acme Corp",
      "username": "@acmecorp",
      "brand_id": "b7e2c1a0-4f3d-11ee-be56-0242ac120002",
      "status": "reconnect_required",
      "reconnect_reason": "The access token was revoked by the user."
    }
  ]
}
Profile normalization
PROFILE NORMALIZATIONOAuth grantaccount ownerconsentsOfficial platform APIsnever scrapedPer-platform fieldsbiography / about /bio_descriptionSocialAPI.ainormalizationlayerAccountname /username / av…

Every profile field originates in a platform's official API, read under an OAuth grant from the account owner. The normalization layer collapses six different bio field names and three different follower-count call patterns into one Account object.

Two caveats matter more than anything else on this page. First, follower counts are not on the account list response. The metadata object that carries follower_count (TikTok) and subscriber_count (YouTube) is returned only on the connect and POST /v1/oauth/exchange responses, not on GET /v1/accounts. Capture it at connection time if you want a baseline.

Second, live counts come from platform-specific reads. GET /v1/platforms/youtube/accounts/{id}/summary returns the current channel stats, and GET /v1/accounts/{id}/pages returns Facebook Page detail including followers_count, category, verification_status, and cover_photo_url. The generic endpoint stays generic; the platform-specific richness lives behind a platform-specific path rather than being crammed into a lowest-common-denominator object.

json
// GET /v1/platforms/youtube/accounts/{id}/summary
{
  "title": "Acme Corp",
  "handle": "@acmecorp",
  "thumbnail_url": "https://yt3.ggpht.com/...",
  "subscriber_count": 12400,
  "view_count": 980000,
  "video_count": 47
}

One flow detail catches teams out. A Google login that manages more than one Business Profile cannot resolve to a single account from the OAuth grant alone, so the connect pauses: your callback receives status=selection_required and a connection_id instead of an account_id, and you finish with POST /v1/accounts/pending/{connection_id}/select. Facebook takes the same path on every connect, because Pages must be assigned to a brand explicitly. Handle selection_required before you ship the connect button.

What can you build with profile data?

Profile data is rarely the product. It is the connective tissue that makes the rest of a product legible — the avatar on a comment, the handle on a report header, the badge that tells an operator an integration is dead. Four patterns cover most of what teams actually ship with GET /v1/accounts.

  • Account pickers and dashboards. Render every connected account as a tile with profile_picture_url, name, username, and platform. This is the single most common consumer of a profile API and the reason the fields are normalized at all: one component renders all platforms.
  • CRM enrichment for owned accounts. Attach the handle, bio, and avatar of a customer's connected accounts to their record so support and success see the same identity your product does. This works because the customer authorized it — enriching arbitrary leads from scraped profiles is the pattern this guide argues against.
  • Agency and client reporting. Snapshot subscriber_count or follower_count per client account on a schedule and chart the delta. Accounts group under a brand_id, which is what keeps one agency's clients isolated from another's in the same workspace.
  • Integration health monitoring. Alert on status: "reconnect_required" and surface reconnect_reason to the customer. This is the most operationally valuable profile field and almost nobody plans for it before their first mass token expiry.

That last one deserves emphasis. Profile reads are where token death surfaces first, because listing accounts is usually the first call a dashboard makes. Treating status as a first-class UI state — a badge, a reconnect button, an email — converts a silent outage into a two-click fix. Pair it with social mentions coverage and you have both halves of an account-health picture.

Frequently asked questions

What is a social media profile API?
A social media profile API returns the identity data attached to a social account — display name, handle, avatar URL, bio, and follower count — through one interface instead of one client per platform. It reads what each platform calls its user or account node and normalizes the differing field names into a single object, so one piece of code can render an Instagram profile, a Facebook Page, a TikTok creator, and a YouTube channel identically.
Can I fetch any user's profile by username through an API?
Almost never through an official API. Among the major networks, only X (GET /2/users/by/username/:username with an app-only bearer token) and YouTube (channels.list with forHandle and an API key) support genuine third-party lookup. Instagram's user node is app-user-scoped, TikTok's user info endpoint has no username parameter, Threads documents that you may only fetch the app-scoped user's profile, and Facebook Page reads require an admin-granted Page token. Vendors selling arbitrary lookup on those platforms are scraping.
Is scraping social media profiles legal?
It breaches the terms of the major platforms and creates data-protection exposure. Meta's Terms of Service prohibit collecting data from its products by automated means without prior permission, and LinkedIn's User Agreement explicitly bars crawlers or other technology used to scrape or copy the Services, naming profiles. Separately, a name, avatar, bio, and handle together are personal data under GDPR, and collecting them without the subject's knowledge leaves you without a clear legal basis or a way to honour erasure requests.
Does SocialAPI.ai scrape profile data?
No. Every profile field SocialAPI.ai returns comes from the platform's official API, read with a token the account owner granted through OAuth and stored encrypted at rest. There is no endpoint for looking up an account that has not connected, because no official API supports it on most platforms. The OAuth grant is the mechanism the whole product is built on, which is also what makes the data stable across platform version changes.
Which profile fields are available across all platforms?
Display name and some form of handle are the most universal, though Google Business Profile locations have no username and LinkedIn's member userinfo response carries no handle. Avatar and bio are widely but not universally available. Follower count is the least consistent: it is a plain profile field on Instagram, Facebook Pages, X, and Pinterest, but requires a separate call or scope on Threads, LinkedIn organizations, TikTok, and YouTube.
How do I get follower counts through SocialAPI.ai?
Not from GET /v1/accounts — the account list response intentionally omits the per-platform metadata object. Follower and subscriber counts arrive in metadata on the connect response and on POST /v1/oauth/exchange, so capture them at connection time for a baseline. For live values, use the platform-specific reads: GET /v1/platforms/youtube/accounts/{id}/summary returns subscriber_count, view_count, and video_count, and GET /v1/accounts/{id}/pages returns followers_count for Facebook Pages.
What does status: reconnect_required mean on an account?
It means the stored platform token is no longer usable — typically revoked by the user, expired, or invalidated by a permission change — and the account must go through the connect flow again. The Account object carries a human-readable reconnect_reason alongside it. Treat this as a first-class UI state with a visible reconnect action, because listing accounts is usually the first call a dashboard makes and therefore where token death surfaces first.
Is YouTube's subscriber count accurate through the API?
It is rounded. Google documents that subscriberCount is rounded down to three significant figures, so a channel at 12,400 subscribers and one at 12,499 report the same value. A channel can also hide the count entirely, signalled by statistics.hiddenSubscriberCount. If you are charting subscriber deltas for client reporting, that rounding sets a hard floor on your resolution and should be disclosed in the report rather than smoothed over.

Treat a social media profile API as a compliance decision first and a convenience second. Decide which product you actually need: connected-account profiles, which every platform supports officially and which survive version changes, or arbitrary lookup, which almost nothing supports and which trades a working integration for a legal and operational liability. If it is the former, GET /v1/accounts is one call away — the full field reference lives in the SocialAPI.ai documentation, and connection limits are on the pricing page.

Per-platform profile field claims in this guide are drawn from official platform documentation so each one can be checked at its source. Primary sources: Instagram Platform: IG User node reference (name, username, profile_picture_url, biography, followers_count) · Meta Graph API: Page node reference (name, username, about, picture, followers_count) · TikTok Display API: Get User Info (user.info.basic, user.info.profile, user.info.stats scopes) · YouTube Data API v3: channels.list (snippet, statistics; subscriberCount rounding) · X API v2: get user by username (app-only bearer token lookup, user.fields) · Threads API: profiles (you may only fetch the app-scoped user's profile) · Threads API: insights (followers_count metric) · LinkedIn: Sign In with LinkedIn using OpenID Connect (userinfo claims) · LinkedIn: Organization Lookup API (vanityName, logoV2, networkSizes follower count) · Google Business Profile: Business Information API location resource (title, profile.description) · Meta Terms of Service (prohibition on automated data collection without permission) · LinkedIn User Agreement (prohibition on scraping or copying the Services, including profiles) · X Developer Policy (restrictions on content accessed by means other than the X API)

Get started today

Ready to unify your social interactions?

Free tier available · No credit card required · Ships with MCP server

We use essential cookies for security, and analytics cookies with your consent. Privacy Policy.