Aller au contenu

Pede uma comunidade nova (formulário do site)

POST/api/community-requests

Auth
Public
Clé d’API:
Clé d’API non acceptée
Les descriptions des endpoints viennent directement de la spécification de l’API et sont en portugais pour l’instant. L’interface autour est traduite.

Público, sem login e sem `X-CommunityId`. Grava um pedido **pendente** que o SuperAdmin aprova ou recusa em `/api/admin/community-requests`, e coloca 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. - **Telefone (`ownerPhone`, opcional):** guardado em E.164. Número sem `+` usa o país da variante de `language` (`pt-BR` → +55), ou o de `country` quando a variante não tem país (`en`). O que não pode ser telefone: 400 com `param = ownerPhone`. Na aprovação, vira o telefone da conta da dona na comunidade nova (e no perfil dela na comunidade da plataforma, se ainda não tiver um). - **Contato por WhatsApp/SMS (`contactConsent`, opcional):** o estado da caixa "Prefiro que entre em contato por WhatsApp e/ou SMS" (desmarcada por padrão) como foi enviado. Com `true` ou `false`, o pedido guarda a prova: o estado, quando, o texto exato da caixa no idioma `language` e a versão do texto (`2026-10-23`). O texto guardado é o da API, não um texto mandado pelo cliente: o site mostra exatamente essa frase. Sem o campo, nada é registrado (não autorizado). - **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.

En-têtes

NomTypeDescription
X-Site-KeyfacultatifstringSó o servidor do site: chave compartilhada (ACCESS_REQUEST_SITE_KEY)
X-Visitor-IPfacultatifstringSó com X-Site-Key válida: o IP de quem preencheu o formulário

Corps de la requête application/json

NomTypeDescription
communityNameobligatoirestringmin 2, max 120
subdomainobligatoirestringmin 3, max 63
ownerNameobligatoirestringmin 2, max 120
ownerEmailobligatoirestring (email)max 200
languagefacultatifpt-BR | pt-PT | en-US | en | es-ES | es-MX | es-AR | it-IT | de-DE | de-AT | de-CH | fr-FR | fr-CA | fr-BE | fr-CHVariante do site em que a pessoa preencheu. Os e-mails vão nela. Padrão pt-BR.
countryfacultatifstringOpcional, ISO 3166-1 alfa-2
ownerPhonefacultatifstringOpcional. Qualquer grafia; guardado em E.164 (+5541999998888) · max 40
contactConsentfacultatifbooleanOpcional. A caixa "Prefiro que entre em contato por WhatsApp e/ou SMS" (desmarcada por padrão), como a pessoa deixou
communityTypeobligatoireCOMMUNITY | COMPANY_HR | COWORKINGObrigatório. O que a pessoa vai montar: `COMMUNITY` (Comunidade), `COMPANY_HR` (Empresa & RH) ou `COWORKING` (Coworking). Ausente ou outro valor: 400 com `param = communityType`. Aparece no aviso à equipe e nas rotas do SuperAdmin.
turnstileTokenobligatoirestringToken do widget Cloudflare Turnstile do site · max 2048
websitefacultatifstringArmadilha para robôs: o formulário manda vazio

Réponses

StatutDescription
202Pedido recebido (ou duplicado, ou descartado pela armadilha).
400Requisição inválida — falha de validação.
429Muitos envios do mesmo IP. Tente depois do tempo em `Retry-After`.
500Erro interno do servidor.
503A verificação do Turnstile está indisponível agora (ou sem chave em produção).

Exemple 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]","communityType":"COMMUNITY","turnstileToken":"string"}'