JSON-Structured Image Decomposition: Property Photo Documentation and Disclosure Assembly for Transaction Coordinators

Tools:Google Gemini
Time to build:1-2 hours
Difficulty:Advanced
Prerequisites:Comfortable using Gemini for document review and listing description drafts — see Level 3 guide: "Using Gemini for Transaction Document Review"
Gemini

What This Builds

Most listing TCs document property photos manually: glancing at each shot, writing a short caption, noting what room it shows, and hoping the agent's MLS upload matches what the disclosure package describes. That process takes 20-30 minutes per listing and produces inconsistent records. This technique gives you a repeatable system that extracts structured metadata from each property photo as a JSON object, then uses that structured data to auto-generate caption sets, disclosure photo indexes, and MLS-ready descriptions from the same source. One extraction pass feeds everything downstream.

Prerequisites

  • Advanced subscription ($20/month) — Sign up
  • Property listing photos in JPEG or PNG format (supplied by photographer or agent)
  • Familiarity with copy-pasting JSON between Gemini sessions
  • Basic understanding of your state's disclosure photo requirements (what must be documented, what must be labeled)

The Concept

When you upload a photo to Gemini and ask it to "describe this room," you get a paragraph of flowing prose. Useful for some things. For building a disclosure index or a structured photo log, it creates more work, not less. You have to read through the description and re-sort the information yourself.

The JSON approach flips this. Instead of asking for a description, you ask Gemini to analyze the photo and return a structured data object: what room, what features are visible, what condition flags appear, what appliances are present, what natural light direction, and so on. Every property in a named field. Because the output is structured, you can copy it directly into a template, sort by field, and produce standardized records without any reformatting.

Think of it like the difference between asking a colleague "what's in that room?" versus giving them a form to fill out. The form produces usable data. The conversation produces a narrative you still have to parse.

The second step is where the leverage compounds. Once you have the JSON for a photo, you can modify specific fields and re-submit to Gemini with the original image to produce an edited version or a flagged variant. Need a version of the photo annotated for the disclosure packet showing the water heater location? Change one field. Need the AI to describe the same room in MLS language versus disclosure language? Swap one field and regenerate. The photo doesn't change; the structured blueprint does.


Build It Step by Step

Part 1: Extract the JSON Blueprint from Each Photo

Open gemini.google.com and start a new chat. Upload your first property photo, then paste this extraction prompt:

Copy and paste this
Analyze this property photo and return a structured JSON object with these fields:

{
  "photo_id": "",
  "room_or_area": "",
  "photo_angle": "front-facing | corner | overhead | detail",
  "natural_light": "high | medium | low | none",
  "features_visible": [],
  "appliances_visible": [],
  "flooring_type": "",
  "wall_condition": "new | good | fair | needs_repair | unknown",
  "ceiling_condition": "new | good | fair | needs_repair | unknown",
  "visible_defects_or_flags": [],
  "disclosure_relevant": true | false,
  "mls_caption_draft": "",
  "disclosure_caption_draft": ""
}

For "features_visible", list every built-in feature visible in the frame (fireplace, built-in shelving, crown molding, window seat, etc.).
For "visible_defects_or_flags", list anything that may require disclosure: water stains, cracks, peeling paint, damaged fixtures, missing hardware.
For "disclosure_relevant", return true if any defect flags are present or if this photo shows a system component (water heater, electrical panel, HVAC unit, roof visible, foundation visible).
Write both captions in plain English — mls_caption_draft for marketing tone, disclosure_caption_draft for factual/neutral tone.

Gemini returns a completed JSON object for that photo. Copy it to a running document (Google Doc or plain text file) labeled with the property address.

Repeat for each photo in the set. A typical listing package of 25-35 photos takes 15-20 minutes to process this way.

Part 2: Build the Disclosure Photo Index

Once you have JSON objects for all photos, open a fresh Gemini chat and paste this prompt followed by all the JSON objects you collected:

Copy and paste this
I have a set of property photos documented as structured JSON objects below. Using this data:

1. Generate a disclosure photo index table with columns: Photo ID | Room/Area | Disclosure Relevant | Defects/Flags | Disclosure Caption
2. Flag any photos where "disclosure_relevant" is true with a [REVIEW] marker
3. List all unique defect flags found across the full set in a summary section at the end

Here are the JSON objects:
[paste all JSON objects here]

The output is a formatted disclosure index, ready to include in your transaction file, with defect flags surfaced for agent review. What used to take 20+ minutes of manual cross-referencing now takes the time it takes to paste and hit send.

Part 3: Generate MLS-Ready Captions and Listing Notes

In the same session or a new one, paste your JSON objects again with this prompt:

Copy and paste this
Using the mls_caption_draft fields from these property photo JSON objects, generate:

