LinkedIn profiles in Clay: enrich rows with the HTTP API column, no Data Credits
Your Clay table has a LinkedIn profile URL in each row, and you want the person's job title, company, location and headline in the same row. With Clay's own LinkedIn enrichment, you pay for each profile in Data Credits: 0.5 a profile in its help doc's example, plus an Action. An HTTP API column that calls an API with your own key takes an Action and no Data Credits.
Datacircle is a data co-op. Step 1: Query your favorite B2B data APIs through us. Same request, same price, no markup. Step 2: You're DONE. Every morning, you get the flat file of your data plus everyone else's. Right now we have 3 live LinkedIn profile APIs that we trust: Up2Data, HarvestAPI and Fetchin.
You get the profile back from one HTTP API column, at $2.375 per 1,000 profiles Up2Data finds, and you pay nothing for a profile it can't find. Past Up2Data's daily limit, a second HTTP API column calls Fetchin, at $1.485 per 1,000. Four formula columns show the job title, company, location and headline. Clay marks the cell of a private or deleted profile as failed and goes on with the other rows. You send the provider's own request to api.datacircle.dev, with your Datacircle key. That's the only change.
We sent both requests to api.datacircle.dev with a wrong key: the API answered 401 to each, at no charge. We ran the formulas below in Node.js against a stand-in for each answer. We have no Clay account, so we haven't run this in a Clay table. We took each Clay setting here from Clay's docs.
Before you start
- A Clay plan with HTTP API integrations: Growth or Enterprise. Clay leaves them out of Free and Launch, as its pricing page shows. Growth is $495 a month, or $446 a month if you pay yearly, with 40,000 Actions a month.
- A Datacircle API key: Log in at datacircle.dev/login with your work email. Your API key is on the page once you're in. You get a $5 credit, enough for 2,105 profiles through Up2Data.
- A column named
LinkedIn URL, holding URLs likehttps://.www. linkedin. com/ in/ williamhgates
Save your Datacircle key in Clay
Add an enrichment, pick HTTP API, and open the Configure tab. Under Select header account, click + Add account and add one header:
| Field | Value |
|---|---|
| Account name | Datacircle |
| Key | Authorization |
| Value | Token, a space, then your key |
Clay encrypts the account and keeps it for your workspace, and you use it in both columns below. If you type the key in a column's Headers field instead, anyone who can see the column reads it in plain text. To change the key, edit the account once, under Settings, then Connections. Anyone in your workspace can pick the account for a column of their own, and you pay for each call they make: only Clay's Enterprise plan lets you choose who can use a connection. If your Datacircle key leaks, send a POST to https:// with it, as our quickstart shows: you get a new key, and the old one stops working.
The Up2Data column
In the same HTTP API panel, set:
| Setting | Value |
|---|---|
| Column name | Up2Data |
| Method | POST |
| Endpoint | https:// |
| Header account | Datacircle |
| Headers | X-Data-Provider: up2data |
| Body | {"url": "/LinkedIn URL"}: type / and pick your LinkedIn URL column |
| Retry on failure | off |
| Run settings | Auto-run on, and Only run if !!{{LinkedIn URL}} |
The column sends the same request as this curl command, which you can run in a terminal to check your key:
curl -X POST "https://api.datacircle.dev/v1/profiles/enrich" \
-H "Authorization: Token $DATACIRCLE_API_KEY" \
-H "X-Data-Provider: up2data" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.linkedin.com/in/williamhgates"}'Clay sets the Content header itself. Pick the column with /: Clay's docs say a column name typed as plain text goes to the API as that text, not the row's URL. Retry on failure is on by default and resends a call at once after a 429. At Up2Data's daily limit, that second call gets the same 429, so turn Retry on failure off: the 429 then goes to the Fetchin column. The run condition skips rows with no URL, and auto-run fills each new row. Clay lets you test the column on one row before the whole table, and we bill that call like any other.
Past Up2Data's daily limit: the Fetchin column
Add a formula column named Up2Data error, with the first formula of the next section. Clay's Clay. gives a failed cell's error, and nothing for a call that worked. Clay's docs show a 429 as "Clay received a 429 error from the API". Then add a second HTTP API column:
| Setting | Value |
|---|---|
| Column name | Fetchin |
| Method | GET |
| Endpoint | https:// |
| Query string parameters | profileUrlOrUrn: /, picked with / |
| Header account | Datacircle |
| Headers | X-Data-Provider: fetchin |
| Custom rate limit | Request Limit 5, Duration (in ms) 1000 |
| Retry on failure | on, Clay's default |
| Run settings | Auto-run on, and Only run if String({{Up2Data error}} ?? ""). |
Fetchin takes 5 requests a second from all our customers together. The rate limit keeps this column from sending more, and Clay retries a 429 once. Clay checks the run condition each time Up2Data error changes, so Fetchin runs on a row once its Up2Data error holds a 429. Clay says its error text may change. If it does, the Fetchin column stops running, and the rows past Up2Data's daily limit stay failed at no charge, until you change the condition.
The formula columns
Add a Formula column for each name below, with its formula. Clay's formulas are JavaScript and take no Action. Type the formulas or pick each column with /:
Up2Data error
Clay.getCellErrorMessagePreview({{Up2Data}})
Job title
{{Up2Data}}?.data?.current_company?.title || {{Fetchin}}?.jobTitle
Company
{{Up2Data}}?.data?.current_company?.name || {{Fetchin}}?.companyName
Location
{{Up2Data}}?.data?.location?.raw || {{Fetchin}}?.location
Headline
{{Up2Data}}?.data?.headline || {{Fetchin}}?.titleEach of the last four takes Up2Data's field, or Fetchin's past the daily limit, and stays empty when neither found the profile. Clay's formula preview shows nothing for Up2Data error: the column fills once you save. Our LinkedIn Profile API page shows the profile's other fields, such as jobs and schools: click a cell of the Up2Data column to see them all.
Each API response: its cost and what your table shows
| Answer | What it means | Cost | In your table |
|---|---|---|---|
| Up2Data 200 | the profile | $2.375 per 1,000 | Clay fills the four columns |
| Up2Data 422 | Up2Data can't reach that profile: private or deleted | free | Up2Data's cell fails, and Fetchin doesn't run |
| Up2Data 400 | not a LinkedIn profile URL: a company page or a malformed URL | free | Up2Data's cell fails |
| Up2Data 429 | Up2Data's daily limit, or its rate limit | free | Up2Data's cell fails, and Fetchin runs |
| Fetchin 200 | the profile | $1.485 per 1,000 | Clay fills the four columns |
Fetchin 404 with PROFILE_ | Fetchin can't find that profile: private or deleted | $1.485 per 1,000: Fetchin bills the lookup | Fetchin's cell fails |
| Fetchin 400 | not a LinkedIn profile URL. At Up2Data's daily limit, our API answers 429 without sending the URL to Up2Data, so Fetchin checks it first | free | Fetchin's cell fails |
| any other | 401: your key is wrong. 402: your balance is too low. 502, 503 or 504: Up2Data or Fetchin failed. 429 from Fetchin: its rate limit, which all our customers share | free | the cell fails |
| no answer | Clay stopped waiting before our API answered. Ours can take up to 45 seconds, and Clay doesn't publish its timeout | free unless Up2Data or Fetchin answered | the cell fails |
Up2Data takes $1 a day per account (421 profiles), with a shared daily limit for all customers, then answers 429 until 00:00 UTC. HarvestAPI has no daily limit. Fetchin has no daily limit either. A call your balance can't cover answers 402. Add funds, from $5, on your dashboard.
Failed rows
Clay keeps running the other rows when a cell fails. Open Clay's Errored rows view, in the view menu at the top of the table, to see each row with a failed cell. Click a red cell to read its error. The view also lists rows where Up2Data failed with a 429 and Fetchin then filled the job title.
To rerun rows, select them, right click, and pick Run [N] rows. Rerun a 401 once you fix the key in the account, a 402 once you've added funds, a 502, 503 or 504, and Fetchin's 429. A cell with no answer may already be billed, if the provider answered after Clay stopped waiting: your balance shows the charge, and we bill a rerun like any other call. Don't rerun a 422 or a Fetchin 404: the profile is private or deleted, and Fetchin bills each lookup. For a 400, fix the URL in the row. With Clay's Keep existing results on, the default for a new table, auto-run reruns a failed cell when its row changes.
Cost per 1,000 profiles
We charge your balance the prices on our pricing page, with no markup:
| Up2Data | Fetchin | |
|---|---|---|
| Per 1,000 found | $2.375 | $1.485 |
| Per 1,000 not found | free | $1.485 |
| Daily limit | 421 profiles per account | none |
If 1,000 new rows come in one day and the providers find every profile, you pay us $1.86 at most: $1.00 for 421 through Up2Data and $0.86 for the other 579 through Fetchin. Fetchin costs less per profile found but bills profiles it can't find. Up2Data doesn't, so trying Up2Data first costs less only when more than about 37% of your URLs are private or deleted. Your Clay table tries Up2Data first because you may not know how many of your URLs are gone. If the providers find more than about 63% of yours, Fetchin alone costs less: leave out the Up2Data and Up2Data error columns, give the Fetchin column the run condition !!{{LinkedIn URL}}, and keep only Fetchin's field in each formula, like {{Fetchin}}?..
Clay counts 1 Action for each run of an HTTP API column and no Data Credits. Clay runs the Up2Data column on each row, and past Up2Data's daily limit the Fetchin column too, so those 1,000 rows take up to 2,000 of the Growth plan's 40,000 Actions a month, more if Clay counts its retry of a 429 as another run: its docs don't say. Clay's own LinkedIn enrichment would take 500 Data Credits per 1,000 profiles, at least $25.00 at Clay's lowest Data Credit price, plus the Actions.
The same call in n8n: LinkedIn profiles in n8n. In a Zap: LinkedIn profiles in Zapier. In a Make scenario: LinkedIn profiles in Make. In an Airtable base: LinkedIn profiles in Airtable. Clay's plans next to our prices: Clay alternative. Other vendors' prices per 1,000: LinkedIn profile API pricing compared.
Questions
Can Clay enrich LinkedIn profiles without Data Credits?
Yes, with an HTTP API column that calls a LinkedIn profile API with your own key. Clay's pricing page says a run with your own API key "will count as one Action, but no Data Credit will be used". With our API: POST {"url": "<the profile's LinkedIn URL>"} to https://
Which Clay plans have the HTTP API column?
Growth and Enterprise, as Clay's pricing page says. Growth is $495 a month, or $446 a month if you pay yearly, with 40,000 Actions a month. We haven't run the HTTP API column on any Clay plan.
How much does Clay's own LinkedIn enrichment cost?
Clay's help doc on Actions and Data Credits gives an example: enriching a LinkedIn profile takes 0.5 Data Credits, plus an Action. Clay's Data Credits start at $0.05 each, so 500 Data Credits per 1,000 profiles cost at least $25.00. Through an HTTP API column, Clay charges the Action and no Data Credits, and we take our price from your Datacircle balance.
How much does it cost to enrich LinkedIn profiles in Clay?
$2.375 per 1,000 through Up2Data (a profile it can't find is free), $3.70 per 1,000 through HarvestAPI. $1.485 per 1,000 through Fetchin, a profile it can't find billed the same. HarvestAPI bills a profile it can't find at $2.30 per 1,000. Clay counts 1 Action for each HTTP API call, and we take each call's price from your Datacircle balance. Say Up2Data and Fetchin find 1,000 profiles in a day: you pay us at most $1.86 ($1.00 for 421 through Up2Data and $0.86 for 579 through Fetchin), and Clay counts an Action for each column run, up to 2,000.
Is there a daily limit?
Up2Data takes $1 a day per account (421 profiles), with a shared daily limit for all customers, then answers 429 until 00:00 UTC. HarvestAPI has no daily limit. Fetchin has no daily limit either.
Is each request live, or cached?
Live. Each request goes to the provider and gets the profile as it is today.
Do I need a LinkedIn account?
No. You send the profile's URL with your Datacircle key: no LinkedIn login, no cookies, no browser.
What happens when my balance runs out?
A call your balance can't cover answers 402. Add funds, from $5, on your dashboard.
Get started
Sign up at datacircle.dev with your work email: a $5 credit, that's 2,105 LinkedIn profiles at $2.375 per 1,000.
Sign up