Bluesky Brand Presence Mapper avatar

Bluesky Brand Presence Mapper

Pricing

from $2.45 / 1,000 company checkeds

Go to Apify Store
Bluesky Brand Presence Mapper

Bluesky Brand Presence Mapper

Resolves a company domain to its official Bluesky account and returns exact follower, following and post counts through the public AT Protocol API. Flat, Clay ready, one row per company. Counts are exact, not rounded.

Pricing

from $2.45 / 1,000 company checkeds

Rating

0.0

(0)

Developer

Mamba Labs

Mamba Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

๐Ÿ”Ž What can Bluesky Brand Presence Mapper do?

Give it a company domain. It finds that company's official Bluesky account and returns the profile URL plus exact follower, following and post counts, in one flat row per company.

It uses Bluesky's own public AT Protocol API, which is public by design rather than by oversight. No login, no API key, no scraping, no browser.

๐Ÿ“ฆ What you getโš™๏ธ Features and integrations
๐Ÿฆ‹ Brand Bluesky account, resolved from a company domain
๐Ÿ”ข Exact follower, following and post counts, never rounded
๐Ÿชช Stable DID, plus domain verification status
๐Ÿงพ 21 flat fields, snake_case, one row per company
๐Ÿ”— Domain handle first, which is how most brands verify on Bluesky
๐Ÿ“ก Public AT Protocol API, documented and keyless
๐Ÿ•ฐ๏ธ Account creation date, so you can tell new from established
โฌ‡๏ธ Export to JSON, CSV, Excel, HTML or XML

Bought by teams tracking brand migration off X, media and publishing prospectors, and developer relations teams mapping where technical audiences moved.

๐Ÿšซ This is not a Bluesky firehose or post scraper. It returns one account level row per company. It does not stream posts, replies or the timeline. Bluesky adoption among B2B companies is still thin, so expect not_found often, and expect it to be correct.

๐Ÿ’ก Why use Bluesky Brand Presence Mapper?

The counts are exact, and almost nowhere else are they. TikTok serves 2,000,000. Instagram serves 3M. YouTube serves "902 thousand subscribers". Those are the platforms rounding, not us, and summing them across a target list sums the rounding. Bluesky serves 1,204 and means 1,204.

Domain verification is a free identity check. Bluesky lets a company use its own domain as its handle, but only after a DNS check the company must pass. So when bluesky_handle equals bluesky_domain_verified is true, you are not looking at a plausible match, you are looking at an account the company proved it controls. No other platform in this family offers that.

It starts from a domain. Every Bluesky tool on the Store starts from a handle, which is the thing you do not have. If you had the handle you would not need the tool.

๐Ÿงญ Four routes, cheapest first

  1. The domain as a handle. A company that verified its domain IS reachable at that handle. One API call, no discovery, exact answer.
  2. The company homepage. Its own sameAs block or footer links, read directly with no proxy.
  3. Bluesky account search. The platform's own search, filtered through an identity gate so a similarly named account is dropped rather than shipped.
  4. A web search, last, and only for what the first three missed.

The row tells you which route answered, in bluesky_discovery. If your use case cannot carry a weak match, filter to input_handle, homepage_sameas and homepage_link and drop the rest.

๐Ÿ“‹ What data can Bluesky Brand Presence Mapper extract?

Every row carries 21 flat fields. These are the ones a buyer actually filters and sorts on.

