Date: 2026-03-19
Severity: High — directly impacts search precision and credit cost
Endpoint: POST /screener/person/search (Realtime People Search)
CrustData's Realtime People Search has a post_processing.strict_title_and_company_match parameter that is supposed to ensure the searched title and company co-occur within the same employment record. This works correctly for current positions but fails completely for past positions. The result is that PAST_TITLE and PAST_COMPANY are matched independently across different employment records, producing false positives.
{
"filters": [
{ "filter_type": "PAST_TITLE", "type": "in", "value": ["CFO", "Chief Financial Officer"] },
{ "filter_type": "PAST_COMPANY", "type": "in", "value": ["Open-Xchange"] },
{ "filter_type": "REGION", "type": "in", "value": ["Germany"] }
],
"page": 1,
"post_processing": {
"strict_title_and_company_match": true
}
}With strict_title_and_company_match: true, we expect the API to only return profiles where the same employment record contains both:
- A title matching one of our PAST_TITLE values (e.g., "CFO")
- A company matching our PAST_COMPANY value (e.g., "Open-Xchange")
In other words: people who were CFO at Open-Xchange, not people who were CFO somewhere and also worked at Open-Xchange in a different role.
The API returns profiles where:
- The person held a title matching PAST_TITLE at any past company
- AND the person worked at PAST_COMPANY in any past role
The title and company are matched independently — not within the same employment record. The strict_title_and_company_match post-processing does not fix this for past positions.
Query:
{
"filters": [
{ "filter_type": "PAST_TITLE", "type": "in", "value": ["CFO", "Chief Financial Officer", "Chief Finance Officer", "C.F.O", "CFOs", "Chief Finance Officers", "Chief Financial Officers", "Chief Fin Officer", "Chief Fin. Officer"] },
{ "filter_type": "PAST_COMPANY", "type": "in", "value": ["EQS Group"] },
{ "filter_type": "REGION", "type": "in", "value": ["Austria", "Germany", "Switzerland"] }
],
"page": 1,
"post_processing": { "strict_title_and_company_match": true }
}Result: 1 profile — FALSE POSITIVE
| Name | Role at EQS Group | CFO Role (different company) |
|---|---|---|
| George Dietrichsbruckner | Senior Product Manager Compliance / GRC (2017-2019) | Interim CFO at ENHANCE INVESTMENT PARTNERS (2014) |
Why this is wrong: George was never a CFO at EQS Group. He was a Product Manager at EQS and a CFO at a completely unrelated company. Strict matching should have filtered him out.
Query: Same structure as above, with PAST_COMPANY: "Open-Xchange".
Result: 4 profiles — 3 are FALSE POSITIVES
| # | Name | Role at Open-Xchange | CFO Role (different company) | Verdict |
|---|---|---|---|---|
| 1 | Markus Struppler | Aufsichtsrat / supervisory board (2011-2012) | CFO at BayTech Venture Capital (2009-2012), CFO at ATOSS Software (1997-2008) | ❌ Board member at OX, CFO elsewhere |
| 2 | Stefanie S. | Sr. Corporate Marketing Manager (2016-2025) | "Assistentin der Geschäftsleitung (CEO/CFO)" at KIRCHHOFF Group (2013-2016) | ❌ Marketing manager at OX, word "CFO" appeared in an assistant role title at another company |
| 3 | Uwe Reumuth | CFO / Finanzvorstand (2016-2017) | Serial CFO at multiple companies | ✅ Genuine past CFO at Open-Xchange |
| 4 | Olga Virkus | Finance Controlling (2016-2020) | CFO at Enough Software (2013-2018) | ❌ Finance controller at OX, CFO elsewhere |
When using CURRENT_TITLE + CURRENT_COMPANY with strict_title_and_company_match: true, the results are accurate:
| Company | Query | Results | Precision |
|---|---|---|---|
| EQS Group | CURRENT_TITLE=CFO + CURRENT_COMPANY=EQS Group | 1 (Andre Silverio Marques — genuine CFO) | 100% |
| Open-Xchange | CURRENT_TITLE=CFO + CURRENT_COMPANY=Open-Xchange | 1 (Dirk Valbert — genuine CFO) | 100% |
Strict matching works perfectly for current positions — title and company are correctly linked within the same active employment record.
The most common pattern. Person was CFO at Company A and held a non-CFO role at the target company.
Example: George Dietrichsbruckner — CFO at ENHANCE INVESTMENT PARTNERS, Product Manager at EQS Group.
The title filter matches any occurrence of the keyword in the role title string, even when embedded in a completely different context.
Example: Stefanie S. — her KIRCHHOFF Group role was literally "Assistentin der Geschäftsleitung (CEO/CFO)" — she was an assistant to the CEO/CFO, not a CFO herself. The API matched the substring "CFO" in this title.
Person held a finance-adjacent role at the target company (e.g., Finance Controlling) but was CFO at a different company.
Example: Olga Virkus — Finance Controller at Open-Xchange, CFO at Enough Software.
| Search Type | Total Results | Valid | False Positives | Precision |
|---|---|---|---|---|
| Current (2 searches) | 2 | 2 | 0 | 100% |
| Past (2 searches) | 5 | 1 | 4 | 20% |
| Combined | 7 | 3 | 4 | 43% |
Each false positive costs credits. With min charge of 5 credits per search:
- We paid 10 credits ($1.00) for past searches
- Got 1 valid result and 4 false positives
- Effective cost per valid past result: $1.00 (vs $0.50 for current)
At scale (100 companies), if past search averages 3 false positives per company:
- 300 false positive profiles × $0.10 = $30 wasted on noise
- Plus additional engineering time to filter them in our pipeline
Our sourcing pipeline must now implement client-side title+company cross-validation for past results — checking that the matched title actually occurred at the matched company within the same employment record. This is doable but adds complexity and requires processing the full employment history of each returned profile.
strict_title_and_company_match should verify that PAST_TITLE and PAST_COMPANY co-occur within the same employer record, not just that both exist somewhere in the person's history. The current behavior makes the strict flag effectively useless for past position searches.
Until CrustData fixes this, we can filter results ourselves:
// After receiving RT Search results for past title + past company
foreach ($profiles as $profile) {
$isValid = false;
foreach ($profile['employer'] as $employer) {
$titleMatch = /* check if employer.title matches our search titles */;
$companyMatch = /* check if employer.company_name matches our target company */;
if ($titleMatch && $companyMatch) {
$isValid = true;
break;
}
}
if (!$isValid) {
// False positive — skip this profile
continue;
}
}The downside: we still pay credits for false positives before filtering them client-side.