Kitchen Sink
Resolve a person or company from whatever partial data you already have — no need to know which field is "the right one."
The Kitchen Sink resolvers are named after the saying "everything but the kitchen sink." The idea: pass in whatever you know about a person or company (any mix of identifiers), and Fiber does its best to find the match across its databases and additional sources. You don't have to know which field is "the right one," and you don't have to worry about the fields you're missing.
Kitchen Sink returns the resolved, enriched entity (identity + firmographics + history). It does not reveal email/phone — for that, use Contact Reveal on the resolved LinkedIn URL.
There are two resolvers:
| Resolver | Operation | Resolves |
|---|---|---|
| Profile | KitchenSinkProfile | A person from any identifier |
| Company | kitchenSinkCompany | A company from any identifier |
Operation casing is inconsistent and case-sensitive: the person resolver starts with a capital K, the company resolver with a lowercase k. Copy the identifiers from the table above exactly as written.
The problem it solves
Sales teams and CRMs almost never have clean, uniform data. One record has a LinkedIn URL; the next has only an email; another has just a name and the company they work at; a company record might have only a domain, or only a brand name. Forcing the caller to pick the correct typed endpoint for each shape of data is brittle and slow.
Kitchen Sink collapses that into a single endpoint per entity type where you throw in whatever you have and get back a resolved, enriched record. This is why it's a favorite for:
- CRM enrichment / cleanup: normalize and complete records that each carry different fields.
- Lead intake: resolve inbound leads regardless of what the form captured.
- Data unification: merge partial records from multiple systems by resolving them all to the same canonical entity.
How it works
- Accepts any combination of identifiers. Provide one or several of the supported fields; Kitchen Sink combines whatever is present and ignores what's absent. More signals generally improve match accuracy.
- Auto-detect, don't pre-classify. You don't tell it "this is a slug" vs "this is a URL" — it figures out and normalizes the inputs.
- Finds matches wherever the signal lives. Kitchen Sink draws on Fiber's full identity graph (including resolving an email to the person behind it), so even sparse records land on the right entity.
- Fast and cost-effective by design. Lookups run against Fiber's continuously refreshed index and return quickly at low credit cost. When you need the freshest possible snapshot of an already-clean identifier, use Live Enrich instead.
Kitchen Sink Profile (person resolver)
Resolve a person from any mix of:
- a LinkedIn identifier: URL, slug, or numeric user ID (
profileIdentifier), - an email address (
emailAddress), - a name (
personName), plus their company as a name, domain, or LinkedIn identifier (companyName,companyDomain,companyIdentifier), - a job title or LinkedIn headline (
jobTitle,linkedinHeadline), - a school (
schoolName,schoolDomain,schoolIdentifier), and - a location (
profileLocation: country code, state, or free text).
Text fields are objects with a value (personName: { value: "Jane Doe" });
the email is a plain string.
It returns the same comprehensive profile shape as live profile enrichment — 44+ top-level fields by default, including:
- Experiences (full work history) and tenures (time in role / at company)
- Education (schools, degrees, fields, years)
- Skills
- Tags (system-assigned, e.g., founder, investor)
- Inferred location with coordinates and timezone
- Career-began date
- Follower count and connection count
- is-hiring and open-to-work status flags
- Identity basics (name, headline, LinkedIn URL/slug, profile image)
// Pass whatever you have — any subset of these fields.
const person = await KitchenSinkProfile({
body: {
apiKey: process.env.FIBER_API_KEY!,
profileIdentifier: {
identifier: "linkedinUrl", // or "linkedinSlug" / "userID"
value: "https://www.linkedin.com/in/example",
},
emailAddress: "jane@acme.com",
personName: { value: "Jane Doe" },
companyDomain: { value: "acme.com" },
},
});
console.log(person.data?.output.data); // matched profiles, best firstTuning a person lookup
| Field | Default | What it does |
|---|---|---|
forceCompanyMatch | false | Only return people who work at the company you passed. Without it, a strong name match at another company can come back. |
fuzzySearch | false | Tolerate spelling differences in the name |
personName.looseMatch | false | Match on a looser reading of the name |
numProfiles | 1 | Return up to 10 candidates, best first |
thoroughness | high | high searches longer to recover more matches; low returns faster |
liveFetch | false | Pull a fresh LinkedIn snapshot of each match (extra credits) |
getDetailedEducation | false | Add school details to each education entry |
getDetailedWorkExperience | false | Add company details (domains, LinkedIn IDs, headcount, revenue estimate) to each role |
Kitchen Sink Company (company resolver)
Resolve a company from any mix of:
- a domain (
companyDomain, e.g.acme.com), - a LinkedIn identifier (
companyIdentifier): slug (e.g.stripe), URL, or organization ID (e.g.1441), - a company name (
companyName, the brand name), and - a headquarters location (
companyLocation) to tell apart companies with similar names.
Ask for up to 10 candidates with numCompanies (default 1).
It returns rich company data in one call, including:
- Tech stack: technologies the company uses
- Funding: rounds, stages, amounts, investors
- Headcount history: employee count over time, not just the current number
- Social presence: follower count and LinkedIn activity
- Plus identity/firmographics: name, domain, slug, org ID, industry, HQ/location, founding date, operating status, logo.
const company = await kitchenSinkCompany({
body: {
apiKey: process.env.FIBER_API_KEY!,
// any one (or several) of these:
companyDomain: { value: "stripe.com" },
companyIdentifier: { identifier: "linkedinSlug", value: "stripe" }, // or "linkedinUrl" / "linkedinOrgID"
companyName: { value: "Stripe" },
},
});
console.log(company.data?.output.data); // matched companies, best firstCompany resolver vs. company search. Use the company resolver when you already know the company and want a rich profile in one call. Use company search when you need discovery and filtering across many companies, not for fetching one known company. The same split applies on the people side: the person resolver handles one known-but-messy person; people search discovers many.
Bulk identifier-based lookup
When the messy records number in the dozens, the Kitchen Sink module also supports bulk identifier-based company and profile lookup: resolve up to 50 people or companies per call instead of looping the single resolvers. Every row in the batch can carry different identifier types, just like the singles: a CRM export where one row has a LinkedIn URL, the next only an email, the next a name plus company, all resolve in one pass.
const resolved = await KitchenSinkBulkProfile({
body: {
apiKey: process.env.FIBER_API_KEY!,
profiles: [
{ profileIdentifier: { identifier: "linkedinUrl", value: "https://www.linkedin.com/in/example" } },
{ emailAddress: "jane@acme.com" },
{ personName: { value: "Jane Doe" }, companyDomain: { value: "acme.com" } },
// ...up to 50 per call
],
// liveFetch: true, // optional: also refresh each person from LinkedIn
},
});
// One array of matches per row, in the order you sent them.
console.log(resolved.data?.output.data);Each bulk row takes the identity fields (profileIdentifier, emailAddress,
personName, jobTitle, companyName, companyDomain, companyIdentifier,
and numProfiles); liveFetch, forceCompanyMatch, fuzzySearch,
thoroughness, and the detail flags apply to the whole batch. Bulk defaults to
thoroughness: "low" for speed; set "high" when coverage matters more.
Bulk behavior to plan around:
- Charging is per entity, only when found. 2 credits per resolved
person or company; unresolvable rows are not charged. A row that returns
several candidates (
numProfilesabove 1) is charged for each one. The company bulk lookup works the same way at 2 credits per company. liveFetchopts each profile into a fresh LinkedIn pull for 2 additional credits per person. Leave it off for index-speed lookups; turn it on when the batch needs "as it stands right now" data.- Give it room to run. Bulk calls carry a 3-minute recommended timeout; batches of 50 mixed-identifier rows are not sub-second calls. At 60 requests per minute, a 10,000-row backlog clears in about 200 calls and under 4 minutes of rate-limit window.
- Pair bulk resolution with batch contact reveal for full pipeline enrichment: resolve the messy identifiers first, then feed the resolved people into batch contact reveal for emails and phones.
Kitchen Sink vs. Search vs. Live Enrich
| You have… | You want… | Use |
|---|---|---|
| A messy/ambiguous identifier (any type) | The resolved, enriched record | Kitchen Sink (KitchenSinkProfile / kitchenSinkCompany) |
| Filters (industry, title, size, …) | To discover many matching entities | Search (companySearch / peopleSearch) |
| A clean identifier (URL/slug/orgId) | The freshest real-time snapshot | Live Enrich (profileLiveEnrich / companyLiveEnrich) |
| A resolved LinkedIn URL | Their email / phone | Contact Enrichment |
| An email | The person behind it | Reverse email lookup — or Kitchen Sink Profile with emailAddress |
Mental model:
- Search discovers many.
- Kitchen Sink resolves one (or bulk) from whatever you have.
- Live Enrich refreshes one to "right now."
- Contact Enrichment reveals how to reach them.
Operations
| Operation | What it does | Reference |
|---|---|---|
| Person resolver | Resolve one person from any mix of identifiers | KitchenSinkProfile |
| Company resolver | Resolve one company from any mix of identifiers | kitchenSinkCompany |
| Person resolver (bulk) | Resolve up to 50 people per call, mixed identifiers | KitchenSinkBulkProfile |
| Company resolver (bulk) | Resolve up to 50 companies per call, mixed identifiers | kitchenSinkBulkCompany |
Credit costs
- Kitchen Sink charges 2 credits per resolved entity, single or bulk, and
only for entities found. Asking for several candidates bills each one that
comes back.
liveFetchadds 2 credits per person actually fetched. - Listed amounts are defaults — custom pricing is available for bulk use cases (Billing & credits).
- Rate limits: 120 requests/minute for single lookups, 60/minute for bulk. Recommended client timeouts: 30s (company), 60s (person), 180s (bulk).
- It does not include contact reveal — emails/phones are billed separately via Contact Reveal (Normal stack: work email 2, personal email 2, phone 3; other stacks differ).
output.chargeInfois authoritative. Surface it verbatim, and checkGET /v1/get-org-credits?apiKey=xxx(free) before large bulk resolutions.