Um site imobiliário completo e aberto que roda sobre a Express API: veja funcionando, publique em minutos e modifique como quiser.
A wiki documenta as 21 ações uma por uma. Esta página responde à outra pergunta, a que aparece primeiro: como eu monto um site com isso?
1. Veja funcionando
express.mapaprop.com é o site rodando sobre uma conta real de Mapaprop, com a Express API de produção. O que você vê ali é o que é publicado: não é uma maquete.
O código está em github.com/Mapaprop/mapaprop-express-starter, com licença MIT.
2. O que é
Um site completo —início, destaques, busca, ficha do imóvel, empreendimentos, blog, contato e captação de proprietários— escrito em HTML e JavaScript, sem framework e sem etapa de compilação. Você abre, edita e vê a mudança.
Não é um exemplo de código solto: é a implementação que mantemos a cada mudança da Express API, e a mesma que usamos para mostrar a API funcionando.
| O que traz do lado do cliente | HTML, CSS e JavaScript sem dependências: nada para instalar, nada para compilar |
| O que traz do lado do servidor | uma função que guarda o seu token e fala com a API por você |
| Os idiomas | espanhol, inglês e português, com seletor |
| Os testes | 131, sem dependências externas |
| A licença | MIT: use, mude e publique como quiser |
O design —cores, tipografia, logo, capa, chamadas para ação, redes sociais e rodapé— vem da sua conta se você ativar o site da Mapaprop e vinculá-lo ao seu token. Sem isso, o site usa os valores de reserva de public/js/config.js.
3. Do zero ao publicado
- Tenha o seu plano. A Express API está incluída a partir do Mapaprop Pro+.
- Ative o seu token em Configurações > Token de API. Guia passo a passo: Express API Token.
- Publique o site. O repositório tem um botão da Vercel que clona o projeto e pede o token durante o processo; ele fica guardado como a variável de ambiente
MAPAPROP_API_TOKEN. - Edite
public/js/config.jscom os seus dados de reserva e publique de novo.
Você não precisa ativar o scope CORS: o site fala com a API pelo servidor, não pelo navegador. O scope CORS é necessário quando o JavaScript do navegador chama a API diretamente, que é justamente o que este site evita.
Também funciona no seu próprio servidor: é um servidor Node sem dependências, que sobe atrás do nginx ou do Apache como qualquer outra aplicação. O que não basta é uma hospedagem apenas de arquivos estáticos, porque é preciso executar a função que guarda o token.
4. Testar sem conta e sem token
git clone https://github.com/Mapaprop/mapaprop-express-starter
cd mapaprop-express-starter
npm run dev:mock # http://localhost:3000
Isso inicia o site com as fixtures do repositório, que são respostas reais da API anonimizadas. É a forma de olhar, de trabalhar o design e de mandar uma mudança sem ser cliente da Mapaprop. No modo mock os formulários não enviam nada para lugar algum.
Com o seu token, o modo real:
cp .env.example .env.local # e cole o seu token dentro
npm run dev # http://localhost:3000
npm test # a suíte completa
5. O mapa do código
Para a pessoa que vai modificá-lo, o que cada coisa resolve:
| Arquivo | O que resolve |
|---|---|
api/mp/[...path].js | a função de servidor: adiciona o token e deixa passar apenas as ações que o site usa |
dev-local.mjs | o servidor Node que despacha para essa mesma função, para a sua máquina ou a sua hospedagem |
public/js/config.js | os seus dados de reserva. É a primeira coisa que você vai editar |
public/js/api.js | o cliente que fala com a função de servidor |
public/js/brand.js | aplica o design da sua conta: cores, tipografia, logo e favicon |
public/js/i18n.js | os textos nos três idiomas e o seletor |
public/js/ui.js | a renderização compartilhada: preços, fotos, características e paginação |
public/css/style.css | todo o estilo, em um arquivo |
public/<seção>/index.html | uma pasta por seção, servida em /<seção> |
fixtures/ | as respostas anonimizadas e o servidor do modo mock |
tests/ | a suíte, que roda sem instalar nada |
6. Por que o token fica do lado do servidor
É a decisão de arquitetura mais importante do projeto, e a que vale entender antes de mudar.
A sua conta tem um único API Token, esse token carrega todas as permissões que o seu plano dá e não vence. Se você contratou o adicional de Property API, o mesmo token também pode criar imóveis e publicá-los nos portais. Colocado no JavaScript do site, qualquer visitante o leria pelas ferramentas de desenvolvimento do navegador e ficaria com uma credencial permanente da sua conta.
Por isso ele vive em uma variável de ambiente do servidor, e o navegador fala com uma função que é a única que o conhece. Essa função também:
- deixa passar apenas as ações que o site usa, por uma lista explícita. Sem essa lista, uma rota montada à mão poderia chegar com o seu token a outra parte da API.
- filtra o corpo dos dois formulários contra os campos que cada ação documenta.
- recorta
settings-v2para o que o site usa. Além do seu nome e dos seus dados de contato, essa ação devolve os seus dados fiscais e as chaves de Mapbox e reCAPTCHA da sua conta. Tudo o que a função devolve fica público, então o que o site não precisa não sai. - completa o IP, o navegador e o referer de cada consulta: são dados de que a ação de consultas precisa e que o navegador não pode declarar sobre si mesmo.
- faz cache dos catálogos para não gastar chamadas a mais.
Se você adicionar uma ação nova, inclua-a nessa lista. E se precisar de um campo de settings-v2 que hoje não sai, inclua-o de propósito e se pergunte se esse campo pode ficar publicado, porque é exatamente o que vai acontecer.
O site também declara uma Content-Security-Policy e três outros cabeçalhos, e o servidor Node os lê do mesmo arquivo que a Vercel: assim a defesa não depende de onde você publicou.
7. As consultas voltam para o seu CRM
O formulário de cada ficha envia para messages, então a consulta entra no seu Inbox da Mapaprop como um lead: você atribui a um corretor, faz o acompanhamento, ela fica nos seus relatórios e dispara as suas automações.
Se você trocar por um formulário que só manda um e-mail, o círculo se rompe: você continua cadastrando os imóveis na Mapaprop e atende os clientes fora, onde a consulta não existe para o seu CRM.
O formulário de captação de proprietários usa seller-submissions: cria o contato no seu CRM e manda um e-mail com os anexos. Essa ação precisa de um site vinculado ao seu token.
8. O que não cobre
| A consulta genérica | messages exige um imóvel publicado, então uma consulta que não é sobre nenhum imóvel não entra no CRM pela API. A página de contato do site mostra as suas filiais com telefone, e-mail e WhatsApp, e o formulário dela abre o programa de e-mail do visitante |
| A hospedagem e a manutenção | ficam por sua conta. É o outro lado de ter o código: ninguém o atualiza no seu servidor |
| 20 imóveis por requisição | é o limite da API. A listagem pagina sozinha |
| Os rascunhos | a API devolve apenas imóveis publicados |
| Os anexos da captação | 2 MB por arquivo, e o teto real é dado pelo total do envio: eles viajam codificados e isso infla o corpo em cerca de um terço |
Se você regenerar o seu token, o anterior para de funcionar na hora: atualize a variável de ambiente e publique de novo. Se cancelar o plano, o token é desativado e o site para de trazer imóveis.
9. Como colaborar
O repositório é público e aceita pull requests.
- Se faltar algo —um filtro, um bloco, um idioma—, abra uma issue em github.com/Mapaprop/mapaprop-express-starter/issues e vamos olhar.
- Se você já resolveu, mande o seu PR. O modo mock existe justamente para que você possa trabalhar e testar sem uma conta.
- Se encontrar um problema de segurança, como reportá-lo está escrito no
SECURITY.mddo repositório.