All articles
Clearbit Enrichment API: Replacement Guide and Tutorial

Clearbit Enrichment API: Replacement Guide and Tutorial

Published Updated By GoodInbound team

Explore a Clearbit enrichment API replacement, follow an enrichment tutorial and connect lead research to Google Sheets or your CRM with GoodInbound.

The Clearbit enrichment API returned person and company data for an email or a domain. Clearbit no longer sells new standalone subscriptions, so replacing it means pointing the lookups your workflow already makes at a new enrichment API and mapping the results to the same CRM fields.

If you're enriching inbound leads at volume, GoodInbound Lead Screen is a drop-in fix that spends enrichment only on the real ones. It screens how every visitor fills in your form and stops automated list bombing, spam, and non-buyers sending unsolicited pitches from cluttering your pipeline, with five layers of protection:

  • Rules: domains you always accept or always block.
  • Behavior: how the form was filled in: typing, pasting, fill time, automation tells, and a built-in honeypot.
  • Network: data centers, VPNs, proxies, Tor, and bursts from one IP or device.
  • Identity: whether the email has a working inbox and isn't disposable or gibberish, and whether the phone number is real.
  • Message: the whole submission read for intent, so sales pitches, recruiters, and link offers are caught.

Every submission is classified into five types (lead, review, spam, junk, and bot), and only the real leads, based on your filters, are enriched and sent to your CRM. GoodInbound takes care of the entire flow end to end for you.

Use GoodInbound for free for up to 500 screened submissions a month.

GoodInbound's Lead Enrichment API researches people, companies and decision-makers from an email address, a name and company, a company or a phone number. It returns company details, the relevant people, recent company activity, estimated revenue and social profiles, including LinkedIn profiles for the business and its decision-makers. Use the results in your current CRM or save them as GoodInbound contacts.

This guide covers GoodInbound as a Clearbit enrichment API replacement, a contact-enrichment tutorial and a Google Sheets workflow for teams replacing Clearbit enrichment for Sheets. To see how it compares with other providers, read our Clearbit alternatives for lead and company enrichment.

Contact enrichment and company enrichment: what your team needs

A contact enrichment API helps you understand a person: their role, the company they work for and the context your team needs before following up. Company enrichment adds information about the business itself, such as its website, size, estimated revenue and recent activity.

These often belong in the same sales workflow. A lead’s job title helps you understand their responsibility; company information helps you understand the account. When researching a target company, you also need to know which people are relevant to the conversation.

GoodInbound supports both kinds of research through one enrichment API:

Starting point Research you can use
A lead’s email address or phone number Person and company information for qualification and follow-up
A company Business research and relevant decision-makers
A company with role filters People in the roles you want to reach, such as founders or heads of engineering
A name alongside email, company or phone Additional context to help identify the person you want to research

You do not need to create a GoodInbound contact before requesting enrichment. That lets you research a lead before deciding where to save or route the result.

GoodInbound as a Clearbit enrichment API replacement

GoodInbound combines contact enrichment and company enrichment with research your team can use in a conversation.

Find the people behind an account. Research relevant decision-makers and their roles, with LinkedIn profiles and other identifying information where available. For company requests, role filters help focus the research on the people your team wants to reach.

Understand the business. Company details, estimated revenue, company size and recent activity give your team context for qualification and account research.

Keep the sources with the findings. Supporting sources let your team review the research and follow up on information relevant to the account.

Clearbit enrichment tutorial: enrich a lead with GoodInbound

An inbound lead may already exist in your CRM, arrive through a form or enter a workflow in another application. Send the identifying details to GoodInbound and use the research in that same workflow.

1. Choose the lead to enrich

Start with the lead’s email address and add their name if you have it. Use your GoodInbound project ID and API key for the request. Keep create_contacts set to false when you want the results in your existing CRM or spreadsheet.

2. Send the enrichment request

This example researches a person from their name and email without saving a new contact. Replace the example identity with the lead you want to research:

