| name | unipile-v2-linkedin-search |
| description | Padrão para CAPTURAR prospects via Unipile v2 — busca no LinkedIn Classic e Sales Navigator (pessoas e empresas), por URL colada ou filtros estruturados, com o catálogo completo de filtros. Use ao implementar/ajustar a captura de leads (ProspectSource/searchSalesNavigator) ou ao montar buscas. Requer [[unipile-v2-foundations]]. |
Unipile v2 — Busca LinkedIn / Sales Navigator
Na v2, Sales Navigator é first-class, com endpoints dedicados sob
/v2/{account_id}/linkedin/sales-navigator/.... account_id no PATH; paginação por
offset/limit (query). Ver [[unipile-v2-foundations]].
⚠️ Pré-requisito de conexão: a conta LinkedIn precisa ter sido conectada com o
produto sales_navigator (config.linkedin.products: ["classic","sales_navigator"]
no POST /v2/auth/link). Sem isso o LinkedIn conecta só como "Personal" (classic) e
as rotas sales-navigator/* não funcionam. npm run connect -- linkedin BR já pede
os dois produtos por padrão.
Forma 1 (preferida p/ "todas as variáveis"): URL colada
POST /v2/{account_id}/linkedin/sales-navigator/search (application/json):
{ "url": "https://www.linkedin.com/sales/search/people?query=..." }
Cole a URL de uma busca montada na UI nativa do Sales Navigator. A cobertura de
filtros passa a ser a própria UI do LinkedIn — nada a re-modelar. É o caminho padrão
do projeto para garantir que nenhum filtro se perca. Query: limit, offset.
Forma 2: filtros estruturados
Endpoints separados por categoria (body = objeto de filtros):
- Pessoas:
POST /v2/{account_id}/linkedin/sales-navigator/search/people
- Empresas:
POST /v2/{account_id}/linkedin/sales-navigator/search/companies
Sales Navigator — people (catálogo completo)
keywords, first_name, last_name, location, location_by_postal_code, industry, tenure, groups, school, profile_language, company, company_headcount, company_type, company_location, tenure_at_company, past_company, function, role, tenure_at_role, seniority, past_role, following_your_company, viewed_your_profile_recently, network_distance, connections_of, past_colleague, shared_experiences, changed_jobs, posted_on_linkedin, mentionned_in_news, persona, account_lists, lead_lists, saved_search_id, recent_search_id, last_viewed_at, include_saved_leads, include_saved_accounts, save_search
Sales Navigator — companies (catálogo completo)
keywords, industry, location, location_by_postal_code, has_job_offers, headcount, headcount_growth, department_headcount, department_headcount_growth, network_distance, annual_revenue, followers_count, fortune, technologies, recent_activities, saved_accounts, account_lists, saved_search_id, recent_search_id, last_viewed_at, save_search
(Classic: POST /v2/{account_id}/linkedin/search + /search/people|companies|posts|jobs.
Recruiter: .../linkedin/recruiter/search.... Listas salvas Sales Nav:
.../sales-navigator/lead-lists e .../account-lists.)
Filtros por TEXTO precisam virar ID
industry/location/company/function/seniority… não aceitam texto cru, só IDs.
Converta com GET /v2/{account_id}/linkedin/sales-navigator/search/parameters
(ou .../linkedin/search/parameters no classic). Na busca por URL (Forma 1) a
conversão já vem embutida na URL.
Response e "todos os campos"
Preserve o payload raw completo de cada item (fonte de verdade de todos os
campos), além dos normalizados. No código: SalesNavLead.raw/SalesNavAccount.raw
guardam o objeto inteiro — nunca descarte campos no mapeamento.
Mapa código → endpoint v2
| Nosso | v2 |
|---|
searchSalesNavigator({searchUrl}) | POST /v2/{acc}/linkedin/sales-navigator/search body {url} |
…({params, category:'people'}) | POST .../sales-navigator/search/people |
…({params, category:'companies'}) | POST .../sales-navigator/search/companies |
| paginação | query offset/limit |
| resolver IDs de filtro | GET .../sales-navigator/search/parameters |