Uma biblioteca TypeScript para interagir com a API interna do LinkedIn (Voyager)
npm install linkedin-api-voyager> ⚠️ MUDANÇA DE PACOTE: Esta biblioteca foi renomeada e movida de linkedin-api-voyager para @florydev/linkedin-api-voyager.
> Por favor, atualize suas dependências. A versão antiga não receberá novas atualizações.


Biblioteca TypeScript para interagir com endpoints internos do LinkedIn (Voyager). Esta não é uma API oficial.
``bash`
npm install @florydev/linkedin-api-voyagerou
yarn add @florydev/linkedin-api-voyager
Atenção: Esta biblioteca deve ser executada exclusivamente no lado do servidor (Node.js). O uso direto no navegador (client-side) resultará em erros de CORS e restrições de segurança.
Se você estiver usando em uma aplicação web (React, Vue, etc.), você deve criar uma API ou função intermediária no seu backend para chamar esta biblioteca.
No ponto de entrada da sua aplicação backend (ex: index.ts, server.ts):
`ts
import { Client } from "@florydev/linkedin-api-voyager";
// Configure suas credenciais uma única vez
Client({
JSESSIONID: process.env.LINKEDIN_JSESSIONID, // ex: "ajax:123456789" (apenas os números se preferir, a lib trata)
li_at: process.env.LINKEDIN_LI_AT, // ex: "AQEDAR..."
});
`
1. Faça login no LinkedIn pelo navegador.
2. Abra o DevTools do navegador.
3. Vá em:
- Chrome/Edge: Application -> Storage -> Cookies -> https://www.linkedin.comStorage
- Firefox: -> Cookies -> https://www.linkedin.comli_at
4. Copie os valores:
- : valor completo.JSESSIONID
- : valor completo (ex: "ajax:123456789").
> Nota: Nunca comite suas credenciais reais no código. Use variáveis de ambiente (.env).
Após inicializar o Client, você pode importar e usar qualquer função diretamente:
`ts
import {
getUserMiniProfile,
getProfissionalExperiences,
getCompany,
searchPeople,
getCommentsByPostUrl,
} from "@florydev/linkedin-api-voyager";
// Exemplo: Buscar perfil
const profile = await getUserMiniProfile("florymignon");
console.log(profile);
// Exemplo: Buscar experiências
const experiences = await getProfissionalExperiences("florymignon");
// Exemplo: Buscar empresa
const company = await getCompany("microsoft");
// Exemplo: Pesquisar pessoas
const people = await searchPeople("software engineer");
// Exemplo: Buscar comentários
const comments = await getCommentsByPostUrl(
"https://www.linkedin.com/feed/update/urn:li:activity-1234567890/",
);
`
- Client(config: { JSESSIONID: string; li_at: string }): Configura a instância global do axios. Deve ser chamado antes de qualquer outra função.API_BASE_URL
- : https://www.linkedin.com/voyager/api
A biblioteca exporta funções dos seguintes módulos:
- user: Perfis e dados de usuário.company
- : Dados de empresas.posts
- : Interações com posts e comentários.search
- : Busca de pessoas e empresas.utils
- : Utilitários gerais.
Flory Muenge Tshiteya
- Github: @Floryvibla
- LinkedIn: Flory Muenge Tshiteya
- 🐦 X (Twitter): @DevFlory
``
Tipos exportados:
- MiniUserProfileLinkedin
Funções exportadas:
- getUserMiniProfile(identifier: string): Promiseabout
- Busca dados básicos do perfil (nome, headline, imagens) e também o .identifier
- é o publicIdentifier (parte final da URL linkedin.com/in/).
- extractProfileIdLinkedin(profileUrl: string): PromisepublicIdentifier
- Extrai o de uma URL linkedin.com/in/....urn:li:fsd_profile:
- Se você passar apenas o identificador, ele tenta usar diretamente.
- Retorna o ID numérico interno (sem o prefixo ) quando encontra.
- getProfileSectionAbout(identifier: string): Promise
- Retorna o texto de “Sobre” (about) do perfil.
- getProfissionalExperiences(identifier: string): PromisegetCompany
- Retorna a lista de experiências profissionais.
- Para cada experiência, tenta enriquecer com dados de empresa via .
- getContactInfo(identifier: string): Promise<{ ... }>
- Retorna informações de contato quando disponíveis (email, telefones, sites etc.).
- getLinkedinSkills(identifier: string): Promise
- Retorna as skills (habilidades) listadas no perfil.
- getLinkedinEducation(identifier: string): Promise
- Retorna a educação (escola, degree, datas, skills relacionadas quando houver).
- getLinkedinCertifications(identifier: string): Promise
- Retorna certificações.
Exemplo:
`ts
import {
getUserMiniProfile,
getProfileSectionAbout,
getProfissionalExperiences,
getContactInfo,
getLinkedinSkills,
getLinkedinEducation,
getLinkedinCertifications,
} from "linkedin-api-voyager";
const identifier = "florymignon";
const mini = await getUserMiniProfile(identifier);
const about = await getProfileSectionAbout(identifier);
const experiences = await getProfissionalExperiences(identifier);
const contact = await getContactInfo(identifier);
const skills = await getLinkedinSkills(identifier);
const education = await getLinkedinEducation(identifier);
const certifications = await getLinkedinCertifications(identifier);
``
Funções exportadas:
- getCompany(identifier: string): PromiseuniversalName
- Busca dados de uma empresa pelo (slug da página).https://www.linkedin.com/company/microsoft/
- Exemplo de slug: -> microsoft.
Exemplo:
`ts
import { getCompany } from "linkedin-api-voyager";
const company = await getCompany("microsoft");
`
Funções exportadas:
- parseResponsePostLinkedin(response: any, key: string, accumulatedData: any): anyincluded
- Helper para selecionar itens do a partir de *elements.
- getCommentsByPostUrl(url: string, start = 0, limit = 50, accumulatedComments: unknown[] = []): Promise
- Busca comentários de um post (paginando recursivamente até acabar).
- getPosts(): Promise[]
- Atualmente retorna (placeholder).
- getPostLinkedin(url: string, commentsCount = 10, likesCount = 10): Promise
- Busca um post pelo slug da URL e retorna os dados do post e do autor.
- getUserPosts({ identifier, start = 0, count = 50, accumulatedPosts = [] }): Promiseidentifier
- Busca posts do usuário por (publicIdentifier).
- helperGetPosts(response: any, key: string, accumulatedPosts?: any, addFields?: Record
- Helper para extrair posts e contagens (likes, comentários, shares).
- helperGetImageUrl(item: any): string
- Helper para montar a URL de imagem, priorizando o maior artifact.
Exemplo (comentários):
`ts
import { getCommentsByPostUrl } from "linkedin-api-voyager";
const comments = await getCommentsByPostUrl(
"https://www.linkedin.com/feed/update/urn:li:activity-1234567890/",
);
`
Constantes internas:
- MAX_SEARCH_COUNT = 25 (limite máximo por chamada na busca geral)
Funções exportadas:
- search(params: ISearchParams): Promisequery
- Busca geral usando e/ou filters (formato Voyager).offset
- Aceita paginação via .
- searchPeople(queryOrParams: string | ISearchPeopleParams): Promise
- Busca pessoas com helpers para montar filtros (networkDepth, regiões, empresas etc.).
Exemplo:
`ts
import { search, searchPeople } from "linkedin-api-voyager";
const res = await search({ query: "react developer" });
const people = await searchPeople({
query: "engenheiro de software",
regions: ["br:0"],
});
`
Funções exportadas (helpers usados em parsing e normalização):
- filterKeys(obj: any, keysToKeep: string[]): anyfilterOutKeys(obj: any, keysToIgnore: string[]): any
- getNestedValue(obj: any, path: string): any
- extractFields(data: any[], fieldsMap: Record
- debugObjectStructure(obj: any, maxDepth = 3, currentDepth = 0): void
- resolveReferences(data: any, included: any[]): any
- extractDataWithReferences(elements: string[], included: any[], fieldsMap?: Record
- debugResolvedStructure(elements: string[], included: any[], maxDepth = 2): void
- extractFieldsFromIncluded(included: any[], fields: string[]): Array
- mergeExtraFields(mainData: any[], extraData: Array
- getDataIncludedForEntity(jsonData: Record
- extractExperiences(jsonData: Record
- assert(value: unknown, message?: string | Error): asserts value
- getIdFromUrn(urn?: string): string | undefined
- getUrnFromRawUpdate(update?: string): string | undefined
- isLinkedInUrn(urn?: string): boolean
- parseExperienceItem(item: any, opts: { isGroupItem?: boolean; included: any[] }): ExperienceItem
- getGroupedItemId(item: any): string | undefined
- omit(inputObj: object, ...keys: string[]): object
- resolveImageUrl(vectorImage?: VectorImage): string | undefined
- resolveLinkedVectorImageUrl(linkedVectorImage?: LinkedVectorImage): string | undefined
- stringifyLinkedInDate(date?: LIDate): string | undefined
- normalizeRawOrganization(o?: RawOrganization): Organization
-
Exemplo (mapear campos com path aninhado):
`ts
import { extractFields } from "linkedin-api-voyager";
const fieldsMap = {
nome: "firstName",
headline: "headline",
foto: "profilePicture.displayImageReferenceResolutionResult.vectorImage.rootUrl",
};
const mapped = extractFields([someObject], fieldsMap);
`
Este arquivo exporta tipos e interfaces TypeScript usados pela biblioteca (por exemplo: ISearchParams, ISearchPeopleParams, SearchResponse, Organization, ExperienceItem`).
- Usa endpoints internos do LinkedIn (Voyager), que podem mudar sem aviso.
- Requer cookies válidos de uma sessão autenticada.
- Use com moderação para reduzir risco de bloqueio.
- Respeite os termos de uso do LinkedIn.
MIT