reference_image_url, VibePeak analyzes it into a structural spec (the photo slots it holds, its logo area, the text fields it prints, its colour palette, its typography and its background) and returns a confidence score with the result. You can correct anything the analysis got wrong, or skip the analysis entirely by sending your own spec.
Every showcase created with template_id: "custom" and that custom_template_id replaces the photos, the logo and the text of the reference with yours while keeping its layout, its proportions and its style.
Requirements. Custom templates are available on the Pro, Max and Enterprise plans. A key on any other plan is rejected with
403 PLAN_REQUIRED, whose details carry current_plan and required_plans: ["Pro", "Max", "Enterprise"]. The gate applies to Create and to every showcase generated with template_id: "custom".Each account keeps at most 10 active templates. Creating an eleventh returns 409 CUSTOM_TEMPLATE_LIMIT_REACHED with details.max. Archive one to make room; archived templates never count towards the limit.201 with the stored template. There is no job, no webhook and no credit cost on any of the five operations below. Credits are only spent when you render a showcase with the template, at the usual 2 credits per showcase.
How it works
1
Register the design
POST the reference URL and a name. VibePeak analyzes the image and stores the detected spec, its confidence and the aspect_ratio it was authored at.2
Review the spec
Read
spec.image_slots, spec.logo_area and spec.text_fields: they define exactly how many photos a showcase must carry, whether a logo is accepted, and which property fields are required. The analysis also fills spec.text_sources with the exact text it read for each field; correct it with a PATCH if it misread the design. A confidence below 0.7 means the detection deserves a careful read.3
Correct it if needed
PATCH the template with a full spec to fix a slot, a missing text field or the wrong aspect ratio. The stored spec is what every later generation obeys.4
Generate
Create a showcase with
template_id: "custom" and custom_template_id, supplying exactly the photos and fields the spec declares.Create
POST /v1/real-estate/property-showcase/custom-templates
Registers a reference design. With no spec in the body, the reference image is analyzed and the detected layout is stored. With a spec, the analysis is skipped, your layout is stored as-is and confidence comes back as 1.
The reference URL is validated before any analysis runs: it must be publicly reachable, be an accepted image format and weigh at most 8 MB. A failure returns the image error code on the reference_image_url field, with the field name prefixed onto the message, e.g. "reference_image_url: Image exceeds the 8 MB limit".
Request body
string
required
Your label for the template, 1 to 80 characters. Leading and trailing whitespace is trimmed; an empty or whitespace-only name returns
"name is required" and a longer one returns "name must be at most 80 characters".string
required
Publicly reachable URL of the design to reproduce, at most 2048 characters. For analysis it must be a PNG, JPEG or WebP of at most 8 MB; an image VibePeak cannot read as a layout returns
400 INVALID_REFERENCE_IMAGE. The URL is stored and read again on every generation, so it must stay reachable.object
Optional layout description. Send it to skip the analysis and store exactly the layout you describe. Omit it to have VibePeak analyze the reference image for you. When you send it,
confidence is returned as 1.Response
string
required
Identifier of the stored template. Pass it as
custom_template_id when you create a showcase.string
required
The stored name, trimmed.
object
required
The stored layout, in the shape documented above. It is what every generation with this template obeys. When the analysis ran,
spec.text_sources carries the original text it read for each field; when you supplied the spec yourself, it carries back whatever you sent.number
required
How confident the analysis is that it read the design correctly, from
0 to 1. Always 1 when you supplied the spec yourself.A value below 0.7 is not a failure: the template is stored and usable. It means the slots, the logo area or the text fields were hard to identify, so read the spec before you generate and correct it with Update if needed.string
required
Mirror of
spec.aspect_ratio, the ratio showcases built on this template render at.string[]
required
Non-blocking notes about the analysis. Empty when you supplied the
spec. Currently one value is emitted:image_slots_truncated: the design appears to hold more than 4 photo areas and only the first 4 were kept. The template works, but it reproduces fewer photos than the reference. Checkspec.image_slotsand adjust it with Update if the wrong areas were kept.
string
required
ISO 8601 timestamp of creation.
string
required
Unique identifier for this request, useful for support and debugging.
201 Created
Errors
409 Conflict (Limit reached)
403 Forbidden (Plan required)
List
GET /v1/real-estate/property-showcase/custom-templates
Returns your active templates, newest first, with how many more you may create. Archived templates are not listed; read one by id with Get.
Response
object[]
required
Your active templates.
integer
required
How many more templates you may create, that is
max minus the number of active templates. Never negative.integer
required
Maximum number of active templates per account. Currently
10.string
required
Unique identifier for this request, useful for support and debugging.
200 OK
Errors
Get
GET /v1/real-estate/property-showcase/custom-templates/{id}
Reads one template, archived ones included. A template that belongs to another account is reported as missing, never as forbidden.
Response
object
required
The template, in the shape documented under List.
archived_at carries the archive timestamp when the template has been archived, and null otherwise.string
required
Unique identifier for this request, useful for support and debugging.
200 OK
Errors
Update
PATCH /v1/real-estate/property-showcase/custom-templates/{id}
Renames a template, replaces its layout, or both. The reference image is immutable: to change the design, register a new template.
string
required
Identifier of the template to update.
Request body
At least one ofname or spec is required. An empty body returns a VALIDATION_ERROR on the name path with the message "At least one of name or spec is required".
string
New label for the template, 1 to 80 characters.
object
Replacement layout, complete and in the shape documented under Create. It is not merged with the stored one: what you send becomes the spec. A new
aspect_ratio inside it also moves the ratio showcases render at.This is how you correct an analysis: read the stored spec, fix the slot, the text field or the logo area that is wrong, and send the whole object back.Response
object
required
The updated template, in the shape documented under List.
confidence keeps the value of the analysis that produced the original spec.string
required
Unique identifier for this request, useful for support and debugging.
Errors
Delete (archive)
DELETE /v1/real-estate/property-showcase/custom-templates/{id}
Archives a template. Nothing is erased: the row is kept with an archived_at timestamp, and the showcases you already generated with it are unaffected.
An archived template stops counting towards the limit of 10 and disappears from List, but stays readable by id through Get. It can no longer be updated, and a new showcase that names it is rejected with 409 CUSTOM_TEMPLATE_ARCHIVED.
The call is idempotent: archiving a template that is already archived returns the same archived_at and changes nothing.
string
required
Identifier of the template to archive.
Response
string
required
Identifier of the archived template.
string
required
ISO 8601 timestamp of the archive. Unchanged on a repeated call.
string
required
Unique identifier for this request, useful for support and debugging.
200 OK
Errors
Generating with a custom template
Create a showcase withtemplate_id: "custom" and the custom_template_id of a template you own. The stored spec decides the request:
- Fields.
fieldsaccepts exactly the spec’stext_fields, and every one of them is required. A field the spec does not declare returns"<field> is not a valid field for the custom template"; a declared field that is missing or empty returns"<field> is required for this custom template". - Photos.
main_image_urlfills the first slot andsupporting_image_urlsfills the rest, so the request carries exactlyimage_slots.length - 1supporting images. Any other count returns"This custom template requires exactly N supporting images". - Logo. With a
logo_area,logo_image_urlis required ("This custom template requires logo_image_url"). Without one, sending it returns"logo_image_url is not supported by this custom template". - Orientation. The showcase renders at the spec’s
aspect_ratio. Sendingaspect_ratioorbrand_profile_idon a custom showcase is rejected. - Optional overrides.
reference_image_urlpoints this single generation at a different copy of the design, andcustom_instruction(up to 250 characters) appends a free-text tweak to the edit instruction.
202 Accepted, then the finished image arrives at your webhook_url as showcase.completed. It costs the usual 2 credits for accounts without an annual plan.
Error shape.
VALIDATION_ERROR responses carry a details object of the form { "field": "<dotted.path>", "issues": [{ "path": "<dotted.path>", "message": "..." }] }, where field is the first failing path and issues lists every failure. CUSTOM_TEMPLATE_LIMIT_REACHED carries details.max and PLAN_REQUIRED carries details.current_plan and details.required_plans; the image error codes and the remaining codes carry no details. See Error Handling.
