Google Sheets Integration

LinkedIn Enrichment in Google Sheets

Turn a column of names, emails, companies, or LinkedIn URLs into enriched rows — profile data, work emails, and company info — without leaving your spreadsheet. Install the official add-on for one-click LinkedIn lookups, or paste one short Apps Script function to reach all 20.

Official add-on, or paste a script
All 20 lookups
Free credits to start
From 1 credit a row
20
Lookups Available
~3s
Per Row
1–50
Credits per Row
25
Free Credits to Start
Two ways to do this
Both call the same API and cost the same credits. The add-on is easier to install; the script reaches all 20 lookups today.
Easiest

The official add-on

Install it from the Google Workspace Marketplace, paste your API key once, and enrich a column from a side panel. Nothing to paste into a script editor.
  • Finds LinkedIn profile URLs from a column of names and companies
  • Nothing to paste into a script editor — install, add your key, pick your columns
  • Works on a column at a time rather than cell by cell
  • One lookup for now. The other 19, and the extra matching columns, are in the next release — the script below already has all of them.
Install the add-on

The Apps Script function

Paste one function into Extensions → Apps Script and call =LINKFINDER() in a cell. Nothing to install, and the code is yours to change.
  • Works as a formula you can drag down a column
  • No add-on permissions to approve — useful where Workspace admins lock the Marketplace down
  • Edit it: change the output format, chain two lookups, write into several columns
  • Google can recalculate a formula on its own, which re-spends credits. Use the batch script for anything long.
Get the code
The Apps Script route, in 4 steps
Apps Script is built into every Google Sheet, so there is nothing to install. Prefer a panel to a formula? Install the add-on instead.

Get your API key

Sign up for free — your key is in your dashboard under Settings → API Key. New accounts start with 25 credits.

Open the Apps Script editor

In your sheet, go to Extensions → Apps Script. Delete the placeholder code and paste the function from the next section. Then add your key under Project Settings → Script Properties as LF_KEY — the script reads it from there, so it is never sitting in the code you might share.

Add your key and save

Replace YOUR_API_KEY with your key (or store it in Script Properties), then save the project.

Enrich with a formula

Back in the sheet, type =LINKFINDER(A2, "company_name_to_website") in a cell and drag it down.

Looking someone up by name? Pass the company, location and job title too — =LINKFINDER(A2, "lead_full_name_to_email", B2, C2, D2). "John Smith" on its own matches thousands of people; "John Smith Acme Berlin VP Sales" matches one, and costs exactly the same. For big lists, use the batch script below.

The code
Paste once into Apps Script. The custom function works in any cell; the batch script is for large columns. Both share the same lfCall helper, so paste the first block either way.
/**
 * Enrich a value with LinkFinder AI.
 *
 * @param {string} input     The cell to look up (name, email, company, or LinkedIn URL)
 * @param {string} type      The request type, e.g. "company_name_to_website"
 * @param {string} company   Optional. Name lookups only.
 * @param {string} location  Optional. Name lookups only.
 * @param {string} jobTitle  Optional. Name lookups only.
 * @customfunction
 */
function LINKFINDER(input, type, company, location, jobTitle) {
  if (!input || !type) return "";
  var cell = function (v) { return Array.isArray(v) ? cell(v[0]) : v; };
  var text = function (v) { return String(cell(v) == null ? "" : cell(v)).trim(); };

  var value = text(input);

  // The two name lookups take name + company + location + job title joined.
  // A bare "John Smith" matches thousands of people for the same price as one
  // that resolves, so send everything you have.
  if (type.indexOf("lead_full_name_") === 0) {
    // CRMs export "Doe, John". The lookup wants "John Doe".
    var flip = value.match(/^\s*([^,]{1,60}?)\s*,\s*([^,]{1,60}?)\s*$/);
    if (flip) value = flip[2] + " " + flip[1];
    value = [value, text(company), text(location), text(jobTitle)]
      .filter(String).join(" ");
  }

  return lfCall(type, value);
}

