What you’ll build
A Next.js API route deployed on Vercel that:- Accepts a POST from Bright Data containing a JSON array of scraped LinkedIn profiles
- Maps each profile into a normalized CRM-shaped contact record
- Logs the mapped records so you can inspect them in the Vercel dashboard
Prerequisites
- A Bright Data account with an API key (get your key)
- A free Vercel account
- Node.js 18+ installed locally
- The Vercel CLI installed:
npm install -g vercel
Part 1: Scaffold the Next.js project
In a new terminal, create a minimal Next.js project:Part 2: Add the webhook route
Create the fileapp/api/webhook/linkedin/route.ts:
app/api/webhook/linkedin/route.ts
route.ts file as an API endpoint, so this file alone gives you a working POST /api/webhook/linkedin route once deployed.
Part 3: Deploy to Vercel
From the project root:Part 4: Trigger the scrape
Open a second terminal and trigger the Bright Data LinkedIn scraper, pointing it at your Vercel URL:YOUR_API_KEY with your Bright Data API key and linkedin-to-crm-<hash> with your actual Vercel URL.
You should see a response like this immediately:
snapshot_id. Bright Data POSTs the results to your Vercel endpoint when the job finishes. For two profiles, that usually takes 30 to 60 seconds.
Switch to the Vercel Logs tab. Within a minute you should see something like:
Part 5: Map profiles to a CRM shape
Right now the handler just logs names and positions. Real CRMs expect contact records with specific field names:full_name, job_title, company, and so on. Let’s normalize the Bright Data payload into that shape.
Replace app/api/webhook/linkedin/route.ts with:
app/api/webhook/linkedin/route.ts
Securing the webhook
Right now anyone who guesses your Vercel URL could POST fake profile data to it. Before you pipe live data into a real CRM, lock down the endpoint. Bright Data’s trigger call accepts awebhook_header_Authorization query parameter, which gets forwarded as the Authorization header on the webhook POST:
WEBHOOK_SECRET as an environment variable in your Vercel project settings, then redeploy.
Bright Data also publishes a list of webhook source IPs you can allowlist. See Allowlist webhook IPs in the webhook reference.
Congratulations
You’ve built an end-to-end pipeline that scrapes LinkedIn profiles and delivers CRM-ready contact records to your own server:- A Next.js API route deployed on Vercel that receives Bright Data webhooks
- A mapper function that normalizes Bright Data’s profile schema into a CRM-shaped contact
- A trigger call that fires the scrape asynchronously and tells Bright Data exactly where to send the results
route.ts sketches.
Next steps
Async batch requests
Scrape hundreds of URLs in a single batch job.
Amazon S3 delivery
Swap the webhook for an S3 bucket when payloads exceed Vercel’s 4.5 MB body limit.
Webhook reference
Full parameter list, auth headers and IP allowlist.
HubSpot Contacts API
Drop-in replacement for the commented POST in the handler.