LINKEDIN PROFILE GET EMAIL - Obter E-mail do Usuário
O que é esta operação?
O LinkedIn Profile Get Email é a operação responsável por obter o endereço de e-mail do usuário autenticado no LinkedIn.
Por que esta operação existe?
E-mail é essencial para comunicação e identificação única. O Profile Get Email existe para:
- Comunicação direta: Enviar e-mails ao usuário
- Identificação única: E-mail como chave primária em sistemas
- Marketing automation: Adicionar e-mail a listas de newsletter
- CRM enrichment: Enriquecer dados de leads e contatos
- Autenticação: Validar identidade do usuário
Como funciona internamente?
Quando o Profile Get Email é executado, o sistema:
- Valida access token do LinkedIn OAuth 2.0
- Faz requisição GET para
/v2/emailAddress?q=members&projection=(elements*(handle~)) - Envia headers de autorização
- Recebe array com dados de e-mail
- Armazena resultado na variável especificada
- Retorna contexto atualizado
Código interno (linkedin.executor.ts:62-70):
case 'get_email':
// Get email address
const emailResponse = await axios.get(`${baseUrl}/emailAddress?q=members&projection=(elements*(handle~))`, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
});
return emailResponse.data;
Quando você DEVE usar esta operação?
Use Profile Get Email sempre que precisar do e-mail do usuário:
Casos de uso:
- Newsletter signup: Adicionar e-mail a Mailchimp/SendGrid
- CRM integration: Criar lead no Salesforce com e-mail
- Notificações: Enviar confirmações por e-mail
- Account linking: Vincular conta LinkedIn a sistema interno
- Email marketing: Adicionar contato a campanhas
- Identificação única: Usar e-mail como ID em banco de dados
Quando NÃO usar Profile Get Email:
- Dados básicos do perfil: Use Profile Get que já inclui ID
- E-mail opcional: LinkedIn nem sempre retorna e-mail (usuário pode negar)
Parâmetros Detalhados
config.accessToken (string, obrigatório)
O que é: Token de acesso OAuth 2.0 do LinkedIn com escopo r_emailaddress.
Como obter:
1. Configure OAuth 2.0 no LinkedIn Developers
2. Solicite escopo r_emailaddress (além de r_liteprofile)
3. Usuário deve autorizar acesso ao e-mail
4. Use token retornado
Flow completo para testar:
{
"name": "LinkedIn - Obter Email",
"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": "Configurar Token",
"parameters": {
"name": "linkedin_token",
"value": "SEU_ACCESS_TOKEN_COM_EMAIL_SCOPE"
}
}
},
{
"id": "linkedin_1",
"type": "linkedin",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Obter Email",
"resource": "profile",
"operation": "get_email",
"config": {
"accessToken": "{{linkedin_token}}"
},
"responseVariable": "emailData"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Email",
"parameters": {
"message": "📧 E-mail obtido: {{emailData.elements[0].handle~.emailAddress}}"
}
}
},
{
"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. Você verá o e-mail associado à conta LinkedIn!
responseVariable (string, opcional)
O que é: Nome da variável onde o resultado será armazenado.
Padrão: "linkedInResult"
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| resource | string | Sim | Sempre "profile" |
| operation | string | Sim | Sempre "get_email" |
| config.accessToken | string | Sim | Token OAuth 2.0 com escopo r_emailaddress |
| responseVariable | string | Não | Nome da variável de resposta (padrão: linkedInResult) |
Exemplo 1: Adicionar E-mail ao Mailchimp
Objetivo: Obter e-mail do LinkedIn e adicionar à lista de newsletter
JSON para Importar
{
"name": "LinkedIn → Mailchimp Newsletter",
"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": "Tokens",
"parameters": {
"name": "linkedin_token",
"value": "SEU_LINKEDIN_TOKEN"
}
}
},
{
"id": "linkedin_profile",
"type": "linkedin",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Obter Nome",
"resource": "profile",
"operation": "get",
"config": {
"accessToken": "{{linkedin_token}}"
},
"responseVariable": "profile"
}
},
{
"id": "linkedin_email",
"type": "linkedin",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Obter Email",
"resource": "profile",
"operation": "get_email",
"config": {
"accessToken": "{{linkedin_token}}"
},
"responseVariable": "email"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "✅ {{profile.localizedFirstName}}, você foi inscrito na nossa newsletter!\n\nE-mail: {{email.elements[0].handle~.emailAddress}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "linkedin_profile" },
{ "source": "linkedin_profile", "target": "linkedin_email" },
{ "source": "linkedin_email", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: ✅ José, você foi inscrito na nossa newsletter!
E-mail: jose@exemplo.com
Exemplo 2: Criar Lead no Salesforce com Dados Completos
Objetivo: Obter perfil e e-mail do LinkedIn e criar lead completo no CRM
JSON para Importar
{
"name": "LinkedIn → Salesforce Lead",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_welcome",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "👋 Bem-vindo! Vamos capturar seus dados do LinkedIn..."
}
}
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Token",
"parameters": {
"name": "linkedin_token",
"value": "SEU_TOKEN"
}
}
},
{
"id": "linkedin_profile",
"type": "linkedin",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Buscar Perfil",
"resource": "profile",
"operation": "get",
"config": {
"accessToken": "{{linkedin_token}}"
},
"responseVariable": "linkedinProfile"
}
},
{
"id": "linkedin_email",
"type": "linkedin",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Buscar Email",
"resource": "profile",
"operation": "get_email",
"config": {
"accessToken": "{{linkedin_token}}"
},
"responseVariable": "linkedinEmail"
}
},
{
"id": "variable_2",
"type": "variable",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Preparar Dados",
"parameters": {
"name": "leadData",
"value": {
"FirstName": "{{linkedinProfile.localizedFirstName}}",
"LastName": "{{linkedinProfile.localizedLastName}}",
"Email": "{{linkedinEmail.elements[0].handle~.emailAddress}}",
"LeadSource": "LinkedIn"
}
}
}
},
{
"id": "message_result",
"type": "message",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "🎉 Lead criado com sucesso!\n\nNome: {{leadData.FirstName}} {{leadData.LastName}}\nEmail: {{leadData.Email}}\nFonte: {{leadData.LeadSource}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_welcome" },
{ "source": "message_welcome", "target": "variable_1" },
{ "source": "variable_1", "target": "linkedin_profile" },
{ "source": "linkedin_profile", "target": "linkedin_email" },
{ "source": "linkedin_email", "target": "variable_2" },
{ "source": "variable_2", "target": "message_result" },
{ "source": "message_result", "target": "end_1" }
]
}
Saída esperada:
Sistema: 👋 Bem-vindo! Vamos capturar seus dados do LinkedIn...
Sistema: 🎉 Lead criado com sucesso!
Nome: José Roberto
Email: jose@exemplo.com
Fonte: LinkedIn
Exemplo 3: Validar E-mail Antes de Continuar
Objetivo: Verificar se usuário concedeu permissão de e-mail
JSON para Importar
{
"name": "LinkedIn - Validar Permissão Email",
"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_email",
"type": "linkedin",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Email",
"resource": "profile",
"operation": "get_email",
"config": {
"accessToken": "{{linkedin_token}}"
},
"responseVariable": "emailData"
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Email Disponível?",
"parameters": {
"variable": "emailData.elements[0].handle~.emailAddress",
"operator": "exists"
}
}
},
{
"id": "message_success",
"type": "message",
"position": { "x": 900, "y": 50 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "✅ E-mail autorizado: {{emailData.elements[0].handle~.emailAddress}}"
}
}
},
{
"id": "message_error",
"type": "message",
"position": { "x": 900, "y": 150 },
"data": {
"label": "Erro",
"parameters": {
"message": "⚠️ Você precisa autorizar o acesso ao seu e-mail do LinkedIn.\n\nPor favor, faça login novamente e conceda a permissão."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "linkedin_email" },
{ "source": "linkedin_email", "target": "condition_1" },
{ "source": "condition_1", "target": "message_success", "label": "true" },
{ "source": "condition_1", "target": "message_error", "label": "false" },
{ "source": "message_success", "target": "end_1" },
{ "source": "message_error", "target": "end_1" }
]
}
Saída esperada (com permissão):
Sistema: ✅ E-mail autorizado: jose@exemplo.com
Saída esperada (sem permissão):
Sistema: ⚠️ Você precisa autorizar o acesso ao seu e-mail do LinkedIn.
Por favor, faça login novamente e conceda a permissão.
Resposta do Node
{
"elements": [
{
"handle": "urn:li:emailAddress:123456789",
"handle~": {
"emailAddress": "jose@exemplo.com"
}
}
]
}
Estrutura da Resposta
| Campo | Tipo | Descrição |
|---|---|---|
| elements | array | Array com dados de e-mail |
| elements[0].handle | string | URN do e-mail no LinkedIn |
| elements[0].handle~.emailAddress | string | Endereço de e-mail real |
Boas Práticas
✅ SIM:
- Valide se e-mail existe antes de usar
- Solicite escopo r_emailaddress no OAuth
- Explique ao usuário por que precisa do e-mail
- Trate casos onde usuário nega permissão
- Armazene e-mail de forma segura (LGPD/GDPR)
❌ NÃO: - Não assuma que e-mail sempre está disponível - Não use e-mail para spam (respeite opt-in) - Não compartilhe e-mail sem consentimento - Não armazene sem criptografia adequada
Dicas
💡 Permissão explícita: Usuário pode negar acesso ao e-mail mesmo com token válido
💡 Array de e-mails: API retorna array, mas geralmente tem apenas 1 elemento
💡 Caminho do e-mail: Use elements[0].handle~.emailAddress para acessar
💡 LGPD/GDPR: Armazene apenas com consentimento e permita exclusão
Erros Comuns
Erro 401: Unauthorized
Causa: Token sem escopo r_emailaddress
Solução: Solicite escopo correto no OAuth flow
Erro: elements is empty
Causa: Usuário negou permissão de e-mail Solução: Peça autorização novamente explicando motivo
Erro: Cannot read emailAddress of undefined
Causa: Tentando acessar campo sem validar Solução: Use CONDITION para validar antes de usar
Próximo Node
→ Profile Get - Obter dados básicos do perfil → Post Create - Criar publicação no LinkedIn → Lead Gen Get Leads - Capturar leads de formulários