/** Shared by the formula and the batch script below. */
function lfCall(type, input) {
  var key = PropertiesService.getScriptProperties().getProperty("LF_KEY");
  if (!key) throw new Error("No API key. Project Settings \u2192 Script Properties \u2192 add LF_KEY.");

  var res = UrlFetchApp.fetch("https://api.linkfinderai.com", {
    method: "post",
    contentType: "application/json",
    headers: { Authorization: "Bearer " + key },
    payload: JSON.stringify({ type: type, input_data: input }),
    muteHttpExceptions: true
  });

  var code = res.getResponseCode();
  var data = JSON.parse(res.getContentText() || "{}");

  // These are NOT "not found" — surfacing them as such is how people burn an
  // afternoon wondering why every row came back empty.
  if (code === 401) throw new Error("API key rejected.");
  if (code === 402) throw new Error("Out of credits.");
  if (code === 429) throw new Error("Rate limited \u2014 wait a moment.");
  if (code >= 400) throw new Error(data.message || ("LinkFinder error " + code));

  // Some lookups answer with a job instead of a result and are never ready
  // immediately \u2014 linkedin_profile_to_linkedin_info always does.
  if (data.job_id) data = lfPoll(data.poll_url || ("https://api.linkfinderai.com/status/" + data.job_id), key);

  var result = data.result;
  if (result === null || result === undefined || result === "") return "Not found";

  // A provider failure can arrive dressed as a successful result.
  if (result && result.error) throw new Error("Provider error: " + (result.error.message || "unknown"));

  return typeof result === "object" ? JSON.stringify(result) : result;
}

