Pede uma comunidade nova (formulário do site)
POST/api/community-requests
- Auth
- Pública
Público, sem login e sem `X-CommunityId` (F-89). Grava um pedido **pendente** que o SuperAdmin aprova ou recusa em `/api/admin/community-requests`, e põe na fila o e-mail "recebemos o seu pedido" para quem pediu, no idioma `language`, e o aviso de pedido novo para a equipe da Memberfy.
- **Endereço:** `subdomain` vira `<subdomain>.memberfy.net`. De 3 a 63 caracteres, minúsculas, números e hífen, sem hífen nas pontas. Reservado (`api`, `app`, `admin`, `www`...) ou já usado por uma comunidade (slug ou domínio): 400 com `param = subdomain`, nada é gravado. - **Robôs:** o campo `website` é uma armadilha (o formulário o esconde). Preenchido, a resposta é 202 e nada é gravado. Mais de 5 envios do mesmo IP em 10 minutos: 429 com `Retry-After`. O IP é o que o roteador viu (ou o `CF-Connecting-IP` quando a conexão vem da Cloudflare), nunca o `X-Forwarded-For` que o cliente manda. O servidor do site se identifica com `X-Site-Key` (chave compartilhada) e manda o IP de quem preencheu em `X-Visitor-IP`; sem a chave, `X-Visitor-IP` é ignorado. - **Um pedido pendente por e-mail:** outro envio com o mesmo e-mail (qualquer endereço) responde 202 sem gravar nada. O e-mail de confirmação é genérico (só o endereço pedido) e sai no máximo 2 vezes por dia para o mesmo destinatário. - **Nomes:** `communityName` e `ownerName` não aceitam link, endereço de site ou e-mail (`://`, `www.`, `exemplo.com`, `a/b`, `@`): 400. - **Cloudflare Turnstile:** `turnstileToken` é obrigatório (o token do widget do site, sitekey `0x4AAAAAAFW62nNlCs_PeE46`) e é conferido uma vez no `siteverify` com o IP de quem preencheu. Ausente: 400; inválido, expirado ou já usado (`timeout-or-duplicate`): 400 com `param = turnstileToken` (o site renova o widget). O token só é gasto quando os campos passam na validação. Verificação indisponível: 503. - **Idioma das mensagens de erro:** o do `Accept-Language`.
A resposta é sempre `data: {}`: não diz se o pedido é novo, duplicado ou foi descartado. O IP não é guardado, só um hash dele.
Headers
| Nome | Tipo | Descrição |
|---|---|---|
X-Site-Keyopcional | string | Só o servidor do site: chave compartilhada (ACCESS_REQUEST_SITE_KEY) |
X-Visitor-IPopcional | string | Só com X-Site-Key válida: o IP de quem preencheu o formulário |
Corpo da requisição application/json
| Nome | Tipo | Descrição |
|---|---|---|
communityNameobrigatório | string | min 2, max 120 |
subdomainobrigatório | string | min 3, max 63 |
ownerNameobrigatório | string | min 2, max 120 |
ownerEmailobrigatório | string (email) | max 200 |
languageopcional | pt-BR | pt-PT | en-US | en | es-ES | es-MX | es-AR | it-IT | de-DE | de-AT | de-CH | Variante do site em que a pessoa preencheu. Os e-mails vão nela. Padrão pt-BR. |
countryopcional | string | Opcional, ISO 3166-1 alfa-2 |
turnstileTokenobrigatório | string | Token do widget Cloudflare Turnstile do site · max 2048 |
websiteopcional | string | Armadilha para robôs: o formulário manda vazio |
Respostas
| Código | Descrição |
|---|---|
202 | Pedido recebido (ou duplicado, ou descartado pela armadilha). |
400 | Requisição inválida — falha de validação. |
429 | Muitos envios do mesmo IP. Tente depois do tempo em `Retry-After`. |
500 | Erro interno do servidor. |
503 | A verificação do Turnstile está indisponível agora (ou sem chave em produção). |
Exemplo com curl
curl -X POST "https://api.memberfy.net/api/community-requests" \
-H "Content-Type: application/json" \
-d '{"communityName":"string","subdomain":"string","ownerName":"string","ownerEmail":"[email protected]","turnstileToken":"string"}'