1. A numbered photo caption list (Photo 1, Photo 2...) formatted for MLS upload
2. A short listing description paragraph (4-5 sentences) highlighting the 3-4 strongest features visible across all photos
3. Any features or rooms that appear to be missing from standard listing photo coverage (e.g., if there's no exterior rear shot, no laundry room, no garage interior)

JSON objects:
[paste all JSON objects here]

This gives you the MLS caption set and a listing notes paragraph in one pass. Pass both to the agent for review rather than waiting for them to compose their own description.

Part 4: Edit the JSON for Flagged Photos (When Needed)

When a photo shows something that needs to be highlighted differently for disclosure purposes, you don't re-prompt from scratch. Pull up the original JSON for that photo, change the relevant field, and re-submit with the original image.

Example: A kitchen photo was extracted with "wall_condition": "good" but you notice peeling paint near the window that Gemini missed. Edit the field to "wall_condition": "needs_repair" and add "peeling paint near west window" to "visible_defects_or_flags". Then re-submit to Gemini:

Copy and paste this
I have a property photo and its JSON metadata below. Please update the disclosure_caption_draft field to reflect the defect flag I've added. Keep all other fields the same. Return the full updated JSON.

[paste original image]
[paste modified JSON]

Gemini returns the corrected JSON with an updated disclosure caption. The fix is surgical. Nothing else in the record changes.


Real Example: 847 Clearwater Drive Listing Package

Setup: 31-photo listing package delivered by the photographer as a Dropbox folder. Agent needs MLS captions and a disclosure photo index before the listing goes live in 48 hours.

Input: Upload each photo with the extraction prompt from Part 1. After 20 minutes of processing, you have 31 JSON objects saved to a Google Doc titled "847 Clearwater Drive — Photo JSON Log."

Output from Part 2 (Disclosure Index excerpt):

Photo IDRoom/AreaDisclosure RelevantDefects/FlagsDisclosure Caption
001Front ExteriorfalsenoneFront elevation view facing east; brick facade, attached two-car garage, covered entry
008Master BathfalsenoneMaster bath with double vanity, walk-in shower, soaking tub; tile flooring in good condition
014Basementtrue [REVIEW]hairline crack visible in north foundation wallBasement utility area; hairline crack visible in north foundation wall approximately 18 inches in length
022HVAC Closettrue [REVIEW]age of unit unclear, possible corrosion on supply plenumHVAC unit in hallway closet; supply plenum shows surface discoloration possibly indicating corrosion

Output from Part 3 (MLS captions, excerpt):

Copy and paste this
Photo 1: Brick front elevation with attached two-car garage and covered entry
Photo 8: Master bath with double vanity, walk-in shower, and soaking tub
Photo 14: Basement utility area
Photo 22: HVAC closet

Listing description paragraph (Gemini output): "847 Clearwater Drive features hardwood floors throughout the main level, an updated kitchen with quartz counters and stainless appliances, and a bright great room with gas fireplace. The master suite includes a spa-style bath with soaking tub. Attached two-car garage and full basement with potential for additional finished space."

Time saved: 35 minutes versus manual documentation. More important: two disclosure-relevant items (foundation crack, HVAC corrosion) surfaced automatically for agent review before the listing went live rather than being discovered during inspection.


What to Do When It Breaks

  • Gemini returns a narrative paragraph instead of JSON — Your extraction prompt got truncated or Gemini defaulted to prose mode. Start a fresh chat, upload only one photo, paste the full extraction prompt without any additional context around it. The schema needs to be the entire message body.
  • "visible_defects_or_flags" comes back empty when defects are obvious — Gemini can miss subtle issues in compressed photos. This is a known limitation: the JSON system surfaces what the model can detect, not everything that exists. Always do a final human review of photos flagged as "disclosure_relevant": false in rooms where age or wear is expected (bathrooms, utility areas, basements). Use the JSON to reduce manual review time, not eliminate it.
  • The MLS caption list comes out with wrong photo numbers — This happens when you paste JSON objects in a different order than the photos are numbered. Add a "photo_id" value when you first extract each object (Photo001, Photo002...) and reference those IDs explicitly in the caption prompt.
  • The disclosure caption sounds too similar to the MLS caption — Add this line to your extraction prompt: "The disclosure caption must be strictly factual and condition-focused, with no marketing language. The MLS caption may highlight positive features." Running both through the same extraction without this distinction produces blended tone.
  • Gemini quota runs out mid-listing — Switch to AI Studio (aistudio.google.com), which uses the same underlying model at no cost. Your JSON objects are plain text; the workflow transfers completely.

Variations

  • Simpler version: Skip the multi-photo JSON aggregation and use the extraction prompt only on the 5-8 photos most likely to be disclosure-relevant (basement, utility rooms, exterior, roof visible shots). Manual documentation for the rest, AI-assisted for the risk areas.
  • Extended version: Build a Google Sheet template with one row per photo and columns matching your JSON schema. After each extraction, paste the field values into the row. You get a sortable, filterable master photo log for the full listing file. Filter by disclosure_relevant = TRUE to instantly produce the disclosure subset.
  • Multi-listing batch: If you manage several listings simultaneously, maintain one Google Doc per listing with that listing's JSON objects appended in order. The disclosure index and caption generation prompts work identically regardless of listing size.

What to Do Next

  • This week: Process your current active listing's photos through the extraction prompt. Compare the output disclosure index against whatever manual notes you would have written. Note where the AI caught something you would have noted, and where it missed something.
  • This month: Refine your extraction prompt schema based on what fields proved most useful. If your state has specific disclosure categories (lead paint, water intrusion, structural), add those as boolean fields to the JSON schema so they surface automatically.
  • Advanced: Combine this workflow with your existing transaction platform. Export the disclosure photo index as a formatted checklist and attach it to the transaction file in SkySlope or Dotloop at the start of each listing. Agents reviewing the file see a structured photo log alongside the contract documents.

Advanced guide for Real Estate Transaction Coordinator professionals. These techniques use more sophisticated AI features that may require paid subscriptions.