Domain to LinkedIn URL Resolver Clay-Ready Company URL
Pricing
from $6.00 / 1,000 results
Domain to LinkedIn URL Resolver Clay-Ready Company URL
Resolves a company domain to its LinkedIn company URL via pattern matching and web search. Fixes the 15-20% miss rate in Clay native enrichment. Flat output with LinkedIn URL, employee count, industry, social URLs, and confidence score. MCP-ready for Claude Desktop and AI agents.
Pricing
from $6.00 / 1,000 results
Rating
4.0
(1)
Developer
Mamba Labs
Maintained by CommunityActor stats
2
Bookmarked
124
Total users
16
Monthly active users
4 days ago
Last modified
Categories
Share
Domain to LinkedIn URL Resolver
Resolves a company domain or name to its LinkedIn company URL, with social URLs and firmographics in the same flat row. Fixes the miss rate in Clay's native LinkedIn enrichment.
What's New
- Pricing now published. $0.006 per result. The lowest-priced actor in the Mamba Labs suite.
- Clay table template available. Pre-built fallback enrichment table for rows where Clay's native LinkedIn lookup returned empty. Open the template →
- v0.3.x overhaul. Firmographic enrichment from LinkedIn JSON-LD (employee count, HQ, description, industry, follower count). Social URL resolution via Brave Search. Multi-slug pattern matching with 9 candidate variants. Residential proxy with 5-attempt retry on every external call. Bing fallback replacing DuckDuckGo for enrichment queries. Confidence scoring rebuilt with real validation.
Why not use a free tool?
Free tools return a URL or null. That's it.
You get no signal on how the URL was found, no confidence rating, and no way to gate downstream work on data quality. In a Clay workflow processing thousands of rows, a wrong LinkedIn URL silently propagates into your sequences.
This actor returns resolution_method, confidence (high / medium / low), and slug_mismatch on every row, so you can filter to trusted rows in Clay and route the rest to manual review. Every resolved row also carries social URLs and rich firmographics pulled from the public LinkedIn page itself, so a single call usually replaces a second enrichment step.
How it works
The actor does the LinkedIn URL lookup first, then enriches the resolved row from two separate sources.
Step 1: LinkedIn URL lookup. Two-method cascade.
- Pattern match. Derives up to nine candidate slugs from the domain (bare stem first, then common shapes:
{stem}hq,{stem}-hq,{stem}inc,{stem}-inc,{stem}-io,{stem}-app,{stem}-group, plus a hyphen-collapsed form). Each candidate is HEAD-validated against LinkedIn in parallel; the first that returns a valid page wins. This catches non-obvious slugs like brex.com resolving to/company/brexhq. No external search call, no search rate limits. - Web search fallback (DuckDuckGo). If pattern matching fails, the actor runs a DuckDuckGo search and extracts the first matching LinkedIn company URL. This path mostly handles obscure or recently renamed companies.
Step 2: Firmographic enrichment. Once the LinkedIn URL is resolved, the actor GETs the public LinkedIn company page and parses the Organization JSON-LD block on the page (schema.org @type: Organization). That gives the exact employee count, structured headquarters address, canonical company name, and full description. Follower count comes from a regex over the rendered page text. Industry comes from the page's "About" section via LinkedIn's stable data-test-id="about-us__industry" marker. A Bing search snippet is a graceful fallback for description and canonical name when the LinkedIn page itself is unreachable.
Step 3: Social URLs. One combined Brave Search query, {name} site:facebook.com OR site:instagram.com OR site:x.com OR site:twitter.com OR site:youtube.com, returns the company's profile URLs on all four platforms in a single SERP. Brave honors the site: operator, returns plain URLs (no decoder needed), and reliably surfaces the company's actual handles when they exist.
Every external fetch (LinkedIn HEAD, LinkedIn page GET, DuckDuckGo, Bing, Brave) retries up to five times with a fresh residential proxy IP per attempt, which defeats per-IP throttling. If you only have a company name and no domain, the actor skips pattern matching and goes straight to the web search fallback. Both input paths return the same flat output row.
Input
At least one of company_domain or company_name must be provided.
| Field | Type | Required | Notes |
|---|---|---|---|
company_domain | String | No | Bare domain, e.g. stripe.com. Required if company_name is not provided. Enables pattern matching before the web search fallback. |
company_name | String | No | Company name. Required if company_domain is not provided. When provided alongside a domain, improves search accuracy and gives a fallback display name. |
Example with domain:
{"company_domain": "stripe.com","company_name": "Stripe"}
Example with name only:
{"company_name": "Linear"}
Output
One flat row per input. Every field is always present; missing values are null.
| Field | Type | Description |
|---|---|---|
company_domain | String | Echoed from input, or null if not provided |
company_name | String | Echoed from input, then the canonical name from LinkedIn's JSON-LD, then a name derived from the domain (in that order of preference) |
linkedin_company_url | String | Full LinkedIn company URL, e.g. https://www.linkedin.com/company/stripe |
linkedin_slug | String | Slug only, e.g. stripe |
resolution_method | String | pattern_match / google_search / not_found / error |
confidence | String | high / medium / low |
slug_mismatch | Boolean | true when the resolved slug differs from the slug derived from the domain |
facebook_url | String | Facebook page URL, or null if not found |
instagram_url | String | Instagram profile URL, or null if not found |
twitter_url | String | X (Twitter) profile URL, or null if not found |
youtube_url | String | YouTube channel URL, or null if not found |
employee_count_approx | String | Exact employee count from LinkedIn's JSON-LD, formatted with thousands separators (e.g. "15,356"). Field name kept for Clay column compatibility; the value is now an exact integer, not a range. Null if missing. |
industry | String | Industry label from LinkedIn's About section (e.g. "Financial Services"). Null if the company has not filled it in. |
hq_location | String | Headquarters as "City, State, Country" from LinkedIn's JSON-LD address. Null if missing. |
follower_count | String | LinkedIn follower count with thousands separators (e.g. "312,997"). Null if missing. |
company_description | String | Company description from LinkedIn's JSON-LD, capped at 500 characters. Null if missing. |
run_date | String | ISO timestamp of run |
Confidence and resolution_method explained
resolution_method tells you how the URL was found:
pattern_match: slug derived from the domain, validated directly against LinkedIn. Fastest and most reliable.google_search: URL found via web search. The output value staysgoogle_searchfor Clay column compatibility; the search engine is actually DuckDuckGo.not_found: neither method returned a result.error: no valid input was provided.
confidence tells you how much to trust the result:
high: a pattern_match hit (validated directly against LinkedIn), or a web search result that validates against LinkedIn and whose slug closely matches the domain.medium: a web search result that validates against LinkedIn but whose slug is only a loose match to the domain. Worth a quick review before using.low: no result, a result that did not validate, or an error state.
Use confidence as a Clay view filter. Pass high rows straight to enrichment. Route medium, not_found, and any rows with key firmographic fields missing to manual review.
Social URLs
Facebook, Instagram, X (Twitter), and YouTube company URLs come from a single Brave Search query that anchors each result to the platform's domain via a site: restriction. This avoids cross-platform false positives, for example a "share on LinkedIn" link inside a Facebook result. When a company does not maintain a profile on a platform, that field returns null for that platform.
Firmographics
Firmographics come from the public LinkedIn company page after the URL resolves. The actor parses the Organization JSON-LD block (schema.org @type: Organization) for canonical fields:
employee_count_approx: exact integer fromnumberOfEmployees.value, formatted with thousands separators.hq_location: "City, State, Country" built from the JSON-LDaddress(PostalAddress).company_description: full description, capped at 500 characters.company_name: canonical name (used when nocompany_namewas supplied as input).
follower_count is regex-extracted from the rendered page text. industry is pulled from the page's "About" section via LinkedIn's stable data-test-id="about-us__industry" marker.
All fields are nullable. Smaller companies that omit data on their LinkedIn page will return null for the missing fields, which is normal.
slug_mismatch
slug_mismatch is true when the resolved LinkedIn slug differs from the slug derived from the domain. brex.com derives the stem brex, but the live page is /company/brexhq, so slug_mismatch is true. It is not an error; it is a quality flag that tells you the resolver landed on a non-obvious slug. Useful when spot-checking a batch.
Sample output
brex.com, a non-obvious slug with full firmographics and socials:
{"company_domain": "brex.com","company_name": "Brex","linkedin_company_url": "https://www.linkedin.com/company/brexhq","linkedin_slug": "brexhq","resolution_method": "pattern_match","confidence": "high","slug_mismatch": true,"facebook_url": "https://www.facebook.com/BrexHQ","instagram_url": "https://www.instagram.com/brexhq","twitter_url": "https://www.x.com/brexhq","youtube_url": "https://www.youtube.com/@BrexHQ","employee_count_approx": "1,859","industry": "Financial Services","hq_location": "San Francisco, California, US","follower_count": "312,997","company_description": "Brex is the intelligent finance platform built for speed and control, empowering founders and finance teams to spend smarter and move faster globally with intuitive corporate cards, banking, expenses, and travel...","run_date": "2026-05-28T07:34:50.730Z"}
Reliability and known failure modes
Every field is best-effort. When a source is blocked, rate-limited, or simply does not carry the data for a given company, the field returns null rather than a guess. Use confidence and slug_mismatch as your primary trust signals in Clay.
| Field(s) | Source | How it can fail | Likelihood | What the actor does about it |
|---|---|---|---|---|
linkedin_company_url, linkedin_slug, resolution_method, confidence, slug_mismatch | HEAD validation against LinkedIn for up to nine slug variants; DuckDuckGo fallback when no variant matches | Renamed or recently deleted LinkedIn pages stop validating; obscure companies may have no matching slug and no search result | Low for established companies; higher for newly renamed or unknown companies | 5 HEAD attempts with residential IP rotation; web search fallback; confidence and slug_mismatch flag uncertain cases |
company_name, company_description, employee_count_approx, hq_location | Organization JSON-LD on the public LinkedIn company page (schema.org @type: Organization) | Page blocked by LinkedIn for a given proxy IP (transient); a company omits the field on its profile (rare for name / description, more common for numberOfEmployees); LinkedIn drops JSON-LD entirely (low probability) | Low under normal conditions; smaller companies more likely to have a null employee count | 5 page GET attempts with residential IP rotation; falls back to a Bing snippet for company_name and company_description when the LinkedIn page is unrecoverable |
follower_count | Regex over the rendered "X followers" text on the LinkedIn page | LinkedIn changes the visible label format or serves a localized non-English variant | Low; the follower display has been stable for years | Same retry contract as the rest of the page fetch |
industry | The page's "About" section, located via the stable data-test-id="about-us__industry" marker | Smaller companies leave Industry blank on their profile; LinkedIn could redesign the About section markup | About 80% fill rate for established companies; null for companies that have not completed their About section | Same retry contract; field is explicitly nullable so a missing value never blocks downstream Clay logic |
facebook_url, instagram_url, twitter_url, youtube_url | Brave Search single combined site:facebook.com OR site:instagram.com OR ... query | The company does not maintain a profile on one or more platforms; Brave rate-limits the proxy pool; Brave returns a fan-page or aggregator handle for a very generic company name | Per-platform null is common (most companies do not run all four); per-row total null is rare | 5 Brave attempts with residential IP rotation; the site: restriction anchors results to the correct platform domain so cross-platform false positives are filtered |
Structural risks
Two longer-term risks worth knowing about.
- LinkedIn page structure can change. The actor uses LinkedIn's most stable contracts: schema.org JSON-LD (Organization, numberOfEmployees, address) and explicit
data-test-idattributes (the QA-stable markers LinkedIn maintains for its own tests). Both are less likely to change than CSS class names or DOM positions. If LinkedIn ships a major About-section rewrite,industryis the most likely casualty,follower_countsecond; the JSON-LD fields are the most resilient. Any breakage shows up asnull, never as a wrong value. - Search engines can re-block. Bing, Brave, and DuckDuckGo all rate-limit aggressively and occasionally flag entire proxy pools. The retry-with-IP-rotation contract defeats the common case; persistent pool-wide blocks are the rare-but-real failure mode. When a search engine is fully blocked, the affected fields return
null. The LinkedIn URL itself still resolves via pattern matching, which only touches LinkedIn directly.
Recommended Clay practice
- Treat every field as nullable. Gate downstream logic on presence (
field is not empty) rather than assuming every row has every field. - Use
confidenceandslug_mismatchas your trust signals on the LinkedIn URL. - For mission-critical rows, route
mediumandlowconfidence, and any rows with key fields null, to a manual review queue rather than directly into an outbound sequence. - A sustained pattern of missing values for a single field across many rows (for example, every row missing
industryfor a week) usually means a provider-side change worth flagging.
Clay Table Template
A pre-built Clay table template is available with the enrichment column, formula columns, and views ready to use.
The template includes:
- A Run Apify Actor enrichment column wired to mambalabs/domain-to-linkedin-url-resolver
- Formula columns for linkedin_company_url, confidence, slug_mismatch, social URLs, and firmographic fields
- A run condition gating on rows where linkedin_company_url is empty (fallback enrichment pattern)
- A view filter on confidence = high
Manual setup
Use this actor as a fallback enrichment column in any Clay table where linkedin_company_url is empty after native enrichment.
- Add a formula column:
needs_linkedin={{linkedin_company_url}}is empty. - Add an Apify enrichment column. Search for
domain-to-linkedin-url-resolver. - Map
company_domainto your domain column. Optionally mapcompany_nameto your company name column for better accuracy. - Set run condition:
needs_linkedinequalstrue. - Map output fields to new columns:
linkedin_company_url,confidence,slug_mismatch, the social URLs, and the firmographic fields you want. - Add a view filter:
confidenceequalshigh.
This runs only on rows where Clay native enrichment failed, keeping credit usage low.
Pricing
$0.006 per result. Pay per event, billed per domain processed. No subscription, no seat license, no contract.
| Volume | Cost |
|---|---|
| 100 domains | $0.60 |
| 1,000 domains | $6.00 |
| 10,000 domains | $60.00 |
We recently reduced pricing across the Mamba Labs actor suite to bring more value to GTM teams running enrichment at scale.
Known Limitations
- Renamed or recently deleted LinkedIn pages may stop validating until the actor's slug heuristics catch up.
- Smaller companies often omit
industry,employee_count_approx, orhq_locationon their LinkedIn profile; these fields returnnullrather than a guess. - Search engines (Bing, Brave, DuckDuckGo) can rate-limit entire proxy pools. The 5-attempt residential retry contract defeats the common case, but persistent pool-wide blocks will null out the affected fields.
- Pattern matching requires a domain; name-only inputs skip straight to the web search fallback and tend to land at
mediumconfidence more often.
Issues and Feature Requests
Found a bug or want to request a feature? Open an issue in the Issues tab above. Response time: typically within 48 hours.
Related Actors
All Mamba Labs actors output flat, Clay-ready JSON. Use them together or individually.
- GTM Hiring Signal Scraper, $0.05/result. Detects GTM hiring activity on Greenhouse, Lever, and Ashby. Returns role counts, signal tags, and velocity tracking.
- GTM Tech Stack Signal Enrichment, $0.015/result. Detects CRM, sequencer, and marketing automation from a company's public-facing scripts. Flat boolean output.
- GTM Signals Aggregator, $0.09/result. Runs hiring and tech stack detection in one call. Returns a composite score, recommended action, and plain-English summary.
- Job Board Keyword Signal Scanner, $0.05/result. Scans Greenhouse, Lever, Ashby, Workday, and Rippling for any role category you define. GTM, Engineering, Finance, or custom keywords.
- ICP Fit Scorer, $0.05/result. Scores companies against your ICP using weighted signals. Returns icp_score 0-100, icp_tier A-D, and per-signal breakdown.
Use with MCP (AI Agents)
This actor is callable as a tool over MCP (Model Context Protocol) by AI clients like Claude Desktop, Cursor, VS Code (GitHub Copilot), Windsurf, and any other MCP-compatible client. Apify hosts the MCP server at mcp.apify.com, so no custom server code is needed.
What this actor does in an MCP context
Resolves a single company domain (or name) to its LinkedIn company page URL and returns a flat row of firmographics: canonical company name, employee count, industry, HQ location, follower count, description, and social URLs (Facebook, Instagram, X, YouTube). Each result includes a resolution_method and confidence rating so an agent can decide whether to trust the row, retry, or route to manual review. Good for cheap, high-volume LinkedIn lookups inside an agent workflow.
Example prompts:
- "Find the LinkedIn company page for stripe.com and tell me its employee count and HQ."
- "What is the LinkedIn URL for Brex, and is the slug a non-obvious one?"
- "Resolve linear.app to a LinkedIn company profile and pull its industry, follower count, and social URLs."
Supported MCP clients
Claude Desktop, Cursor, VS Code (GitHub Copilot), Windsurf, and any MCP-compatible client.
Setup: Hosted server (recommended)
Add this entry to your MCP client config. The OAuth variant prompts you to authorize on first connect, so no token sits in your config file.
OAuth (recommended):
{"mcpServers": {"mamba-labs-linkedin-resolver": {"url": "https://mcp.apify.com?tools=mambalabs/domain-to-linkedin-url-resolver"}}}
Bearer token:
{"mcpServers": {"mamba-labs-linkedin-resolver": {"url": "https://mcp.apify.com?tools=mambalabs/domain-to-linkedin-url-resolver","headers": {"Authorization": "Bearer YOUR_APIFY_TOKEN"}}}}
Setup: Full Mamba Labs GTM Suite
Load all 6 Mamba Labs GTM actors as tools in a single MCP server entry.
OAuth:
{"mcpServers": {"mamba-labs-gtm-suite": {"url": "https://mcp.apify.com?tools=mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/gtm-signals-aggregator,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-fit-scorer"}}}
Bearer token:
{"mcpServers": {"mamba-labs-gtm-suite": {"url": "https://mcp.apify.com?tools=mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/gtm-signals-aggregator,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-fit-scorer","headers": {"Authorization": "Bearer YOUR_APIFY_TOKEN"}}}}
Setup: Local server (for development and testing)
npx @apify/actors-mcp-server --tools mambalabs/domain-to-linkedin-url-resolver
Full suite:
npx @apify/actors-mcp-server --tools mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/gtm-signals-aggregator,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-fit-scorer
What the output looks like
Flat JSON, one row per input domain, well under 2KB. Every field is always present; missing values are null. The most useful fields for an agent:
linkedin_company_url: full LinkedIn company URL (e.g.https://www.linkedin.com/company/stripe).linkedin_slug: slug only (e.g.stripe).company_name: canonical name from LinkedIn's JSON-LD, falling back to the input or a domain-derived name.resolution_method:pattern_match,google_search,not_found, orerror.confidence:high,medium, orlow. Use this to gate downstream actions.employee_count_approx,industry,hq_location,follower_count: firmographics pulled from the public LinkedIn page.facebook_url,instagram_url,twitter_url,youtube_url: social profile URLs.
Billing
MCP runs use the same pay-per-event pricing as direct API or Console runs. Each successful result costs $0.006.
Part of the Mamba Labs GTM Suite
This actor is part of the Mamba Labs GTM Suite. See all 6 actors at https://apify.com/mambalabs
Built by Mamba Labs