Social Bright Data Package

Read a social profile URL or @handle through Bright Data

What this is

@zooly/social-brightdata reads a public social profile for onboarding. You pass a profile link or an @handle. It returns the name, bio, photo, and follower counts.

It is the Bright Data plug for Social Lookup, and it is the reader onboarding uses. Social Apify is deprecated and nothing in the product calls it. Bright Data is cheaper. Tracked as ZLY-2029.

The account is on Bright Data's free plan: 5,000 profiles a month. When that allowance runs out or scrapes start failing, create a Bright Data subscription. Paid records are $1.50 per 1,000.

A profile link is read on that network only, and the link you passed is the one sent. An @handle is tried on Instagram, TikTok, Facebook, Threads, and X. LinkedIn is the exception: it needs a linkedin.com/in/… link, because that public id is not the same string as a handle on the other networks. A first name with no @ is not a handle.

YouTube and Spotify are not here. They have official APIs. The older Scrapfly package, @zooly/social-scraper, only counts followers and is not this interface.

What a dataset is

A dataset is Bright Data's ready-made scraper for one kind of page. LinkedIn profiles are one dataset. Instagram profiles are another. We do not build them. Bright Data publishes them.

You do not pass a dataset id yourself. A lookup already picks the id for that network and sends it with the profile URL. The request is one scrape: the id says which scraper to run, and the body is that URL. If Bright Data has not finished, the package waits, up to 60 seconds.

NetworkBright Data scraperWhat you can pass
LinkedIngd_l1viktl72bvl7bjuj0linkedin.com/in/… only
Instagramgd_l1vikfch901nx3by4Profile URL or @handle
TikTokgd_l1villgoiiidt09ciProfile URL or @handle
Facebookgd_mf0urb782734ik94dzProfile URL, profile.php?id=, /people/Name/id, or @handle
Xgd_lwxmeb2u1cniijd7t4Profile URL or @handle
Threadsgd_mde7jg3ld2h3hnnf2Profile URL or @handle

Token

The server reads BRIGHTDATA_TOKEN (or BRIGHTDATA_API_KEY) when it starts. Locally, add it to the root .env.local and restart zooly-app. apps/zooly-app/.env.local points at that same file. Without it, a LinkedIn link says it could not be opened.

On Vercel the same name is set for zooly-app, zooly-app-dev, and zooly-app-stage, on production, preview, and development. A deployment that is already running does not see a new value until it is redeployed.

What you get back

Each lookup is found, not_found, or error.

  • found includes the display name, bio, photo, and follower counts, plus the raw item Bright Data returned.
  • not found means the scrape ran and there was no usable profile.
  • error means there was no answer: the token was rejected, the scrape timed out, or Bright Data failed. The profile may still exist.

A value that is not a handle, such as jane kim or a post URL, is rejected. A missing token is rejected.

Name, city, current company, education, and followers usually come back from LinkedIn. Headline, about, and job history are often empty, because LinkedIn no longer shows those on the public page. Recent activity can be a long list of posts and likes. Onboarding uses the stable fields and does not put that activity on the findings card.

Onboarding

When everything in a research call is a social profile link or an @handle, onboarding skips the normal web-page reader and uses this package. A normal website is still read as a web page. A social link in that same call is read here if the web-page reader misses it.

The findings card keeps the URL the person typed, not a country-host redirect Bright Data may return. The name they typed stays, unless the profile name starts with it and is longer. See the findings card.