@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.
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.
| Network | Bright Data scraper | What you can pass |
|---|---|---|
gd_l1viktl72bvl7bjuj0 | linkedin.com/in/… only | |
gd_l1vikfch901nx3by4 | Profile URL or @handle | |
| TikTok | gd_l1villgoiiidt09ci | Profile URL or @handle |
gd_mf0urb782734ik94dz | Profile URL, profile.php?id=, /people/Name/id, or @handle | |
| X | gd_lwxmeb2u1cniijd7t4 | Profile URL or @handle |
| Threads | gd_mde7jg3ld2h3hnnf2 | Profile URL or @handle |
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.
Each lookup is found, not_found, or error.
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.
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.