Use case · Real estate

A card for every listing, in every agent's name.

Price, address, beds, baths and the lead photo go into a template once. Each listing then gets a card for its listing page, Just listed, Open house and Sold posts at every size, and a short video, with the listing agent's face and number on every one.

150 images a month free, no card. A brokerage with 60 new listings a month, each with its posts and a video, fits in the $9 plan.

live · POST /v1/images1200 × 630
Property listing, rendered with the sample variables
rendering…
rendered with the sample variables · change them and render again
Open in the editorThe template
the same render with your saved copy
curl -X POST https://api.imageapis.com/v1/images \
  -H 'X-API-Key: YOUR_KEY' -H 'Content-Type: application/json' \
  -d '{"template": "tpl_…", "variables": {"status": "Just listed", "price": "$849,000", "address": "14 Orchard Lane, Maplewood", "beds": "4 beds", "baths": "3 baths", "area": "2,450 sq ft", "agent": "Maya Chen", "phone": "(555) 014-2290", "office": "Example Realty", "agent_photo": "https://i.pravatar.cc/160?img=47", "photo": "https://images.unsplash.com/photo-1570129477492-45c003edd2be?w=1600"}}'
How it works

Three ways in, from one template.

Listing pages make their own cards when a link is shared. The week's new listings, open houses and sales come from a CSV. A brokerage puts each agent's face on their own listings.

GET img.imageapis.com/s/…

On the listing page: a signed URL

The page that shows a listing builds its image URL from the listing, whether that page is an IDX site, a WordPress theme or a Next.js app. The status and price are in the URL, so when a listing goes to Open house or Sold, its next share shows the new card.

POST /v1/collections · text/csv

From the listings: a CSV a week

Export the new listings, open houses and sales, one row each, and post the file. A status.background column turns the chip blue for an open house or red for a sale. From a CRM or Airtable, the Zapier app does the same a listing at a time.

/v1/brands · brand

For a brokerage: each agent's brand

Keep each agent's name, photo and phone, and their office's colour, as a brand kit. Render a listing with its agent's brand and the card, the posts and the video all carry the right face and number.

# 1. Copy the property listing starter into your account; its id is your template
curl -s https://api.imageapis.com/v1/starters/property-listing -H 'X-API-Key: YOUR_KEY' | jq .template > card.json
curl -X POST https://api.imageapis.com/v1/templates -H 'X-API-Key: YOUR_KEY' \
  -H 'Content-Type: application/json' -d @card.json
# → { "id": "tpl_…", "object": "template", … }

# 2. For listing pages: a signed base that can render that template and nothing else
curl -X POST https://api.imageapis.com/v1/signed-bases -H 'X-API-Key: YOUR_KEY' \
  -H 'Content-Type: application/json' -d '{"name":"listing cards","template":"tpl_…"}'
# → { "id": "sb_…", "secret": "sbs_…", … }   keep them as OG_TEMPLATE, OG_BASE and OG_SECRET

Sign the query string exactly as you send it: URLSearchParams writes spaces as +, and the example signs the string it then puts in the URL. The signed URLs guide has PHP and Python for a WordPress or Django listing site, and the sizes and brands guide covers both features in full.

Every status

Just listed, Open house, Sold.

The same template, three rows of the CSV above. The status is a variable and its colour a status.background column; prices, addresses and areas come in written the way your market writes them, and each line shrinks to fit.

The listing card for a white house with a porch, Just listed at $849,000
row 1 · Just listed
The same card for a cabin at dusk, Open house Saturday 1 to 3 pm, in blue
row 2 · Open house · status.background #1d4ed8
The same card for a villa, Sold over asking, in red
row 3 · Sold · status.background #b91c1c
Every size

Square, portrait and story, as laid out.

POST /v1/images/sizes lays the card out again at each size you name. This one needs no modifications: the photo covers each canvas, and the band of details stretches across the foot with the agent held to its corner. On a story the details stay the size they were on the card; give that size its own modifications if you want them larger.

The listing card as a 1080 square, laid out by the API with no changes
instagram-post · as laid out
The listing card at 1080 by 1350, laid out by the API with no changes
instagram-portrait · as laid out
The listing card as a 1080 by 1920 story, laid out by the API with no changes
instagram-story · as laid out
POST /v1/videos · 9 s · 720×720 · 9 images
Listing video

Three photos and the price, as a video.

A video template is a card whose layers move. Here the photos stack, each fading in over the last, while the band slides up and the status pops in.

1

Give the layers an entrance

animate on a layer sets how it arrives and when: a fade at 3 s for the second photo, at 6 s for the third. The editor plays it back before you render.

2

Render an MP4, WebM or GIF

Up to 30 seconds and 1080p, with a soundtrack under the MP4 or WebM if you give it a track. The answer comes at once with the file's URL; a webhook says when it is ready.

3

Post it where reels and stories go

One image per second of video, so this one is nine. The videos guide has every animation option.

Beyond the card

The rest of what a brokerage asks for.

