LINKEDIN POST LIST - Listar Publicações do Usuário
O que é esta operação?
O LinkedIn Post List é a operação responsável por listar as publicações (posts) do usuário autenticado no LinkedIn, permitindo análise de conteúdo histórico e métricas de engajamento.
Por que esta operação existe?
Análise de conteúdo e métricas de performance. O Post List existe para:
- Analytics: Analisar performance de posts anteriores
- Auditoria: Verificar histórico de publicações
- Moderação: Revisar conteúdo publicado
- Backup: Arquivar posts para registro
- Pesquisa: Encontrar posts específicos
Como funciona internamente?
Quando o Post List é executado, o sistema:
- Valida access token com escopo
r_liteprofileer_member_social - Define limite de posts a retornar (padrão 50)
- Monta query com filtro por autor
- Faz GET para
/v2/ugcPosts?q=authors - Processa paginação se necessário
- Retorna array de posts com metadados
- Armazena resultado na variável especificada
Código interno (linkedin.executor.ts:111-120):
case 'list':
// List user's posts
const limit = data.limit || 50;
const listResponse = await axios.get(`${baseUrl}/ugcPosts?q=authors&authors=List(urn:li:person:${data.personId || 'me'})&count=${limit}`, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
});
return listResponse.data;
Quando você DEVE usar esta operação?
Use Post List sempre que precisar analisar posts históricos:
Casos de uso:
- Dashboard analytics: Mostrar posts recentes e métricas
- Content audit: Revisar conteúdo publicado
- Backup automatizado: Salvar posts em banco de dados
- Buscar por hashtag: Filtrar posts com hashtags específicas
- Análise de frequência: Verificar ritmo de publicação
- Moderação de conteúdo: Revisar posts problemáticos
Quando NÃO usar Post List:
- Posts de outros usuários: API retorna apenas posts próprios
- Comentários: Não lista comentários, apenas posts principais
- Posts de empresa: Use operações de company para isso
Parâmetros Detalhados
limit (number, opcional)
O que é: Número máximo de posts a retornar.
Padrão: 50
Máximo: 100 por requisição
Flow completo para testar:
{
"name": "LinkedIn - Listar Últimos 10 Posts",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Token",
"parameters": {
"name": "linkedin_token",
"value": "SEU_ACCESS_TOKEN"
}
}
},
{
"id": "linkedin_1",
"type": "linkedin",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Listar Posts",
"resource": "posts",
"operation": "list",
"config": {
"accessToken": "{{linkedin_token}}"
},
"limit": 10,
"responseVariable": "meusPosts"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Quantidade",
"parameters": {
"message": "📊 Total de posts encontrados: {{meusPosts.paging.total}}\n\nPrimeiro post: {{meusPosts.elements[0].specificContent.com.linkedin.ugc.ShareContent.shareCommentary.text}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "linkedin_1" },
{ "source": "linkedin_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Execute o flow para ver seus últimos 10 posts!
config.accessToken (string, obrigatório)
O que é: Token OAuth 2.0 com escopos r_liteprofile e r_member_social.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| resource | string | Sim | Sempre "posts" |
| operation | string | Sim | Sempre "list" |
| limit | number | Não | Número de posts (padrão: 50, máx: 100) |
| config.accessToken | string | Sim | Token OAuth 2.0 |
| responseVariable | string | Não | Nome da variável de resposta (padrão: linkedInResult) |
Exemplo 1: Analytics Dashboard
Objetivo: Criar dashboard com últimos posts e estatísticas
JSON para Importar
{
"name": "LinkedIn - Analytics Dashboard",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Token",
"parameters": {
"name": "linkedin_token",
"value": "SEU_TOKEN"
}
}
},
{
"id": "linkedin_1",
"type": "linkedin",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Posts",
"resource": "posts",
"operation": "list",
"config": {
"accessToken": "{{linkedin_token}}"
},
"limit": 50,
"responseVariable": "posts"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Dashboard",
"parameters": {
"message": "📊 ANALYTICS DASHBOARD\n\n📝 Total de posts: {{posts.paging.total}}\n📅 Posts retornados: {{posts.paging.count}}\n\n🎯 Últimos 3 posts:\n1. {{posts.elements[0].specificContent.com.linkedin.ugc.ShareContent.shareCommentary.text}}\n2. {{posts.elements[1].specificContent.com.linkedin.ugc.ShareContent.shareCommentary.text}}\n3. {{posts.elements[2].specificContent.com.linkedin.ugc.ShareContent.shareCommentary.text}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "linkedin_1" },
{ "source": "linkedin_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: 📊 ANALYTICS DASHBOARD
📝 Total de posts: 127
📅 Posts retornados: 50
🎯 Últimos 3 posts:
1. Feliz em compartilhar...
2. Nova conquista...
3. Dica do dia...
Exemplo 2: Backup Automatizado
Objetivo: Salvar posts em banco de dados para backup
JSON para Importar
{
"name": "LinkedIn - Backup Posts",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Token",
"parameters": {
"name": "linkedin_token",
"value": "SEU_TOKEN"
}
}
},
{
"id": "linkedin_1",
"type": "linkedin",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Todos Posts",
"resource": "posts",
"operation": "list",
"config": {
"accessToken": "{{linkedin_token}}"
},
"limit": 100,
"responseVariable": "allPosts"
}
},
{
"id": "loop_1",
"type": "loop",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Iterar Posts",
"parameters": {
"array": "{{allPosts.elements}}",
"itemVariable": "currentPost"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Log",
"parameters": {
"message": "💾 Salvando post: {{currentPost.id}}"
}
}
},
{
"id": "message_final",
"type": "message",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Concluído",
"parameters": {
"message": "✅ Backup concluído! {{allPosts.paging.count}} posts salvos."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1300, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "linkedin_1" },
{ "source": "linkedin_1", "target": "loop_1" },
{ "source": "loop_1", "target": "message_1" },
{ "source": "message_1", "target": "loop_1" },
{ "source": "loop_1", "target": "message_final", "label": "done" },
{ "source": "message_final", "target": "end_1" }
]
}
Resposta do Node
{
"paging": {
"count": 10,
"start": 0,
"total": 127,
"links": []
},
"elements": [
{
"id": "urn:li:share:123456789",
"author": "urn:li:person:abcd1234",
"lifecycleState": "PUBLISHED",
"specificContent": {
"com.linkedin.ugc.ShareContent": {
"shareCommentary": {
"text": "Conteúdo do post aqui..."
},
"shareMediaCategory": "NONE"
}
},
"visibility": {
"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
},
"created": {
"actor": "urn:li:person:abcd1234",
"time": 1642512000000
}
}
]
}
Campos Retornados
| Campo | Tipo | Descrição |
|---|---|---|
| paging.count | number | Número de posts retornados |
| paging.total | number | Total de posts disponíveis |
| elements | array | Array de posts |
| elements[].id | string | URN do post |
| elements[].specificContent | object | Conteúdo do post |
| elements[].created.time | number | Timestamp criação |
| elements[].visibility | object | Configuração de visibilidade |
Boas Práticas
✅ SIM: - Use paginação para listar todos os posts - Armazene results em cache temporário - Use LOOP para processar cada post - Valide se array elements existe - Limite requisições (rate limits)
❌ NÃO: - Não busque todos os posts repetidamente - Não ignore paginação (limite 100/req) - Não assuma que elements tem itens - Não faça chamadas em loop infinito
Dicas
💡 Paginação: Use paging.total para calcular páginas necessárias
💡 Cache: Salve resultados por 1 hora para evitar chamadas
💡 Filtros: Processe localmente (API não tem filtros avançados)
💡 Performance: Busque apenas o necessário (use limit baixo)
Próximo Node
→ Post Create - Criar nova publicação → Profile Get - Obter dados do perfil → Company List Managed - Listar empresas gerenciadas