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ónRequerida (OAuth2 Bearer Token)
HTTP MethodPOST
Request FormatJSON
ResponseJSON
Version1
Rate Limiting10 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

KeyTypeRequiredDescripción
websiteIdintegeryesEl ID del sitio web al que se asociará el envío. Debe pertenecer al cliente autenticado.
namestringyesNombre del propietario (mín: 3, máx: 100 caracteres)
emailstringyesEmail del propietario (formato de email válido, máx: 100 caracteres)
phonestringyesTeléfono del propietario (máx: 20 caracteres)
propertyTypestringyesTipo de propiedad (por ejemplo, "Casa", "Departamento", "Local", "Terreno")
propertyOperationstringyesTipo de operación (por ejemplo, "Venta", "Alquiler", "Alquiler Temporal")
propertyAddressstringyesDirección completa de la propiedad (máx: 200 caracteres)
domainstringyesDominio de la aplicación solicitante
urlstringyesURL de referencia del envío
ipstringyesDirección IP del usuario que realiza el envío (para detección de spam)

Parámetros opcionales - Información de contacto

KeyTypeRequiredDescripción
contactHoursstringnoHorario de contacto preferido (por ejemplo, "Lunes a Viernes de 9 a 18hs")

Parámetros opcionales - Detalles de la propiedad

KeyTypeRequiredDescripción
propertyListedstringnoSi la propiedad está actualmente publicada ("true" o "false")
propertyValuationstringnoSi el propietario desea una tasación de la propiedad ("true" o "false")
availabilityDatestringnoFecha en que la propiedad estará disponible (formato: YYYY-MM-DD)
propertyCurrencystringnoMoneda del precio (por ejemplo, "USD", "ARS", "EUR")
propertyPricestringnoPrecio de venta/alquiler de la propiedad
propertyLegalIdstringnoNúmero de identificación legal (por ejemplo, "12-34-567890-1")
propertyBetweenStreetsstringnoReferencia de calles transversales (máx: 200 caracteres)
propertyZipcodestringnoCódigo postal (máx: 10 caracteres)
propertyZonestringnoZona o nombre del barrio (máx: 200 caracteres)
propertyDescriptionstringnoDescripción detallada de la propiedad (máx: 4000 caracteres)
propertyStatusstringnoEstado actual de la propiedad (por ejemplo, "Excelente", "Bueno", "A Refaccionar")
propertyBuildingAreastringnoSuperficie cubierta en metros cuadrados
propertyLandAreastringnoSuperficie del terreno en metros cuadrados
propertyYearsOldstringnoAntigüedad de la propiedad en años
propertyRoomsstringnoNúmero de ambientes/dormitorios
propertyBathroomsstringnoNúmero de baños
propertyAmbiencesstringnoNúmero de ambientes/espacios
propertyAttributesstringnoCaracterísticas especiales (por ejemplo, "Garage, Jardín, Parrilla, Piscina")

Parámetros opcionales - Adjuntos de archivos

KeyTypeRequiredDescripción
imagestringnoImagen 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
pdfstringnoDocumentació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

KeyTypeRequiredDescripción
platformstringnoPlataforma móvil ("iOS" o "Android") - usado para analítica
appVersionstringnoVersión de la aplicación (por ejemplo, "2.5.1") - usado para analítica
userAgentstringnoString de user agent del browser/app - usado para detección de spam
refererstringnoURL 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

CampoTipoDescripción
errorbooleanSiempre false en caso de éxito
messagestringMensaje de éxito
contactIdinteger(Opcional) ID del contacto creado
websiteIdinteger(Opcional) ID del sitio web
processingTimeMsinteger(Opcional) Tiempo de procesamiento en milisegundos

Respuesta de error

CampoTipoDescripción
errorbooleanSiempre true en caso de error
messagestringMensaje de error que describe qué salió mal
codestring(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

  1. Creación de contacto: Se crea un nuevo contacto en el CRM con tipo "SELLER"
  2. Almacenamiento de archivos: Las imágenes y PDFs se suben a almacenamiento seguro en S3
  3. 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)
  4. Estadísticas: El evento se registra con metadatos detallados para analítica
  5. Registro de auditoría: Se crea un registro de auditoría completo para cumplimiento normativo

Códigos de error

CódigoHTTP StatusDescripción
INVALID_INPUT400Campo requerido faltante o validación fallida
NOT_FOUND404Sitio web no encontrado o no pertenece al cliente
UNAUTHORIZED401Token OAuth2 inválido o faltante
RATE_LIMIT_EXCEEDED429Demasiadas solicitudes (límite de 10/hora)
SPAM_DETECTED400Envío marcado como spam por Akismet
INVALID_FILE400Formato de archivo no admitido o validación fallida
SERVICE_BUSY503Límite de bandwidth superado (10MB/hora)

Buenas prácticas

  1. Siempre incluí el token OAuth2: El endpoint requiere autenticación
  2. Validá del lado del cliente: Verificá los campos requeridos antes de enviar
  3. Comprimí las imágenes: Optimizá las imágenes antes de codificarlas en Base64 para mantenerte bajo el límite de 2MB
  4. Manejá los límites de tasa: Implementá backoff exponencial si recibís rate limit
  5. Registrá la versión de la app: Siempre enviá platform y appVersion para analítica
  6. Proporcioná la IP real: Enviá la IP real del usuario para mayor precisión en la detección de spam
  7. Usá HTTPS: Siempre usá conexión segura en producción

Notas de integración

  • customerId es automático: No incluyas customerId en 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.com en 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ónFechaCambios
1.02025-10-22Lanzamiento 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