# 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:

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

![Tabela dos Verbos: Hermes Agent decide como, Zernio executa, Notion lembra, humano decide se](https://slrn4gnz7mv5rk2m.public.blob.vercel-storage.com/newsletter-orquestracao/2026-07-28-tabela-dos-verbos.png)

**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`.

```bash
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

```bash
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/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 | 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.