FieldTypeMeaning
degradedbooleanTrue when this row could not be produced normally, for example the company site was unreachable and no discovery could run. A degraded row is never charged.
degradation_reasonstring | nullWhy the row is degraded, in plain words. Null on a normal row.
company_domainstring | nullThe company domain this row is about, normalized. Null when only a handle or a name was supplied. This is the join key across the whole Mamba Labs fleet.
company_namestring | nullThe company name as supplied or derived. Improves search accuracy and is what the identity gate matches against.
bluesky_urlstring | nullCanonical Bluesky profile URL, or null when no trustworthy account was found.
bluesky_handlestring | nullThe resolved handle. When this equals the company domain, the company has verified that domain with Bluesky, which is the strongest identity evidence this platform offers.
bluesky_didstring | nullThe account decentralized identifier. Unlike a handle this never changes, so it is the field to store if you are tracking one account over time.
bluesky_domain_verifiedboolean | nullTrue when the resolved handle IS the company domain, which Bluesky only permits after a DNS check. False when the account was found some other way. Null when no account was found.
bluesky_followersinteger | nullExact follower count. Bluesky serves the real integer, so unlike every other platform in this family this number can be summed across a list.
bluesky_followinginteger | nullExact count of accounts this account follows.
bluesky_postsinteger | nullExact count of posts on the account. Zero is a real answer and means a registered but unused account, which is different from null.
bluesky_followers_exactboolean | nullAlways true when a count was returned. Bluesky does not round. The field exists so this actor row is shape compatible with the rest of the family, where rounding is the norm.
bluesky_display_namestring | nullThe account display name as set by its owner.
bluesky_biostring | nullThe account description text.
bluesky_created_atstring | nullWhen the account was created, ISO 8601. Useful for telling an established presence from one opened last week.
bluesky_discoverystring | nullHow the account was found: domain_handle (the company domain is the verified handle, strongest), input_handle, homepage_sameas, homepage_link, search, or pattern_guess. Anything below homepage_link is weaker evidence and you may want to filter on it.
bluesky_statusstringok, not_found, not_extractable, blocked, identity_mismatch, auth_failed or skipped. Read this before reading any count.
run_datestringISO 8601 timestamp of this run. Social counts move, so a row without a date is a number with no shelf life.
row_statusstringok, partial or error. partial means a platform status is blocked, auth_failed or not_extractable; error means the row is degraded.
error_reasonstring | nullWhy the row is partial or an error, in plain words. Null on an ok row.
billable_events_jsonstringThe charges this row caused, as a JSON array, for example [{"event":"company-checked","count":1}]. [] when the row was free.

โš ๏ธ How to read these values. bluesky_did is the field to store if you are tracking an account over time. A handle can be changed by its owner; a DID cannot.

๐Ÿ› ๏ธ How to find a company's Bluesky account

  1. Put a company domain in company_domain. That is the whole setup.
  2. Optionally add company_name, which is what the identity gate matches a discovered account against. Supplying it reduces wrong matches.
  3. If you already know the handle, put it in handle and the actor skips discovery and goes straight to the fetch, which is cheaper.
  4. For a list, pass an array of objects with the same fields. Or put the domains in company_domains, one per line, on the Console form.

๐Ÿงช Using it in Clay

Add an Enrichment > Apify column, pick this actor, and map company_domain to your domain column. Every output field arrives as its own flat column, snake_case, no nesting, so there is nothing to unwrap.

Save credits by gating the column: run it only on rows where your ICP filter already passed. There is no point resolving a Bluesky account for a company you are not going to contact.

๐Ÿ’ต How much does it cost?

Pay per event. Each run also carries Apify's apify-actor-start event, $0.00005 per GB of run memory, charged once when the run starts (one event at the default memory). Everything else is charged per row of output.

EventFires whenPrice
apify-actor-startOnce per run, when the run starts. Apify's own start event, one per GB of run memory.$0.00005
company-checkedOnce per company for which the discovery cascade completed and a non degraded row was produced, whether or not a Bluesky profile was found. Does not fire on a degraded row, because on a degraded row no discovery was performed.$0.0035
profile-resolvedOnce per company whose candidate Bluesky URL passed the identity gate. Fires on the validation work, not on a populated count. A candidate dropped as an impersonator does not charge: the work was done and the honest answer is that there is no such profile.$0.0030
follower-count-extractedOnce per company where a numeric follower count was read off the public page. Does not fire on not_extractable, blocked, identity_mismatch or url only runs.$0.0025

๐Ÿ’ณ What you are billed for. A run that resolves an account but cannot read its counts charges company-checked and profile-resolved and not follower-count-extracted. You are never billed for a number you did not get.

Setting includeFollowerCounts to false resolves the URL only and never fires the extraction event.

What the same coverage costs bought a la carte: There is no Bluesky presence actor on the Apify Store priced per profile to compare against, and no Store actor sells domain to Bluesky discovery at all. The nearest comparison is what it costs to not have this: resolving a company domain to a social account by hand.

Free plan: free Apify plan users get 900 results a month, reset on the 1st of each month. Any paid Apify plan removes the cap.

Cost cap: set max_charge_usd and the run stops before starting a company that could take it past that amount. The run also stops cleanly when the maximum cost per run you set in Apify is reached, and keeps every row already charged.