Terminal
1curl -X POST \
2 "https://goodinbound.com/api/projects/$PROJECT_ID/enrichments" \
3 -H "Authorization: Bearer $GOODINBOUND_API_KEY" \
4 -H "Content-Type: application/json" \
5 -d '{
6 "name": "Alex Morgan",
7 "email": "alex@example.com",
8 "create_contacts": false
9 }'

The request needs at least one email, company or phone. A name, company website or LinkedIn URL provides additional context.

Retrieve the research result

A fresh request returns HTTP 202 and a job identifier. Copy that identifier from the response and use it in the GET request below. A cached request can return completed research immediately with HTTP 200.

Terminal
1curl --fail-with-body \
2 "https://goodinbound.com/api/projects/$PROJECT_ID/enrichments/$JOB_ID" \
3 -H "Authorization: Bearer $GOODINBOUND_API_KEY" \
4 --output enrichment-result.json

Read the returned status before using the findings. While research is still running, retrieve the same job again; do not submit another enrichment request. Once it finishes, the response contains company, people, cache, contact_creation, usage and warnings.

Put the findings on the right record

Keep person and company information separate when writing to your CRM:

Returned information Destination Example use
People and their identifying details in people The matching contact or lead Add a role, email finding and LinkedIn profile
Business findings in company The associated company or account Add company size, estimated revenue and recent activity
Supporting sources attached to the findings Research notes or source fields Let the next rep open the source behind a finding
warnings Review notes Keep an ambiguous match out of automatic routing

For a demo request, the result might be a Head of Engineering at a company in your target size range. Save the role on the contact, the size estimate on the account and the supporting references in research notes. Your existing routing rule can then assign the lead to the right sales owner.

Clearbit enrichment for Sheets: keep lead research in Google Sheets

Google Sheets can call an enrichment API through Apps Script. The workflow below sends the selected row to GoodInbound and writes the returned company and people records back to the sheet. It preserves the complete response so the sources remain available.

Set up the sheet and API credentials

Create a tab named Enrichment with these column headings:

Column Heading Purpose
A Email An email you already know; leave blank for company research
B Name Optional person name
C Company Company name; required when no email is supplied in this example
D Job ID Copy the identifier from an accepted request into this column
E Request ID Filled by the script to keep retries on the same request
F HTTP status The last API response code
G Research status The returned status
H Company result The returned company object as JSON
I People result The returned people records as JSON
J Full response The complete response, including sources and warnings
K Submitted input The identifiers used for that request

Open Extensions → Apps Script. In Project Settings → Script properties, add GOODINBOUND_API_KEY and GOODINBOUND_PROJECT_ID. Keep the sheet and its bound script restricted to teammates who should have access to that API key; do not put it in a cell.

Add the Apps Script

Paste the following into the script editor and save it. Reload the sheet to add the GoodInbound menu. The first run asks for the Google permissions needed to read the sheet and call the API.

