Propõe um tema a partir de uma imagem ou do logo
POST/api/communities/appearance/theme-from-image
- Auth
- Jeton requis
- Clé d’API:
- community:write
- X-CommunityId
X-CommunityIdEnvoyez le X-CommunityId de la communauté où l’opération a lieu.
"Gerar a partir de uma imagem": o servidor extrai até 8 cores dominantes da imagem e a IA, recebendo **só a lista de cores em hexadecimal**, escolhe as cores do tema (principal, secundária, menu e cabeçalho no claro e no escuro). A resposta é a proposta em `values`, no formato de `CommunityThemeValues`: o tema ativo com as cores trocadas (modo, fonte, cantos, densidade e navegação continuam os dele). **Nada é salvo**: para guardar, envie `values` em `POST /api/community-themes` com `origin: image` (conta no limite de 10 temas).
Fonte: um arquivo `file` (multipart; PNG, JPG ou WebP, até 5 MB; SVG → 422) **ou** `source: logo`, que usa o logo da comunidade, lido no servidor (nunca uma URL enviada pelo cliente). O arquivo fica só na memória e é descartado depois da extração; a imagem não sai do servidor. O formato é conferido pelos primeiros bytes antes de qualquer leitura. Logo em SVG é lido como PNG gerado pelo CDN de imagens a partir do próprio arquivo; sem isso, 422.
Contraste AA garantido: todo texto do menu e do cabeçalho passa 4,5:1 sobre o fundo, e o tom 600 de cada escala passa sob o texto que o app põe nele; `adjusted` lista o que o servidor corrigiu, e `warnings` volta vazio.
Cada geração conta 1 uso da cota de IA do plano (`ai.textUsesPerMonth`, a mesma do "Melhorar com IA"); com a cota esgotada, 429 com a mensagem `ai.errors.communityTextLimit`. Os limites por pessoa de `/api/ai` (30 por minuto, 500 por dia) valem aqui também. Fora de produção, sem a chave do provedor, um gerador falso determinístico responde. Owner e admin.
En-têtes
| Nom | Type | Description |
|---|---|---|
X-CommunityIdfacultatif | string (uuid) | ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade. |
Corps de la requête multipart/form-data
| Nom | Type | Description |
|---|---|---|
fileobligatoire | string (binary) | PNG, JPG ou WebP, até 5 MB. |
Réponses
| Statut | Description |
|---|---|
200 | A proposta (não salva). |
400 | Nem arquivo nem `source: logo`, ou os dois juntos. |
401 | Token ausente, inválido ou expirado; token de outra comunidade (o `X-CommunityId` ou o `communityId` do corpo não é o do token); token antigo ou de uma sessão encerrada (troca de senha, convite aceito). Nesses casos a mensagem pede para entrar de novo (`auth.signInAgain`). |
403 | Autenticado, mas sem permissão para esta operação. |
404 | Recurso não encontrado. |
422 | O arquivo não é uma imagem aceita, passa de 5 MB (SVG não é aceito) ou não tem cor visível; ou a comunidade não tem logo, ou ele não pôde ser lido como imagem. |
429 | A comunidade usou a cota mensal de IA do plano (sem `Retry-After`), ou a pessoa passou do limite por minuto ou por dia de `/api/ai` (com `Retry-After`). |
500 | Erro interno do servidor. |
503 | O provedor de IA não respondeu; a cota só é devolvida quando a chamada nem chegou a ele. |
Exemple curl
curl -X POST "https://api.memberfy.net/api/communities/appearance/theme-from-image" \
-H "Authorization: Bearer $TOKEN" \
-H "X-CommunityId: $COMMUNITY_ID" \
-F "file=@caminho/do/arquivo"