Real Estate Listing Images: Automate Property Marketing

Real Estate Listing Images: Automate Property Marketing

Sarah manages marketing for a real estate brokerage with 45 agents. Every new listing needs at least six image types: MLS photos with price overlays, social media posts, open house flyers, email headers, and agent-branded cards.

She used to spend 30+ hours a week in Canva. Now she spends zero.

Her secret? A single API call generates every listing image the moment a property hits their MLS system. Price, bedrooms, square footage, agent photo—all pulled automatically.

Here's how to build the same system for your brokerage or real estate business.

Why real estate needs automated listing imagesWhy Real Estate Needs Automated Listing Images

Every property listing triggers a cascade of marketing materials:

  • MLS listing photos with price and details
  • Facebook and Instagram property posts
  • Open house announcement graphics
  • Email campaign headers
  • Agent branding cards
  • Print-ready flyers

Multiply this by listings per month. A mid-size brokerage with 50 new listings monthly needs 300+ unique images. That's a full-time design job—or a simple automation.

What agents automate today:

  • Price and feature overlays on property photos
  • "Just Listed" and "Sold" badges
  • Agent contact info and branding
  • Virtual tour QR codes
  • Open house date announcements

The basic setupThe Basic Setup

Real estate listing image automation follows a predictable pattern:

MLS Data → Template → Image API → Marketing Materials

Your listing data already exists in your MLS or CRM. The API pulls that data and generates every image variant you need.

Data sources for listingsData Sources for Listings

Most real estate systems expose listing data through APIs or exports:

SystemData AccessIntegration Method
MLS (RESO)Web APIDirect integration
ZillowPartner APIVerified partners
Realtor.comData feedsMLS syndication
BoomTownREST APICRM integration
Follow Up BossWebhooksAutomation trigger
Custom CRMDatabaseDirect API calls

If you can export or query your listings, you can automate images.

Building your first listing templateBuilding Your First Listing Template

Let's create a property listing image that works for any MLS entry.

Step 1 design the templateStep 1: Design the Template

Your listing template needs editable fields for:

  • Property photo (image URL from MLS)
  • Price (formatted with commas: $425,000)
  • Address (street address)
  • City/State (location line)
  • Bedrooms (number)
  • Bathrooms (number)
  • Square footage (formatted)
  • Agent name (text)
  • Agent photo (image URL)
  • Brokerage logo (image)

In Imejis.io, design this layout and mark each element as editable. You'll get a template ID for API calls.

Step 2 map your mls fieldsStep 2: Map Your MLS Fields

MLS data comes in specific formats. Map fields to your template:

function mapMLSToTemplate(listing) {
  return {
    property_photo: listing.photos[0]?.url || '/placeholder-home.jpg',
    price: formatPrice(listing.listPrice),
    address: listing.streetAddress,
    city_state: `${listing.city}, ${listing.stateOrProvince}`,
    bedrooms: listing.bedroomsTotal,
    bathrooms: listing.bathroomsTotalInteger,
    sqft: formatNumber(listing.livingArea),
    agent_name: listing.listAgentFullName,
    agent_photo: listing.listAgentPhotoUrl,
    brokerage_logo: listing.listOfficeLogo,
  };
}
 
function formatPrice(cents) {
  return new Intl.NumberFormat('en-US', {
    style: 'currency',
    currency: 'USD',
    maximumFractionDigits: 0,
  }).format(cents);
}

Step 3 call the apiStep 3: Call the API

Generate listing images with a single POST request:

async function generateListingImage(listing) {
  const templateData = mapMLSToTemplate(listing);
 
  const response = await fetch(
    'https://render.imejis.io/v1/your-listing-template-id',
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.IMEJIS_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(templateData),
    }
  );
 
  const result = await response.json();
  return result.url;
}

That's it. One API call, one listing image.

Step 4 trigger on new listingsStep 4: Trigger on New Listings

Set up webhooks to generate images when listings appear:

// Webhook handler for new MLS listings
app.post('/webhooks/new-listing', async (req, res) => {
  const listing = req.body;
 
  // Generate all image types
  const images = await Promise.all([
    generateListingImage(listing, 'mls-overlay'),
    generateListingImage(listing, 'social-square'),
    generateListingImage(listing, 'email-header'),
    generateListingImage(listing, 'agent-card'),
  ]);
 
  // Store URLs for agent access
  await saveListingImages(listing.mlsId, images);
 
  res.sendStatus(200);
});

Template types for real estateTemplate Types for Real Estate

One template won't cover every use case. Build a library:

Mls listing overlayMLS Listing Overlay

Standard property photo with:

  • Price in corner
  • Bed/bath/sqft bar
  • Status badge (Active, Pending, Sold)

Social media property postSocial Media Property Post

Square format (1080x1080) with:

  • Property photo
  • Large price
  • Key features
  • Agent contact
  • Brokerage branding

Open house graphicOpen House Graphic

Event-focused design with:

  • Property photo
  • Open house date and time
  • Address
  • Agent info
  • QR code for directions

Just listed just sold cardsJust Listed / Just Sold Cards

Announcement-style with:

  • Bold status text
  • Property photo
  • Price (and sold price if applicable)
  • Agent branding

Agent introduction cardAgent Introduction Card

Personal branding with:

  • Agent headshot
  • Contact info
  • Recent listings
  • Testimonial quote

Check our template library for real estate designs you can customize.

Connecting mls dataConnecting MLS Data

Most MLS systems follow the RESO (Real Estate Standards Organization) data dictionary. This standardizes field names across systems.

Common reso fields for imagesCommon RESO Fields for Images

