tag: BETA
Este webservice se utiliza para enviar una solicitud de comercialización de propiedad de vendedor desde aplicaciones móviles. Permite a los propietarios enviar sus propiedades para venta o alquiler con información detallada y adjuntos opcionales (imágenes y PDFs).
| Información del recurso | |
|---|---|
| Autenticación | Requerida (OAuth2 Bearer Token) |
| HTTP Method | POST |
| Request Format | JSON |
| Response | JSON |
| Version | 1 |
| Rate Limiting | 10 requests/hora, 10MB bandwidth/hora |
URL del recurso
https://mapaprop.app/api/action/express-v1/seller-submissions
Autenticación
Este endpoint requiere autenticación OAuth2. Debés incluir un Bearer token válido en el encabezado Authorization.
Authorization: Bearer {your-oauth2-token}
El customerId se extrae automáticamente del token autenticado. No lo incluyas en el cuerpo de la solicitud.
Parámetros
Parámetros requeridos
| Key | Type | Required | Descripción |
|---|---|---|---|
| websiteId | integer | yes | El ID del sitio web al que se asociará el envío. Debe pertenecer al cliente autenticado. |
| name | string | yes | Nombre del propietario (mín: 3, máx: 100 caracteres) |
| string | yes | Email del propietario (formato de email válido, máx: 100 caracteres) | |
| phone | string | yes | Teléfono del propietario (máx: 20 caracteres) |
| propertyType | string | yes | Tipo de propiedad (por ejemplo, "Casa", "Departamento", "Local", "Terreno") |
| propertyOperation | string | yes | Tipo de operación (por ejemplo, "Venta", "Alquiler", "Alquiler Temporal") |
| propertyAddress | string | yes | Dirección completa de la propiedad (máx: 200 caracteres) |
| domain | string | yes | Dominio de la aplicación solicitante |
| url | string | yes | URL de referencia del envío |
| ip | string | yes | Dirección IP del usuario que realiza el envío (para detección de spam) |
Parámetros opcionales - Información de contacto
| Key | Type | Required | Descripción |
|---|---|---|---|
| contactHours | string | no | Horario de contacto preferido (por ejemplo, "Lunes a Viernes de 9 a 18hs") |
Parámetros opcionales - Detalles de la propiedad
| Key | Type | Required | Descripción |
|---|---|---|---|
| propertyListed | string | no | Si la propiedad está actualmente publicada ("true" o "false") |
| propertyValuation | string | no | Si el propietario desea una tasación de la propiedad ("true" o "false") |
| availabilityDate | string | no | Fecha en que la propiedad estará disponible (formato: YYYY-MM-DD) |
| propertyCurrency | string | no | Moneda del precio (por ejemplo, "USD", "ARS", "EUR") |
| propertyPrice | string | no | Precio de venta/alquiler de la propiedad |
| propertyLegalId | string | no | Número de identificación legal (por ejemplo, "12-34-567890-1") |
| propertyBetweenStreets | string | no | Referencia de calles transversales (máx: 200 caracteres) |
| propertyZipcode | string | no | Código postal (máx: 10 caracteres) |
| propertyZone | string | no | Zona o nombre del barrio (máx: 200 caracteres) |
| propertyDescription | string | no | Descripción detallada de la propiedad (máx: 4000 caracteres) |
| propertyStatus | string | no | Estado actual de la propiedad (por ejemplo, "Excelente", "Bueno", "A Refaccionar") |
| propertyBuildingArea | string | no | Superficie cubierta en metros cuadrados |
| propertyLandArea | string | no | Superficie del terreno en metros cuadrados |
| propertyYearsOld | string | no | Antigüedad de la propiedad en años |
| propertyRooms | string | no | Número de ambientes/dormitorios |
| propertyBathrooms | string | no | Número de baños |
| propertyAmbiences | string | no | Número de ambientes/espacios |
| propertyAttributes | string | no | Características especiales (por ejemplo, "Garage, Jardín, Parrilla, Piscina") |
Parámetros opcionales - Adjuntos de archivos
| Key | Type | Required | Descripción |
|---|---|---|---|
| image | string | no | Imagen de la propiedad como Data URL en Base64 (formato: data:image/{type};base64,{data}). Formatos admitidos: JPEG, PNG, GIF, WebP. Tamaño máximo: 2MB |
| string | no | Documentación de la propiedad como Data URL en Base64 (formato: data:application/pdf;base64,{data}). Tamaño máximo: 2MB |
Parámetros opcionales - Metadatos de la app móvil
| Key | Type | Required | Descripción |
|---|---|---|---|
| platform | string | no | Plataforma móvil ("iOS" o "Android") - usado para analítica |
| appVersion | string | no | Versión de la aplicación (por ejemplo, "2.5.1") - usado para analítica |
| userAgent | string | no | String de user agent del browser/app - usado para detección de spam |
| referer | string | no | URL referrer - usado para detección de spam |
Formato de subida de archivos
Las imágenes y PDFs deben subirse como Data URLs codificadas en Base64:
Formato de imagen:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJ...
Formato PDF:
data:application/pdf;base64,JVBERi0xLjQKJcOkw7zDtsKBw4XDqsOPDQoxIDAgb2Jq...
Tipos de imagen admitidos:
- image/jpeg
- image/png
- image/gif
- image/webp
Límites de tamaño de archivo:
- Máximo por archivo: 2MB
- Máximo de bandwidth total: 10MB por hora
Seguridad:
- Los archivos se validan usando validación por número mágico (no solo el MIME type)
- Todos los archivos se escanean para detectar amenazas de seguridad
- Los archivos se suben a almacenamiento seguro en S3
Ejemplo de solicitud
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"
}
Respuesta
La respuesta JSON indica si el envío del vendedor fue exitoso y provee detalles del contacto creado.
Respuesta exitosa
| Campo | Tipo | Descripción |
|---|---|---|
| error | boolean | Siempre false en caso de éxito |
| message | string | Mensaje de éxito |
| contactId | integer | (Opcional) ID del contacto creado |
| websiteId | integer | (Opcional) ID del sitio web |
| processingTimeMs | integer | (Opcional) Tiempo de procesamiento en milisegundos |
Respuesta de error
| Campo | Tipo | Descripción |
|---|---|---|
| error | boolean | Siempre true en caso de error |
| message | string | Mensaje de error que describe qué salió mal |
| code | string | (Opcional) Código de error para manejo programático |
Ejemplo de respuesta - Éxito
{
"error": false,
"message": "Seller commercialization request submitted successfully",
"contactId": 1065875,
"websiteId": 869,
"processingTimeMs": 5215
}
Ejemplos de respuesta - Errores
Pertenencia inválida del sitio web:
{
"error": true,
"message": "Website not found or does not belong to customer",
"code": "NOT_FOUND"
}
Límite de tasa superado:
{
"error": true,
"message": "Too many seller submissions. Please try again later.",
"code": "RATE_LIMIT_EXCEEDED"
}
Formato de archivo inválido:
{
"error": true,
"message": "Invalid file format. Only JPEG, PNG, GIF, WebP images and PDF documents are allowed.",
"code": "INVALID_FILE"
}
Campo requerido faltante:
{
"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"
}
Límite de tasa
Este endpoint tiene límite de tasa para prevenir abusos:
- Límite de solicitudes: 10 solicitudes por hora por cliente
- Límite de bandwidth: 10MB por hora por cliente
Cuando se supera el límite de tasa, recibirás:
{
"error": true,
"message": "Too many seller submissions. Please try again later.",
"code": "RATE_LIMIT_EXCEEDED"
}
Funcionalidades de seguridad
Detección de spam
Todos los envíos se verifican contra spam usando la integración con Akismet en el entorno de producción. Los envíos marcados como spam se registran pero no se bloquean automáticamente.
Seguridad de archivos
- Validación por número mágico: Los archivos se validan por su contenido real, no solo por el MIME type
- Límites de tamaño de archivo: 2MB por archivo, 10MB de bandwidth total por hora
- Formatos admitidos: Solo se aceptan formatos de imagen y PDF incluidos en la lista de permitidos
- Almacenamiento seguro: Los archivos se suben a buckets S3 cifrados
Validación de entrada
- Todos los campos de texto se sanitizan y validan
- Las direcciones de email deben tener formato RFC válido
- Los números de teléfono se validan por formato
- Prevención de inyección SQL mediante sentencias preparadas
- Prevención de XSS mediante escape de plantillas
Qué ocurre después del envío
- Creación de contacto: Se crea un nuevo contacto en el CRM con tipo "SELLER"
- Almacenamiento de archivos: Las imágenes y PDFs se suben a almacenamiento seguro en S3
- Notificación por email: Se encola un email (via SQS) y se envía al cliente con:
- Todos los detalles de la propiedad
- Archivos adjuntos (imagen y PDF)
- Información de contacto
- Metadatos del envío (plataforma, versión de app, timestamp)
- Estadísticas: El evento se registra con metadatos detallados para analítica
- Registro de auditoría: Se crea un registro de auditoría completo para cumplimiento normativo
Códigos de error
| Código | HTTP Status | Descripción |
|---|---|---|
| INVALID_INPUT | 400 | Campo requerido faltante o validación fallida |
| NOT_FOUND | 404 | Sitio web no encontrado o no pertenece al cliente |
| UNAUTHORIZED | 401 | Token OAuth2 inválido o faltante |
| RATE_LIMIT_EXCEEDED | 429 | Demasiadas solicitudes (límite de 10/hora) |
| SPAM_DETECTED | 400 | Envío marcado como spam por Akismet |
| INVALID_FILE | 400 | Formato de archivo no admitido o validación fallida |
| SERVICE_BUSY | 503 | Límite de bandwidth superado (10MB/hora) |
Buenas prácticas
- Siempre incluí el token OAuth2: El endpoint requiere autenticación
- Validá del lado del cliente: Verificá los campos requeridos antes de enviar
- Comprimí las imágenes: Optimizá las imágenes antes de codificarlas en Base64 para mantenerte bajo el límite de 2MB
- Manejá los límites de tasa: Implementá backoff exponencial si recibís rate limit
- Registrá la versión de la app: Siempre enviá
platformyappVersionpara analítica - Proporcioná la IP real: Enviá la IP real del usuario para mayor precisión en la detección de spam
- Usá HTTPS: Siempre usá conexión segura en producción
Notas de integración
- customerId es automático: No incluyas
customerIden el cuerpo de la solicitud; se extrae del token OAuth2 - Pertenencia del websiteId: El endpoint valida que el websiteId pertenece al cliente autenticado
- DEV vs PROD: La detección de spam se omite en el entorno de desarrollo pero está activa en producción
- Redirección de email en DEV: En desarrollo, los emails se redirigen a
info@mapaprop.comen vez del email del cliente
Documentación relacionada
Para ver el flujo completo de cómo funciona la captación de propiedades en el sistema, consultá:
Captación de Propiedades - Vender (Flujo Práctico)
Historial de versiones
| Versión | Fecha | Cambios |
|---|---|---|
| 1.0 | 2025-10-22 | Lanzamiento inicial - endpoint de seller submissions de Express API |
Versión de API: 1.0 Última actualización: 2025-10-22 Estado: Listo para producción