The LinkedIn company data API
Type a company and press the ball. Its full profile comes back as JSON: size, industry, headquarters, website and 14 more fields. A fresh lookup by LinkedIn company URL costs a tenth of a cent on our smallest pack, and half that from our cache.
10,000 lookups by LinkedIn company URL, or 5,000 by website domain, for $10. No subscription. 200 free credits, no card.
POST /v1/company
A real response from our cache. Free here; with a key it costs what the headers say.
curl https://api.happyfetch.net/v1/company --max-time 120 \
-H "Authorization: Bearer $HAPPYFETCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://www.linkedin.com/company/stripe/"}'const res = await fetch("https://api.happyfetch.net/v1/company", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HAPPYFETCH_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"url": "https://www.linkedin.com/company/stripe/"
}),
signal: AbortSignal.timeout(120_000),
});
const { data, meta } = await res.json();import os, requests
res = requests.post(
"https://api.happyfetch.net/v1/company",
headers={"Authorization": f"Bearer {os.environ['HAPPYFETCH_API_KEY']}"},
json={
"url": "https://www.linkedin.com/company/stripe/"
},
timeout=120,
)
body = res.json()- x-request-id
- Ties this call to its charge and to the data it returned. Quote it and we find it.
- x-credits-charged, x-credits-remaining
- What the call cost and what's left, on every billed call.
- x-cache, age
- Whether our cache answered, and how old the data is in seconds.
- The body
- Every field is always present, and
nullwhen it isn't known.
HTTP/1.1 200 OK x-request-id: b54a47f0-a532-4798-8500-78bffc17b8f0 x-credits-charged: 1 x-credits-remaining: 199 x-cache: HIT age: 847
{
"data": {
"logo": "https://media.licdn.com/dms/image/v2/D560BAQE2ZfJyfn-VCg/company-logo_200_200/B56ZlyKwpUKIAI-/0/1758557047806/stripe_logo?e=2147483647&v=beta&t=En4Hm6NDGbDTYCoOQ0Ko5Ne2gylx0WRb0yL2GlOeXBQ",
"name": "Stripe",
"phone": null,
"tagline": "Help increase the GDP of the internet.",
"industry": "Technology, Information and Internet",
"foundedOn": {
"year": 2010
},
"locations": [
{
"city": "South San Francisco",
"state": "California",
"country": "US",
"street1": "354 Oyster Point Blvd",
"street2": null,
"postalCode": "94080"
}
],
"linkedInId": "2135371",
"websiteUrl": "https://stripe.com",
"description": "Stripe builds programmable financial services. Millions of companies—from the world’s largest enterprises to the most ambitious startups—use Stripe to accept payments, grow their revenue, and accelerate new business opportunities. Headquartered in San Francisco and Dublin, the company aims to increase the GDP of the internet.",
"headquarter": {
"city": "South San Francisco",
"country": "US",
"street1": "354 Oyster Point Blvd",
"street2": null,
"postalCode": "94080",
"geographicArea": "California"
},
"linkedInUrl": "https://www.linkedin.com/company/stripe",
"specialities": [],
"backgroundUrl": "https://media.licdn.com/dms/image/v2/D563DAQFt98MykXcktg/image-scale_191_1128/B56Z352EMMKIAY-/0/1778013193531/stripe_cover?e=2147483647&v=beta&t=UwiZWbPrYkD77DpQmZIjVuuqKMCfyZ-e-YcHE336MlY",
"employeeCount": 16694,
"followerCount": 1767046,
"universalName": "stripe",
"employeeCountRange": {
"end": 10000,
"start": 5001
}
},
"meta": {
"request_id": "b54a47f0-a532-4798-8500-78bffc17b8f0",
"endpoint": "company",
"credits_charged": 1,
"credits_remaining": 199,
"cache": {
"status": "hit",
"age_seconds": 847,
"fetched_at": "2026-10-14T14:46:48.000Z",
"max_age_seconds": 604800
},
"content_hash": "sha256:502b3c5d7198efbd93977f19c6351230f53f4c7150635645975f264a9b241696",
"canonical": {
"slug": "stripe",
"id": "2135371"
}
}
}In the cache right now
Real profiles, fetched once and answered from our cache since. Open any of them to see its complete response. With a key, any company page works; these just come back faster and cost less.
| Company | Industry | People | Headquarters | Founded | Response |
|---|---|---|---|---|---|
| Stripestripe | Technology, Information and Internet | 16,694 | South San Francisco, US | ||
Loading… | |||||
Your engineers will like the API. Your finance team will like the bill.
For the people who build with it
- One call per company. Send a LinkedIn company URL, a slug or a website.
- 18 fields, always present. A value is null when it isn't known, so your code never guesses.
- Safe retries with Idempotency-Key. Error codes say whether retrying helps.
- OpenAPI 3.1, with samples in cURL, JavaScript and Python. Your first call takes five minutes.
For the people who pay for it
- From $0.50 per 1,000 by LinkedIn URL, $1.00 by website domain, on our biggest pack, and half that from our cache. One public price list.
- Prepaid packs from $10. You can never spend more than you bought, and credits never expire.
- Calls we can't complete are refunded in the same request. Rejected calls are never charged.
- Every credit in your ledger points at the request that spent it, and every purchase comes with an invoice.
What comes back
Eighteen fields, and every one is always present. A value is null when it isn't available, so your code never has to guess whether a key exists. This is the whole shape, ready to paste into your code.
The canonical slug and numeric id come back too, so every form of the same company lands on one record in your system.
Field referenceinterface Company {
name: string | null;
tagline: string | null;
description: string | null;
industry: string | null;
websiteUrl: string | null;
phone: string | null;
logo: string | null; // image URL
backgroundUrl: string | null; // cover image URL
followerCount: number | null;
employeeCount: number | null; // the employee count on the company page
employeeCountRange: { start: number | null; end: number | null } | null;
foundedOn: { year: number | null } | null;
headquarter: Address | null;
locations: Location[];
specialities: string[];
universalName: string | null; // canonical slug: changes when the company is renamed
linkedInUrl: string | null;
linkedInId: string | null; // numeric id, as a string: your stable key
}
interface Address {
street1: string | null;
street2: string | null;
city: string | null;
geographicArea: string | null;
postalCode: string | null;
country: string | null; // ISO 3166 code, like "US"
}
type Location = Omit<Address, "geographicArea"> & { state: string | null };Start from a website
Most lead lists have a website, not a company page. Send the domain, or any URL on the site, and get the same profile back, with whether the company lists that website as its own.
A lookup by website domain costs 4 credits, or 2 credits from our cache. A domain with no company behind it (no website, or no LinkedIn company page) costs 4 credits, and nothing from our cache.
Domain lookup reference, with a complete responsecurl https://api.happyfetch.net/v1/domain --max-time 120 \
-H "Authorization: Bearer $HAPPYFETCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain":"https://www.stripe.com/pricing"}'const res = await fetch("https://api.happyfetch.net/v1/domain", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HAPPYFETCH_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"domain": "https://www.stripe.com/pricing"
}),
signal: AbortSignal.timeout(120_000),
});
const { data, meta } = await res.json();import os, requests
res = requests.post(
"https://api.happyfetch.net/v1/domain",
headers={"Authorization": f"Bearer {os.environ['HAPPYFETCH_API_KEY']}"},
json={
"domain": "https://www.stripe.com/pricing"
},
timeout=120,
)
body = res.json()Every credit points at a request
Your console keeps each call: what came in, whether the cache answered, what it cost and what came back. A call we can't complete is refunded in the same request, and the ledger shows both lines.
Quote the request id from any response and support sees the same page.
How billing worksRequest details
9a80ddb0-0aed-41bc-9e48-a035c9388751
Received
With key production …7Qf2, no Idempotency-Key.
Cache: fetched live
Nothing usable was cached, so the data was fetched live.
Charged 2 credits
Ledger row 1,204, balance 20,198 after.
The fetch didn't complete
We couldn't get the data this time, so nothing is charged.
Refunded 2 credits
Automatic, in the same request. Ledger row 1,205.
Answered 503
The data couldn't be fetched right now. Refunded automatically; retry after Retry-After.
- Request
- POST /v1/company
- Answer
- 503 blocked
- Charged
- 2 credits
- Refunded
- 2 credits
- Net cost
- 0 credits
Ledger rows for this request
| Cause | Change | Balance |
|---|---|---|
| API call | −2 | 20,198 |
| Automatic refund | +2 | 20,200 |
What teams build with it
Enrich every signup
Turn the domain of a signup email into company size and industry, and route the lead before anyone reads it.
Keep your CRM current
Refresh each account's size, industry and headquarters every week. With max_age you decide how fresh is fresh enough.
Score and segment
Feed headcount, industry and location into your scoring model, at a tenth of a cent per account by LinkedIn URL.
Give your agent company context
Company lookups and web search as tools, over plain HTTP or our MCP server.
Web search, same key
Send a query and get the results back as JSON: a title, URL and snippet for every hit. A search costs 1 credit, fresh or from our cache.
Search reference, with a complete responsecurl https://api.happyfetch.net/v1/search --max-time 120 \
-H "Authorization: Bearer $HAPPYFETCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"stripe","max_results":5}'const res = await fetch("https://api.happyfetch.net/v1/search", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HAPPYFETCH_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"query": "stripe",
"max_results": 5
}),
signal: AbortSignal.timeout(120_000),
});
const { data, meta } = await res.json();import os, requests
res = requests.post(
"https://api.happyfetch.net/v1/search",
headers={"Authorization": f"Bearer {os.environ['HAPPYFETCH_API_KEY']}"},
json={
"query": "stripe",
"max_results": 5
},
timeout=120,
)
body = res.json()Made for code that runs unattended
Safe retries, errors your code can act on, and a record of every credit. What matters when a job runs at night and nobody is watching.
- Idempotency-Key
- Retry after a timeout without paying twice. The retry gets the stored answer back.
- X-Request-Id
- On every response. It ties the call to its charge and to the data it returned.
- RateLimit-*
- Every authenticated response shows what's left of your budget. Past it, you get a 429 with Retry-After.
- error.code
- Stable codes that say whether retrying helps, each with its own entry in the docs.
- max_age
- Choose how fresh an answer must be, from anything we have cached to fetched right now. A free cache check tells you how old our copy is before you pay.
- openapi.json
- OpenAPI 3.1 with samples in cURL, JavaScript and Python. Generate a typed client in one command.
What 1,000 company profiles cost
Our biggest pack's price next to each vendor's lowest published price, for the same kind of lookup.
By LinkedIn company URL, compared with our $0.50 per 1,000
| Vendor | Their lowest price per 1,000 | Compared with ours |
|---|---|---|
| Renidly (formerly LinkdAPI)1M+ credit balance | $2.50 | 5× ours |
| Enrich LayerUltra, yearly | $7.70 | 15× ours |
| Reverse Contact (with ScrapIn)200K-credit pack | $9.00 | 18× ours |
By website domain, compared with our $1.00 per 1,000
| Vendor | Their lowest price per 1,000 | Compared with ours |
|---|---|---|
| CoresignalElite, yearly | $4.50 | 4.5× ours |
| People Data LabsPro, yearly | $80.00 | 80× ours |
| LushaPremium, yearly | $82.67 | 83× ours |
Ours is the price on our biggest pack. List prices from each vendor's public pricing page, checked on October 12, 2026. Some of them sell things we don't, like contact data. See the full comparison
Pricing
A fixed price per call, in credits. Buy a pack when you need more. Calls we can't complete are refunded in the same request, and rejected calls are never charged.
| Call | Price | Per 1,000 calls | From our cache | Confirmed not found |
|---|---|---|---|---|
| Company, by LinkedIn URL | 2 credits | $1.00 to $0.50 | 1 credit$0.50 to $0.25 per 1,000 | 1 creditfree from our cache |
| Company, by website domain | 4 credits | $2.00 to $1.00 | 2 credits$1.00 to $0.50 per 1,000 | 4 creditsfree from our cache |
| Web search | 1 credit | $0.50 to $0.25 | 1 credit$0.50 to $0.25 per 1,000 | n/a |
| Cache check | Free | Free | n/a | n/a |
Prices in USD, excluding VAT. Per 1,000 calls: from the Starter pack's rate down to the Business pack's. Pay by card; every purchase comes with an invoice, and credits never expire.
Starter
$10
20,000 credits
$1.00 per 1,000 by LinkedIn URL · $2.00 by website domain
Enough for 10,000 lookups by LinkedIn company URL, or 5,000 by website domain. Lookups from our cache cost half.
Growth
$40
100,000 credits
$0.80 per 1,000 by LinkedIn URL · $1.60 by website domain
Enough for 50,000 lookups by LinkedIn company URL, or 25,000 by website domain. Lookups from our cache cost half.
Scale
$150
500,000 credits
$0.60 per 1,000 by LinkedIn URL · $1.20 by website domain
Enough for 250,000 lookups by LinkedIn company URL, or 125,000 by website domain. Lookups from our cache cost half.
Business
$500
2,000,000 credits
$0.50 per 1,000 by LinkedIn URL · $1.00 by website domain
Enough for 1,000,000 lookups by LinkedIn company URL, or 500,000 by website domain. Lookups from our cache cost half.
What each outcome costs
Each answer carries its request id and what it cost, and every line in your ledger points at the request that caused it. Every error has a stable code, listed with its billing in the error reference.
| Outcome | Cost |
|---|---|
| A company profile or a completed search | The call's price; lookups cost less from our cache |
| A confirmed "no such company" | 1 credit by LinkedIn company URL, 4 by website domain; free from our cache |
| We couldn't complete the call | Refunded automatically |
| Rejected before any work | Never charged |
Questions
- What does a lookup cost?
- A lookup by LinkedIn company URL costs 2 credits, or 1 credit from our cache; a confirmed not-found costs 1 credit, and nothing from our cache. A lookup by website domain costs 4 credits, or 2 credits from our cache. A domain with no company behind it (no website, or no LinkedIn company page) costs 4 credits, and nothing from our cache. A web search costs 1 credit, fresh or from our cache. Credits come in packs, starting at $10 for 20,000 credits (USD, VAT excluded).
- How can it be this cheap?
- We focus on company data. Popular companies come from our cache, which costs us less, so cached lookups cost you less too. And there's no sales team or annual contract to pay for.
- When am I charged?
- Only for completed calls: a company profile, a completed search (even with zero results), or a confirmed not-found (1 credit by LinkedIn company URL, 4 by website domain), which is free when the answer comes from our cache. If we can't complete a call, the charge is refunded automatically in the same request. Invalid input, authentication errors and rate limits are never charged.
- Do credits expire?
- No. Credits stay in your workspace until you use them. There's no subscription, nothing renews, and you can never spend more than you bought.
- Can I get an invoice with our VAT number?
- Yes. Every purchase comes with an invoice. Add your company details and VAT number at checkout, and the invoice, with a PDF, is in the console next to the purchase.
- How fresh is the data?
- As fresh as you ask for. Every answer says whether it came from our cache and how old it is. Choose the oldest answer you accept, of any age, or ask for a fresh fetch every time.
- Where does the data come from?
- From LinkedIn company pages, fetched when you ask and kept in our cache for repeat lookups.
- What don't you sell?
- We don't sell email addresses, phone numbers or contact lists.
- Is there a free trial?
- Yes. You get 200 credits when you verify your email. No card needed.
Your first call in five minutes
Create an account
Verify your email and 200 credits land in your workspace. No card needed.
Create an API key
In the console, under API keys. It's shown once, so keep it in an environment variable.
Make the call
Copy the request at the top of this page, or follow the quickstart in your language.