JavaScript
1function onOpen() {
2 SpreadsheetApp.getUi().createMenu('GoodInbound')
3 .addItem('Request enrichment for selected row', 'requestEnrichment')
4 .addItem('Retrieve selected row result', 'retrieveEnrichment')
5 .addToUi();
6}
7
8function selectedLead() {
9 const sheet = SpreadsheetApp.getActiveSpreadsheet()
10 .getSheetByName('Enrichment');
11 const active = SpreadsheetApp.getActiveRange();
12 if (!sheet || !active || active.getSheet().getName() !== 'Enrichment'
13 || active.getRow() < 2 || active.getNumRows() !== 1) {
14 throw new Error('Select one lead row on the Enrichment tab.');
15 }
16 return { sheet: sheet, row: active.getRow() };
17}
18
19function callEnrichment(method, suffix, payload, requestId) {
20 const properties = PropertiesService.getScriptProperties();
21 const key = properties.getProperty('GOODINBOUND_API_KEY');
22 const project = properties.getProperty('GOODINBOUND_PROJECT_ID');
23 if (!key || !project) throw new Error('Set the two script properties first.');
24 const headers = { Authorization: 'Bearer ' + key };
25 if (requestId) headers['Idempotency-Key'] = requestId;
26 const options = {
27 method: method,
28 headers: headers,
29 muteHttpExceptions: true
30 };
31 if (payload) {
32 options.contentType = 'application/json';
33 options.payload = JSON.stringify(payload);
34 }
35 const response = UrlFetchApp.fetch(
36 'https://goodinbound.com/api/projects/' + encodeURIComponent(project)
37 + '/enrichments' + suffix,
38 options
39 );
40 const code = response.getResponseCode();
41 const text = response.getContentText();
42 let body;
43 try { body = JSON.parse(text); }
44 catch (error) { throw new Error('The API returned a non-JSON response: HTTP ' + code); }
45 if (code < 200 || code >= 300) {
46 throw new Error('HTTP ' + code + ': ' + (body.error || 'Request failed'));
47 }
48 return { code: code, body: body };
49}
50
51function writeResult(target, result) {
52 const body = result.body;
53 // Keep the original structure and sources instead of guessing nested fields.
54 const values = [
55 result.code,
56 String(body.status || ''),
57 JSON.stringify(body.company == null ? null : body.company),
58 JSON.stringify(body.people == null ? [] : body.people),
59 JSON.stringify(body)
60 ];
61 if (values.some(function(value) { return String(value).length > 45000; })) {
62 throw new Error('This result is too large for a sheet cell. Retrieve the job as JSON using the API.');
63 }
64 target.sheet.getRange(target.row, 6, 1, 5).setValues([
65 values.map(function(value) {
66 return typeof value === 'string' && /^[=+@-]/.test(value)
67 ? "'" + value : value;
68 })
69 ]);
70}
71
72function requestEnrichment() {
73 const target = selectedLead();
74 const sheet = target.sheet;
75 const row = target.row;
76 const input = sheet.getRange(row, 1, 1, 3).getDisplayValues()[0];
77 const payload = { create_contacts: false };
78 if (input[0].trim()) payload.email = input[0].trim();
79 if (input[1].trim()) payload.name = input[1].trim();
80 if (input[2].trim()) payload.company = input[2].trim();
81 if (!payload.email && !payload.company) {
82 throw new Error('Enter an email or company in the selected row.');
83 }
84 const serialized = JSON.stringify(payload);
85 const previous = sheet.getRange(row, 11).getValue();
86 if (previous !== serialized) {
87 sheet.getRange(row, 4, 1, 7).clearContent();
88 sheet.getRange(row, 5).setValue(Utilities.getUuid());
89 sheet.getRange(row, 11).setValue(serialized);
90 }
91 let requestId = String(sheet.getRange(row, 5).getValue());
92 if (!requestId) {
93 requestId = Utilities.getUuid();
94 sheet.getRange(row, 5).setValue(requestId);
95 }
96 const result = callEnrichment('post', '', payload, requestId);
97 writeResult(target, result);
98 if (result.code === 202) {
99 SpreadsheetApp.getUi().alert(
100 'Request accepted. Copy its job identifier from the full response in J'
101 + row + ' into D' + row + ', then use Retrieve selected row result.'
102 );
103 }
104}
105
106function retrieveEnrichment() {
107 const target = selectedLead();
108 const input = target.sheet.getRange(target.row, 1, 1, 3).getDisplayValues()[0];
109 const payload = { create_contacts: false };
110 if (input[0].trim()) payload.email = input[0].trim();
111 if (input[1].trim()) payload.name = input[1].trim();
112 if (input[2].trim()) payload.company = input[2].trim();
113 if (JSON.stringify(payload) !== target.sheet.getRange(target.row, 11).getValue()) {
114 throw new Error('This row has changed. Request enrichment for the updated lead first.');
115 }
116 const id = String(target.sheet.getRange(target.row, 4).getValue()).trim();
117 if (!id) throw new Error('Enter the returned job identifier in column D.');
118 writeResult(target, callEnrichment('get', '/' + encodeURIComponent(id)));
119}

