Como um agente de IA agenda um post no LinkedIn pelo Zernio =========================================================== https://docs.nexialismo.ai/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: 1. o texto está aprovado pelo humano; 2. o horário está em ISO 8601 com offset explícito; 3. a conta do LinkedIn está identificada pelo _id; 4. a autorização do humano é explícita. Só existe sucesso quando as quatro provas aparecem: 1. o POST devolve 201 e cria o recurso; 2. o GET pelo identificador devolve 200; 3. o status é scheduled; 4. 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 ----------------- 1. Os três níveis de leitura do Zernio 2. O agendamento fantasma do Zernio 3. Quem decide o quê no Zernio 4. Antes de começar com o Zernio 5. Os passos do agendamento no Zernio 6. Como confirmar o agendamento no Zernio 7. Quando parar no Zernio 8. Se o agendamento no Zernio falhar 9. O que não funciona no Zernio 10. Como ler o resultado do Zernio 11. 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 --------------------------- [imagem] Tabela dos Verbos: Hermes Agent decide como, Zernio executa, Notion lembra, humano decide se 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 com printf '%s\n' "$ZERNIO_API_KEY" | grep -cE '^sk_[0-9a-fA-F]{64}$', que devolve 1 quando bate. Os passos do agendamento no Zernio ---------------------------------- 1. 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']])" 2. Monte o corpo da requisição. O accountId fica dentro de platforms, 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" } 3. 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 4. Crie o agendamento. O endereço é a base https://zernio.com/api/v1 mais /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' 5. 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. 6. Extraia o identificador. O recibo é aninhado: o objeto vem em post e o campo chama _id, não id e não postId. 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')" 7. Se sair SEM IDENTIFICADOR, o agendamento está NÃO VERIFICADO. Imprima o recibo com python3 -m json.tool recibo.json e 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 scheduled e 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: HTTP 401 ou 403 / Ação: Confira o formato da chave e peça rotação ao humano. Não tente outra credencial. Sintoma na saída do Zernio: HTTP 200 com corpo começando em DOCTYPE / Ação: O endereço não existe. Corrija o caminho antes de repetir. Sintoma na saída do Zernio: Recibo sem post._id / Ação: Leia o recibo inteiro antes de tentar de novo, porque um segundo POST cria duplicidade. Sintoma na saída do Zernio: HTTP 404 no GET logo após criar / Ação: O identificador foi lido do lugar errado. Ele mora em post._id. Sintoma na saída do Zernio: HTTP 422 na hora de publicar no LinkedIn / Ação: 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/media e POST /media/validate responderam 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 post e o campo chama _id. O discriminante é a chave post no topo da resposta. - Comparar scheduledFor como texto reprova agendamento correto, porque o Zernio devolve normalizado em UTC. O discriminante é o sufixo Z na string devolvida. - Na leitura, platforms[0].accountId volta como objeto expandido, não como o texto enviado. Comparar enviado com devolvido acusa diferença falsa. O discriminante é o campo _id dentro 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: 201 com post._id presente / O que significa: Criado, ainda não confirmado / O que fazer agora: Rodar o GET antes de relatar Padrão na resposta do Zernio: 200, status scheduled, instante igual / O que significa: Agendamento de pé no horário certo / O que fazer agora: Colar o primeiro comentário no dia Padrão na resposta do Zernio: 200 com corpo em HTML / O que significa: Endereço inexistente disfarçado de sucesso / O que fazer agora: Corrigir o caminho, não repetir a chamada Padrão na resposta do Zernio: Instante diferente do enviado / O que significa: O post sai em outra hora / O que fazer agora: 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: Decidiu não usar o clipe arquivado / Agente executou: Manteve o agendamento no Zernio Humano decidiu: Autorizou rodar contra a API real / Agente executou: Criou, confirmou e apagou o post de teste Humano decidiu: Escolheu o hook e aprovou a peça / Agente executou: 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.