API reference
Enrich Companies
Send exactly one of `linkedin_urls`, `domains` or `names`, with up to 25 entries. Each entry gets its own result, in the order you sent them, with a list of `matches`.
Send exactly one of linkedin_urls, domains or names, with up to 25 entries. Each entry gets its own result, in the order you sent them, with a list of matches.
A LinkedIn URL or a domain gives at most one company. A name can give up to 5, because companies share names; confidence_score is 1.0 on an exact name and null otherwise. Set exact_match to keep only exact names (or, for domains, only a company on exactly that domain).
fields picks the groups: basic_info (the default), headcount, locations, taxonomy, followers, funding and hiring. A value we cannot fill is null, and its path is listed in unavailable, so you can tell "unknown" from "zero".
Every company found costs one credit, whatever groups you ask for; the open roles in hiring are included. Not found, invalid or failed entries cost nothing.
Send Authorization: Bearer gtk_…. Create the key under API Access → API Keys. A missing, invalid or revoked key is 401, including while this API is closed. A valid key while the API is closed for your organization answers 404, the same body as an unknown path. Every response includes FounderMCP-Api-Version and FounderMCP-Request-Id.
Authentication
Send your API key as a Bearer token: Authorization: Bearer gtk_…. Create the key under API Access → API Keys. A missing, invalid or revoked key is 401, including while an API is closed. A valid key while the Signals API or the Company API is closed for your organization answers 404, the same body as an unknown path. Every response includes FounderMCP-Api-Version and FounderMCP-Request-Id.
Body parameters
linkedin_urlsstring[]— LinkedIn company pages, e.g.https://www.linkedin.com/company/acme-analytics.domainsstring[]— Company websites or domains, e.g.acme-analytics.example.namesstring[]— Company names.fieldsstring[]— Groups to return. Defaults to["basic_info"]. One of:basic_info,headcount,locations,taxonomy,followers,funding,hiring.exact_matchboolean— Names: keep only exact names. Domains: keep only a company on exactly that domain. Defaults to false.
Response
resultsobject[]— One entry per input, in the same order.results[].inputstring— The input as you sent it.results[].statusstring—matched,not_found,invalid(not a LinkedIn company URL, domain or name) orerror(lookup failed; retry later). One of:matched,not_found,invalid,error.results[].match_typestring—linkedin_url,domainorname. One of:linkedin_url,domain,name.results[].matchesobject[]—confidence_scoreandcompany; empty unless the status ismatched.company.linkedin_urlstring | null— The company page.company.basic_infoobject—name,linkedin_url,website,primary_domain,description,tagline,logo_url,employee_count_range,company_type,year_founded.company.headcountobject—total(employees on LinkedIn) andrange. Growth, role mix and region mix are null and listed inunavailable.company.locationsobject—headquarters,city,state,country,country_code,street_address,postal_codeandall_office_addresses.company.taxonomyobject—industryandspecialities.company.followersobject—count. Follower growth is null and listed inunavailable.company.fundingobject—last_round_type,last_round_amount_usd,last_fundraise_date,investorsandrounds(newest first), from the funding rounds we track.company.hiringobject—openings_count(open roles on LinkedIn) andrecent_openings: the newest roles, withtitle,url,locationandposted_on.company.unavailablestring[]— Paths in the requested groups that this API cannot fill for this company.credits_usedinteger— Credits this call used.
Credits
1 credit per company found Errors and empty lookups are free. A call that spent credits puts that number in credits_used, in X-Credits-Used and in X-Credits-Charged. When the wallet can be read, the response also sends X-Credits-Remaining.
Errors
- 400
invalid_request— The body is not valid JSON, a field is unknown or has the wrong type, or a value is not allowed. - 401
authentication_error— The Authorization header is missing, or the key is unknown or revoked. - 403
permission_error— API access is not part of your plan, or your account is suspended. - 429
rate_limit_error— More than 60 requests per minute, or more than 3 at the same time, on one key. Wait for the Retry-After header. - 429
daily_limit_reached— The request could take your organization over its daily credit limit. The limit resets at midnight (Europe/Brussels). - 502
upstream_error— The data source did not answer. Retry later. - 503
service_unavailable— The API is temporarily unavailable. Retry later. - 500
internal_error— Something went wrong on our side.
Example
cURL
curl -X POST "https://foundermcp.dev/api/v1/company/enrich" \
-H "Authorization: Bearer $FOUNDERMCP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"linkedin_urls": [
"https://www.linkedin.com/company/acme-analytics"
],
"fields": [
"basic_info",
"headcount"
]
}'
JavaScript
const response = await fetch('https://foundermcp.dev/api/v1/company/enrich', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.FOUNDERMCP_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"linkedin_urls": [
"https://www.linkedin.com/company/acme-analytics"
],
"fields": [
"basic_info",
"headcount"
]
})
});
const body = await response.json();
Python
import json
import os
import urllib.request
payload = {
"linkedin_urls": [
"https://www.linkedin.com/company/acme-analytics"
],
"fields": [
"basic_info",
"headcount"
]
}
request = urllib.request.Request(
"https://foundermcp.dev/api/v1/company/enrich",
headers={
"Authorization": f"Bearer {os.environ['FOUNDERMCP_API_KEY']}",
"Content-Type": "application/json"
},
data=json.dumps(payload).encode(),
method="POST",
)
with urllib.request.urlopen(request) as response:
body = json.load(response)
Example response
{
"results": [
{
"input": "https://www.linkedin.com/company/acme-analytics",
"status": "matched",
"match_type": "linkedin_url",
"matches": [
{
"confidence_score": 1,
"company": {
"linkedin_url": "https://www.linkedin.com/company/acme-analytics",
"basic_info": {
"name": "Acme Analytics",
"linkedin_url": "https://www.linkedin.com/company/acme-analytics",
"website": "https://acme-analytics.example",
"primary_domain": "acme-analytics.example",
"description": "Analytics for finance teams.",
"tagline": null,
"logo_url": null,
"employee_count_range": "51-200",
"company_type": "Privately Held",
"year_founded": 2019
},
"headcount": {
"total": 87,
"range": "51-200",
"growth_percent": {
"1m": null,
"3m": null,
"6m": null,
"12m": null
},
"growth_absolute": {
"1m": null,
"3m": null,
"6m": null,
"12m": null
},
"by_role": null,
"by_region": null,
"largest_headcount_country": null
},
"unavailable": [
"headcount.growth_percent",
"headcount.growth_absolute",
"headcount.by_role",
"headcount.by_region",
"headcount.largest_headcount_country"
]
}
}
]
}
],
"credits_used": 1
}