Request, retrieve and use the row

Enter a lead in row 2 and select any cell in that row. Choose GoodInbound → Request enrichment for selected row. The script writes the API response into columns F–J.

If the request is accepted for research, copy its job identifier from the response into column D. Choose Retrieve selected row result to fetch that job. Repeat retrieval while its status is still running. This separate retrieval action avoids repeatedly submitting the lead for fresh research.

When research is complete, review the company and people records in H and I. Copy the relevant role, company details, email findings and source references into the columns your sales team uses. The complete response in J remains available for reference. For automatic field-by-field CRM sync, map those records to your own destination schema.

This is a custom Apps Script integration. It uses Google’s URL Fetch service and spreadsheet ranges, with one selected row per operation.

Research target accounts and find decision-makers

You can also start with a company when you have an account in mind but have not identified the people to contact.

For example, a team selling to engineering leaders can research a target company and focus on heads of engineering. A team working with founders can use a founder role filter. GoodInbound returns relevant people and supporting sources so the team can review the findings before outreach.

Save the results in your existing CRM, or enable optional contact creation to keep the people you find in GoodInbound.

Plan your Clearbit enrichment migration

Use the input your existing workflow already collects, then replace the enrichment request and map the completed findings to the same destination records. For a demo request, that might mean email in, person and company research out, followed by sales-owner assignment. For account research, start with the company and relevant roles.

Keep actions that depend on enrichment after the job completes. Keep your current contact identifiers when updating your CRM so the research attaches to the original lead. Use create_contacts: true only when you also want GoodInbound to save eligible people as contacts.

Bring enrichment into your existing workflow

GoodInbound brings research into your sales or inbound workflow through native integrations, including an MCP for your AI agents to take the automation further.

Use the enrichment API in your own application, connect research to the tools already in your pipeline, or let your AI agents access it through MCP. The purpose is the same: make person and company research available where your team qualifies leads and prepares its follow-up.

Reuse research when you revisit a lead

Enrichment results are cached for 30 days. Repeat requests that reuse the same research consume no additional enrichment credits, so you can return to an account or save its contacts later without repeating that research.

Saved contacts keep their enriched details and sources after the cache expires. If you need newer information, request fresh research.

Explore the GoodInbound Lead Enrichment API to connect person and company research to your workflow.

Frequently asked questions

What does a Clearbit enrichment migration involve?

Connect your existing lead or company identifiers to GoodInbound’s enrichment API, retrieve the completed research and map the findings to your CRM or application. Keep the lead-routing and follow-up actions that use that information connected to the completed result. You can continue using your current CRM without creating GoodInbound contacts.

Can I use GoodInbound as a Clearbit enrichment API replacement?

Yes. GoodInbound supports person and company research from email, company or phone inputs, with decision-maker discovery and optional contact creation. When replacing an existing integration, map the returned information to the fields your application or CRM uses.

How can I replace Clearbit enrichment for Sheets?

Connect your Google Sheet to GoodInbound’s API with Apps Script. Send each row’s lead identifiers for enrichment, retrieve the completed research and write the findings into output columns. The sheet can remain your working list; saving GoodInbound contacts is optional.

Does contact enrichment include company information?

Yes. GoodInbound researches both the person and their company, bringing information such as roles, company details and supporting sources into the same workflow.

Can I research a company without a person’s email?

Yes. Start with the company and optionally use role filters to focus on relevant decision-makers. An existing contact or a person’s email is not required for company research.

Are repeated enrichment requests charged again?

Requests that reuse cached research within 30 days consume no additional enrichment credits. Fresh research after expiry or an explicit refresh consumes credits.

Switch in 5 minutes

Setup with your agents