---
title: "How to Match a Company to Its Website and LinkedIn Profile from Claude Code"
description: "Turn name-only CRM rows into a {business_id, canonical website, LinkedIn profile} triple from Claude Code using Explorium's match and firmographics endpoints. Two API calls, 50 rows per batch."
canonical: "https://www.explorium.ai/blog/data-enrichment/match-company-website-linkedin-claude-code/"
last-updated: "2026-07-19"
---

# How to Match a Company to Its Website and LinkedIn Profile from Claude Code

> Turn name-only CRM rows into a {business_id, canonical website, LinkedIn profile} triple from Claude Code using Explorium's match and firmographics endpoints. Two API calls, 50 rows per batch.

- Canonical URL: https://www.explorium.ai/blog/data-enrichment/match-company-website-linkedin-claude-code/
- Last updated: 2026-07-19

RevOps and SalesOps teams inherit CRM records that are just a company name and nothing else. Sales Nav needs a LinkedIn URL. Outbound tools need a domain. Dedup workflows need both. This guide shows how to turn a name-only row into a canonical `{business_id, website, linkedin_profile}` triple from inside Claude Code using two Explorium endpoints.

## What This Playbook Solves

The specific problem: an account row shows up as `Acme Corporation` with no website, no LinkedIn URL, no domain, no country. Sales Nav can't be pointed at it. The outbound tool can't verify the mailing domain. Dedup rules can't collapse it against an existing `acme.com` record. Every downstream system needs the same two identifiers — canonical website and LinkedIn company URL — but the CRM only has the name.

### Why a two-call flow, not one

Explorium's match endpoint is entity resolution: given fuzzy inputs, it decides which record you meant and returns a canonical `business_id`. It does not return the canonical website and LinkedIn URL as fielded strings. That is by design — match is fast and its only job is anchoring. To get the canonical fields for write-back, you enrich firmographics on the returned `business_id`. Two calls, one result: `{business_id, website, linkedin_profile, name}`.

## Prerequisites

An Explorium API key in your Claude Code project. Put it in `.env` and never commit the file.

[code example — see docs.explorium.ai]

Every call sends the key in the `api_key` header, not `Authorization: Bearer`.

## Step 1, Standardize the Input

Ask Claude Code to normalize your input file. For every row, keep the original CRM account ID, the raw name, and any partial identifiers you do have (a website even if malformed, a LinkedIn URL if present). Lowercasing names, trimming trailing `, Inc.` / `Ltd.`, and normalizing domains (drop `http(s)://` and `www.`) raises match confidence 5-15% on messy CRM exports.

## Step 2, Match to a Canonical business_id

Batch up to 50 businesses per call. Send whatever identifiers you have — name is enough on its own; adding website or LinkedIn URL sharply raises accuracy.

[code example — see docs.explorium.ai]

The response preserves input order. Each row in `matched_businesses[]` returns a `business_id` or `null` if the row could not be resolved. Rows with a `business_id` proceed to Step 3; rows with `null` go to `unmatched.csv` for manual review.

### How the matcher decides

- Name plus website triggers smart fuzzy logic on the name using the website as an anchor. This is the highest-confidence combination and Explorium's recommended input shape.
- Website alone is the fallback path. Domains are unique across organizations, so this is reliable when the name is missing or noisy.
- Name alone triggers fuzzy resolution without a domain anchor. It is the weakest input and returns the highest share of null matches. Route these to review before writing back.
- LinkedIn company URL is accepted as an additional identifier and can disambiguate similarly-named companies across markets.

## Step 3, Enrich Firmographics to Return Canonical Website + LinkedIn

Pass the resolved `business_id` batch to the firmographics bulk enrich endpoint. This is the call that returns the canonical fields you write back to the CRM.

[code example — see docs.explorium.ai]

### Fields returned that matter for this workflow

Firmographics enrichment fields for the website + LinkedIn match workflowFieldTypeUse`business_id`stringAnchor for write-back to CRM`name`stringCanonical company name; compare against CRM name for a dedup flag`website`string (URI)Canonical company website; primary output`linkedin_profile`string (URI)Canonical LinkedIn company page URL; primary output`linkedin_industry_category`stringLinkedIn's own industry classification; useful for routing and segmentation`country_name`stringOptional cross-check against CRM country if present

## Step 4, Assemble the Triple and Split Output

