Como um agente de IA agenda um post no LinkedIn pelo Zernio
Zernio agent-first: agendar no LinkedIn por REST, por José C. Amorim na Nexialismo, A última inteligência. Verificado em 2026-07-28 por execução real contra a API. Documento versão 2.0, descreve o Zernio na API v1. Zernio é uma camada de publicação para redes sociais operável por máquina.
Um agente agenda um post no LinkedIn pelo Zernio com duas chamadas: POST /posts devolve 201 e cria, GET /posts/{id} devolve 200 e prova. O ciclo de criar, confirmar e apagar foi executado em 2026-07-28 contra a API real. A condição de validade é uma conta conectada por OAuth em zernio.com e uma chave no formato sk_ mais 64 caracteres hexadecimais.
Contrato de execução do Zernio
Objetivo: agendar um post de texto no LinkedIn pelo Zernio.
Só há o que executar com as quatro condições:
- o texto está aprovado pelo humano;
- o horário está em ISO 8601 com offset explícito;
- a conta do LinkedIn está identificada pelo
_id; - a autorização do humano é explícita.
Só existe sucesso quando as quatro provas aparecem:
- o POST devolve 201 e cria o recurso;
- o GET pelo identificador devolve 200;
- o status é
scheduled; - o instante e a conta conferem com o enviado.
Quatro coisas nunca acontecem neste fluxo: a ZERNIO_API_KEY aparecer em saída, log ou mensagem; um POST ser repetido diante de resposta ambígua; o recibo de criação ser tratado como confirmação; uma URL ser publicada no corpo do post.
O que este documento do Zernio cobre
Cobre:
- Agendar post de texto no LinkedIn pelo Zernio
- Descobrir o identificador da conta no Zernio
- Confirmar e apagar o agendamento no Zernio
- Falhas silenciosas do Zernio, testadas em 2026-07-28
Não cobre:
- Publicar imagem, vídeo ou carrossel pelo Zernio
- Primeiro comentário, que o Zernio não faz
- Servidor MCP de comunidade com prefixo zernio_
- Publicar no Instagram, YouTube ou WhatsApp pelo Zernio
Mapa do documento
- Os três níveis de leitura do Zernio
- O agendamento fantasma do Zernio
- Quem decide o quê no Zernio
- Antes de começar com o Zernio
- Os passos do agendamento no Zernio
- Como confirmar o agendamento no Zernio
- Quando parar no Zernio
- Se o agendamento no Zernio falhar
- O que não funciona no Zernio
- Como ler o resultado do Zernio
- A partitura desta edição
Os três níveis de leitura do Zernio
Três seções do Zernio levam rótulo de profundidade: Em uma frase: no diagrama, Se você nunca viu isso antes: nas pré-condições e Se você já opera isso: nas falhas silenciosas.
O agendamento fantasma do Zernio
O humano arquivou um clipe que decidiu não usar. A ordem seguiu de pé no Zernio, identificador 6a63c68abb68bcea95998ca9, marcada para 2026-07-27 às 06:45. Ordem viva sem peça é o fantasma.
Ninguém errou: o arquivo foi arquivado onde se arquiva arquivo, a ordem ficou onde se guarda ordem, e nenhuma das duas pontas tinha o trabalho de avisar a outra. Foi percebido na véspera. O estado desse agendamento em 2026-07-28 é NÃO VERIFICADO.
Quem decide o quê no Zernio
Em uma frase: cinco caixas, quatro de máquina e uma de humano. Hermes Agent decide como e nunca guarda estado. Zernio executa e nunca julga o conteúdo. Notion lembra e nunca executa. Telegram conversa e nunca guarda estado. O humano decide se e nunca delega: escolhe o hook, aprova a peça e cola o primeiro comentário.
Antes de começar com o Zernio
Se você nunca viu isso antes: o Zernio publica em redes sociais por API REST, sem clique em painel. Cada endereço é um endpoint, o corpo da ordem é JSON, e a chave viaja no header Authorization na forma Bearer.
Três entradas vêm do humano. Se faltar uma, pergunte antes de chamar o Zernio: agendamento errado só se desfaz apagando.
- O texto do post, aprovado, sem URL no corpo. O Zernio publica como veio.
- Data e hora com offset, no formato
2027-01-15T06:45:00-03:00. O offset é o da audiência, não o do relógio de quem roda. - A chave em
ZERNIO_API_KEY. Confira o formato sem imprimir o valor comprintf '%s\n' "$ZERNIO_API_KEY" | grep -cE '^sk_[0-9a-fA-F]{64}$', que devolve 1 quando bate.
Os passos do agendamento no Zernio
- Descubra o identificador da conta. O campo chama
_id. Em 2026-07-28 esta chamada devolveu quatro contas ativas: instagram, linkedin, whatsapp e youtube.curl -sS 'https://zernio.com/api/v1/accounts' -H "Authorization: Bearer $ZERNIO_API_KEY" -o contas.json -w 'HTTP %{http_code}\n' python3 -c "import json;print([(c['platform'],c['_id']) for c in json.load(open('contas.json'))['accounts']])" - Monte o corpo da requisição. O
accountIdfica dentro deplatforms, nunca na raiz, porque cada destino carrega a conta dele. Na criação ele vai como texto simples. Os valores abaixo são exemplo.{ "content": "Texto integral do post, sem URL no corpo.", "platforms": [ { "platform": "linkedin", "accountId": "O_ID_DA_SUA_CONTA" } ], "scheduledFor": "2027-01-15T06:45:00-03:00" } - Meça o texto contra o teto de 3000 caracteres do LinkedIn. Monte o JSON com uma biblioteca, nunca concatenando texto na linha de comando: apóstrofo em português encerra a aspa do shell e o comando morre antes de falar com o Zernio.
python3 -c "import sys;c=open(sys.argv[1],encoding='utf-8').read();print(len(c));sys.exit(1 if len(c)>3000 else 0)" texto.txt - Crie o agendamento. O endereço é a base
https://zernio.com/api/v1mais/posts, e a versão aparece uma vez só no endereço final.curl -sS -X POST 'https://zernio.com/api/v1/posts' -H "Authorization: Bearer $ZERNIO_API_KEY" -H 'Content-Type: application/json' --data @post.json -o recibo.json -w 'HTTP %{http_code}\n' - Leia o código impresso. O código de sucesso da criação é 201, não 200. Valor fora da faixa 200 a 299 é falha: abra
recibo.json, que carrega o motivo, e vá para a seção de falhas. - Extraia o identificador. O recibo é aninhado: o objeto vem em
poste o campo chama_id, nãoide nãopostId. Ler a raiz devolve vazio.python3 -c "import json;d=json.load(open('recibo.json'));p=d.get('post') or {};print(p.get('_id') or 'SEM IDENTIFICADOR')" - Se sair
SEM IDENTIFICADOR, o agendamento está NÃO VERIFICADO. Imprima o recibo compython3 -m json.tool recibo.jsone procure o identificador antes de tentar de novo, porque um segundo POST com o mesmo texto vira conteúdo duplicado.
Como confirmar o agendamento no Zernio
O POST devolve um recibo de aceite, que não é prova de existência. A prova vem da segunda chamada. O campo a extrair é o _id dentro de post, e o estado esperado é scheduled.
curl -sS "https://zernio.com/api/v1/posts/O_ID_DO_PASSO_5" -H "Authorization: Bearer $ZERNIO_API_KEY" -o confirmacao.json -w 'HTTP %{http_code}\n'
python3 -c "
import json,datetime as dt
p=json.load(open('confirmacao.json'))['post']
enviado='2027-01-15T06:45:00-03:00'
a=dt.datetime.fromisoformat(enviado)
b=dt.datetime.fromisoformat(p['scheduledFor'].replace('Z','+00:00'))
print(p['_id'], p['status'], p['scheduledFor'])
print('mesmo instante:', a==b)"
Nunca compare o scheduledFor como texto. O Zernio normaliza para UTC e devolve outra string: em 2026-07-28, 2027-01-15T06:45:00-03:00 voltou como 2027-01-15T09:45:00.000Z. As duas apontam o mesmo instante, e comparar caractere a caractere reprova um agendamento correto.
Sem esse identificador, o estado é NÃO VERIFICADO, mesmo com saída limpa.
Quando parar no Zernio
- Pare quando o GET devolver 200, o status for
schedulede o instante bater. Esse é o único sucesso. - Pare quando qualquer chamada devolver código fora da faixa 200 a 299, sem repetir o POST.
- Pare quando a mesma leitura tiver sido repetida duas vezes com o mesmo resultado, porque o objeto não muda sozinho.
Para desfazer, DELETE /posts/{id} devolve 200 com mensagem de remoção, e o GET seguinte passa a devolver 404. Foi assim que o post de teste desta edição foi criado e apagado.
Se o agendamento no Zernio falhar
python3 -m json.tool recibo.json
O corpo da resposta carrega o motivo. O código HTTP foi impresso na última linha do comando que falhou e não sobrevive para a chamada seguinte: se você perdeu o código, repita a leitura, nunca o POST.
| Sintoma na saída do Zernio | Ação |
|---|---|
| HTTP 401 ou 403 | Confira o formato da chave e peça rotação ao humano. Não tente outra credencial. |
| HTTP 200 com corpo começando em DOCTYPE | O endereço não existe. Corrija o caminho antes de repetir. |
Recibo sem post._id | Leia o recibo inteiro antes de tentar de novo, porque um segundo POST cria duplicidade. |
| HTTP 404 no GET logo após criar | O identificador foi lido do lugar errado. Ele mora em post._id. |
| HTTP 422 na hora de publicar no LinkedIn | Conteúdo repetido é recusado; reescreva o texto se for esse o caso. |
O que não funciona no Zernio
Se você já opera isso: as quatro falhas abaixo foram testadas em 2026-07-28 e nenhuma delas devolve erro de forma óbvia.
- Endereço inexistente devolve 200 com página HTML, não 404. Testado:
POST /validate/mediaePOST /media/validateresponderam 200 servindo o app. Um agente que confia no código de status conclui sucesso sobre rota que não existe. O discriminante é o primeiro caractere do corpo: se for menor que, é página, não resposta. - Ler o identificador na raiz do recibo devolve vazio, porque o objeto vem aninhado em
poste o campo chama_id. O discriminante é a chavepostno topo da resposta. - Comparar
scheduledForcomo texto reprova agendamento correto, porque o Zernio devolve normalizado em UTC. O discriminante é o sufixo Z na string devolvida. - Na leitura,
platforms[0].accountIdvolta como objeto expandido, não como o texto enviado. Comparar enviado com devolvido acusa diferença falsa. O discriminante é o campo_iddentro desse objeto.
Estes limites são do LinkedIn, não do Zernio: um documento por post, até 20 imagens de 8 MB cada, vídeo em MP4, MOV, AVI ou WebM até 5 GB, 10 minutos em perfil pessoal e 30 minutos em página de empresa. A API do LinkedIn não aceita arquivo .srt, então a legenda precisa estar queimada no vídeo. Link no corpo derruba de 40 a 50 por cento do alcance, e o lugar do link é o primeiro comentário, que fica com o humano.
Nome de tool decorado também não funciona: o servidor MCP oficial do Zernio expõe mais de 480 tools, cerca de 461 auto-geradas a partir do OpenAPI, que mudam de nome quando a API muda. Só 20 são documentadas como core, e nenhuma existe num run REST puro como o descrito aqui.
A execução que foi ao ar é outra: saiu em 2026-07-24 com urn:li:share:7486455115952906240 e status published, pelo caminho REST, porque o servidor MCP do Zernio não estava exposto naquela execução.
Como ler o resultado do Zernio
Duas linhas decidem: status scheduled com o instante certo significa agendamento de pé, e corpo em HTML significa que o endereço não existe.
| Padrão na resposta do Zernio | O que significa | O que fazer agora |
|---|---|---|
201 com post._id presente | Criado, ainda não confirmado | Rodar o GET antes de relatar |
200, status scheduled, instante igual | Agendamento de pé no horário certo | Colar o primeiro comentário no dia |
| 200 com corpo em HTML | Endereço inexistente disfarçado de sucesso | Corrigir o caminho, não repetir a chamada |
| Instante diferente do enviado | O post sai em outra hora | Apagar com DELETE e criar de novo |
A partitura desta edição
A tabela separa as decisões que José C. Amorim tomou das execuções que a frota rodou. A publicação de 2026-07-24 teve 34 impressões e 2,94% de engajamento, lidos no painel do LinkedIn em 2026-07-24.
| Humano decidiu | Agente executou |
|---|---|
| Decidiu não usar o clipe arquivado | Manteve o agendamento no Zernio |
| Autorizou rodar contra a API real | Criou, confirmou e apagou o post de teste |
| Escolheu o hook e aprovou a peça | Leu os quatro identificadores de conta |
Verificado em 2026-07-28. Próxima revisão em 2026-10-28. A versão 2.0 troca suposição por execução: o identificador é post._id, a criação devolve 201, o horário volta normalizado em UTC e o endpoint de validação de mídia não existe.
Tamo junto.