The Product object
Every field of a product - its images, its 3D model, its sources and warnings - and the public projection a publishable key reads.
A product is what products.create commits and products.retrieve answers. A session or a secret
key reads the full ProductResponse; a publishable key reads the allow-listed
PublicProductResponse, and only for a published product with a ready model. The catalog list
answers ProductSummary rows, which carry no nested assets.
ProductResponse
JavaScript: Product · Python: viewrium.Product
A product with its assets. status is its review status; display_status is what to show. images are in page order; warnings lists every warning, image warnings first.
iduuidrequiredUnique identifier.
org_iduuidrequiredThe organization it belongs to.
titlestringrequiredThe product's title.
custom_idstringoptionalnullableYour own id for the product, unique within the organization.
tagsstring[]optionalYour tags.
statusProductStatusrequiredThe stored review status: awaiting_review, needs_attention, ready_to_publish or complete.
One of "awaiting_review", "needs_attention", "ready_to_publish", "complete"
display_statusDisplayStatusrequiredThe status to show: the stored status, except generating while any asset is in flight, failed when nothing usable was produced, and published once it is live.
One of "published", "generating", "failed", "awaiting_review", "needs_attention", "ready_to_publish", "complete"
publishedbooleanoptionalWhether the product is live (the embed and the hosted viewer serve it).
Default false
formstringoptionalnullableThe product's shape class from the analysis: regular (most furniture), wall (hung or mounted on a wall), cylindrical (near rotationally symmetric), character (has a face or front, e.g. a figure) or painting.
source_typeSourceTypeoptionalnullableHow it was created: image, video, url (a product page) or model (a finished 3D file).
One of "image", "video", "url", "model", "scan", "upload"
pricenumberoptionalnullableYour price.
currencystringoptionalnullableYour price's currency.
heightnumberoptionalnullableThe product's height in cm.
widthnumberoptionalnullableThe product's width in cm.
depthnumberoptionalnullableThe product's depth in cm.
display_unitDimensionUnitoptionalnullableThe unit the dimensions are shown in. They are always stored and returned in cm.
One of "mm", "cm", "m", "in", "ft"
images_orderedbooleanoptionalWhether the catalog images were ordered.
Default false
thumbnail_urlstringoptionalnullableThe card image: the first ready image in page order, else the model's poster.
has_warningsbooleanoptionalWhether the product has any warning.
Default false
warning_countintegeroptionalHow many warnings the product has.
Default 0
comment_countintegeroptionalHow many comments the product has.
Default 0
image_countintegeroptionalHow many deliverable images are ready.
Default 0
model_statusAssetStatusoptionalnullableThe 3D model's status. Null when no model was ordered.
One of "planned", "generating", "ready", "failed", "skipped"
Who created the product.
created_atdatetimerequiredWhen it was created.
updated_atdatetimeoptionalnullableWhen it was last changed.
viewer_urlstringoptionalnullableThe product's hosted viewer page, which its QR code encodes. It opens only while the product is published.
descriptionstringoptionalnullableThe product's description.
wall_mountedbooleanoptionalWhether the product hangs on a wall (AR places it on a wall).
Default false
product_typestringoptionalnullableWhat the object is in a few words, as a shopper would search for it (from the analysis).
material_wordsstringoptionalnullableThe dominant material and finish in a few words (from the analysis).
transparentbooleanoptionalThe analysis found a see-through part.
Default false
metadatamap of string to anyoptionalYour free-form key/value data.
The photographs or video the product was made from, in order.
The catalog images, in page order.
The 3D model. Null when none was ordered.
Every warning for the product, image warnings first.
open_request_countintegeroptionalHow many change requests are open on the product.
Default 0
A painting's settings. Form painting only.
viewer_desktopViewerDesktopModeoptionalHow the embed shows the product on a desktop: viewer, qr, button or hidden.
One of "viewer", "qr", "button", "hidden"
Default "viewer"
viewer_mobileViewerMobileModeoptionalHow the embed shows the product on a phone: viewer, button or hidden.
One of "viewer", "button", "hidden"
Default "viewer"
ProductOwner
JavaScript: no alias - an element of the type that holds it · Python: viewrium.ProductOwner
Who created the product.
iduuidrequiredThe creator's profile id.
display_namestringoptionalnullableThe creator's display name.
emailstringrequiredThe creator's email.
ProductSourceResponse
JavaScript: no alias - an element of the type that holds it · Python: viewrium.ProductSource
iduuidrequiredUnique identifier.
kindstringrequiredphoto or video.
One of "photo", "video"
urlstringrequiredPublic URL of the stored source file.
original_namestringoptionalnullableThe uploaded file's name, when known.
positionintegeroptionalThe source's 0-based order within the product.
Default 0
azimuthstringoptionalnullableCamera bearing around the product, in 45-degree steps: front, front-right, right, back-right, back, back-left, left, front-left.
tiltstringoptionalnullableCamera elevation: level sees the sides only, above sees the sides and the top, overhead sees only the top.
cleanbooleanoptionalnullableTrue when the product is alone, whole and unobstructed in the photograph - good enough to ship as it is. Null when not assessed.
created_atdatetimerequiredWhen it was created.
ProductImageResponse
JavaScript: ProductImage · Python: viewrium.ProductImage
One catalog image position. A position that was not produced reads status: skipped with a skip_reason and has no files.
iduuidrequiredUnique identifier.
viewstringrequiredThe page position, e.g. front, side, back, angle, front-elevated, detail. An extra standing in for a position carries a suffix such as side-2.
kindstringrequiredwanted: a catalog position the product was planned for. extra: an additional viewpoint used to fill an empty position.
One of "wanted", "extra"
stands_forstringrequiredThe catalog position this image fills: view itself for a wanted image, the position an extra substitutes for.
statusAssetStatusrequiredplanned, generating, ready, failed, or skipped (a withheld position, which has no files).
One of "planned", "generating", "ready", "failed", "skipped"
skip_reasonstringoptionalnullableWhy the position was not produced, in plain words. Set when status is skipped.
routestringoptionalnullableHow the image is made: reuse ships the photograph as it is, edit edits a photograph, generate creates the view from reference photos. Null for a skipped position.
One of "reuse", "edit", "generate"
sourcestringoptionalnullableWhat produced the image: photograph (yours, reused), edited (yours, edited) or generated.
One of "photograph", "edited", "generated"
evidencestringoptionalnullableHow well the photographs cover this view: seen (a clean photo shows it), pinned (a photo shows it but is not clean, or photos on both sides bracket it), implied (a rotationally symmetric product's far side), unseen (nothing shows it).
azimuthstringoptionalnullableCamera bearing around the product, in 45-degree steps: front, front-right, right, back-right, back, back-left, left, front-left.
tiltstringoptionalnullableCamera elevation: level sees the sides only, above sees the sides and the top, overhead sees only the top.
source_photo_iduuidoptionalnullableThe source photograph this image reuses, edits or is anchored on.
attemptsintegeroptionalHow many generation attempts were made.
Default 0
flaggedbooleanoptionalTrue when the view could not be confirmed against the photographs (a view generated with unseen evidence).
Default false
cut_flaggedbooleanoptionalTrue when the background-removal check judged the cut-out possibly wrong.
Default false
cut_problemsstringoptionalnullableThe cut-out checker's description of what looks wrong. Null when nothing was flagged.
review_statusReviewStatusoptionalYour decision: pending, accepted or rejected. Once decided it never returns to pending.
One of "pending", "accepted", "rejected"
Default "pending"
filenamestringrequiredThe download filename: filename_override when set, else a generated SEO name.
alt_textstringrequiredThe image's alt text: alt_override when set, else generated.
filename_overridestringoptionalnullableYour filename, when you set one.
alt_overridestringoptionalnullableYour alt text, when you set one.
Your shadow settings for this image, merged field by field over the calibrated defaults.
background_overrideinteger[3]optionalnullableYour backdrop colour for this image, [r, g, b].
frame_scalenumberoptionalnullableThe shared scale that makes the product fill the frame at the same size across the set's images.
contact_regionsnumber[][]optionalWhere the product touches the ground, as [ymin, xmin, ymax, xmax] boxes on a 0-1000 scale. Drives the contact shadow; empty for wall pieces.
raw_urlstringoptionalnullableURL of the uncut image. Null for a skipped position.
cutout_urlstringoptionalnullableURL of the background-removed (transparent) image. Null for a skipped position and for detail.
This image's warnings.
created_atdatetimerequiredWhen it was created.
updated_atdatetimeoptionalnullableWhen it was last changed.
ProductModelResponse
JavaScript: ProductModel · Python: viewrium.ProductModel
The product's 3D model. No response carries a URL for the model file: mint a single-use ticket with POST /v1/products/{id}/tickets.
iduuidrequiredUnique identifier.
statusAssetStatusrequiredplanned, generating, ready or failed.
One of "planned", "generating", "ready", "failed", "skipped"
review_statusReviewStatusoptionalYour decision: pending, accepted or rejected.
One of "pending", "accepted", "rejected"
Default "pending"
thumbnail_urlstringoptionalnullableURL of the model's poster image. The model file itself has no URL: mint a ticket.
scale_factornumberoptionalnullableThe multiplier applied to the geometry to match the product's real dimensions.
width_axisstringoptionalnullableWhich of the model's horizontal axes is its width (x or z); the other is its depth.
One of "x", "z"
The analysis's structured read of the product: the risks it found and why.
The model's warnings.
created_atdatetimerequiredWhen it was created.
completed_atdatetimeoptionalnullableWhen the model finished. Null while it is in progress.
ProductWarning
JavaScript: no alias - an element of the type that holds it · Python: viewrium.ProductWarning
A warning about a product or one of its images.
kindWarningKindrequiredcut, generation, missing, lighting, model_failed or model_risk.
One of "cut", "generation", "missing", "lighting", "model_failed", "model_risk"
scopestringrequiredimage or product.
One of "image", "product"
titlestringrequiredA short headline.
detailstringrequiredThe explanation. For cut, the cut-out checker's own words.
viewstringoptionalnullableThe affected position, for an image warning. Null otherwise.
PaintingSettings
JavaScript: PaintingSettings · Python: viewrium.PaintingSettings
A painting's settings, in cm: the ones the model being shown was built with. A rebuild in progress or failed is rebuild.
edgePaintingEdgerequiredHow the painting's sides are finished: frame, solid (painted in edge_color) or stretch (the artwork's border pixels wrapped over the sides).
One of "frame", "solid", "stretch"
edge_colorstringrequiredThe colour of a solid edge, as #RRGGBB.
dimensions_ofPaintingDimensionsOfrequiredWhich rectangle the stated width x height describe: canvas or frame (the frame's outer edge).
One of "canvas", "frame"
canvas_width_cmnumberoptionalnullableThe canvas width in cm. Null while it is still to be derived from a size stated for the frame.
canvas_height_cmnumberoptionalnullableThe canvas height in cm. Null while it is still to be derived from a size stated for the frame.
depth_cmnumberoptionalnullableThe slab's depth in cm (a solid or stretch edge). Null for a framed painting.
has_framebooleanoptionalWhether the painting was ordered with a frame - the only way it ever has one.
Default false
An edit's rebuild in progress or failed. Null when there is none.
ShadowOverride
JavaScript: no alias - an element of the type that holds it · Python: viewrium.ShadowOverride
Your shadow settings for one image. Every field is optional: what you set replaces the calibrated default, and what you leave out keeps it.
modestringoptionalnullablesilhouette (cast shadow), contact (shadow at the ground contacts) or both.
One of "silhouette", "contact", "both"
toneinteger[3]optionalnullableThe shadow's colour, [r, g, b].
Cast-shadow settings.
Contact-shadow settings.
Floor-line settings.
GateFlags
JavaScript: GateFlags · Python: viewrium.GateFlags
The risks the analysis found in the product. source_quality: poor is a warning only and never blocks anything.
transparentbooleanoptionalA part can be seen through (glass, acrylic).
Default false
geometry_riskbooleanoptionalThin or fine shapes 3D reconstruction gets wrong (rods, wires, open weave, foliage, chains).
Default false
texture_riskbooleanoptionalArtwork, a logo, lettering or a pattern must land in the right place on the surface.
Default false
source_qualitystringoptionalpoor when the photographs are weak (blurred, dim, small, hiding the item). It warns and never blocks.
One of "ok", "poor"
Default "ok"
One sentence per raised flag.
PaintingRebuild
JavaScript: PaintingRebuild · Python: viewrium.PaintingRebuild
A painting edit's rebuild. The product keeps its delivered model, dimensions and settings while the rebuild runs and if it fails; one that succeeds replaces them and disappears.
statusPaintingRebuildStatusrequiredrunning or failed. A rebuild that succeeds replaces the settings and disappears.
One of "running", "failed"
The settings the edit asked for, so a retry can re-send them.
requested_atdatetimeoptionalnullableWhen the edit was made.
errorstringoptionalnullableWhy the rebuild failed. Set only when status is failed.
ShadowSilhouette
JavaScript: no alias - an element of the type that holds it · Python: viewrium.ShadowSilhouette
lengthnumberoptionalnullableHow far the cast shadow lies along the floor, as a fraction of the product's height.
leannumberoptionalnullableSideways drag away from the light, as a multiple of the lay-down distance.
blurNearnumberoptionalnullableBlur in px where the shadow meets the product.
blurFarnumberoptionalnullableBlur in px at the shadow's far end.
opacitynumberoptionalnullableShadow strength.
distanceFadenumberoptionalnullableAlpha lost per unit of distance from the floor line (0-1).
ShadowContact
JavaScript: no alias - an element of the type that holds it · Python: viewrium.ShadowContact
trailPxnumberoptionalnullableHow far the contact shadow reaches out from the outline, in px.
darknumberoptionalnullableAlpha at the outline (0-1).
endnumberoptionalnullableAlpha at the far end (0-1).
midpointnumberoptionalnullableWhere the falloff crosses halfway (0.05-0.95).
regionHeightnumberoptionalnullableMultiplier on each contact region's marked height.
ShadowGround
JavaScript: no alias - an element of the type that holds it · Python: viewrium.ShadowGround
nudgenumberoptionalnullablePixels to move the fitted floor line down.
tiltnumberoptionalnullableNull fits the floor line to the contact regions; a number pins it.
GateReason
JavaScript: no alias - an element of the type that holds it · Python: viewrium.GateReason
One risk the analysis found, as a sentence about this item. Show it as it is.
codestringrequiredThe flag raised: transparent, geometry_risk, texture_risk or source_quality.
sentencestringrequiredThe analysis's sentence about this item. Show it as it is.
PaintingRequestedSettings
JavaScript: PaintingRequestedSettings · Python: viewrium.PaintingRequestedSettings
The settings a painting edit asked for, so a retry can re-send them.
edgePaintingEdgerequiredHow the painting's sides are finished: frame, solid (painted in edge_color) or stretch (the artwork's border pixels wrapped over the sides).
One of "frame", "solid", "stretch"
edge_colorstringrequiredThe colour of a solid edge, as #RRGGBB.
dimensions_ofPaintingDimensionsOfrequiredWhich rectangle the stated width x height describe: canvas or frame (the frame's outer edge).
One of "canvas", "frame"
canvas_width_cmnumberoptionalnullableThe canvas width the edit asked for, in cm.
canvas_height_cmnumberoptionalnullableThe canvas height the edit asked for, in cm.
depth_cmnumberoptionalnullableThe slab depth the edit asked for, in cm.
frame_width_cmnumberoptionalnullableThe frame's outer width the edit gave, in cm. Null unless the edit was sized by the frame.
frame_height_cmnumberoptionalnullableThe frame's outer height the edit gave, in cm. Null unless the edit was sized by the frame.
PublicProductResponse
JavaScript: PublicProduct · Python: viewrium.PublicProduct
What a publishable key reads: only what a storefront needs. Served only for a published product with a ready model. The model file is reached through a ticket.
iduuidrequiredUnique identifier.
titlestringrequiredThe product's title.
thumbnail_urlstringoptionalnullableURL of the model's poster image.
model_statusAssetStatusoptionalnullableThe 3D model's status.
One of "planned", "generating", "ready", "failed", "skipped"
wall_mountedbooleanoptionalWhether the product hangs on a wall (AR places it on a wall).
Default false
A painting's settings. Form painting only.
viewer_desktopViewerDesktopModeoptionalHow the embed shows the product on a desktop: viewer, qr, button or hidden.
One of "viewer", "qr", "button", "hidden"
Default "viewer"
viewer_mobileViewerMobileModeoptionalHow the embed shows the product on a phone: viewer, button or hidden.
One of "viewer", "button", "hidden"
Default "viewer"
ProductSummary
JavaScript: ProductSummary · Python: viewrium.ProductSummary
A product as the list returns it: its details and status, without nested assets.
iduuidrequiredUnique identifier.
org_iduuidrequiredThe organization it belongs to.
titlestringrequiredThe product's title.
custom_idstringoptionalnullableYour own id for the product, unique within the organization.
tagsstring[]optionalYour tags.
statusProductStatusrequiredThe stored review status: awaiting_review, needs_attention, ready_to_publish or complete.
One of "awaiting_review", "needs_attention", "ready_to_publish", "complete"
display_statusDisplayStatusrequiredThe status to show: the stored status, except generating while any asset is in flight, failed when nothing usable was produced, and published once it is live.
One of "published", "generating", "failed", "awaiting_review", "needs_attention", "ready_to_publish", "complete"
publishedbooleanoptionalWhether the product is live (the embed and the hosted viewer serve it).
Default false
formstringoptionalnullableThe product's shape class from the analysis: regular (most furniture), wall (hung or mounted on a wall), cylindrical (near rotationally symmetric), character (has a face or front, e.g. a figure) or painting.
source_typeSourceTypeoptionalnullableHow it was created: image, video, url (a product page) or model (a finished 3D file).
One of "image", "video", "url", "model", "scan", "upload"
pricenumberoptionalnullableYour price.
currencystringoptionalnullableYour price's currency.
heightnumberoptionalnullableThe product's height in cm.
widthnumberoptionalnullableThe product's width in cm.
depthnumberoptionalnullableThe product's depth in cm.
display_unitDimensionUnitoptionalnullableThe unit the dimensions are shown in. They are always stored and returned in cm.
One of "mm", "cm", "m", "in", "ft"
images_orderedbooleanoptionalWhether the catalog images were ordered.
Default false
thumbnail_urlstringoptionalnullableThe card image: the first ready image in page order, else the model's poster.
has_warningsbooleanoptionalWhether the product has any warning.
Default false
warning_countintegeroptionalHow many warnings the product has.
Default 0
comment_countintegeroptionalHow many comments the product has.
Default 0
image_countintegeroptionalHow many deliverable images are ready.
Default 0
model_statusAssetStatusoptionalnullableThe 3D model's status. Null when no model was ordered.
One of "planned", "generating", "ready", "failed", "skipped"
Who created the product.
created_atdatetimerequiredWhen it was created.
updated_atdatetimeoptionalnullableWhen it was last changed.
viewer_urlstringoptionalnullableThe product's hosted viewer page, which its QR code encodes. It opens only while the product is published.
ProductListResponse
JavaScript: ProductList · Python: viewrium.ProductListResponse
This page of products.
totalintegerrequiredHow many products match the filters.
limitintegerrequiredThe page size the list was read with.
offsetintegerrequiredHow many items were skipped before this page.