O que é essa API
É a mesma API REST que move o painel do PostAutomation - cadastro de nichos, upload e agendamento de vídeos, métricas e a conexão com o YouTube. Cada requisição autenticada usa o mesmo token que sua sessão já tem quando você está logado no painel.
URL base
Não existe prefixo de versão nem de rota - cada endpoint é chamado direto na raiz.
Produção
https://postautomation-production-5857.up.railway.appLocal
http://localhost:3000Autenticação
Faça login em POST /auth/login com email e senha da sua conta pra receber um accessToken. Envie esse token em toda chamada protegida no header abaixo. Quando ele expirar, troque por um novo em POST /auth/refresh usando o refreshToken recebido junto - sem precisar logar de novo.
Authorization: Bearer <SEU_ACCESS_TOKEN>
Não existe um mecanismo separado de chave de API hoje - a autenticação é sempre o token da sua própria conta.
Códigos de erro comuns
Todo erro vem no formato padrão do NestJS: { statusCode, message }. Os códigos abaixo aparecem em praticamente qualquer endpoint protegido; cada endpoint também lista, na própria seção, os status específicos dele nas abas de resposta.
| Status | Descrição |
|---|---|
400Bad Request | O corpo da requisição não passou na validação - campo obrigatório ausente ou em formato errado. |
401Unauthorized | Token ausente, inválido ou expirado. Renove em POST /auth/refresh ou faça login de novo. |
404Not Found | Nenhum registro encontrado com o id informado. |
409Conflict | Já existe um registro com esse valor único (ex: email já cadastrado). |
500Internal Server Error | Erro inesperado no servidor - se persistir, entre em contato com o suporte. |
Autenticação
Login, renovação de sessão e conexão do canal do YouTube.
/auth/loginPúblicoLogin
Autentica com email e senha e devolve o par de tokens usado em todas as outras chamadas da API.
Corpo da requisição (application/json)
emailobrigatóriostring | Email cadastrado do usuário. |
passwordobrigatóriostring | Senha da conta. |
https://postautomation-production-5857.up.railway.appcurl -X POST "https://postautomation-production-5857.up.railway.app/auth/login" \-H "Content-Type: application/json" \-d '{"email":"<EMAIL>","password":"<PASSWORD>"}'
Resposta
{"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
/auth/refreshPúblicoRenovar sessão
Troca um refreshToken válido por um novo par de tokens, sem precisar logar de novo.
Corpo da requisição (application/json)
refreshTokenobrigatóriostring | Refresh token obtido no login. |
https://postautomation-production-5857.up.railway.appcurl -X POST "https://postautomation-production-5857.up.railway.app/auth/refresh" \-H "Content-Type: application/json" \-d '{"refreshToken":"<REFRESHTOKEN>"}'
Resposta
{"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
/auth/youtube/connectRequer autenticaçãoIniciar conexão do YouTube
Gera a URL de autorização do Google para o usuário logado conectar um canal do YouTube. O cliente deve redirecionar o navegador pra essa URL - depois da autorização o Google chama nosso callback e a conexão fica pronta, sem o cliente precisar fazer mais nada.
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/auth/youtube/connect" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"url": "https://accounts.google.com/o/oauth2/v2/auth?client_id=...&scope=..."}
Usuários
Cadastro, dados da conta e status da conexão com o YouTube.
/usersPúblicoCriar conta
Cadastra um novo usuário. É o único endpoint de usuários que não exige autenticação.
Corpo da requisição (application/json)
emailobrigatóriostring | Precisa ser um email válido. |
namestring | Até 10 caracteres. |
passwordstring | Entre 3 e 20 caracteres. |
https://postautomation-production-5857.up.railway.appcurl -X POST "https://postautomation-production-5857.up.railway.app/users" \-H "Content-Type: application/json" \-d '{"email":"<EMAIL>","name":"<NAME>","password":"<PASSWORD>"}'
Resposta
{"id": "b3f1a2c4-1234-4a5b-8c9d-0e1f2a3b4c5d","email": "criador@exemplo.com","name": "Ana","role": "USER","createdAt": "2026-09-01T12:00:00.000Z"}
/usersRequer autenticaçãoListar usuários
Lista todos os usuários cadastrados.
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/users" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
[{"id": "b3f1a2c4-1234-4a5b-8c9d-0e1f2a3b4c5d","email": "criador@exemplo.com","name": "Ana","role": "USER"}]
/users/emailsRequer autenticaçãoListar emails
Lista só os emails de todos os usuários cadastrados.
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/users/emails" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
["criador@exemplo.com","outro@exemplo.com"]
/users/email/:emailRequer autenticaçãoBuscar usuário por email
Retorna os dados de um usuário a partir do email.
Parâmetros na URL
emailobrigatóriostring | Email do usuário. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/users/email/<EMAIL>" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"id": "b3f1a2c4-1234-4a5b-8c9d-0e1f2a3b4c5d","email": "criador@exemplo.com","name": "Ana"}
/users/:idRequer autenticaçãoBuscar usuário por id
Retorna os dados de um usuário específico.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do usuário. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/users/<ID>" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"id": "b3f1a2c4-1234-4a5b-8c9d-0e1f2a3b4c5d","email": "criador@exemplo.com","name": "Ana","role": "USER"}
/users/:idRequer autenticaçãoAtualizar usuário
Atualiza parcialmente os dados de um usuário (mesmos campos do cadastro, todos opcionais).
Parâmetros na URL
idobrigatóriostring (uuid) | Id do usuário. |
Corpo da requisição (application/json)
emailstring | Novo email. |
namestring | Até 10 caracteres. |
passwordstring | Entre 3 e 20 caracteres. |
https://postautomation-production-5857.up.railway.appcurl -X PATCH "https://postautomation-production-5857.up.railway.app/users/<ID>" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-H "Content-Type: application/json" \-d '{"email":"<EMAIL>","name":"<NAME>","password":"<PASSWORD>"}'
Resposta
{"id": "b3f1a2c4-1234-4a5b-8c9d-0e1f2a3b4c5d","email": "novo@exemplo.com","name": "Ana"}
/users/:idRequer autenticaçãoExcluir usuário
Remove permanentemente uma conta de usuário.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do usuário. |
https://postautomation-production-5857.up.railway.appcurl -X DELETE "https://postautomation-production-5857.up.railway.app/users/<ID>" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"message": "Usuário removido com sucesso."}
/users/:id/youtube-connectionRequer autenticaçãoStatus da conexão com o YouTube
Informa se o usuário tem um canal do YouTube conectado no momento.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do usuário. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/users/<ID>/youtube-connection" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"connected": true,"account": {"id": "a1b2c3d4-...","platform": "YOUTUBE","tokenExpiry": "2026-09-17T22:00:00.000Z"}}
/users/:id/youtube-connectionRequer autenticaçãoDesconectar YouTube
Remove a conexão do canal do YouTube do usuário. Isso apaga a credencial guardada no nosso banco - não revoga o acesso automaticamente do lado do Google (o usuário pode revogar manualmente na própria conta Google se quiser).
Parâmetros na URL
idobrigatóriostring (uuid) | Id do usuário. |
https://postautomation-production-5857.up.railway.appcurl -X DELETE "https://postautomation-production-5857.up.railway.app/users/<ID>/youtube-connection" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"message": "Conexão com o YouTube removida com sucesso."}
Nichos
Organização dos posts por nicho de conteúdo.
/nichesRequer autenticaçãoCriar nicho
Cria um nicho usado pra organizar os posts.
Corpo da requisição (application/json)
nameobrigatóriostring | Entre 2 e 60 caracteres. |
descriptionstring | Até 255 caracteres. |
activeboolean | Padrão: true. |
https://postautomation-production-5857.up.railway.appcurl -X POST "https://postautomation-production-5857.up.railway.app/niches" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-H "Content-Type: application/json" \-d '{"name":"<NAME>","description":"<DESCRIPTION>","active":"<ACTIVE>"}'
Resposta
{"id": "c1a2b3c4-...","name": "Curiosidades","description": null,"active": true}
/nichesRequer autenticaçãoListar nichos
Lista todos os nichos cadastrados.
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/niches" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
[{"id": "c1a2b3c4-...","name": "Curiosidades","active": true}]
/niches/:idRequer autenticaçãoBuscar nicho
Retorna um nicho específico.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do nicho. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/niches/<ID>" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"id": "c1a2b3c4-...","name": "Curiosidades","active": true}
/niches/:idRequer autenticaçãoAtualizar nicho
Atualiza parcialmente um nicho (mesmos campos da criação, todos opcionais).
Parâmetros na URL
idobrigatóriostring (uuid) | Id do nicho. |
Corpo da requisição (application/json)
namestring | Entre 2 e 60 caracteres. |
descriptionstring | Até 255 caracteres. |
activeboolean |
https://postautomation-production-5857.up.railway.appcurl -X PATCH "https://postautomation-production-5857.up.railway.app/niches/<ID>" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-H "Content-Type: application/json" \-d '{"name":"<NAME>","description":"<DESCRIPTION>","active":"<ACTIVE>"}'
Resposta
{"id": "c1a2b3c4-...","name": "Curiosidades e fatos","active": true}
/niches/:idRequer autenticaçãoExcluir nicho
Remove um nicho.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do nicho. |
https://postautomation-production-5857.up.railway.appcurl -X DELETE "https://postautomation-production-5857.up.railway.app/niches/<ID>" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"message": "Nicho removido com sucesso."}
Posts e agendamento
Upload, edição de rascunho, agendamento, publicação e métricas.
/postsRequer autenticaçãoListar posts
Lista todos os posts do usuário autenticado (qualquer status).
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/posts" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
[{"id": "d1e2f3a4-...","platform": "YOUTUBE","title": "Como automatizar sua publicação","status": "POSTED","scheduledAt": "2026-09-10T13:00:00.000Z","postedAt": "2026-09-10T13:00:04.000Z"}]
/posts/overviewRequer autenticaçãoResumo de posts
Retorna um resumo agregado dos posts do usuário (usado pela tela inicial do painel) - opcionalmente filtrado por data.
Query params
datestring (ISO 8601) | Filtra o resumo por um dia específico. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/posts/overview" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"scheduled": 3,"posted": 12,"drafts": 2,"failed": 0}
/posts/:id/analyticsRequer autenticaçãoMétricas de um post
Retorna o histórico de métricas coletadas (visualizações, curtidas, comentários) de um post publicado.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do post. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/posts/<ID>/analytics" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
[{"id": "e1f2...","views": 1240,"likes": 87,"comments": 12,"collectedAt": "2026-09-17T09:00:00.000Z"}]
/posts/draftsRequer autenticaçãoListar rascunhos
Lista os posts que ainda estão em rascunho (status DRAFT).
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/posts/drafts" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
[{"id": "f1a2...","title": "Sem título","status": "DRAFT","format": "SHORT"}]
/posts/:id/draftRequer autenticaçãoBuscar rascunho
Retorna um rascunho específico.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do post. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/posts/<ID>/draft" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"id": "f1a2...","title": "Sem título","status": "DRAFT","format": "SHORT","trimStart": 0,"trimEnd": 12.5}
/posts/:id/draft/videoRequer autenticaçãoBaixar vídeo do rascunho
Retorna o arquivo de vídeo do rascunho (stream binário, não JSON). Usado pelo player do editor de vídeo.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do post. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/posts/<ID>/draft/video" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
<binário - video/mp4>
/posts/:id/draft/thumbnailRequer autenticaçãoBaixar thumbnail do rascunho
Retorna a imagem de thumbnail do rascunho (stream binário, não JSON).
Parâmetros na URL
idobrigatóriostring (uuid) | Id do post. |
https://postautomation-production-5857.up.railway.appcurl -X GET "https://postautomation-production-5857.up.railway.app/posts/<ID>/draft/thumbnail" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
<binário - image/jpeg>
/posts/draftRequer autenticaçãoCriar rascunho
Envia um vídeo e cria um novo post em rascunho (status DRAFT).
Corpo da requisição (multipart/form-data)
videoobrigatóriofile | Arquivo de vídeo. |
titlestring | Até 255 caracteres. |
https://postautomation-production-5857.up.railway.appcurl -X POST "https://postautomation-production-5857.up.railway.app/posts/draft" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-F "video=@caminho/do/arquivo" \-F "title=<TITLE>"
Resposta
{"id": "f1a2...","title": "Sem título","status": "DRAFT"}
/posts/:id/editRequer autenticaçãoEditar rascunho
Atualiza título, descrição, formato ou o corte (trim) de um rascunho.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do post. |
Corpo da requisição (application/json)
titlestring | |
descriptionstring | Até 500 caracteres. |
format"SHORT" | "STANDARD" | |
trimStartnumber | Segundos, >= 0. |
trimEndnumber | Segundos, >= 0. |
https://postautomation-production-5857.up.railway.appcurl -X PATCH "https://postautomation-production-5857.up.railway.app/posts/<ID>/edit" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-H "Content-Type: application/json" \-d '{"title":"<TITLE>","description":"<DESCRIPTION>","format":"<FORMAT>","trimStart":"<TRIMSTART>","trimEnd":"<TRIMEND>"}'
Resposta
{"id": "f1a2...","format": "SHORT","trimStart": 0,"trimEnd": 12.5}
/posts/:id/thumbnailRequer autenticaçãoEnviar thumbnail
Envia/substitui a imagem de thumbnail de um rascunho.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do post. |
Corpo da requisição (multipart/form-data)
thumbnailobrigatóriofile | Arquivo de imagem. |
https://postautomation-production-5857.up.railway.appcurl -X POST "https://postautomation-production-5857.up.railway.app/posts/<ID>/thumbnail" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-F "thumbnail=@caminho/do/arquivo"
Resposta
{"id": "f1a2...","thumbnailUrl": "https://.../thumb.jpg"}
/posts/:id/finalizeRequer autenticaçãoFinalizar rascunho
Sai do estado de rascunho e agenda a publicação (status DRAFT -> PENDING). A partir daqui o nicho passa a ser obrigatório.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do post. |
Corpo da requisição (application/json)
nicheIdobrigatóriostring (uuid) | Nicho do post. |
scheduledAtobrigatóriostring (ISO 8601) | Data/hora da publicação. |
titlestring | |
descriptionstring |
https://postautomation-production-5857.up.railway.appcurl -X PATCH "https://postautomation-production-5857.up.railway.app/posts/<ID>/finalize" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-H "Content-Type: application/json" \-d '{"nicheId":"<NICHEID>","scheduledAt":"<SCHEDULEDAT>","title":"<TITLE>","description":"<DESCRIPTION>"}'
Resposta
{"id": "f1a2...","status": "PENDING","scheduledAt": "2026-09-20T13:00:00.000Z"}
/posts/:id/draftRequer autenticaçãoExcluir rascunho
Remove um rascunho e o arquivo de vídeo/thumbnail associado do armazenamento.
Parâmetros na URL
idobrigatóriostring (uuid) | Id do post. |
https://postautomation-production-5857.up.railway.appcurl -X DELETE "https://postautomation-production-5857.up.railway.app/posts/<ID>/draft" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>"
Resposta
{"message": "Rascunho removido com sucesso."}
/posts/import-youtube-urlRequer autenticaçãoImportar vídeo por URL do YouTube
Cria um post agendado a partir de uma URL pública de um vídeo já existente no YouTube.
Corpo da requisição (application/json)
userIdobrigatóriostring (uuid) | |
nicheIdobrigatóriostring (uuid) | |
youtubeUrlobrigatóriostring (url) | Até 500 caracteres. |
scheduledAtobrigatóriostring (ISO 8601) |
https://postautomation-production-5857.up.railway.appcurl -X POST "https://postautomation-production-5857.up.railway.app/posts/import-youtube-url" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-H "Content-Type: application/json" \-d '{"userId":"<USERID>","nicheId":"<NICHEID>","youtubeUrl":"<YOUTUBEURL>","scheduledAt":"<SCHEDULEDAT>"}'
Resposta
{"id": "f1a2...","platform": "YOUTUBE","status": "PENDING"}
/posts/upload-videoRequer autenticaçãoEnviar vídeo já agendado
Envia um vídeo e já cria o post com nicho e data de publicação definidos (sem passar pelo fluxo de rascunho).
Corpo da requisição (multipart/form-data)
videoobrigatóriofile | |
userIdobrigatóriostring (uuid) | |
nicheIdobrigatóriostring (uuid) | |
titleobrigatóriostring | Até 255 caracteres. |
descriptionstring | |
scheduledAtobrigatóriostring (ISO 8601) |
https://postautomation-production-5857.up.railway.appcurl -X POST "https://postautomation-production-5857.up.railway.app/posts/upload-video" \-H "Authorization: Bearer <SEU_ACCESS_TOKEN>" \-F "video=@caminho/do/arquivo" \-F "userId=<USERID>" \-F "nicheId=<NICHEID>" \-F "title=<TITLE>" \-F "description=<DESCRIPTION>" \-F "scheduledAt=<SCHEDULEDAT>"
Resposta
{"id": "f1a2...","platform": "YOUTUBE","status": "PENDING"}