Publiva API
Geração de criativos a partir de um briefing: content plan, DesignSpec, render e assets persistidos por organização. Os endpoints da engine respondem sem token; os de persistência usam o access token do Supabase.
Catálogo em JSON: GET /api · status em GET /api/health
Chaves e procedência
Qualidade e origem de cada variável. Valores nunca aparecem aqui. Atualize esta lista quando colar uma chave nova no .env.
Ainda falta (obrigatório)
- META_APP_ID / META_APP_SECRET — Instagram + Facebook Pages. Login OAuth, token de 60 dias e Page token. Sem isso Conectar devolve 503. Produção para clientes: App Review (política de privacidade + vídeo do fluxo).
SUPABASE_URL / VITE_SUPABASE_URLpúblicaobrigatóriapresenteOrigem: Supabase → Project Settings → API Keys. URL https://<ref>.supabase.co
HTTP Auth + Postgres (cliente JS). Não é connection string Direct/ORM.
SUPABASE_PUBLISHABLE_KEY / VITE_SUPABASE_PUBLISHABLE_KEYpúblicaobrigatóriapresenteOrigem: Supabase → API Keys → Publishable (`sb_publishable_…`)
Login no browser. Pode ir no front. Não bypassa RLS.
SUPABASE_SECRET_KEY / SUPABASE_SERVICE_ROLE_KEYsecretaobrigatóriapresenteOrigem: Supabase → API Keys → Secret (`sb_secret_…`). O app aceita os dois nomes.
Só no Lambda. Bypass RLS. Nunca no front.
SUPABASE_JWKS_URLpúblicaopcionalpresenteOrigem: `/auth/v1/.well-known/jwks.json` no mesmo host do projeto
Reservado. Auth hoje usa as chaves HTTP, não JWKS.
OPENAI_API_KEYproduçãoobrigatóriapresenteOrigem: https://platform.openai.com/api-keys (`sk-proj-…` ou `sk-…`)
Arte gpt-image. Sem ela a geração de imagem falha.
OPENAI_IMAGE_MODEL / OPENAI_IMAGE_QUALITYinternaopcionalpresenteOrigem: Nossa config. Qualidade atual: `low` (mais barato, pior nitidez).
Modelo `gpt-image-1`. Subir para `medium`/`high` aumenta custo.
ANTHROPIC_API_KEYinternaopcionalfaltaOrigem: https://console.anthropic.com/settings/keys (`sk-ant-…`) — não usar.
Módulo Claude na engine/agente. Não está em uso. Copy fica offline.
STRIPE_SECRET_KEYtesteopcionalparcialOrigem: https://dashboard.stripe.com/test/apikeys — hoje é `rk_test_…` (restricted). `sk_test_…` ou `sk_live_…` também servem.
Checkout. Restricted precisa de Customers + Checkout Sessions. `rk_live_`/`sk_live_` = dinheiro real.
STRIPE_WEBHOOK_SECRETtesteopcionalpresenteOrigem: Stripe → Developers → Webhooks → signing secret (`whsec_…`)
Assina POST /api/stripe/webhook. Sem isso o pagamento não ativa o plano.
META_APP_ID / META_APP_SECRETproduçãoobrigatóriafaltaOrigem: https://developers.facebook.com/apps → app → Settings → Basic. Redirect: `{origem}/api/social-accounts/oauth/callback`
Instagram + Facebook Pages. Login OAuth, token de 60 dias e Page token. Sem isso Conectar devolve 503. Produção para clientes: App Review (política de privacidade + vídeo do fluxo).
PUBLIVA_OAUTH_STATE_SECRETsecretaopcionalfaltaOrigem: String aleatória nossa. Se vazio, usa META_APP_SECRET ou a secret do Supabase.
HMAC do state OAuth. Melhor ter um valor dedicado.
LINKEDIN_CLIENT_ID / LINKEDIN_CLIENT_SECRETproduçãoopcionalfaltaOrigem: https://www.linkedin.com/developers/apps
Publicar no LinkedIn. Sem isso a rede fica pendente.
PINTEREST_APP_ID / PINTEREST_APP_SECRETproduçãoopcionalfaltaOrigem: https://developers.pinterest.com/apps/
Publicar no Pinterest. Sem isso a rede fica pendente.
EVOLUTION_API_URL / EVOLUTION_API_KEY / EVOLUTION_INSTANCEsecretaopcionalfaltaOrigem: https://evoapicloud.com → Project + → instância. Copiar Base URL, token (`apikey`) e Instance ID/nome. Docs: https://docs.evoapicloud.com/instances/token
WhatsApp. Sem isso o cron prepara o post e anota pendência.
PUBLIVA_CRON_SECRETinternaobrigatóriapresenteOrigem: Gerada por nós. Header `Authorization: Bearer …` nos crons EventBridge.
Autentica /api/public/cron/gerar e /publish. Não é chave de terceiro.
PUBLIVA_S3_BUCKET / AWS_REGIONinternaobrigatóriapresenteOrigem: Bucket `publiva-assets-ssmalkk`, região us-east-1. Lambda usa a role IAM, não access key no env.
Arquivos. Access keys de IAM user não vão para a função.
UNSPLASH_ACCESS_KEY / PEXELS_API_KEYpúblicaopcionalfaltaOrigem: Unsplash Developers / Pexels API. Só se não houver OpenAI para foto.
Fallback de stock. Com OPENAI_API_KEY não são necessárias.
Google OAuth (painel, sem env)produçãoopcionalfaltaOrigem: Google Cloud → Credenciais OAuth (Web). Client ID/Secret no Supabase Authentication → Providers → Google. Callback fixo: `https://mklzrrzvvhiygejbyldz.supabase.co/auth/v1/callback`. Redirects: Site URL + `http://localhost:8080/**`.
Botão Entrar com Google. Sem isso o login é só e-mail/senha.
META_BUSINESS_PARTNER_ID / META_SYSTEM_USER_TOKENproduçãoopcionalfaltaOrigem: Meta Business Suite → configurações da BM. O ID é público (cliente cola como parceiro). O token é de System User com páginas atribuídas.
Facebook Pages sem OAuth. GET Graph client_pages/owned_pages/me/accounts; POST /{page-id}/feed.
Schema SQL (migrations)internaobrigatóriapresenteOrigem: `npx supabase db push` no projeto `mklzrrzvvhiygejbyldz`. A base está em `20260825170000_schema_base.sql`.
Sem tabelas (`plans`, `organizations`…) o health fica `database: down` mesmo com as chaves HTTP certas.
PUBLIVA_MODO_TESTEinternaopcionalpresenteOrigem: Nossa flag. Local = `1` (IA que falha vira mock). Lambda deve ficar `0`.
Não é chave de terceiro. Em produção com `1` o usuário vê peça rosa [MOCK].
Token de acesso
Entre para obter um bearer token. A organização é criada no primeiro acesso autenticado.
Engine
Sem persistência e sem token. Compatível com o briefing original.
GET/api/healthTemplates, formatos, provedor de foto, driver de render, storage, banco e se o Cloud remoto está configurado.
GET/api/custoTokens e custo já gastos nesta sessão.
GET|POST/api/custo/estimativaQuanto sairia um plano deste tamanho, antes de gastar (?posts=4&imagens=4).
GET/api/formatsFormatos nativos das redes, com área de segurança de cada uma.
GET/api/templatesCatálogo de templates com os campos de conteúdo de cada um.
GET/api/templates/:idDetalhe de um template.
GET/api/brands/presetsPaletas e tipografias prontas, mais o BrandKit padrão.
POST/api/spectemplate + conteúdo + marca => DesignSpec, sem renderizar.
POST/api/rendertemplate + conteúdo => imagem (?format=png|jpeg|webp&scale=&supersample=).
POST/api/render/specDesignSpec editado => imagem.
POST/api/variantsN variações de layout do mesmo conteúdo, já renderizadas.
POST/api/planBriefing => plano de conteúdo escrito pela IA (offline sem chave).
POST/api/plan/renderBriefing => posts prontos: imagem, legenda e hashtags, sem persistir.
POST/api/carouselCarrossel completo: capa + slides + página final.
POST/api/campaignUm conteúdo em vários formatos de uma vez (feed, story, ...).
Persistência
Exigem Authorization: Bearer <access_token>. Escopados pela organização do usuário.
POST/api/campaigns/runtokenFluxo completo persistido: briefing → plano → posts → DesignSpecs → render → assets → generations.
GET|POST/api/brandstokenLista e cria brands da organização.
GET|PATCH|DELETE/api/brands/:idtokenLê, atualiza e remove uma brand.
GET|POST/api/projectstokenLista e cria projects da organização.
GET|PATCH|DELETE/api/projects/:idtokenLê, atualiza e remove um project.
GET|POST/api/campaignstokenLista (?projectId=) e cria campanhas.
GET|PATCH|DELETE/api/campaigns/:idtokenCampanha completa: posts, generations, DesignSpecs e assets.
GET/api/generations/:idtokenGeneration com o DesignSpec e os assets assinados.
GET/api/assets/:idtokenAsset com URL assinada (?redirect=1 responde 302).
GET|POST/api/assetstokenBiblioteca: lista (?kind= ?brandId= ?productId=) e upload multipart (campo file).
GET/api/midiatokenAlias da biblioteca (mesmo conjunto de /api/assets).
GET|POST/api/social-accountstokenLista e cria contas sociais (status pending_configuration). Nunca devolve credentials.
PATCH|DELETE/api/social-accounts/:idtokenAtualiza handle/status ou remove uma conta social.
POST/api/social-accounts/:id/connecttokenInicia OAuth Meta (Instagram/Facebook). Devolve { url }; nunca devolve tokens.
GET/api/social-accounts/oauth/callbackCallback do Facebook Login (state assinado; sem bearer).
GET|POST/api/social-accounts/:id/meta-pagestokenLista Páginas/Instagram autorizados (sem tokens) e grava a Page escolhida.
GET|POST/api/social-accounts/meta-parceirotokenParceiro BM: ID público da nossa BM e gravação do token da Página.
POST/api/social-accounts/:id/credentialstokenGrava credentials Evolution (WhatsApp). Nunca ecoa secrets.
POST/api/social-accounts/:id/disconnecttokenLimpa credentials e marca a conta como disconnected.
GET|PATCH/api/configtokenPerfil da organização: nome comercial da empresa, fuso, negócio, tom.
POST/api/agentetokenAgente conversacional do workspace. Módulo Anthropic existe, não está em uso (sem chave = indisponível/mock). Foto de post usa OPENAI_API_KEY.
POST/api/public/cron/gerarWorker: cria agendamentos a partir das campanhas e gera a peça na hora de publicar. Antecipação é a estrela no calendário. Schedule `*/5 * * * *` (EventBridge). Header Authorization: Bearer <PUBLIVA_CRON_SECRET>.
POST/api/public/cron/publishWorker de publicação no dia. Schedule `*/5 * * * *` (EventBridge). Header Authorization: Bearer <PUBLIVA_CRON_SECRET>. WhatsApp via Evolution API quando configurada; sem rede, prepara o post e anota o impedimento sem derrubar o lote.
GET|POST/api/productstokenLista e cria produtos da organização (?brandId= ?status= ?busca=).
GET|PATCH|DELETE/api/products/:idtokenLê, atualiza e remove um produto.
GET|POST/api/modelostokenTemplates da organização: listar e criar (?busca=).
GET|PATCH|DELETE/api/modelos/:idtokenLê, atualiza e remove um template da organização.
GET|PUT/api/campaigns/:id/productstokenProdutos vinculados à campanha. PUT substitui o conjunto.
POST/api/campaigns/:id/poststokenCria um post na campanha (content, template, format, caption, spec…).
GET|PATCH/api/posts/:idtokenPost com generations, DesignSpec e assets.
GET/api/tokenstokenSaldo de tokens, plano da organização e tabela de preços.
GET/api/tokens/extratotokenExtrato paginado de token_transactions (?limite= ?antesDe=).
GET|POST/api/tokens/estimativatokenQuanto custaria uma ação, sem gastar.
GET/api/calendariotokenAgenda agrupada por dia local (?de= ?ate= ?tz=).
PATCH/api/calendario/:idtokenRemarca um agendamento (runAt + timezone).
POST/api/calendario/:id/gerartokenGera o post agora (estrela no calendário).
GET/api/agendatokenPublicações agendadas numa janela (?de= ?ate=).
POST/api/campaigns/agendartokenAgenda os posts da campanha. Gerar antes da hora é a estrela no calendário.