Skip to main content
POST
/
api
/
unipile
/
search
Search LinkedIn people via Unipile
curl --request POST \
  --url https://app.puffle.ai/api/unipile/search \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "keywords": "<string>",
  "limit": 4503599627370495,
  "cursor": "<string>",
  "currentCompany": [
    "<string>"
  ],
  "pastCompany": [
    "<string>"
  ],
  "location": [
    "<string>"
  ],
  "industry": [
    "<string>"
  ],
  "school": [
    "<string>"
  ],
  "firstName": "<string>",
  "lastName": "<string>",
  "title": "<string>",
  "seniorityLevel": [
    "<string>"
  ],
  "yearsInCurrentCompany": "<string>",
  "yearsInCurrentPosition": "<string>",
  "companyHeadcount": [
    "<string>"
  ],
  "function": [
    "<string>"
  ]
}
'
{ "items": [ { "object": "SearchPeopleItem", "provider_id": "ACoAAA...", "public_identifier": "jane-doe-123", "first_name": "Jane", "last_name": "Doe", "headline": "Head of RevOps at Acme", "profile_url": "https://linkedin.com/in/jane-doe-123", "profile_picture_url": "https://media.licdn.com/...", "location": "San Francisco Bay Area", "current_company_name": "Acme", "current_company_linkedin_url": "https://linkedin.com/company/acme", "mutual_connections_count": 14 } ], "cursor": "eyJwYWdlIjoyfQ==", "api": "sales_navigator" }

Overview

The server auto-selects between LinkedIn’s classic search and sales_navigator search based on the account’s has_sales_navigator flag. Sales Navigator exposes richer filters (seniority, tenure, headcount, function); classic silently drops them. Pagination is cursor-based: call again with the returned cursor until it comes back as null. Each result item carries a provider_id that feeds directly into connection-request and message sends — no second lookup needed.

AI agent notes

Preconditions. Account must exist in unipile_accounts with status: "connected". If status is disconnected or credentials_required, run reconnectUnipileAccount first.Page size. Default is Unipile’s default (roughly 10). Max is 50 on classic, 100 on Sales Navigator. Agents doing bulk enrichment typically request the max.Sales Navigator filters are ignored on classic accounts. You can send seniorityLevel, companyHeadcount, etc. safely — the server drops them when api === "classic". Check the api field in the response to confirm which surface ran.Chains with: prospect imports (feed provider_id into your own list-building flow), LinkedIn campaign creation.Rate caution. Unipile throttles aggressive scraping. For large harvests, prefer a sequence of smaller paged calls over tight loops — the provider.fetch layer surfaces 429s as thrown errors.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Body

application/json

Only accountId is required. The server picks classic vs. sales_navigator automatically based on the account's has_sales_navigator flag — Sales Navigator-only filters are silently ignored on classic accounts.

accountId
string<uuid>
required

Supabase UUID of the unipile_accounts row whose LinkedIn session executes the search. Must be owned by the caller and in status: connected.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
keywords
string

Free-text keywords. Same semantics as LinkedIn's search bar.

limit
integer

Results per page. Max 50 on classic, 100 on Sales Navigator. Defaults to Unipile's default (typically 10).

Required range: 0 < x <= 9007199254740991
cursor
string

Opaque pagination cursor returned from a prior response. Omit for the first page.

currentCompany
string[]

LinkedIn company URNs or names for current employer.

pastCompany
string[]

LinkedIn company URNs or names for past employer.

location
string[]

LinkedIn geo URNs.

industry
string[]

LinkedIn industry URNs.

school
string[]

LinkedIn school URNs or names.

firstName
string
lastName
string
title
string

Substring match against current job title.

seniorityLevel
string[]

Sales Navigator only. LinkedIn seniority enum values (e.g. manager, director, vp).

yearsInCurrentCompany
string

Sales Navigator only. LinkedIn tenure bucket.

yearsInCurrentPosition
string

Sales Navigator only. LinkedIn tenure bucket.

companyHeadcount
string[]

Sales Navigator only. LinkedIn headcount buckets (e.g. 10001+).

function
string[]

Sales Navigator only. LinkedIn function codes (e.g. engineering, sales).

Response

One page of LinkedIn search results.

items
object[]
required

Page of LinkedIn people matching the query.

cursor
string | null
required

Opaque cursor for the next page, or null when there are no further results. Pass back as cursor on the next call.

api
enum<string>
required

Which LinkedIn search surface the server used. Determined by the account's entitlements.

Available options:
classic,
sales_navigator