// Property details
listing.listPrice           // 425000
listing.streetAddress       // "123 Main Street"
listing.city                // "Austin"
listing.stateOrProvince     // "TX"
listing.postalCode          // "78701"
listing.bedroomsTotal       // 3
listing.bathroomsTotalInteger // 2
listing.livingArea          // 1850
listing.propertyType        // "Residential"
listing.standardStatus      // "Active"
 
// Agent info
listing.listAgentFullName   // "Jane Smith"
listing.listAgentEmail      // "jane@brokerage.com"
listing.listAgentPhone      // "(512) 555-0100"
listing.listOfficeName      // "Austin Realty Group"
 
// Photos
listing.media               // Array of photo URLs

Your template fields map directly to these values.

Handling status changesHandling Status Changes

Listings change status: Active to Pending to Sold. Update images automatically:

app.post('/webhooks/status-change', async (req, res) => {
  const { mlsId, newStatus, soldPrice } = req.body;
 
  // Get current listing data
  const listing = await getListing(mlsId);
 
  // Generate new images with updated status
  if (newStatus === 'Sold') {
    await generateListingImage(listing, 'just-sold', {
      status: 'SOLD',
      sold_price: formatPrice(soldPrice),
    });
  } else if (newStatus === 'Pending') {
    await generateListingImage(listing, 'pending-overlay', {
      status: 'PENDING',
    });
  }
 
  res.sendStatus(200);
});

Multi agent scenariosMulti-Agent Scenarios

Brokerages need images branded for different agents. Handle this with agent-specific data:

async function generateAgentListingImage(listing, agentId) {
  const agent = await getAgentDetails(agentId);
 
  return await fetch('https://render.imejis.io/v1/agent-listing-template', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.IMEJIS_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      // Property data
      property_photo: listing.photos[0]?.url,
      price: formatPrice(listing.listPrice),
      address: listing.streetAddress,
      // Agent-specific branding
      agent_name: agent.name,
      agent_photo: agent.headshotUrl,
      agent_phone: agent.phone,
      agent_email: agent.email,
      brokerage_logo: agent.brokerageLogo,
    }),
  });
}

Each agent gets properly branded materials without manual work.

No code optionsNo-Code Options

Not every real estate team has developers. Imejis.io offers options that don't require code.

Share templates as simple web forms. Agents fill in:

  • Property address
  • Price
  • Upload photo
  • Select status

Click generate, download image. No design skills needed.

Learn more about sharing designs with public links.

Zapier integrationZapier Integration

Connect your CRM to image generation:

  1. Trigger: New listing in Follow Up Boss / BoomTown / etc.
  2. Action: Generate image via Imejis.io
  3. Action: Save to Google Drive or send via email

Our Zapier integration guide walks through the setup.

Scaling for high volumeScaling for High Volume

Large brokerages process hundreds of listings. Plan for scale:

Batch processingBatch Processing

Generate images in parallel:

async function processListingBatch(listings) {
  const batchSize = 10;
 
  for (let i = 0; i < listings.length; i += batchSize) {
    const batch = listings.slice(i, i + batchSize);
 
    await Promise.all(
      batch.map(listing =>
        generateAllListingImages(listing)
      )
    );
 
    // Brief pause between batches
    await sleep(1000);
  }
}

Image storageImage Storage

Store generated images on your CDN rather than hotlinking:

async function storeListingImage(listing, imageUrl) {
  // Download from API
  const imageBuffer = await fetch(imageUrl).then(r => r.buffer());
 
  // Upload to your storage
  const storedUrl = await uploadToS3(
    `listings/${listing.mlsId}/social.jpg`,
    imageBuffer
  );
 
  return storedUrl;
}

This ensures images stay available regardless of API changes.

Measuring impactMeasuring Impact

Track these metrics to prove ROI:

Time savings:

  • Hours per listing on image creation
  • Time from listing to social post

Consistency:

  • Brand compliance across agents
  • Error rate (wrong prices, missing info)

Speed:

  • Minutes from MLS entry to marketing launch
  • Agent response time for new materials

One brokerage we work with reduced their "listing to social" time from 4 hours to 15 minutes. That's 3.75 hours saved per listing.

FaqFAQ

Can i automate images from zillow or realtorcom dataCan I automate images from Zillow or Realtor.com data?

You can if you have API access to that data. Most agents get listing data from their MLS, which syndicates to consumer sites. Automate from the MLS source, and your images stay current across all platforms.

How do i handle different property typesHow do I handle different property types?

Create templates for each property type: residential, commercial, land, multi-family. Use conditional logic to select the right template based on listing data.

What about compliance and fair housingWhat about compliance and fair housing?

Automated images use the same data from your MLS. They don't add or remove information. Always review generated images before posting, especially for fair housing compliance. The National Association of Realtors provides guidelines on advertising.

Can agents customize their brandingCan agents customize their branding?

Yes. Store agent-specific branding (headshots, colors, logos) in your system. Pass these values to the API alongside property data for personalized outputs.

How much does this cost for a mid size brokerageHow much does this cost for a mid-size brokerage?

With Imejis.io pricing, a brokerage generating 2,000 listing images per month pays about $25 on the Pro plan. Compare that to designer hours or per-listing fees from other services.

Start generating listing imagesStart Generating Listing Images

You don't need to automate everything on day one. Start with one template:

  1. Design a "Just Listed" social media graphic
  2. Connect your top-producing agent's listings
  3. Generate images for a week
  4. Measure time saved

Once that works, add templates. Connect more agents. Automate status changes.

The brokerages winning today aren't the ones with the biggest design teams. They're the ones that stopped doing repetitive image work manually.

Get started with Imejis.io →