Writing auction lots from photographs
The build in public: how an auction house that typed 1,250 lots by hand before every sale now fills them from photographs, and what it took to trust the machine.
Frank Zoller Authentic History runs militaria auctions in the United States. Before every sale, somebody sat down with the photographs and typed: a title, a description, a starting price and an estimate, one lot at a time, to lot 1,250. The work was not difficult. It was long, it sat in front of every auction, and it was done by the people who knew the most about the objects, which is the wrong use of them.
What did the work look like before?
A sale starts with a room of objects. Each is photographed, the photographs are edited and renumbered, and then the cataloguing begins: what is it, what should it be called, what is it worth and what is the range a bidder should see. For a repeat item (a cap badge the house has sold a dozen times) the answer exists in the house's own history, if somebody remembers to look. For a new one, somebody has to know.
Multiply by 1,250 and the shape of the problem is clear. It is not one hard task. It is one easy task done more times than a person can do it without the quality sliding, and all of it has to finish before any of it can be sold. Every auction waited for the typing.
What goes in, and what comes out?
Photographs go in: the same ones the house already takes for the listing. What comes out is the auction platform's bulk-upload template, filled: title, description, starting price, estimate range, one row per lot, ready to upload without retyping. The handoff is deliberately boring. The house's existing automation then cross-posts to its other bidding sites exactly as it did before, so nothing downstream had to change.
Between the two sits the engine. It identifies the object from the image, decides whether the house has sold one like it before, and either pulls that history forward or describes the object from what it can see. The voice matters more than people expect. A listing is a sales document with a reputation attached, and a house that has described things one way for years cannot start sounding like a machine on the day it starts using one.
What is the reference corpus for?
Before the engine wrote anything, 32,000 past items went into a hosted backend: titles, descriptions, estimates and what each one actually sold for. That set is the house's institutional memory, in a form it could not be used in while it lived in spreadsheets and old catalogues.
It does three jobs. It teaches the model what this house calls things, so the output sounds like the house. It lets a repeat item carry its own history, so a badge that has sold before is priced against what it fetched, not against a guess. And it turned up something nobody had been able to see while the records were scattered: realised prices had sat consistently below estimates across the whole set. The estimates had been drifting upward for years, invisibly. That was a finding about the business, not about the software, and it was worth the ingestion on its own.
How does the review step work?
This is the part that made it usable, and it is not the writing. Every output carries a confidence score. Above the line, the lot passes straight through to the template. Below it, the lot is flagged and a person reads it. Nothing else reaches a person.
A tool that needs every answer checked has saved nobody anything, because the checking is the job it was meant to remove. A tool that knows which of its answers to distrust has. The cataloguer's day moves from reading all the lots to reading the hard ones: the unfamiliar object, the ambiguous photograph, the item whose history is thin. That is where their knowledge was always most valuable, and it is now the whole of what they spend it on.
- The model could not match the object to anything in the house's history and is describing it from the image alone.
- Two plausible identifications, with nothing in the photograph to choose between them.
- A price that falls outside the range the house's past sales would predict for an object of that kind.
- A photograph that is too dark, too cropped or too busy to describe honestly.
The threshold is a dial, and it was set by the house, not by us. Set it high and more lots get read, at the cost of time. Set it low and fewer do, at the cost of trust. The right setting is the one where the person reviewing stops finding errors in the lots that were not flagged, and that is found by looking, not by argument.
What did it take to trust it?
Nobody trusts a cataloguer on their first day, and the machine got the same treatment.
- It ran beside the old process first. A past sale, already typed by hand, was fed through as photographs, and the output was read against what the house had actually written and what the lots had actually fetched.
- The house's own people read the flagged lots and the unflagged ones, until the unflagged ones stopped surprising them.
- The voice was corrected lot by lot until a reader could not tell which rows the machine had written.
- The threshold was moved, deliberately, in both directions, to see what came through and what was caught.
- Then one live auction, on 16 August, with a person watching every stage and the old process ready to take over if it had to. It did not have to.
What made the trust possible was the shape of the thing, not its cleverness. The output is a spreadsheet the house already used. The upload is the one they already did. The review is a shorter version of the reading they already did. Nothing in the house's day was replaced by something unfamiliar. A long part of it was made short.
What does 400+ hours actually mean?
It is the house's own count of the typing that no longer happens, and it is open-ended on purpose: the saving continues with every sale, and we do not attach a period to it because the house has not. We would rather publish a number with its limits than round it into a headline.
The figure we watch more closely is the share of lots a person now has to read, because that is what decides whether the tool is working. If the flags creep up, the model has met a run of objects it does not know and the corpus needs feeding. If they fall to nothing, the threshold is probably too loose and somebody should check a sample. A good number sits in the middle and moves slowly.
The build sits beside the rebuilt zollerhistory.com and its shop, for the same house. The listing engine is the one we show first, because it is the clearest example we have of what we mean by an AI app: a narrow tool, built against a task somebody did by hand before every sale, with a review step that lets a person trust it. The case is at /work/zoller, the service page is at /services/ai-apps, and the piece on what a tool like this costs is at /blog/what-a-custom-ai-app-costs.