Datacircle

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 like https://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:

The HTTP API (Headers) account
FieldValue
Account nameDatacircle
KeyAuthorization
ValueToken, 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://api.datacircle.dev/me/api-key/reset/ 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:

The Up2Data column's settings
SettingValue
Column nameUp2Data
MethodPOST
Endpointhttps://api.datacircle.dev/v1/profiles/enrich
Header accountDatacircle
HeadersX-Data-Provider: up2data
Body{"url": "/LinkedIn URL"}: type / and pick your LinkedIn URL column
Retry on failureoff
Run settingsAuto-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-Type 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.getCellErrorMessagePreview 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:

The Fetchin column's settings
SettingValue
Column nameFetchin
MethodGET
Endpointhttps://api.datacircle.dev/api/v1/profile
Query string parametersprofileUrlOrUrn: /LinkedIn URL, picked with /
Header accountDatacircle
HeadersX-Data-Provider: fetchin
Custom rate limitRequest Limit 5, Duration (in ms) 1000
Retry on failureon, Clay's default
Run settingsAuto-run on, and Only run if String({{Up2Data error}} ?? "").includes("429")

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}}?.title

Each 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

Up2Data's and Fetchin's responses
AnswerWhat it meansCostIn your table
Up2Data 200the profile$2.375 per 1,000Clay fills the four columns
Up2Data 422Up2Data can't reach that profile: private or deletedfreeUp2Data's cell fails, and Fetchin doesn't run
Up2Data 400not a LinkedIn profile URL: a company page or a malformed URLfreeUp2Data's cell fails
Up2Data 429Up2Data's daily limit, or its rate limitfreeUp2Data's cell fails, and Fetchin runs
Fetchin 200the profile$1.485 per 1,000Clay fills the four columns
Fetchin 404 with PROFILE_NOT_FOUNDFetchin can't find that profile: private or deleted$1.485 per 1,000: Fetchin bills the lookupFetchin's cell fails
Fetchin 400not a LinkedIn profile URL. At Up2Data's daily limit, our API answers 429 without sending the URL to Up2Data, so Fetchin checks it firstfreeFetchin's cell fails
any other401: 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 sharefreethe cell fails
no answerClay stopped waiting before our API answered. Ours can take up to 45 seconds, and Clay doesn't publish its timeoutfree unless Up2Data or Fetchin answeredthe 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:

Our price per 1,000 profiles and daily limit, by provider
Up2DataFetchin
Per 1,000 found$2.375$1.485
Per 1,000 not foundfree$1.485
Daily limit421 profiles per accountnone

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}}?.jobTitle.

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://api.datacircle.dev/v1/profiles/enrich, with the headers Authorization: Token <your key> and X-Data-Provider: up2data. Past Up2Data's daily limit, add a second HTTP API column that sends the URL to Fetchin: GET https://api.datacircle.dev/api/v1/profile?profileUrlOrUrn=<the profile's LinkedIn URL>, with X-Data-Provider: fetchin.

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
Ask AI about Datacircle

Each opens with our question