โŒจ๏ธ Input

FieldTypeRequiredMeaning
company_domainstringnoBare company domain, for example shopify.com. Supply this or a handle. With a domain the actor runs full discovery; with a handle it skips straight to the fetch.
company_domainsarraynoOptional. A list of bare company domains, one per line. One row per domain. When filled it is used instead of company_domain.
company_namestringnoOptional. Improves search accuracy and is what the identity gate checks a discovered profile against, so supplying it reduces wrong matches.
handlestringnoOptional. A Bluesky handle such as shopify.com, mamba.bsky.social, or a did. Supplying it skips discovery entirely and goes straight to the profile fetch. A company that has verified its domain with Bluesky uses the bare domain as its handle, which is why this often equals company_domain.
includeFollowerCountsstringnoWhen "true" (default) the profile page is fetched and the counts are extracted. Set "false" to resolve the profile URL only, which is cheaper and needs no proxy. Sent as a string for Clay compatibility.
skipCachestringnoWhen "false" (default) a successful lookup is cached for seven days and reused. Set "true" to force a fresh fetch. Sent as a string for Clay compatibility.
useActorSearchstringnoWhen "true" (default) and the domain is not itself a verified handle, Bluesky's own account search is used to find the company. Set "false" to rely only on the company homepage and the domain as handle, which avoids any chance of matching a similarly named account. Sent as a string for Clay compatibility.
max_charge_usdnumbernoOptional. Maximum charge for this run in USD. The run stops before starting a company that could take its charges past this amount. Leave empty to rely on the maximum cost per run set in Apify.
{
"company_domain": "theverge.com",
"company_name": "The Verge",
"useActorSearch": "true"
}

๐Ÿ“ค Output

Exports to JSON, CSV, Excel, HTML or XML. One flat, snake_case row per company. No nested objects, so it drops straight into Clay, a spreadsheet or a warehouse table without a flattening step.

{
"degraded": false,
"degradation_reason": null,
"company_domain": "theverge.com",
"company_name": "The Verge",
"bluesky_url": "https://bsky.app/profile/theverge.com",
"bluesky_handle": "theverge.com",
"bluesky_did": "did:plc:7exlcsle4mjfhu3wnhcgizz6",
"bluesky_domain_verified": true,
"bluesky_followers": 357220,
"bluesky_following": 141,
"bluesky_posts": 14584,
"bluesky_followers_exact": true,
"bluesky_display_name": "The Verge",
"bluesky_bio": "Covering life in the future\n\nSubscribe here: https://www.theverge.com/subscribe",
"bluesky_created_at": "2023-05-23T19:11:25.009Z",
"bluesky_discovery": "domain_handle",
"bluesky_status": "ok",
"run_date": "2026-08-22T19:26:58.474Z",
"row_status": "ok",
"error_reason": null,
"billable_events_json": "[{\"event\":\"company-checked\",\"count\":1}]"
}

false versus null, and why the difference matters

false means we looked and the answer is no. null means we could not look, or the platform withheld it. They are never interchangeable in this output. If you filter for companies with no presence on this platform, filter on false, because null rows are unknown rather than absent and including them will overstate your list.

๐Ÿ’ก Tips

  • Try the domain as the handle first. Many companies verify their domain with Bluesky, and when they have, discovery costs nothing.
  • Store the DID, not the handle, if you are going to look this account up again later.
  • bluesky_posts: 0 is a real and useful answer. It means the company registered the account and never used it, which is a different qualification signal from having no account at all.
  • Filter on bluesky_discovery if a wrong match would be expensive for you.

โš ๏ธ Known limits

  • Bluesky is small. It is a real network with real brand accounts and it is nowhere near the size of Instagram or LinkedIn. Many B2B companies have no Bluesky presence, and bluesky_status: "not_found" will be a common and correct answer. That is information, not a failure.
  • Follower counts are a public vanity metric. They are a proxy for reach, not a measurement of it, on every platform.
  • No post content, no follower lists, no engagement data. This actor returns account level presence and counts. It does not read posts.
  • The account search can only find accounts that exist. A company with no Bluesky account returns not_found no matter how many routes are tried.

โ“ FAQ

Does this need a Bluesky account or an API key? No. The AT Protocol AppView is public and unauthenticated by design.