POST /v1/pdfs · bleed

Flyers that go to print

A Letter or A4 flyer from a template, as a print-ready PDF with bleed and crop marks, one image per page. Print-ready PDFs.

POST /v1/qr-codes

QR codes for yard signs

A code that opens the listing, as SVG for the sign maker, or a QR layer on the flyer itself. Make a QR code.

POST /v1/charts

Market reports

A chart of the month's median prices or days on market, as SVG for the newsletter or PNG for social; the weekly report starter makes a whole card of them. Make a chart.

POST /v1/uploads

Photos from a shared drive

Image layers need a public URL. Upload a listing photo once and it is served from img.imageapis.com until you delete it. Uploads are free. Upload images.

Zapier · webhooks

From the CRM

The ImageAPIs app for Zapier makes a card when a row lands in Airtable or a deal moves in a CRM that Zapier connects to. Make and n8n use the API and webhooks. The Zapier guide.

mcp.imageapis.com

From your assistant

Connect the MCP server to Claude, Cursor or your own agent with the same key, and it can write the open house post and make its card from the listing. Set it up.

What it costs

About twenty images a listing.

A listing's card for its page, Just listed, Open house and Sold at three sizes each, and a nine-second video come to about twenty images. A flyer is one more per page.

New listings a monthImages a month, roughlyPlan
5100Free, $0 (150 included)
601,200Starter, $9 (2,000 included)
4008,000Growth, $29 (10,000 included)
1,80036,000Scale, $79 (40,000 included)

Counted as one card, nine status posts and a nine-second video a listing; a video costs one image per second. A listing page's card shared again after its week in the cache is one more. Past a paid plan's images, renders cost $2 to $4 per 1,000; the free plan stops at 150. All plans.

Guides

Read further.

What this guide builds: One template, every size and every brand

One template, every size and every brand

Render one design as an Open Graph card, a square post, a story and a banner in one call with POST /v1/images/sizes, and fill each customer's colours, fonts and logo from a brand kit with {{brand.…}} placeholders.

curl · Node · 4 min read
What this guide builds: Videos from templates

Videos from templates

Give template layers an entrance, a loop or an exit and render the template as an MP4, WebM or GIF. Every animation option, timing, formats, waiting or webhooks, HTML with CSS animations, cost and limits.

curl · Python · CSS · 5 min read
What this guide builds: Images from a CSV

Images from a CSV

Turn a CSV or a Google Sheet into one image per row with one API call. Columns fill placeholders or change layers by name, up to 1,000 rows, a webhook when they are done, and how to retry the rows that failed.

curl · Python · Google Sheets · 4 min read
What this guide builds: Signed URLs

Signed URLs

How imageapis.com signed URLs work: HMAC-SHA256 over the path and query, expiry, template locking, edge caching, revocation, charts and QR codes as SVG, and the four lines of code in Python, Node and PHP.

Python · Node · PHP · 4 min read
What this guide builds: Print-ready PDFs with bleed and crop marks

Print-ready PDFs with bleed and crop marks

Make certificates, cards, posters and invitations a print shop will take: POST /v1/pdfs with bleed and crop_marks turns a template into a PDF whose artwork runs past the trim, with hairline cut marks and the trim and bleed boxes set.

curl · Python · 2 min read
What this guide builds: ImageAPIs on Zapier

ImageAPIs on Zapier

Make an image, video, screenshot or PDF in a Zap from a spreadsheet row, a form, a new post or a product. Your template's placeholders become form fields; finished renders trigger Zaps. Every step, what it costs, and how to do the same with Webhooks by Zapier, Make or n8n.

Zapier · no code · 6 min read
FAQ

Questions brokerages ask.

Can every card carry the brokerage's name?

Yes: put the brokerage's name, and a licence number where you need one, in the template or in the office's brand kit, so every card, post and video carries it. Many states and MLSs require it on advertising; check the rules that apply to you.

Do you enhance or straighten photos?

No. The API places the photos you give it and does not edit them; fit: "cover" fills the frame and crops from the centre. Send the photos your photographer delivered.

What happens when a listing sells?

On the listing page, the status and price are part of the signed URL, so Sold makes a new URL and a new card on its first fetch; social networks keep the image they scraped until they look again. For posts, run the listing's row again with the new status.

What music can go under a video?

A track you have the rights to. Give its URL as audio.url (MP3, M4A, WAV, OGG or FLAC, up to 10 MB) and it plays under the MP4 or WebM, cut to the video's length, with a start point, volume and fades. Sound costs nothing extra.

Do you integrate with my CRM?

Not directly. The ImageAPIs app for Zapier reaches Airtable, HubSpot and the other apps Zapier connects to; it is waiting on Zapier's review, so ask for an invite. Anything else can call the API, and webhooks tell it when renders finish.

Start from the listing card above.

Copy the property listing starter into your account, then sign its URL on your listing pages or post a CSV of the week's listings. The first 150 images each month are free.

Get a free keyOpen it in the editorSee the template