Join the match response to the enrichment response on `business_id`, then join back to your original CRM row on `crm_id`. Produce two files: `matched.csv` with the canonical triple for write-back, and `unmatched.csv` with rows the match endpoint could not resolve.

[code example — see docs.explorium.ai]

## Step 5, Apply Write-Back Rules

The canonical triple looks tempting to overwrite blindly. Do not. Apply field-level rules that distinguish filling a blank field from changing a populated one.

- **Blank website in CRM, canonical website returned:** fill automatically.
- **Populated website in CRM matches canonical:** no-op.
- **Populated website in CRM differs from canonical:** route to review; do not overwrite. Domain drift is often a rebrand or a subsidiary, not a bad record.
- **Blank LinkedIn URL in CRM, canonical URL returned:** fill automatically.
- **Populated LinkedIn URL in CRM differs from canonical:** route to review.
- **Multiple CRM rows resolve to the same `business_id`:** dedup candidate; flag for merge, do not write back until an owner approves.

## Step 6, Batch Sizing and Rate Limits

Match accepts up to 50 businesses per call. Firmographics bulk enrich accepts up to 50 `business_id`s per call. Explorium's default rate limit is 200 queries per minute per API key, and bulk endpoints count each entity in the payload as a separate query. Two calls of 50 rows each = 100 queries. Under the default limit, a Claude Code loop can process 100 rows per minute end to end. Enterprise customers on higher tiers should confirm their per-account ceiling before turning up parallelism.

## Common Variations

### Reverse: LinkedIn URL in, everything else out

Send the LinkedIn URL as `linkedin_url` in the match payload. Same two-call flow returns the canonical website and name.

### Website in, LinkedIn out

Send the domain as `website` in match. Firmographics enrich returns the canonical LinkedIn profile.

### Batch mode from a Trigger.dev task or GitHub Action

Wrap the two-call flow in a scheduled task, store the resolved `business_id` on the CRM record, and skip the match call on subsequent runs. Storing `business_id` once cuts credit spend on refresh cadences by roughly half.

## Why This Belongs in Claude Code and Not a Chat Session

Claude chat is fine for spot-checking a handful of records. It is not the right surface for a repeatable dedup, Sales Nav prep, or CRM identity cleanup workflow. Claude Code brings the file handling, ordered joins across two API responses, confidence-driven routing, and structured CSV output that make this workflow safe to run at 5,000 rows or 50,000. The Explorium API supplies the entity resolution. Claude Code supplies the surrounding logic.

## Frequently Asked Questions

### How do I match a company name to its canonical website and LinkedIn profile from Claude Code?

Use two Explorium endpoints in sequence. First, `POST /v1/businesses/match` resolves the fuzzy input (name, or name + website, or LinkedIn URL) to a canonical `business_id`. Second, `POST /v1/businesses/firmographics/bulk_enrich` returns the canonical `website` and `linkedin_profile` fields for that `business_id`. Both endpoints accept up to 50 rows per call.

### Why does the match endpoint not return the canonical website and LinkedIn URL directly?

The match endpoint's job is entity resolution: it decides which record you meant given fuzzy inputs and returns the anchor `business_id`. Returning full canonical fields would slow it down and duplicate the enrichment layer's job. Two calls keep matching fast and enrichment flexible — you can enrich only the fields you actually need for write-back.

### How accurate is name-only matching?

Name alone is the weakest input for Explorium's match endpoint because there is no domain to anchor the fuzzy resolution. Match accuracy climbs sharply when you include even a partial website or a LinkedIn company URL alongside the name. Route name-only rows that return low-confidence matches to a review file rather than writing them back to the CRM directly.

### How many rows can I match and enrich in one Claude Code run?

Both the match endpoint and the firmographics bulk enrich endpoint accept up to 50 rows per call. Explorium's default rate limit is 200 queries per minute per API key, and each row in a bulk payload counts as one query. Two calls of 50 rows = 100 queries. In practice, Claude Code can process 100 rows per minute end to end under the default limit, and higher throughput on enterprise-tier accounts.

### What do I do with rows that return no match?

Route them to a separate `unmatched.csv` output file with the original input and a reason column. Do not write null values back to the CRM — a null on a populated CRM field is a regression, not an update. Common reasons: name-only input with a very common company name, non-Latin script the fuzzy matcher struggled with, or a defunct entity. Re-run these with additional identifiers (a partial website, a country code, a LinkedIn URL) before falling back to manual review.