Why are the counts exact here when other social actors round? Because Bluesky serves the integer. Instagram, TikTok, YouTube, Threads and Facebook render a rounded display string and there is no exact figure on the page to read.

What does bluesky_domain_verified actually prove? That the account holder controls DNS for that domain, because Bluesky checks before granting the handle. It is the strongest identity evidence available in this family of actors.

Can I pass a handle instead of a domain? Yes, in handle. It skips discovery, which is faster and cheaper.

What happens on a company with no Bluesky account? You get a row with bluesky_status: "not_found", the identity columns populated and the counts null. You are charged company-checked for the work of looking, and not the resolution or extraction events.

๐Ÿงฉ Want other GTM data?

Mamba Labs builds a fleet of GTM enrichment actors that share one flat, Clay-ready output convention, so their rows join on company_domain with no cleaning step:

๐Ÿ•ต๏ธ Agent Accessibility Auditor๐Ÿค– AI Tooling Detector
๐Ÿ“ก GTM Signals Aggregator๐Ÿš€ Prospect Engine
๐Ÿ“ Publishing Frequency Trackerโฉ Sequencer Lead Push
๐Ÿ”„ Company Change Event Feed๐Ÿ“‡ Company Contact Details Extractor
๐Ÿงญ Company Discovery List Builder๐Ÿข Company Firmographic Enricher
๐Ÿชช Company Identity Resolver๐ŸŒ Company Social Presence Mapper
๐Ÿท๏ธ Contact Classifier๐Ÿ“ˆ Influencer Change Monitor
๐Ÿ”Ž Influencer Finder๐Ÿงพ Influencer Lead List Builder
๐Ÿ‘ค Influencer Profile Scraper๐Ÿ“ฌ Domain Deliverability Checker
๐Ÿ”— Domain to LinkedIn URL Resolver๐Ÿ›’ Ecommerce Platform Profiler
โœ‰๏ธ Work Email Waterfall๐ŸŽช Event Presence Index
โš–๏ธ Expert Witness Directory๐Ÿ’ต Company Funding Record
๐Ÿ’ฐ Funding and Press Signal Scanner๐Ÿ™ GitHub Organization Signal Scanner
๐Ÿง‘โ€๐Ÿ’ผ GTM Hiring Signal Scraper๐Ÿ“‹ Job Posting Monitor
๐Ÿงฑ Tech Stack Signal Detector๐ŸŽฏ ICP Fit Scorer
๐Ÿ”‘ Job Board Keyword Signal Scanner๐Ÿ›๏ธ Legal Entity Resolver
๐Ÿ“ฐ Link in Bio Scraper and Newsletter Detector๐Ÿ’ผ LinkedIn Company Page Mapper
๐Ÿ’ฌ LinkedIn Post Tracker๐Ÿ“ข Meta Ad Library Monitor
๐Ÿ“ธ Meta Brand Presence Mapper๐Ÿ“ฎ Outbound Stack Detector
๐Ÿ“„ Page Finder and Extractor๐Ÿง‘ People Finder & Email Verifier
๐Ÿ“Œ Pinterest Brand Presence Mapper๐Ÿ† Government Contract Award Monitor
๐Ÿ“… Reporting Window Finder๐Ÿ‘ฝ Reddit Brand Presence Mapper
โญ Trustpilot Reputation Enricher๐Ÿค Influencer Talent Agency Lookup
๐Ÿ‘ฅ Team Page People Extractor๐ŸŽต TikTok Brand Presence Mapper
๐Ÿ“Š Website Traffic Rank Estimator๐Ÿ… Workplace Program Detector
โœ–๏ธ X Brand Presence Mapperโ–ถ๏ธ YouTube Channel Stats Extractor

Every actor in the suite takes a domain or a company and returns one flat row, so they stack in the same Clay table without reshaping anything.

๐Ÿ› ๏ธ Need something custom built for you or your team? Tell us what you are trying to find and we will build it. Talk to Mamba Labs.

๐Ÿ†˜ Support

Issues, field requests and bug reports: open an issue on the actor's Issues tab. Mamba Labs reads every one.

โ„น๏ธ Sourcing and legal. Every field comes from the public AT Protocol API that Bluesky documents and serves without authentication. bluesky_domain_verified reflects Bluesky's own domain handle mechanism, not an assessment by us. You are responsible for how you use the output.

Built by Mamba Labs.