Erro ao criar post no LinkedIn via nó de requisição HTTP com formato de texto

Descreva o problema/erro/pergunta

Estou usando nós de IA para gerar algum texto para postar no meu LinkedIn. Testei as credenciais usando uma requisição HTTP GET e sei que funciona.
Ao tentar criar a postagem com o texto gerado pela IA, recebo constantemente erros como:
400 - “{"status":400,"code":"ILLEGAL_ARGUMENT","message":"Request body could not be converted to data map"}”
Mensagem completa
422 - “{"message":"ERROR :: /## Audit Log Ingestion Lag\n\nImagine you’re trying to catch a thief who just left a store :: unrecognized field found but not allowed\nERROR :: /author :: field is required but not found and has no default value\nERROR :: /commentary :: field is required but not found and has no default value\nERROR :: /visibility :: field is required but not found and has no default value\nERROR :: /distribution :: field is required but not found and has no default value\nERROR :: /lifecycleState :: field is required but not found and has no default value\n","status":422}”

Por favor, compartilhe seu fluxo de trabalho

Não consigo copiar os nós, parece que não copia o texto (Edge no Windows 11)
Os nós de IA funcionam OK, é apenas a postagem no LinkedIn via requisição HTTP que não está funcionando

Compartilhe a saída retornada pelo último nó

422 - “{"message":"ERROR :: /## Audit Log Ingestion Lag\n\nImagine you’re trying to catch a thief who just left a store :: unrecognized field found but not allowed\nERROR :: /author :: field is required but not found and has no default value\nERROR :: /commentary :: field is required but not found and has no default value\nERROR :: /visibility :: field is required but not found and has no default value\nERROR :: /distribution :: field is required but not found and has no default value\nERROR :: /lifecycleState :: field is required but not found and has no default value\n","status":422}”

Informações sobre sua configuração n8n

  • Versão n8n: 2.30.0
  • Banco de dados (padrão: SQLite): padrão
  • Configuração n8n EXECUTIONS_PROCESS (padrão: own, main): padrão
  • Executando n8n via (Docker, npm, n8n cloud, aplicativo desktop): Proxmox lxc
  • Sistema operacional: Proxmox

Obrigado por nos informar sobre isso. Criamos o CV-9 como ticket interno de desenvolvimento para investigar.

OK, consegui resolver os problemas, era a postagem da API do LinkedIn que requer certos campos a serem adicionados no corpo do post.

Também descobri que há um limite de 4000 caracteres ao postar via API.

Ambos os erros apontam para as mesmas duas causas raiz, e são corrigíveis:

  1. O erro 400 “Request body could not be converted to data map” significa que o corpo JSON em si é inválido — seu texto de IA está sendo injetado cru, então suas aspas, quebras de linha e caracteres como : e # quebram o JSON. Solução: defina o corpo da Requisição HTTP para o modo JSON e envolva o texto com JSON.stringify para que seja escapado, por exemplo, o valor commentary fica ={{ JSON.stringify($json.text) }} (remova as aspas externas no template). Isso sozinho elimina o erro “converted to data map”.

  2. O erro 422 “field is required” (author, commentary, visibility, distribution, lifecycleState) significa que você está postando para o endpoint /rest/posts mais recente, mas enviando um corpo parcial. Esse endpoint requer TODOS esses campos. Um corpo mínimo que funciona:

{
“author”: “urn:li:person:XXXX”, // ou urn:li:organization:XXXX
“commentary”: “seu texto aqui”,
“visibility”: “PUBLIC”,
“distribution”: {
“feedDistribution”: “MAIN_FEED”,
“targetEntities”: ,
“thirdPartyDistributionChannels”:
},
“lifecycleState”: “PUBLISHED”,
“isReshareDisabledByAuthor”: false
}

E dois headers que as pessoas costumam esquecer: LinkedIn-Version: 202401 (use um YYYYMM atual) e X-Restli-Protocol-Version: 2.0.0. Sem o header de versão, o LinkedIn silenciosamente rejeita o schema.

Mais um detalhe específico do campo commentary do /rest/posts: ele usa o formato “Little Text” do LinkedIn, então os caracteres literais (, ), <, >, @, #, * e alguns outros devem ser escapados com uma barra invertida ou a requisição retorna 422. Se seu texto de IA contiver headers markdown (##) ou parênteses, remova-os ou escape-os antes de enviar. Seu exemplo de texto tinha ## e ::, o que é quase certamente o que causou o problema.

Se você colar a configuração exata do node (URL do endpoint + quais campos você envia), posso apontar qual é a peça específica que falta.

Analisamos essa questão e não conseguimos confirmar que se trata de um bug. Por enquanto, fechamos o ticket interno, mas se começar a parecer que é um bug, nossa equipe de moderação sinalizará novamente.

Ótima descoberta! Para quem chegar aqui com o mesmo problema, aqui está o corpo mínimo necessário para o endpoint ugcPosts do LinkedIn:

{
  "author": "urn:li:person:YOUR_PERSON_ID",
  "lifecycleState": "PUBLISHED",
  "specificContent": {
    "com.linkedin.ugc.ShareContent": {
      "shareCommentary": {
        "text": "Seu texto de post aqui"
      },
      "shareMediaCategory": "NONE"
    }
  },
  "visibility": {
    "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
  }
}

Também vale a pena notar: o limite de 4000 caracteres se aplica ao campo text. Se você estiver usando IA para gerar conteúdo, adicione uma verificação de comprimento antes de enviar — caso contrário, a API simplesmente rejeitará a solicitação silenciosamente.