Apollo API alternative for company data
Company data by domain for your own code, with no seats and no custom plan. Prepaid credits that never expire, from the first pack.
What you pay#
| Apollo | HappyFetch, by website domain | |
|---|---|---|
| Lowest price per 1,000 | Not published | $1.00Business pack, $500 |
| Cheapest plan, per 1,000 | Not published | $2.00Starter pack, $10 |
| How you pay | Seats, from $49 a month | Prepaid packs, from $10 |
| Unused credits | Reset each cycle | Never expire |
| Bills a failed call? | No | No, refunded in the same request |
API access is on Custom plans. Credits per plan aren't published. Apollo doesn't publish a per-lookup price (checked on October 12, 2026. Sources: Apollo pricing, API pricing).
Apollo sells seats, and its pricing page puts API access on Custom plans. With us, the API works the same on every pack, from $10, and the credits stay in your workspace until you use them. Domain lookups cost from $1.00 per 1,000 on our biggest pack, and half that for companies already in our cache. If you have the company's LinkedIn URL, it's $0.50 per 1,000.
How the calls compare#
Apollo GET api.apollo.io/api/v1/organizations/enrich?domain=stripe.com
HappyFetch POST https://api.happyfetch.net/v1/domain {"domain": "stripe.com"}| Apollo | HappyFetch | |
|---|---|---|
| Your key goes in | The x-api-key header |
The Authorization: Bearer header |
| Company fields | Under organization |
Under data, with cost and freshness under meta |
| Company size | An estimated count | A count and a size band |
| Country | United States |
US |
curl https://api.happyfetch.net/v1/domain --max-time 120 \
-H "Authorization: Bearer $HAPPYFETCH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"domain":"stripe.com"}'const res = await fetch("https://api.happyfetch.net/v1/domain", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HAPPYFETCH_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(), // send the same key when you retry this call
},
body: JSON.stringify({
"domain": "stripe.com"
}),
signal: AbortSignal.timeout(120_000),
});
const { data, meta, error } = await res.json();
if (!res.ok) throw new Error(`${error.code}: ${error.message}`);
console.log(meta.request_id, meta.cache.status, data);import os, uuid, requests
res = requests.post(
"https://api.happyfetch.net/v1/domain",
headers={
"Authorization": f"Bearer {os.environ['HAPPYFETCH_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()), # send the same key when you retry this call
},
json={
"domain": "stripe.com"
},
timeout=120,
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["meta"]["request_id"], body["meta"]["cache"]["status"])Field map#
| Apollo | HappyFetch |
|---|---|
organization.name |
data.name |
organization.short_description |
data.description |
organization.industry |
data.industry |
organization.website_url |
data.websiteUrl |
organization.primary_domain |
meta.resolved.domain |
organization.estimated_num_employees |
data.employeeCount |
organization.founded_year |
data.foundedOn.year |
organization.street_address |
data.headquarter.street1 |
organization.city |
data.headquarter.city |
organization.state |
data.headquarter.geographicArea |
organization.postal_code |
data.headquarter.postalCode |
organization.country |
data.headquarter.country, as a two-letter code |
organization.phone |
data.phone |
organization.keywords |
data.specialities |
organization.linkedin_url |
data.linkedInUrl |
organization.linkedin_uid |
data.linkedInId |
We also return a size band and every office. Every answer carries the company's numeric id: one stable key per company, even when it renames.
A drop-in function#
const API = "https://api.happyfetch.net";
export async function companyByDomain(domain) {
const res = await fetch(`${API}/v1/domain`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HAPPYFETCH_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ domain }),
});
if (res.status === 404) return null; // no company at this domain
const body = await res.json();
if (!res.ok) throw new Error(`HappyFetch ${res.status}: ${body.error.code}`);
return body.data;
}When Apollo is the better choice#
If your reps want contact emails, phone numbers and outreach sequences in one sales tool, Apollo does all of that. HappyFetch is for company data inside your own code, priced per call.
Try it on your own companies
200 credits free when you verify your email. No card needed, no subscription.