Publique e agende posts, threads, imagens e vídeo no X (Twitter) por um único endpoint REST. Conecte sua conta do X uma vez: você não precisa de uma conta de desenvolvedor do X nem de um plano próprio da API do X.
URL base https://api.so-me.studio/v1 · Autenticação X-API-Key · socialMedia: TWITTER
Envie um destes valores em postType. Todo post precisa de texto, e fotos ou vídeos são anexados por fileId a partir da sua biblioteca de mídia.
TEXT
Um post só com texto.
IMAGE
Uma imagem.
CAROUSEL
De 2 a 4 imagens em um post.
VIDEO
Um vídeo.
Envie a mídia e depois crie o post. Omita scheduledAt para publicar na hora.
POST /v1/media/presign-upload adiciona o arquivo à sua biblioteca de mídia e devolve um fileId e um uploadUrl pré-assinado.
curl -X POST https://api.so-me.studio/v1/media/presign-upload \
-H "X-API-Key: $SOME_API_KEY" \
-H "Content-Type: application/json" \
-d '{"files":[{"filename":"onboarding.png","mimetype":"image/png","size":412300}]}'
# → [{ "fileId": "…", "uploadUrl": "https://…", "fileSrc": "…", "s3Key": "…" }]Faça um PUT dos bytes em uploadUrl com exatamente o Content-Type que você declarou. A URL é válida por uma hora.
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: image/png" \
--upload-file ./onboarding.pngPOST /v1/posts com o fileId. A resposta é o post com status SCHEDULED, e ele é publicado em scheduledAt por uma fila que tenta de novo em caso de falha.
curl -X POST https://api.so-me.studio/v1/posts \
-H "X-API-Key: $SOME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"socialMedia": "TWITTER",
"postType": "IMAGE",
"text": "Reconstruímos nosso onboarding. 3 coisas que aprendemos:",
"fileIds": ["<fileId>"],
"threadParts": [
{ "text": "1. Peça uma coisa por tela." },
{ "text": "2. Mostre o resultado antes da configuração." },
{ "text": "3. Meça o abandono por etapa, não por funil." }
],
"scheduledAt": "2026-11-06T13:00:00Z"
}'accountId é opcional quando o workspace tem uma conta de X. Caso contrário, passe um id de GET /v1/accounts.
Os arquivos anexados com fileIds são verificados contra os limites de X abaixo antes de qualquer coisa entrar na fila. Um arquivo que viola uma regra retorna 400 com um relatório por arquivo.
Os campos que mudam a forma como um post é publicado em X.
| Campo | O que faz |
|---|---|
| threadParts | Os posts seguintes, em ordem, publicados como uma cadeia de respostas abaixo do primeiro. Até 24 partes de 280 caracteres, cada uma com até 4 fileIds. |
| firstComment | Uma resposta publicada abaixo do post, ou abaixo da última parte de uma thread, assim que ele vai ao ar. Até 280 caracteres, e o X conta cada link como 23. |
| accountId | A conta do X de onde publicar. Opcional quando o workspace tem apenas uma. |
O Social media studio verifica cada arquivo contra estes limites antes de publicar. São os limites que configuramos, não uma promessa de X: GET /v1/media/rules devolve a tabela atual, e POST /v1/media/validate verifica um arquivo sem publicá-lo.
Tipo de post TEXT
Somente texto, sem mídia
Tipo de post IMAGE
Tipo de post CAROUSEL
Tipo de post VIDEO
A publicação é assíncrona. Assine post.published e post.failed, ou consulte GET /v1/posts/:id até que postStatus seja POSTED ou FAILED.
curl -X POST https://api.so-me.studio/v1/webhooks/subscriptions \
-H "X-API-Key: $SOME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/hooks/social",
"categories": ["post"],
"events": ["post.published", "post.failed"]
}'
# The response includes the secret that signs every delivery.POST /hooks/social
X-Webhook-Event: post.published
X-Webhook-Signature: <hex HMAC-SHA256 of the raw body>
{
"event": "post.published",
"category": "post",
"timestamp": "2026-11-03T15:00:07.412Z",
"data": { "postId": "…", "platform": "TWITTER" }
}Toda entrega é assinada com HMAC-SHA256 em X-Webhook-Signature. post.failed é disparado após a última nova tentativa; corrija a causa e chame POST /v1/posts/:id/retry. Um primeiro comentário é reportado por conta própria, com post.first_comment_posted ou post.first_comment_failed.
A mesma chave de API aciona um servidor MCP com mais de 200 ferramentas e uma CLI, para que um agente possa publicar em X sem chamadas HTTP escritas à mão.
Adicione o servidor ao Claude, ao Cursor ou a qualquer cliente MCP com a sua chave de API. OAuth também funciona. Para X, o agente chama estas ferramentas com os mesmos campos da requisição REST:
{
"mcpServers": {
"so-me-studio": {
"url": "https://api.so-me.studio/mcp",
"headers": { "X-API-Key": "sk_live_…" }
}
}
}Instale com npm i -g @social-media-scheduler/cli. Ela envia os arquivos locais por você e imprime JSON, então um script ou um job de CI pode agendar um post em X com um único comando.
so-me posts:create --platform TWITTER --post-type IMAGE \
-m ./onboarding.png \
-c "Reconstruímos nosso onboarding. 3 coisas que aprendemos:" \
--thread "1. Peça uma coisa por tela." \
--thread "2. Mostre o resultado antes da configuração." \
-s 2026-11-06T13:00:00ZO acesso à API, à CLI e ao MCP está incluído em todos os planos pagos: Lite, Creator, Standard, Advanced e Lifetime. Veja os planos e limites
Sim. Coloque o primeiro post em text e o restante em threadParts. Cada parte pode ter seu próprio texto e seus próprios fileIds. Se uma parte posterior falhar, as partes que já estão no ar continuam lá e o post registra quantas foram publicadas.
Não. Você conecta sua conta do X ao Social media studio uma vez, e a publicação passa pela integração do Social media studio com o X. O seu código envia apenas a sua chave de API do Social media studio.
Não. Você conecta a conta de X uma única vez no painel do Social media studio, pelo login de X. Os tokens ficam armazenados criptografados e são renovados do nosso lado, e o seu código envia apenas a sua chave de API do Social media studio no cabeçalho X-API-Key.
Não. Ele retorna assim que o post entra na fila. A publicação roda em um worker que tenta de novo em caso de falha, então escute post.published e post.failed, ou consulte GET /v1/posts/:id.
A API REST, a CLI e o servidor MCP estão incluídos em todos os planos pagos: Lite, Creator, Standard, Advanced e Lifetime. Lite, Creator, Standard e Advanced começam com um teste de 7 dias (cartão obrigatório), e o Lifetime é um pagamento único.
Pare de malabarismo com abas, escreva, adapte e publique em 20 plataformas a partir de um único calendário.