[{"data":1,"prerenderedAt":753},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fguides\u002Fenrich-a-csv-file":208},[4,11,16,21,29,35,42,48,54,59,64,69,74,79,86,92,98,103,108,113,118,123,127,132,137,141,145,148,152,157,161,164,167,171,174,178,182,185,189,193,197,201,205],{"path":5,"title":6,"category":7,"order":8,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fagents","Agent brief","mcp",40,null,"new",{"path":12,"title":13,"category":14,"order":15,"family":9,"subfamily":9,"status":9,"endpointId":9},"\u002Fapi-reference","API reference","introduction",30,{"path":17,"title":18,"category":14,"order":19,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fauthentication","Authentication",20,"updated",{"path":22,"title":23,"category":24,"order":25,"family":26,"subfamily":27,"status":20,"endpointId":28},"\u002Fendpoints\u002Fcheck-company","Company profile status","endpoints",220,"Fetch","Company","check-company",{"path":30,"title":31,"category":24,"order":32,"family":26,"subfamily":33,"status":20,"endpointId":34},"\u002Fendpoints\u002Fcheck-person","Person profile status",120,"Person","check-person",{"path":36,"title":37,"category":24,"order":38,"family":39,"subfamily":40,"status":9,"endpointId":41},"\u002Fendpoints\u002Fcontact-email","Find Email",600,"Contact","Email","contact-email",{"path":43,"title":44,"category":24,"order":45,"family":39,"subfamily":46,"status":9,"endpointId":47},"\u002Fendpoints\u002Fcontact-phone","Find Phone",610,"Phone","contact-phone",{"path":49,"title":50,"category":24,"order":51,"family":52,"subfamily":27,"status":20,"endpointId":53},"\u002Fendpoints\u002Fenrich-company","Enrich company",90,"Enrichment","enrich-company",{"path":55,"title":56,"category":24,"order":57,"family":52,"subfamily":33,"status":20,"endpointId":58},"\u002Fendpoints\u002Fenrich-person","Enrich profile",80,"enrich-person",{"path":60,"title":61,"category":24,"order":62,"family":26,"subfamily":27,"status":20,"endpointId":63},"\u002Fendpoints\u002Ffetch-company","Company profile",200,"fetch-company",{"path":65,"title":66,"category":24,"order":67,"family":26,"subfamily":27,"status":20,"endpointId":68},"\u002Fendpoints\u002Ffetch-company-live","Company profile live",210,"fetch-company-live",{"path":70,"title":71,"category":24,"order":72,"family":26,"subfamily":33,"status":20,"endpointId":73},"\u002Fendpoints\u002Ffetch-profile","Person profile",100,"fetch-profile",{"path":75,"title":76,"category":24,"order":77,"family":26,"subfamily":33,"status":20,"endpointId":78},"\u002Fendpoints\u002Ffetch-profile-live","Person profile live",110,"fetch-profile-live",{"path":80,"title":81,"category":24,"order":82,"family":83,"subfamily":84,"status":20,"endpointId":85},"\u002Fendpoints\u002Fsearch-companies","Company search",94,"Search","Companies","search-companies",{"path":87,"title":88,"category":24,"order":89,"family":90,"subfamily":9,"status":20,"endpointId":91},"\u002Fendpoints\u002Fsearch-companies-available-fields","Company search available fields",720,"Utility","search-companies-available-fields",{"path":93,"title":94,"category":24,"order":95,"family":83,"subfamily":96,"status":10,"endpointId":97},"\u002Fendpoints\u002Fsearch-people","People search",92,"People","search-people",{"path":99,"title":100,"category":24,"order":101,"family":90,"subfamily":9,"status":10,"endpointId":102},"\u002Fendpoints\u002Fsearch-people-available-fields","People search available fields",710,"search-people-available-fields",{"path":104,"title":105,"category":24,"order":106,"family":83,"subfamily":96,"status":10,"endpointId":107},"\u002Fendpoints\u002Fsearch-people-count","People search count",93,"search-people-count",{"path":109,"title":110,"category":24,"order":111,"family":83,"subfamily":96,"status":10,"endpointId":112},"\u002Fendpoints\u002Fsearch-people-lookalike","People lookalike",95,"search-people-lookalike",{"path":114,"title":115,"category":24,"order":116,"family":83,"subfamily":96,"status":10,"endpointId":117},"\u002Fendpoints\u002Fsearch-people-prompt","Agentic Search",96,"search-people-prompt",{"path":119,"title":120,"category":24,"order":121,"family":90,"subfamily":9,"status":20,"endpointId":122},"\u002Fendpoints\u002Fusage","Usage",700,"usage",{"path":124,"title":125,"category":14,"order":126,"family":9,"subfamily":9,"status":9,"endpointId":9},"\u002Fgetting-started","Getting started",10,{"path":128,"title":129,"category":130,"order":131,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Fagent-skills","Agent skills","cli",70,{"path":133,"title":134,"category":135,"order":136,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Fapi-key-management","API key management","guides",12,{"path":138,"title":139,"category":130,"order":140,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Fcli","Command line interface (CLI)",60,{"path":142,"title":143,"category":135,"order":144,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Fcurrent-position-resolution","Current position and work history ordering",35,{"path":146,"title":147,"category":135,"order":8,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Fdata-freshness","Data freshness",{"path":149,"title":150,"category":135,"order":151,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Fdata-quality","Data quality",18,{"path":153,"title":154,"category":155,"order":156,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Fendpoint-transition-october-2026","Endpoint transition on October 13, 2026","migrations",1,{"path":158,"title":159,"category":135,"order":160,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Fenrich-a-csv-file","Enrich a CSV file",16,{"path":162,"title":163,"category":135,"order":19,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Ferrors-retries","Error handling & retries",{"path":165,"title":166,"category":135,"order":126,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Ffirst-api-call","Your first API call",{"path":168,"title":169,"category":135,"order":170,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Findustries","Industry values",50,{"path":172,"title":173,"category":7,"order":170,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Fmcp","Connect AI agents (MCP)",{"path":175,"title":176,"category":155,"order":177,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Fmigrating-search-persons-to-people","Migrating people search from persons to people",51,{"path":179,"title":180,"category":135,"order":181,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fguides\u002Fmissing-and-empty-fields","Missing and empty profile fields",42,{"path":183,"title":184,"category":135,"order":15,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Fpolling","Polling, zero setup",{"path":186,"title":187,"category":135,"order":188,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Fproduction-checklist","Production checklist",45,{"path":190,"title":191,"category":135,"order":192,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Frate-limits-credits","Rate limits & credits",25,{"path":194,"title":195,"category":135,"order":196,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Fwebhooks","Webhooks",31,{"path":198,"title":199,"category":135,"order":200,"family":9,"subfamily":9,"status":20,"endpointId":9},"\u002Fguides\u002Fwhich-endpoint-should-i-use","Which endpoint should I use?",15,{"path":202,"title":203,"category":204,"order":126,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fsdk\u002Fjavascript","JavaScript and TypeScript","sdk",{"path":206,"title":207,"category":204,"order":19,"family":9,"subfamily":9,"status":10,"endpointId":9},"\u002Fsdk\u002Fpython","Python",{"id":209,"title":159,"audience":9,"badgeColor":9,"badgeLabel":9,"body":210,"category":135,"description":744,"endpointId":9,"extension":745,"family":9,"lastVerified":746,"links":9,"meta":747,"navigation":748,"order":160,"path":158,"relatedArticles":749,"requiresFlag":9,"seo":750,"status":10,"stem":751,"subfamily":9,"__hash__":752},"docs\u002Fguides\u002Fenrich-a-csv-file.md",{"type":211,"value":212,"toc":728},"minimark",[213,217,242,247,297,300,305,308,425,434,438,441,495,501,507,511,514,587,616,639,664,668,672,680,684,687,691,694,698,718,722],[214,215,216],"p",{},"You have a file of contacts and want it back with profiles, work emails or phone numbers. There are two ways to do it:",[218,219,220,236],"ul",{},[221,222,223,227,228,235],"li",{},[224,225,226],"strong",{},"In the app, no code:"," ",[229,230,234],"a",{"href":231,"rel":232},"https:\u002F\u002Fapp.reversecontact.com\u002Fbulk",[233],"nofollow","Bulk Import"," takes your CSV and gives you an enriched CSV back.",[221,237,238,241],{},[224,239,240],{},"With the API:"," your code reads the file and calls an endpoint for each row. The API takes JSON, one person per request: there is no endpoint that accepts a CSV file.",[243,244,246],"h2",{"id":245},"bulk-import-in-the-app","Bulk Import in the app",[248,249,250,260,279,285,291],"ol",{},[221,251,252,255,256,259],{},[224,253,254],{},"Upload your file."," Open ",[229,257,234],{"href":231,"rel":258},[233]," and drop a CSV of up to 25,000 rows and 25 MB. You can also paste a list of emails, LinkedIn profile URLs or names instead of uploading a file.",[221,261,262,265,266,270,271,274,275,278],{},[224,263,264],{},"Map your columns."," Tell the import which columns hold the LinkedIn profile URL, the email, the first and last name, the company name and the company domain. Common headers such as ",[267,268,269],"code",{},"linkedin_url",", ",[267,272,273],{},"email"," or ",[267,276,277],{},"profile_url"," are detected for you, and you can change any mapping.",[221,280,281,284],{},[224,282,283],{},"Choose what to look up."," Each row can get its full profile, a work email and a phone number. Select one or several.",[221,286,287,290],{},[224,288,289],{},"Review and start."," The review step counts the rows that will be enriched, the duplicates and the rows with no usable input, and shows the credits the import reserves before it starts.",[221,292,293,296],{},[224,294,295],{},"Download the result."," The job page follows the import row by row. When it completes, you receive an in-app notification and an email, and the enriched CSV is ready to download.",[214,298,299],{},"A row needs at least one usable input: a LinkedIn profile URL, an email, or a name with its company. A row that repeats an earlier one is not enriched or charged twice.",[301,302,304],"h3",{"id":303},"what-the-enriched-file-contains","What the enriched file contains",[214,306,307],{},"The result keeps every column of your file and adds these columns to each row:",[309,310,311,324],"table",{},[312,313,314],"thead",{},[315,316,317,321],"tr",{},[318,319,320],"th",{},"Column",[318,322,323],{},"Content",[325,326,327,358,368,396,409],"tbody",{},[315,328,329,335],{},[330,331,332],"td",{},[267,333,334],{},"rc_status",[330,336,337,270,340,270,343,270,346,270,349,270,352,274,355],{},[267,338,339],{},"enriched",[267,341,342],{},"partial",[267,344,345],{},"not_found",[267,347,348],{},"invalid_input",[267,350,351],{},"skipped",[267,353,354],{},"insufficient_credits",[267,356,357],{},"error",[315,359,360,365],{},[330,361,362],{},[267,363,364],{},"rc_message",[330,366,367],{},"Why a row was not enriched, in plain English",[315,369,370,376],{},[330,371,372,375],{},[267,373,374],{},"rc_*"," profile columns",[330,377,378,379,381,382,270,385,270,388,391,392,395],{},"The fields of the ",[229,380,56],{"href":55}," response, one column per field (",[267,383,384],{},"rc_first_name",[267,386,387],{},"rc_current_position_title",[267,389,390],{},"rc_location_city","...). List fields such as ",[267,393,394],{},"rc_experience"," hold JSON.",[315,397,398,406],{},[330,399,400,270,403],{},[267,401,402],{},"rc_email",[267,404,405],{},"rc_email_status",[330,407,408],{},"The work email, when you asked for one",[315,410,411,422],{},[330,412,413,270,416,270,419],{},[267,414,415],{},"rc_phone",[267,417,418],{},"rc_phone_type",[267,420,421],{},"rc_phone_status",[330,423,424],{},"The phone number, when you asked for one",[214,426,427,429,430,433],{},[267,428,342],{}," means some of the requested lookups found a result and others did not. When you ask for contact details without the profile, a single ",[267,431,432],{},"rc_linkedin_url"," column replaces the profile columns. The file is UTF-8 and opens directly in Excel.",[301,435,437],{"id":436},"what-it-costs","What it costs",[214,439,440],{},"You pay only for rows that return a result. A row that is not found, invalid, a duplicate or skipped costs nothing.",[309,442,443,454],{},[312,444,445],{},[315,446,447,450],{},[318,448,449],{},"Lookup",[318,451,453],{"align":452},"center","Credits per row",[325,455,456,464,472,479,487],{},[315,457,458,461],{},[330,459,460],{},"Profile from a LinkedIn profile URL",[330,462,463],{"align":452},"1 when found",[315,465,466,469],{},[330,467,468],{},"Profile from a LinkedIn profile URL, with Live enrichment",[330,470,471],{"align":452},"2 when found",[315,473,474,477],{},[330,475,476],{},"Profile from an email or a name",[330,478,471],{"align":452},[315,480,481,484],{},[330,482,483],{},"Work email",[330,485,486],{"align":452},"3 when found",[315,488,489,492],{},[330,490,491],{},"Phone number",[330,493,494],{"align":452},"20 when found",[214,496,497,498,500],{},"If your balance does not cover every row, the import takes the rows it can afford in file order and marks the others ",[267,499,354],{},". Top up and upload those rows again to enrich them.",[214,502,503,506],{},[224,504,505],{},"Live enrichment"," applies to rows with a LinkedIn profile URL: it scrapes each profile fresh instead of reading the cached profile, and a large file can take several minutes. Bulk Import works during the free trial with your trial credits, except Live enrichment.",[243,508,510],{"id":509},"enrich-a-csv-with-the-api","Enrich a CSV with the API",[214,512,513],{},"Read the file in your code and call, for each row, the endpoint that matches what the row holds:",[309,515,516,529],{},[312,517,518],{},[315,519,520,523,526],{},[318,521,522],{},"The row holds",[318,524,525],{},"Endpoint",[318,527,528],{"align":452},"Credits",[325,530,531,545,559,573],{},[315,532,533,536,543],{},[330,534,535],{},"A LinkedIn profile URL",[330,537,538],{},[229,539,540],{"href":70},[267,541,542],{},"POST \u002Fv2\u002Ffetch\u002Fpersons",[330,544,463],{"align":452},[315,546,547,550,557],{},[330,548,549],{},"An email, or a name with its company",[330,551,552],{},[229,553,554],{"href":55},[267,555,556],{},"POST \u002Fv2\u002Fenrich\u002Fpersons",[330,558,471],{"align":452},[315,560,561,564,571],{},[330,562,563],{},"You need a work email",[330,565,566],{},[229,567,568],{"href":36},[267,569,570],{},"POST \u002Fv2\u002Fcontact\u002Femail",[330,572,486],{"align":452},[315,574,575,578,585],{},[330,576,577],{},"You need a phone number",[330,579,580],{},[229,581,582],{"href":43},[267,583,584],{},"POST \u002Fv2\u002Fcontact\u002Fphone",[330,586,494],{"align":452},[214,588,589,590,593,594,596,597,599,600,603,604,607,608,611,612,615],{},"The example below reads ",[267,591,592],{},"contacts.csv",", enriches each row from its ",[267,595,273],{}," column with ",[267,598,556],{},", and writes ",[267,601,602],{},"contacts_enriched.csv"," with five profile columns added. A ",[267,605,606],{},"404"," means no match and costs nothing. A ",[267,609,610],{},"429"," means the per-minute rate limit is reached: the example waits the number of seconds in ",[267,613,614],{},"error.details.retryAfter",", then retries the same row.",[617,618,620,631],"code-group",{"title":619},"Enrich a CSV",[621,622,629],"pre",{"className":623,"code":625,"filename":626,"language":627,"meta":628},[624],"language-javascript","\u002F\u002F npm install csv-parse csv-stringify\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { parse } from \"csv-parse\u002Fsync\";\nimport { stringify } from \"csv-stringify\u002Fsync\";\n\nconst KEY = \"YOUR_API_KEY\";\nconst FIELDS = [\"firstName\", \"lastName\", \"currentPositionTitle\", \"currentCompanyName\", \"linkedinUrl\"];\n\nasync function enrich(email) {\n  while (true) {\n    const response = await fetch(\"https:\u002F\u002Fapi.reversecontact.com\u002Fv2\u002Fenrich\u002Fpersons\", {\n      method: \"POST\",\n      headers: { \"Authorization\": `Bearer ${KEY}`, \"Content-Type\": \"application\u002Fjson\" },\n      body: JSON.stringify({ email })\n    });\n    if (response.status === 429) {\n      const { error } = await response.json();\n      await new Promise((resolve) => setTimeout(resolve, error.details.retryAfter * 1000));\n      continue;\n    }\n    if (response.status === 404) return null;\n    if (!response.ok) throw new Error(`HTTP ${response.status}`);\n    return (await response.json()).data.person;\n  }\n}\n\nconst rows = parse(readFileSync(\"contacts.csv\"), { columns: true, bom: true });\nfor (const row of rows) {\n  const person = row.email ? await enrich(row.email) : null;\n  for (const field of FIELDS) row[field] = person?.[field] ?? \"\";\n}\nwriteFileSync(\"contacts_enriched.csv\", stringify(rows, { header: true }));\n","JavaScript","javascript","",[267,630,625],{"__ignoreMap":628},[621,632,637],{"className":633,"code":635,"filename":207,"language":636,"meta":628},[634],"language-python","# pip install requests\nimport csv\nimport time\n\nimport requests\n\nKEY = \"YOUR_API_KEY\"\nFIELDS = [\"firstName\", \"lastName\", \"currentPositionTitle\", \"currentCompanyName\", \"linkedinUrl\"]\n\n\ndef enrich(email):\n    while True:\n        response = requests.post(\n            \"https:\u002F\u002Fapi.reversecontact.com\u002Fv2\u002Fenrich\u002Fpersons\",\n            headers={\"Authorization\": f\"Bearer {KEY}\"},\n            json={\"email\": email},\n        )\n        if response.status_code == 429:\n            time.sleep(response.json()[\"error\"][\"details\"][\"retryAfter\"])\n            continue\n        if response.status_code == 404:\n            return None\n        response.raise_for_status()\n        return response.json()[\"data\"][\"person\"]\n\n\nwith open(\"contacts.csv\", newline=\"\", encoding=\"utf-8-sig\") as source, \\\n        open(\"contacts_enriched.csv\", \"w\", newline=\"\", encoding=\"utf-8\") as target:\n    reader = csv.DictReader(source)\n    writer = csv.DictWriter(target, fieldnames=reader.fieldnames + FIELDS)\n    writer.writeheader()\n    for row in reader:\n        person = enrich(row[\"email\"]) if row[\"email\"] else None\n        for field in FIELDS:\n            row[field] = (person or {}).get(field) or \"\"\n        writer.writerow(row)\n","python",[267,638,635],{"__ignoreMap":628},[214,640,641,642,644,645,648,649,652,653,656,657,660,661,663],{},"For a row with a LinkedIn profile URL, call ",[267,643,542],{}," with ",[267,646,647],{},"{\"url\": ...}"," instead: it costs 1 credit instead of 2. Work emails and phone numbers are asynchronous: send every row first, keep the ",[267,650,651],{},"webhookId"," of each request, then collect the results by ",[229,654,655],{"href":183},"polling"," or through ",[229,658,659],{"href":194},"webhooks",". See ",[229,662,191],{"href":190}," to size a large file against your per-minute limit.",[243,665,667],{"id":666},"faq","FAQ",[301,669,671],{"id":670},"can-i-upload-a-csv-file-to-the-reverse-contact-api","Can I upload a CSV file to the Reverse Contact API?",[214,673,674,675,274,677,679],{},"No. The Reverse Contact API takes JSON, one person per request, and has no endpoint that accepts a CSV file. To enrich a CSV without code, use Bulk Import in the app: upload the file, map its columns and download the enriched CSV. With the API, read the file in your code and call ",[267,676,556],{},[267,678,542],{}," for each row.",[301,681,683],{"id":682},"how-many-rows-can-bulk-import-enrich-at-once","How many rows can Bulk Import enrich at once?",[214,685,686],{},"Bulk Import accepts a CSV of up to 25,000 rows and 25 MB per import. Split a larger file into several imports. Each row needs a LinkedIn profile URL, an email, or a name with its company.",[301,688,690],{"id":689},"how-much-does-it-cost-to-enrich-a-csv-file","How much does it cost to enrich a CSV file?",[214,692,693],{},"Bulk Import charges only rows that return a result: 1 credit for a profile found from a LinkedIn profile URL, 2 credits for a profile found from an email or a name, 3 credits for a work email found and 20 credits for a phone number found. Rows that are not found, invalid or duplicated cost nothing.",[301,695,697],{"id":696},"what-does-the-enriched-csv-contain","What does the enriched CSV contain?",[214,699,700,701,270,703,705,706,708,709,711,712,714,715,717],{},"The enriched CSV from Bulk Import keeps every column of the original file and adds ",[267,702,334],{},[267,704,364],{}," and one ",[267,707,374],{}," column per profile field, plus ",[267,710,402],{}," and ",[267,713,415],{}," columns when a work email or a phone number was requested. ",[267,716,334],{}," tells whether each row was enriched, not found, invalid or skipped.",[301,719,721],{"id":720},"what-happens-when-my-credits-run-out-during-a-bulk-import","What happens when my credits run out during a Bulk Import?",[214,723,724,725,727],{},"Bulk Import reserves credits before the job starts. If the balance does not cover every row, Bulk Import enriches the rows it can afford in file order and marks the other rows ",[267,726,354],{}," in the enriched CSV, without charging them. Top up and upload those rows again to enrich them.",{"title":628,"searchDepth":729,"depth":729,"links":730},3,[731,736,737],{"id":245,"depth":732,"text":246,"children":733},2,[734,735],{"id":303,"depth":729,"text":304},{"id":436,"depth":729,"text":437},{"id":509,"depth":732,"text":510},{"id":666,"depth":732,"text":667,"children":738},[739,740,741,742,743],{"id":670,"depth":729,"text":671},{"id":682,"depth":729,"text":683},{"id":689,"depth":729,"text":690},{"id":696,"depth":729,"text":697},{"id":720,"depth":729,"text":721},"Upload a CSV of contacts in the app and download it enriched, or loop over its rows with the API.","md","2026-10-16",{},true,"\u002Fdocs\u002Fguides\u002Fwhich-endpoint-should-i-use,\u002Fdocs\u002Fendpoints\u002Fenrich-person,\u002Fdocs\u002Fguides\u002Frate-limits-credits,\u002Fdocs\u002Fguides\u002Fpolling",{"title":159,"description":744},"guides\u002Fenrich-a-csv-file","Qvy9yh1nGoSwAunnLNFd1AgBgB9NH42k8dSmXy9s9Nw",1792141280322]