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:
| System | Data Access | Integration Method |
|---|---|---|
| MLS (RESO) | Web API | Direct integration |
| Zillow | Partner API | Verified partners |
| Realtor.com | Data feeds | MLS syndication |
| BoomTown | REST API | CRM integration |
| Follow Up Boss | Webhooks | Automation trigger |
| Custom CRM | Database | Direct 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 URLsYour 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.
Public links for agentsPublic Links for Agents
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:
- Trigger: New listing in Follow Up Boss / BoomTown / etc.
- Action: Generate image via Imejis.io
- 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:
- Design a "Just Listed" social media graphic
- Connect your top-producing agent's listings
- Generate images for a week
- 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.