tag: BETA
Este webservice é usado para enviar uma solicitação de comercialização de imóvel de vendedor a partir de aplicações móveis. Permite que proprietários enviem seus imóveis para venda ou locação com informações detalhadas e anexos opcionais (imagens e PDFs).
A solicitação do proprietário fica registrada na conta Mapaprop da imobiliária (a dona do token): é salva como contato no CRM e a imobiliária é notificada por e-mail com os anexos. A conta de destino é resolvida a partir do token, não é enviada como parâmetro.
| Informações do recurso | |
|---|---|
| Autenticação | Obrigatória (Token de API, Bearer) |
| Scope | express-base |
| HTTP Method | POST |
| Request Format | JSON |
| Response | JSON |
| Version | 1 |
| Rate Limiting | 10 requests/hora, 10MB bandwidth/hora |
URL do recurso
https://mapaprop.app/api/action/express-v1/seller-submissions
Autenticação
Este endpoint requer autenticação OAuth2. Você deve incluir um Bearer token válido no cabeçalho Authorization.
Authorization: Bearer {your-oauth2-token}
O customerId é extraído automaticamente do token autenticado. Não o inclua no corpo da requisição.
Parâmetros
Parâmetros obrigatórios
| Key | Type | Required | Descrição |
|---|---|---|---|
| websiteId | integer | yes | O ID do site ao qual o envio será associado. Deve pertencer ao cliente autenticado. |
| name | string | yes | Nome do proprietário do imóvel (mín: 3, máx: 100 caracteres) |
| string | yes | E-mail do proprietário do imóvel (formato de e-mail válido, máx: 100 caracteres) | |
| phone | string | yes | Telefone do proprietário do imóvel (máx: 20 caracteres) |
| propertyType | string | yes | Tipo de imóvel (por ex., "Casa", "Departamento", "Local", "Terreno") |
| propertyOperation | string | yes | Tipo de operação (por ex., "Venta", "Alquiler", "Alquiler Temporal") |
| propertyAddress | string | yes | Endereço completo do imóvel (máx: 200 caracteres) |
| domain | string | yes | Domínio da aplicação solicitante |
| url | string | yes | URL de referência do envio |
| ip | string | yes | Endereço IP do usuário que faz o envio (para detecção de spam) |
Parâmetros opcionais - Informações de contato
| Key | Type | Required | Descrição |
|---|---|---|---|
| contactHours | string | no | Horário de contato preferido (por ex., "Lunes a Viernes de 9 a 18hs") |
Parâmetros opcionais - Detalhes do imóvel
| Key | Type | Required | Descrição |
|---|---|---|---|
| propertyListed | string | no | Se o imóvel está atualmente publicado ("true" ou "false") |
| propertyValuation | string | no | Se o proprietário deseja uma avaliação do imóvel ("true" ou "false") |
| availabilityDate | string | no | Data em que o imóvel estará disponível (formato: YYYY-MM-DD) |
| propertyCurrency | string | no | Moeda do preço (por ex., "USD", "ARS", "EUR") |
| propertyPrice | string | no | Preço pedido pelo imóvel |
| propertyLegalId | string | no | Número de identificação legal (por ex., "12-34-567890-1") |
| propertyBetweenStreets | string | no | Referência de ruas transversais (máx: 200 caracteres) |
| propertyZipcode | string | no | CEP (máx: 10 caracteres) |
| propertyZone | string | no | Zona ou nome do bairro (máx: 200 caracteres) |
| propertyDescription | string | no | Descrição detalhada do imóvel (máx: 4000 caracteres) |
| propertyStatus | string | no | Estado atual do imóvel (por ex., "Excelente", "Bueno", "A Refaccionar") |
| propertyBuildingArea | string | no | Área construída em metros quadrados |
| propertyLandArea | string | no | Área do terreno em metros quadrados |
| propertyYearsOld | string | no | Idade do imóvel em anos |
| propertyRooms | string | no | Número de quartos/dormitórios |
| propertyBathrooms | string | no | Número de banheiros |
| propertyAmbiences | string | no | Número de ambientes/espaços |
| propertyAttributes | string | no | Características especiais (por ex., "Garage, Jardín, Parrilla, Piscina") |
Parâmetros opcionais - Anexos de arquivos
| Key | Type | Required | Descrição |
|---|---|---|---|
| image | string | no | Imagem do imóvel como Data URL em Base64 (formato: data:image/{type};base64,{data}). Formatos suportados: JPEG, PNG, GIF, WebP. Tamanho máximo: 2MB |
| string | no | Documentação do imóvel como Data URL em Base64 (formato: data:application/pdf;base64,{data}). Tamanho máximo: 2MB |
Parâmetros opcionais - Metadados do app móvel
| Key | Type | Required | Descrição |
|---|---|---|---|
| platform | string | no | Plataforma móvel ("iOS" ou "Android") - usado para análises |
| appVersion | string | no | Versão da aplicação (por ex., "2.5.1") - usado para análises |
| userAgent | string | no | String de user agent do browser/app - usado para detecção de spam |
| referer | string | no | URL referrer - usado para detecção de spam |
Formato de upload de arquivos
Imagens e PDFs devem ser enviados como Data URLs codificadas em Base64:
Formato de imagem:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJ...
Formato PDF:
data:application/pdf;base64,JVBERi0xLjQKJcOkw7zDtsKBw4XDqsOPDQoxIDAgb2Jq...
Tipos de imagem suportados:
- image/jpeg
- image/png
- image/gif
- image/webp
Limites de tamanho de arquivo:
- Máximo por arquivo: 2MB
- Máximo de bandwidth total: 10MB por hora
Segurança:
- Os arquivos são validados usando validação por número mágico (não apenas o MIME type)
- Todos os arquivos são verificados em busca de ameaças de segurança
- Os arquivos são enviados para armazenamento seguro no S3
Exemplo de requisição
POST /api/action/express-v1/seller-submissions HTTP/1.1
Host: mapaprop.app
Content-Type: application/json
Authorization: Bearer {access_token}
{
"websiteId": 869,
"name": "Juan Carlos Rodriguez",
"email": "juan.rodriguez@gmail.com",
"phone": "+54 11 4567-8901",
"contactHours": "Lunes a Viernes de 9 a 18hs",
"propertyType": "Casa",
"propertyOperation": "Venta",
"propertyAddress": "Av. Corrientes 1234",
"propertyZone": "Barrio Norte",
"propertyLandArea": "250",
"propertyBuildingArea": "180",
"propertyPrice": "150000000",
"propertyCurrency": "ARS",
"propertyRooms": "3",
"propertyBathrooms": "2",
"propertyDescription": "Hermosa casa de 3 plantas con jardín y garage.",
"propertyListed": "false",
"propertyValuation": "true",
"image": "data:image/png;base64,iVBORw0KGgo...",
"pdf": "data:application/pdf;base64,JVBERi0xLjQ...",
"platform": "iOS",
"appVersion": "2.5.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)",
"ip": "181.47.123.45",
"referer": "https://www.mapaprop.com/publicar-propiedad",
"domain": "www.mapaprop.com",
"url": "https://www.mapaprop.com/publicar-propiedad/formulario"
}
Resposta
A resposta JSON indica se o envio do vendedor foi bem-sucedido e fornece detalhes sobre o contato criado.
Resposta de sucesso
| Campo | Tipo | Descrição |
|---|---|---|
| error | boolean | Sempre false em caso de sucesso |
| message | string | Mensagem de sucesso |
| contactId | integer | (Opcional) ID do contato criado |
| websiteId | integer | (Opcional) ID do site |
| processingTimeMs | integer | (Opcional) Tempo de processamento em milissegundos |
Resposta de erro
| Campo | Tipo | Descrição |
|---|---|---|
| error | boolean | Sempre true em caso de erro |
| message | string | Mensagem de erro descrevendo o que deu errado |
| code | string | (Opcional) Código de erro para tratamento programático |
Exemplo de resposta - Sucesso
{
"error": false,
"message": "Seller commercialization request submitted successfully",
"contactId": 1065875,
"websiteId": 869,
"processingTimeMs": 5215
}
Exemplos de resposta - Erros
Propriedade inválida do site:
{
"error": true,
"message": "Website not found or does not belong to customer",
"code": "NOT_FOUND"
}
Limite de taxa excedido:
{
"error": true,
"message": "Too many seller submissions. Please try again later.",
"code": "RATE_LIMIT_EXCEEDED"
}
Formato de arquivo inválido:
{
"error": true,
"message": "Invalid file format. Only JPEG, PNG, GIF, WebP images and PDF documents are allowed.",
"code": "INVALID_FILE"
}
Campo obrigatório ausente:
{
"error": true,
"message": "Name is required and must be between 3 and 100 characters",
"code": "INVALID_INPUT"
}
Spam detectado:
{
"error": true,
"message": "Spam detected",
"code": "SPAM_DETECTED"
}
Limite de taxa
Este endpoint tem limite de taxa para prevenir abusos:
- Limite de requisições: 10 requisições por hora por cliente
- Limite de bandwidth: 10MB por hora por cliente
Quando o limite de taxa é excedido, você receberá:
{
"error": true,
"message": "Too many seller submissions. Please try again later.",
"code": "RATE_LIMIT_EXCEEDED"
}
Funcionalidades de segurança
Detecção de spam
Todos os envios são verificados contra spam usando a integração com Akismet no ambiente de produção. Os envios marcados como spam são registrados mas não bloqueados automaticamente.
Segurança de arquivos
- Validação por número mágico: Os arquivos são validados pelo conteúdo real, não apenas pelo MIME type
- Limites de tamanho de arquivo: 2MB por arquivo, 10MB de bandwidth total por hora
- Formatos suportados: Apenas formatos de imagem e PDF incluídos na lista de permitidos são aceitos
- Armazenamento seguro: Arquivos enviados para buckets S3 criptografados
Validação de entrada
- Todos os campos de texto são higienizados e validados
- Endereços de e-mail devem ter formato RFC válido
- Números de telefone são validados por formato
- Prevenção de injeção SQL por meio de prepared statements
- Prevenção de XSS por meio de escape de templates
O que acontece após o envio
- Criação de contato: Um novo contato é criado no CRM com tipo "SELLER"
- Armazenamento de arquivos: Imagens e PDFs são enviados para armazenamento seguro no S3
- Notificação por e-mail: Um e-mail é enfileirado (via SQS) e enviado ao cliente com:
- Todos os detalhes do imóvel
- Arquivos anexados (imagem e PDF)
- Informações de contato
- Metadados do envio (plataforma, versão do app, timestamp)
- Estatísticas: O evento é registrado com metadados detalhados para análises
- Registro de auditoria: Um registro de auditoria completo é criado para conformidade
Códigos de erro
| Código | HTTP Status | Descrição |
|---|---|---|
| INVALID_INPUT | 400 | Campo obrigatório ausente ou validação falhou |
| NOT_FOUND | 404 | Site não encontrado ou não pertence ao cliente |
| UNAUTHORIZED | 401 | Token OAuth2 inválido ou ausente |
| RATE_LIMIT_EXCEEDED | 429 | Muitas requisições (limite de 10/hora) |
| SPAM_DETECTED | 400 | Envio marcado como spam pelo Akismet |
| INVALID_FILE | 400 | Formato de arquivo não suportado ou validação falhou |
| SERVICE_BUSY | 503 | Limite de bandwidth excedido (10MB/hora) |
Boas práticas
- Sempre inclua o token OAuth2: O endpoint requer autenticação
- Valide no lado do cliente: Verifique os campos obrigatórios antes de enviar
- Comprima as imagens: Otimize as imagens antes de codificá-las em Base64 para ficar abaixo do limite de 2MB
- Trate os limites de taxa: Implemente backoff exponencial se receber rate limit
- Registre a versão do app: Sempre envie
platformeappVersionpara análises - Forneça o IP real: Envie o IP real do usuário para maior precisão na detecção de spam
- Use HTTPS: Sempre use conexão segura em produção
Notas de integração
- customerId é automático: Não inclua
customerIdno corpo da requisição; ele é extraído do token OAuth2 - Propriedade do websiteId: O endpoint valida que o websiteId pertence ao cliente autenticado
- DEV vs PROD: A detecção de spam é ignorada no ambiente de desenvolvimento, mas está ativa em produção
- Redirecionamento de e-mail em DEV: Em desenvolvimento, os e-mails são redirecionados para
info@mapaprop.comem vez do e-mail do cliente
Documentação relacionada
Para ver o fluxo completo de como funciona a captação de imóveis no sistema, consulte:
Captação de Imóveis - Vender (Fluxo Prático)
Histórico de versões
| Versão | Data | Alterações |
|---|---|---|
| 1.0 | 2025-10-22 | Lançamento inicial - endpoint de seller submissions da Express API |
Versão da API: 1.0 Última atualização: 2025-10-22 Status: Pronto para produção