[{"data":1,"prerenderedAt":1044},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fguides\u002Fdata-quality":186},[4,10,15,23,28,35,41,47,52,57,62,66,70,77,83,90,95,100,105,110,115,119,124,128,132,136,141,144,147,151,155,159,163,167,170,174,178,182],{"path":5,"title":6,"category":7,"order":8,"family":9,"subfamily":9,"status":9,"endpointId":9},"\u002Fapi-reference","API reference","introduction",30,null,{"path":11,"title":12,"category":7,"order":13,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fauthentication","Authentication",20,"updated",{"path":16,"title":17,"category":18,"order":19,"family":20,"subfamily":21,"status":14,"endpointId":22},"\u002Fendpoints\u002Fcheck-company","Profile status","endpoints",220,"Fetch","Company","check-company",{"path":24,"title":17,"category":18,"order":25,"family":20,"subfamily":26,"status":14,"endpointId":27},"\u002Fendpoints\u002Fcheck-person",120,"Person","check-person",{"path":29,"title":30,"category":18,"order":31,"family":32,"subfamily":33,"status":9,"endpointId":34},"\u002Fendpoints\u002Fcontact-email","Find Email",600,"Contact","Email","contact-email",{"path":36,"title":37,"category":18,"order":38,"family":32,"subfamily":39,"status":9,"endpointId":40},"\u002Fendpoints\u002Fcontact-phone","Find Phone",610,"Phone","contact-phone",{"path":42,"title":43,"category":18,"order":44,"family":45,"subfamily":21,"status":14,"endpointId":46},"\u002Fendpoints\u002Fenrich-company","Enrich company",90,"Enrichment","enrich-company",{"path":48,"title":49,"category":18,"order":50,"family":45,"subfamily":26,"status":14,"endpointId":51},"\u002Fendpoints\u002Fenrich-person","Enrich profile",80,"enrich-person",{"path":53,"title":54,"category":18,"order":55,"family":20,"subfamily":21,"status":14,"endpointId":56},"\u002Fendpoints\u002Ffetch-company","Profile",200,"fetch-company",{"path":58,"title":59,"category":18,"order":60,"family":20,"subfamily":21,"status":14,"endpointId":61},"\u002Fendpoints\u002Ffetch-company-live","Profile live",210,"fetch-company-live",{"path":63,"title":54,"category":18,"order":64,"family":20,"subfamily":26,"status":14,"endpointId":65},"\u002Fendpoints\u002Ffetch-profile",100,"fetch-profile",{"path":67,"title":59,"category":18,"order":68,"family":20,"subfamily":26,"status":14,"endpointId":69},"\u002Fendpoints\u002Ffetch-profile-live",110,"fetch-profile-live",{"path":71,"title":72,"category":18,"order":73,"family":74,"subfamily":75,"status":14,"endpointId":76},"\u002Fendpoints\u002Fsearch-companies","Company search",94,"Search","Companies","search-companies",{"path":78,"title":79,"category":18,"order":80,"family":81,"subfamily":9,"status":14,"endpointId":82},"\u002Fendpoints\u002Fsearch-companies-available-fields","Company search available fields",720,"Utility","search-companies-available-fields",{"path":84,"title":85,"category":18,"order":86,"family":74,"subfamily":87,"status":88,"endpointId":89},"\u002Fendpoints\u002Fsearch-people","People search",92,"People","new","search-people",{"path":91,"title":92,"category":18,"order":93,"family":81,"subfamily":9,"status":88,"endpointId":94},"\u002Fendpoints\u002Fsearch-people-available-fields","People search available fields",710,"search-people-available-fields",{"path":96,"title":97,"category":18,"order":98,"family":74,"subfamily":87,"status":88,"endpointId":99},"\u002Fendpoints\u002Fsearch-people-count","People search count",93,"search-people-count",{"path":101,"title":102,"category":18,"order":103,"family":74,"subfamily":87,"status":88,"endpointId":104},"\u002Fendpoints\u002Fsearch-people-lookalike","People lookalike",95,"search-people-lookalike",{"path":106,"title":107,"category":18,"order":108,"family":74,"subfamily":87,"status":88,"endpointId":109},"\u002Fendpoints\u002Fsearch-people-prompt","Agentic Search",96,"search-people-prompt",{"path":111,"title":112,"category":18,"order":113,"family":81,"subfamily":9,"status":14,"endpointId":114},"\u002Fendpoints\u002Fusage","Usage",700,"usage",{"path":116,"title":117,"category":7,"order":118,"family":9,"subfamily":9,"status":9,"endpointId":9},"\u002Fgetting-started","Getting started",10,{"path":120,"title":121,"category":122,"order":123,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Fapi-key-management","API key management","guides",12,{"path":125,"title":126,"category":122,"order":127,"family":9,"subfamily":9,"status":88,"endpointId":9},"\u002Fguides\u002Fcurrent-position-resolution","Current position and work history ordering",35,{"path":129,"title":130,"category":122,"order":131,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Fdata-freshness","Data freshness",40,{"path":133,"title":134,"category":122,"order":135,"family":9,"subfamily":9,"status":88,"endpointId":9},"\u002Fguides\u002Fdata-quality","Data quality",18,{"path":137,"title":138,"category":139,"order":140,"family":9,"subfamily":9,"status":88,"endpointId":9},"\u002Fguides\u002Fendpoint-transition-october-2026","Endpoint transition on October 13, 2026","migrations",1,{"path":142,"title":143,"category":122,"order":13,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Ferrors-retries","Error handling & retries",{"path":145,"title":146,"category":122,"order":118,"family":9,"subfamily":9,"status":88,"endpointId":9},"\u002Fguides\u002Ffirst-api-call","Your first API call",{"path":148,"title":149,"category":122,"order":150,"family":9,"subfamily":9,"status":88,"endpointId":9},"\u002Fguides\u002Findustries","Industry values",50,{"path":152,"title":153,"category":154,"order":150,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Fmcp","Connect AI agents (MCP)","mcp",{"path":156,"title":157,"category":139,"order":158,"family":9,"subfamily":9,"status":88,"endpointId":9},"\u002Fguides\u002Fmigrating-resolve-to-enrich","Migrating from Resolve to Enrich",52,{"path":160,"title":161,"category":139,"order":162,"family":9,"subfamily":9,"status":88,"endpointId":9},"\u002Fguides\u002Fmigrating-search-persons-to-people","Migrating people search from persons to people",51,{"path":164,"title":165,"category":122,"order":166,"family":9,"subfamily":9,"status":88,"endpointId":9},"\u002Fguides\u002Fmissing-and-empty-fields","Missing and empty profile fields",42,{"path":168,"title":169,"category":122,"order":8,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Fpolling","Polling, zero setup",{"path":171,"title":172,"category":122,"order":173,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Fproduction-checklist","Production checklist",45,{"path":175,"title":176,"category":122,"order":177,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Frate-limits-credits","Rate limits & credits",25,{"path":179,"title":180,"category":122,"order":181,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Fwebhooks","Webhooks",31,{"path":183,"title":184,"category":122,"order":185,"family":9,"subfamily":9,"status":14,"endpointId":9},"\u002Fguides\u002Fwhich-endpoint-should-i-use","Which endpoint should I use?",15,{"id":187,"title":134,"audience":9,"badgeColor":9,"badgeLabel":9,"body":188,"category":122,"description":1036,"endpointId":9,"extension":1037,"family":9,"links":9,"meta":1038,"navigation":1039,"order":135,"path":133,"relatedArticles":1040,"requiresFlag":9,"seo":1041,"status":88,"stem":1042,"subfamily":9,"__hash__":1043},"docs\u002Fguides\u002Fdata-quality.md",{"type":189,"value":190,"toc":1016},"minimark",[191,195,198,203,211,214,218,221,244,247,251,256,259,344,352,357,361,364,443,446,467,473,477,487,490,533,539,547,561,564,578,593,607,611,625,631,635,638,708,711,758,761,811,816,820,853,856,870,877,881,884,904,907,932,936,946,950,953,965,968,972],[192,193,194],"p",{},"Bad data costs more than missing data. A wrong profile written to your CRM gets copied, reported on, and emailed before anyone notices. A missing profile is just a gap you can fill later.",[192,196,197],{},"That asymmetry shapes the whole API. This guide explains the principle behind it, the signals every response carries about its own reliability, and how to tune the balance between match rate and certainty for your use case.",[199,200,202],"h2",{"id":201},"a-not-found-is-a-real-answer","A not-found is a real answer",[192,204,205,206,210],{},"When we cannot identify a person or a company with confidence, we say so. You get a ",[207,208,209],"code",{},"404",", or a documented error code on the async endpoints, instead of a plausible-looking record assembled to fill the response.",[192,212,213],{},"That is a deliberate design choice, and it runs through the whole platform: filters that we cannot honour are rejected instead of silently dropped, a job that failed reports why, and a profile removed by its owner stays removed. Every one of those cases is a place where we could have returned something instead of nothing. We would rather hand you a clean gap you can act on than a record you have no way to distrust.",[199,215,217],{"id":216},"three-questions-behind-every-response","Three questions behind every response",[192,219,220],{},"Every record you receive answers three separate questions, and each one has its own signal in the payload.",[222,223,224,232,238],"ol",{},[225,226,227,231],"li",{},[228,229,230],"strong",{},"Is this the right person?"," Identity resolution.",[225,233,234,237],{},[228,235,236],{},"Is this still true?"," Freshness.",[225,239,240,243],{},[228,241,242],{},"Can I act on it?"," Deliverability.",[192,245,246],{},"A response can score well on one and poorly on another. A profile can be the right person and eighteen months out of date. An email address can be perfectly formed and belong to someone who left the company last year. Read the three signals separately.",[199,248,250],{"id":249},"_1-is-this-the-right-person","1. Is this the right person?",[252,253,255],"h3",{"id":254},"two-ways-to-identify-someone","Two ways to identify someone",[192,257,258],{},"The API has two distinct families, and they answer to different inputs.",[260,261,262,278],"table",{},[263,264,265],"thead",{},[266,267,268,272,275],"tr",{},[269,270,271],"th",{},"Family",[269,273,274],{},"Endpoints",[269,276,277],{},"What you send",[279,280,281,309],"tbody",{},[266,282,283,288,298],{},[284,285,286],"td",{},[228,287,20],{},[284,289,290,293,294,293,296],{},[291,292,54],"a",{"href":63},", ",[291,295,17],{"href":24},[291,297,59],{"href":67},[284,299,300,301,304,305,308],{},"A LinkedIn profile URL, or a Reverse Contact ",[207,302,303],{},"id"," (",[207,306,307],{},"prs_...",")",[266,310,311,316,322],{},[284,312,313],{},[228,314,315],{},"Enrich",[284,317,318,293,320],{},[291,319,49],{"href":48},[291,321,43],{"href":42},[284,323,324,325,293,328,293,331,293,334,293,337,340,341],{},"Attributes: ",[207,326,327],{},"email",[207,329,330],{},"firstName",[207,332,333],{},"lastName",[207,335,336],{},"companyDomain",[207,338,339],{},"companyName",", or a company ",[207,342,343],{},"domain",[192,345,346,347,351],{},"Fetch assumes you already know ",[348,349,350],"em",{},"which"," profile you want and gives you its content. Enrich is the one doing identity resolution: it takes the attributes you have and decides who they point to. Everything below about ambiguity applies to Enrich.",[192,353,354,356],{},[291,355,30],{"href":29}," sits in between: it accepts a LinkedIn profile URL, or a full name with a company domain.",[252,358,360],{"id":359},"match-rate-and-certainty-pull-in-opposite-directions","Match rate and certainty pull in opposite directions",[192,362,363],{},"Every field you add to an Enrich request narrows the search. That is a trade-off, not a free win.",[260,365,366,382],{},[263,367,368],{},[266,369,370,372,375],{},[269,371,277],{},[269,373,374],{},"Match rate",[269,376,377,378,381],{},"Certainty it is ",[348,379,380],{},"your"," person",[279,383,384,399,415,431],{},[266,385,386,393,396],{},[284,387,388,390,391],{},[207,389,330],{}," + ",[207,392,333],{},[284,394,395],{},"Highest. Almost always returns someone",[284,397,398],{},"Lowest. There are hundreds of people with a common name",[266,400,401,409,412],{},[284,402,403,390,405,390,407],{},[207,404,330],{},[207,406,333],{},[207,408,339],{},[284,410,411],{},"High. Company labels are written many ways",[284,413,414],{},"Moderate. Company names are not unique",[266,416,417,425,428],{},[284,418,419,390,421,390,423],{},[207,420,330],{},[207,422,333],{},[207,424,336],{},[284,426,427],{},"Lower. Only matches if that person is known at that domain",[284,429,430],{},"High",[266,432,433,437,440],{},[284,434,435],{},[207,436,327],{},[284,438,439],{},"Lower. Only matches if we know that address",[284,441,442],{},"Highest. One address points to one person at one company",[192,444,445],{},"Neither end of that table is the correct answer. It depends on what a wrong match costs you:",[447,448,449,461],"ul",{},[225,450,451,454,455,457,458,460],{},[228,452,453],{},"Automatic CRM writes, outbound sequences, anything a customer sees."," Prefer certainty. Send ",[207,456,336],{}," or the email, accept more ",[207,459,209],{},"s. A wrong profile is worse than no profile.",[225,462,463,466],{},[228,464,465],{},"Coverage work reviewed by a human, or a first pass you intend to refine."," A looser query is fine. Get the candidates, then decide.",[192,468,469,470,472],{},"The same logic applies to ",[291,471,30],{"href":29},": a name-and-domain lookup can resolve to the wrong person, and then the address it discovers is a correct address for the wrong human being.",[252,474,476],{"id":475},"a-linkedin-url-is-not-a-permanent-identifier","A LinkedIn URL is not a permanent identifier",[192,478,479,480,482,483,486],{},"It is tempting to treat a profile URL as a primary key. It is not one. A public slug is chosen by the person who owns the profile, and they can change it whenever they like. When they do, the URL you stored six months ago points at nothing, and your call comes back as ",[207,481,209],{},", or as ",[207,484,485],{},"422 INVALID_LINKEDIN_URL"," if the stored value is malformed.",[192,488,489],{},"Store our identifiers instead:",[447,491,492,506,525],{},[225,493,494,505],{},[228,495,496,304,498,500,501,504],{},[207,497,303],{},[207,499,307],{}," for a person, ",[207,502,503],{},"com_..."," for a company)"," is stable across slug changes. Every response that returns a person or a company carries it.",[225,507,508,509,511,512,514,515,517,518,521,522,524],{},"Both ",[291,510,54],{"href":63}," and ",[291,513,17],{"href":24}," accept ",[207,516,303],{}," in place of ",[207,519,520],{},"url",", and ",[207,523,303],{}," wins when you send both.",[225,526,527,529,530,532],{},[291,528,59],{"href":67}," resolves the ",[207,531,303],{}," to the current public slug before it starts, so a live refresh keeps working after a rename.",[192,534,535,536,538],{},"Keep the URL for display and for humans. Key your records on ",[207,537,303],{},".",[252,540,542,543,546],{"id":541},"use-alternativepersons-as-an-ambiguity-flag","Use ",[207,544,545],{},"alternativePersons"," as an ambiguity flag",[192,548,549,550,552,553,556,557,560],{},"When several people match your input, ",[291,551,49],{"href":48}," returns the best match in ",[207,554,555],{},"data.person"," and the other candidates in ",[207,558,559],{},"data.alternativePersons",", ordered best first, up to nine.",[192,562,563],{},"Treat that array as the confidence signal it is:",[447,565,566,572],{},[225,567,568,571],{},[228,569,570],{},"Empty."," One person fits what you sent. Safe to write automatically.",[225,573,574,577],{},[228,575,576],{},"Not empty."," Several people fit. Add an identifying field and retry, or route the record to human review before it reaches a CRM or a sequence.",[579,580,582],"code-group",{"title":581},"Ambiguity gate",[583,584,591],"pre",{"className":585,"code":587,"filename":588,"language":589,"meta":590},[586],"language-javascript","const { data } = await enrichPerson({ firstName, lastName, companyDomain });\n\nif (data.alternativePersons.length > 0) {\n  \u002F\u002F Several people match this input. Do not write automatically.\n  await queueForReview(data.person, data.alternativePersons);\n} else {\n  await writeToCrm(data.person);\n}\n","JavaScript","javascript","",[207,592,587],{"__ignoreMap":590},[192,594,595,596,598,599,602,603,606],{},"Two details worth knowing before you build on the alternatives: each one is a full profile, the same shape as ",[207,597,555],{},", so you can review candidates side by side without an extra Profile call, and their ",[207,600,601],{},"currentCompanyId"," is always ",[207,604,605],{},"null",", so you cannot chain a company fetch directly from a candidate you have not confirmed yet.",[252,608,610],{"id":609},"current-position-is-a-decision-not-a-raw-field","Current position is a decision, not a raw field",[192,612,613,614,617,618,511,621,624],{},"A profile can list several jobs with no end date: a main role, a board seat, an advisory gig. ",[207,615,616],{},"currentPosition"," is the one we single out, and we pick it with fixed, published tie-breakers rather than a heuristic that drifts between calls. The ",[207,619,620],{},"experience",[207,622,623],{},"education"," arrays are ordered by the same fixed rules, whether the record came from our database or from a live fetch.",[192,626,627,628,630],{},"So when a title looks wrong, the cause is almost always a missing or outdated date in the source profile, not an unpredictable API. ",[291,629,126],{"href":125}," walks through exactly how the choice is made.",[199,632,634],{"id":633},"_2-is-this-still-true","2. Is this still true?",[192,636,637],{},"Professional data decays continuously. People change jobs, companies rename, teams get restructured. A record that was accurate when we captured it is not accurate forever, so every record tells you when it was last refreshed.",[260,639,640,653],{},[263,641,642],{},[266,643,644,647,650],{},[269,645,646],{},"Where you look",[269,648,649],{},"Field",[269,651,652],{},"What it means",[279,654,655,671,688],{},[266,656,657,663,668],{},[284,658,659,293,661],{},[291,660,49],{"href":48},[291,662,85],{"href":84},[284,664,665],{},[207,666,667],{},"updateDate",[284,669,670],{},"When we last refreshed that record",[266,672,673,680,685],{},[284,674,675,293,677],{},[291,676,54],{"href":63},[291,678,679],{"href":53},"Company profile",[284,681,682],{},[207,683,684],{},"metadata.updatedAt",[284,686,687],{},"Last upstream update, present only when the response was served from cache",[266,689,690,697,702],{},[284,691,692,293,694],{},[291,693,17],{"href":24},[291,695,696],{"href":16},"Company status",[284,698,699],{},[207,700,701],{},"lastUpdate",[284,703,704,705,707],{},"When we last fetched the profile from the source, ",[207,706,605],{}," when it does not exist",[192,709,710],{},"Three ways to act on freshness instead of hoping for the best:",[447,712,713,739,752],{},[225,714,715,718,719,721,722,725,726,728,729,293,732,511,735,738],{},[228,716,717],{},"Read it before you spend."," ",[291,720,17],{"href":24}," costs 0 credits and returns ",[207,723,724],{},"exists"," plus ",[207,727,701],{},", along with ",[207,730,731],{},"experienceCount",[207,733,734],{},"skillCount",[207,736,737],{},"schoolCount"," so you can spot thin records too.",[225,740,741,718,744,511,746,514,748,751],{},[228,742,743],{},"Filter it at the source.",[291,745,85],{"href":84},[291,747,72],{"href":71},[207,749,750],{},"maxDataAgeDate",", an ISO 8601 datetime that returns only profiles refreshed after that date. Prefer it over filtering stale rows in your own code after you paid for them.",[225,753,754,757],{},[228,755,756],{},"Refresh on demand."," The live endpoints pull a fresh copy when the stored record is too old for your use case.",[192,759,760],{},"Pick an explicit threshold per use case instead of treating every record the same:",[260,762,763,776],{},[263,764,765],{},[266,766,767,770,773],{},[269,768,769],{},"Use case",[269,771,772],{},"Suggested threshold",[269,774,775],{},"If older",[279,777,778,789,800],{},[266,779,780,783,786],{},[284,781,782],{},"Outbound sequence, meeting prep",[284,784,785],{},"30 days",[284,787,788],{},"Refresh live before use",[266,790,791,794,797],{},[284,792,793],{},"CRM enrichment at scale",[284,795,796],{},"90 days",[284,798,799],{},"Refresh in your next batch",[266,801,802,805,808],{},[284,803,804],{},"Analytics, market sizing",[284,806,807],{},"180 days",[284,809,810],{},"Usually fine as is",[192,812,813,815],{},[291,814,130],{"href":129}," covers the Check → Fetch → Live pattern and what it saves.",[199,817,819],{"id":818},"_3-can-i-act-on-it","3. Can I act on it?",[192,821,822,824,825,828,829,832,833,836,837,840,841,844,845,848,849,852],{},[291,823,30],{"href":29}," returns one entry per address discovered, each with a ",[207,826,827],{},"value"," and a ",[207,830,831],{},"type",", typically ",[207,834,835],{},"professional",". It is asynchronous: you get a ",[207,838,839],{},"webhookId",", then retrieve the result by ",[291,842,843],{"href":168},"polling"," or through a ",[291,846,847],{"href":179},"webhook callback",". When nothing is found you receive ",[207,850,851],{},"email-not-found"," rather than a constructed address.",[192,854,855],{},"Two habits protect your sender reputation whatever the source of an address:",[447,857,858,864],{},[225,859,860,863],{},[228,861,862],{},"Keep your own suppression list authoritative."," Unsubscribes, complaints and hard bounces you have already recorded always win over a freshly discovered address.",[225,865,866,869],{},[228,867,868],{},"Track bounce rate per input type."," If one segment bounces above your baseline, the input that produced it is usually the problem rather than the addresses themselves. Name-based lookups and URL-based lookups deserve separate counters, for the reason described earlier.",[871,872,874],"docs-alert",{"type":873},"note",[192,875,876],{},"An address that exists is not the same as an address you should contact. Consent and applicable regulations remain yours to handle: the API tells you what exists, not whom you may email.",[199,878,880],{"id":879},"filters-that-fail-loudly","Filters that fail loudly",[192,882,883],{},"Search deserves its own note, because a bad filter is the quietest way to get bad data. If we ignored a field we did not recognise, you would receive a full page of results drawn from a query you never asked for, and nothing in the response would look wrong.",[192,885,886,887,890,891,894,895,898,899,903],{},"So the search endpoints validate every filter before the query runs. A rejected request returns ",[207,888,889],{},"422",", lists every problem in ",[207,892,893],{},"error.details.errors",", and costs 0 credits. Unknown field names, blank values, values outside a closed list such as ",[207,896,897],{},"currentCompanyIndustry",", and inverted ranges are all refused rather than dropped. See ",[291,900,902],{"href":901},"\u002Fguides\u002Ferrors-retries#search-filter-validation","Search filter validation"," for the complete list.",[192,905,906],{},"Two behaviours to keep in mind when you read search results:",[447,908,909,926],{},[225,910,911,718,914,917,918,921,922,925],{},[228,912,913],{},"Title matching is token-based, not exact.",[207,915,916],{},"\"CTO\""," also matches ",[207,919,920],{},"\"Deputy CTO\"",". Multiple titles are OR-matched, and ",[207,923,924],{},"excludeCurrentPositionTitle"," always wins over a match.",[225,927,928,931],{},[228,929,930],{},"Headcount is stored as fixed brackets."," A range only matches a bracket it fully contains, so bounds that fall inside a bracket return an empty array, and that request is still billed. Send bracket boundaries.",[199,933,935],{"id":934},"when-a-profile-is-blocked","When a profile is blocked",[192,937,938,939,942,943,945],{},"A profile removed under a GDPR or CCPA data subject request returns ",[207,940,941],{},"451",". That state is permanent: the record is not stale, not missing, and will not come back. Retrying wastes calls, so treat ",[207,944,941],{}," as a terminal outcome in your pipeline and drop the record from your enrichment queue rather than leaving it to be picked up on the next pass.",[199,947,949],{"id":948},"putting-it-together","Putting it together",[192,951,952],{},"For a pipeline that writes to a system of record, this is the shape we recommend:",[579,954,956],{"title":955},"Decision tree",[583,957,963],{"className":958,"code":960,"filename":961,"language":962,"meta":590},[959],"language-bash","For each lead:\n  1. Enrich with the most identifying fields you have\n     │\n     ├─ 404 (no confident match)\n     │  └─ Retry with fewer fields → route the result to review\n     │\n     └─ Match\n        │\n        ├─ alternativePersons not empty?\n        │  └─ Route to human review, do not write\n        │\n        └─ Unique match\n           │\n           ├─ Store the id (prs_...) and updateDate\n           │\n           └─ updateDate outside your threshold?\n              └─ Refresh live by id, then write\n","Text","bash",[207,964,960],{"__ignoreMap":590},[192,966,967],{},"The two gates that matter are the ambiguity gate and the freshness gate. Skipping either is how wrong data enters a CRM quietly.",[199,969,971],{"id":970},"quality-checklist","Quality checklist",[447,973,974,977,983,989,992,995,1001,1010,1013],{},[225,975,976],{},"Use Fetch when you already know the profile, and Enrich when you are still resolving who it is.",[225,978,979,980,982],{},"Key your records on our ",[207,981,303],{},", not on a LinkedIn URL that its owner can rename.",[225,984,985,986,988],{},"Never write a record with a non-empty ",[207,987,545],{}," array without review.",[225,990,991],{},"Choose your input mix deliberately: certainty for automated writes, coverage for reviewed work.",[225,993,994],{},"Store the freshness timestamp next to every record so you can audit staleness later.",[225,996,997,998,1000],{},"Set a staleness threshold per use case, filter with ",[207,999,750],{}," on search, and refresh live above it.",[225,1002,1003,1004,1006,1007,1009],{},"Treat ",[207,1005,209],{}," as a normal outcome to log and ",[207,1008,941],{}," as terminal, not as errors to retry blindly.",[225,1011,1012],{},"Keep your suppression list ahead of any discovered address.",[225,1014,1015],{},"Track match rate and bounce rate per input type. They tell you which inputs to improve.",{"title":590,"searchDepth":1017,"depth":1017,"links":1018},3,[1019,1021,1022,1030,1031,1032,1033,1034,1035],{"id":201,"depth":1020,"text":202},2,{"id":216,"depth":1020,"text":217},{"id":249,"depth":1020,"text":250,"children":1023},[1024,1025,1026,1027,1029],{"id":254,"depth":1017,"text":255},{"id":359,"depth":1017,"text":360},{"id":475,"depth":1017,"text":476},{"id":541,"depth":1017,"text":1028},"Use alternativePersons as an ambiguity flag",{"id":609,"depth":1017,"text":610},{"id":633,"depth":1020,"text":634},{"id":818,"depth":1020,"text":819},{"id":879,"depth":1020,"text":880},{"id":934,"depth":1020,"text":935},{"id":948,"depth":1020,"text":949},{"id":970,"depth":1020,"text":971},"How we decide what to return, what each response tells you about its own reliability, and how to trade match rate against certainty.","md",{},true,"\u002Fdocs\u002Fguides\u002Fdata-freshness,\u002Fdocs\u002Fendpoints\u002Fenrich-person,\u002Fdocs\u002Fguides\u002Fcurrent-position-resolution,\u002Fdocs\u002Fguides\u002Ferrors-retries,\u002Fdocs\u002Fguides\u002Fproduction-checklist",{"title":134,"description":1036},"guides\u002Fdata-quality","HEYQ5wSkK6q684ELLq8qz0UUgjzNzyRzvpPhCcl4VUk",1791900211536]