function lfPoll(url, key) {
  for (var i = 0; i < 30; i++) {
    Utilities.sleep(3000);
    var r = UrlFetchApp.fetch(url, { headers: { Authorization: "Bearer " + key }, muteHttpExceptions: true });
    var d = JSON.parse(r.getContentText() || "{}");
    if (d.status && d.status !== "processing") return d.data || d;
  }
  throw new Error("Still running after 90s \u2014 use the batch script for this lookup.");
}
Per-cell vs batch: a =LINKFINDER() formula is perfect for a few rows, but Google Sheets can recalculate custom functions repeatedly — which re-spends credits and can hit script time limits on big sheets. For hundreds or thousands of rows, run the batch script instead: it processes each row once, skips rows already filled, and paces itself against rate limits.
What you can do in a sheet
Common enrichment jobs people run straight from Google Sheets.
🏢
Company name → website
Resolve a messy list of company names into clean domains and core company details, ready for outreach or routing.
✉️
Find work emails
Turn names and companies — or LinkedIn URLs — into verified-format work emails for your sequences.
👤
Enrich profiles
Add titles, employers, and profile details to a list of people so reps qualify faster.
🧹
Clean & dedupe CRM exports
Re-enrich an exported CRM list to fill gaps and refresh stale company and title fields before re-importing.
📊
Ad-hoc research
Quick one-off enrichment for a research sheet, a webinar list, or an event attendee export — no pipeline to build.
More ways to connect
Apps Script is the no-dependency option. These work too.
Apps Script
Built-in — custom function or batch
Make
Sheets trigger + HTTP module
Zapier
Sheets + Webhooks by Zapier
n8n
Sheets node + HTTP Request node
What each lookup costs
Credits per row, whichever route you use. A row is charged whether or not anything is found — the search runs either way. This table is generated from the API's own catalog, so it cannot drift from what you are billed.
LookupColumns it readsCredits per row
People
Find LinkedIn URL from Name
lead_full_name_to_linkedin_url
Full Name + Company (optional) + Location (optional) + Job Title (optional) 1
Find LinkedIn URL from Email
email_to_linkedin_url
Email Address 5
Find Email from Name
lead_full_name_to_email
Full Name + Company (optional) + Location (optional) + Job Title (optional) 7
Find Email from LinkedIn Profile
linkedin_profile_to_email
LinkedIn Profile URL 10
Get LinkedIn Profile Details
linkedin_profile_to_linkedin_info
LinkedIn Profile URL 10
Find Phone from LinkedIn Profile
linkedin_profile_to_phone
LinkedIn Profile URL 50
Companies
Find Company Email
company_name_to_email
Company Name 1
Find Company Employee Count
company_name_to_employee_count
Company Name 1
Find Company LinkedIn URL
company_name_to_linkedin_url
Company Name 1
Find Company Phone
company_name_to_phone
Company Name 1
Find Company Website
company_name_to_website
Company Name 1
Get Employee Count from LinkedIn Company
linkedin_company_to_employee_count
LinkedIn Company Page URL 1
List Employees by Company Domain
company_domain_to_employees
Company Domain 0.5 × employees
List Employees by Company Name
company_name_to_employees
Company Name 0.5 × employees
List Employees from LinkedIn Company
linkedin_company_to_employees
LinkedIn Company Page URL 0.5 × employees
Get LinkedIn Company Details
linkedin_company_to_linkedin_info
LinkedIn Company Page URL 6
Social
Get LinkedIn Post Reactions
linkedin_post_to_reactions
LinkedIn Post URL 1
Look Up an Instagram Profile
instagram_lookup
Instagram Handle or URL 1
Discovery
B2B Data Lookup (Any Input)
b2b_data_lookup
Company or Person Identifier 1
The name lookups are the ones to get right. lead_full_name_to_email is 7 credits a row whether it matches the person you meant or someone else with the same name. Send the company, location and job title alongside the name — it costs exactly the same and it is the difference between one match and thousands.
Frequently asked questions
Can I enrich LinkedIn data directly in Google Sheets?
Yes, two ways. Install the official add-on and enrich a column from a side panel, or add a custom function like =LINKFINDER() in the built-in Apps Script editor and use it as a formula. Both call the same API and cost the same credits.
Add-on or Apps Script — which should I use?
The add-on if you want the shortest path: install it, add your key, done — no code anywhere. It currently does one lookup, finding LinkedIn profile URLs from names. Choose Apps Script if you need any of the other 19, if you want a formula you can drag down a column, if you want to edit the code, or if your Workspace admin blocks Marketplace installs.
How much does it cost to enrich a sheet?
It depends on the lookup — from 1 credit a row up to 50. Resolving a company name is 1; finding an email from a name is 7; a mobile number from a LinkedIn profile is 50. The full table is above. A row is charged whether or not anything is found, because the search runs either way. New accounts start with free credits; see the pricing page.
Will a per-cell formula work for thousands of rows?
For a few rows, yes. For large sheets, use the batch script — Google can recalculate custom functions repeatedly, which re-spends credits and can hit time limits. The batch script processes each row once, skips rows already filled, and paces itself against rate limits.
What can I enrich from?
Depending on the request type: resolve a company name to its website, look up profile data, find work emails and contact details, or build lead lists from a plain-English description. You pick the job by changing the type field. Full list in the API documentation.
I look people up by name and keep getting the wrong person.
Send more than the name. The name lookups take a company, a location and a job title as well, and joining them costs nothing extra: =LINKFINDER(A2, "lead_full_name_to_email", B2, C2, D2), or point the add-on's panel at those columns. "John Smith" matches thousands of people; "John Smith Acme Berlin VP Sales" matches one. Names exported from a CRM as Doe, John are flipped to John Doe for you.
My run stopped part-way through a long sheet.
Google stops any Apps Script run at six minutes — roughly 400–600 rows. The add-on and the batch script both stop just before that, keep every answer already written, and skip filled rows next time, so running it again carries on from where it left off and costs nothing for the rows already done.
A cell says "Not found" — was I charged?
Yes. The search ran and returned nothing, and that costs the same as a hit. A cell reading ERROR: instead is a failure worth reading — a rejected key or an empty credit balance stops the whole run rather than writing the same message into every remaining row.
Is my API key safe in Apps Script?
Store it in Script Properties rather than hard-coding it in a cell. Anyone with edit access to the script can see it, so share carefully and rotate the key in your dashboard if it's ever exposed.

Enrich Your First Sheet Free

Get a free API key with 25 credits, paste the function, and enrich a column in minutes.

Get API Key Free View API Docs

Explore more in LinkedIn Data, Scraping & APIs

See the full topic → LinkedIn Data, Scraping & APIs hub

LinkedIn Post Scraper LinkedIn Profile Scraper API LinkedIn API LinkedIn Company Employees API LinkedIn Company Employees Finder LinkedIn Company Post Scraper