Docs · Datafeed spec v1

The datafeed spec our competitors keep secret.

One CSV (or JSON) describes your entire catalog. It's deliberately compatible with the de-facto format most room visualizers already use — if you already maintain a product feed for one, it uploads to Ruangmu unchanged.

Download template CSV13 columns · UTF-8 · one row per SKU

Already using another visualizer? Export the same CSV you maintain for it today and upload it as-is. Extra columns are ignored, never rejected.

Column reference

ColumnRequiredWhat it does
SKU NumberRequiredYour unique, stable product ID. Used for deep links (data-sku), analytics, and diff-based re-uploads — renders and history stay attached to it.
Product NameRequiredShown to customers in the widget and on shared render images.
CategoryRequiredFree text shown as a filter to customers, e.g. “SPC”, “WPC”, “Carpet Tile”.
CollectionOptionalGroups products into a second-level filter in the widget.
ColorsOptionalComma-separated color names; powers the color filter and search.
ThicknessOptionalPhysical thickness with unit, e.g. “4mm”. Shown in product details.
WidthRecommendedPhysical width with unit, e.g. “180mm”. Feeds the render prompt so plank/panel/tile scale looks right in the room.
LengthRecommendedPhysical length with unit. Same role as Width for render realism.
Surface ApplicabilityRequiredOne of the six surfaces below. Selects which render pipeline your product uses — this is the most important column in the feed.
Product LayoutOptionalStraight, Herringbone or Chevron. Tells the renderer how to lay the product, e.g. herringbone plank direction.
Top-Down Image URLRequiredHTTPS link to a flat, top-down photo of the product (the swatch). This exact image is passed to the AI as the texture reference — its quality decides your render quality.
Product Page URLOptionalWhere “View product” links from the widget.
Add to Cart URLOptionalPowers an “Add to cart” CTA. May contain {sku} which we substitute at click time.

Surface Applicability values

Exactly one value per product. It routes the product to the right category tab and the right render prompt.

Floorplanks, tiles, carpet, vinyl rolls
CeilinguPVC / WPC panels, slats
Wallwall panels, wallpaper, paint
Curtaincurtains and drapes, applied per window
Rugplaced on the floor, keeps existing flooring
Furniturereplaces a comparable furniture piece

Product Layout values

Optional, floor/wall products only: Straight (default), Herringbone, Chevron. If your product ships in a fixed pattern, set it here so renders lay it correctly.

StraightHerringboneChevron

Swatch image guidelines

  • Top-down, flat, evenly lit — no perspective shots, no room scenes, no watermarks.
  • Minimum 800×800px; JPG, PNG or WebP; under 5MB.
  • Show enough of the product that the pattern repeat is visible (for planks: at least 2–3 planks).
  • The AI uses this image as its texture reference, so what you upload is what gets rendered.

Prefer JSON?

POST the same fields as an array of objects with camelCase keys. Both formats are validated identically.

[
  {
    "skuNumber": "SPC-305",
    "productName": "Walnut Herringbone",
    "category": "SPC Flooring",
    "collection": "Heritage",
    "colors": "Dark Walnut",
    "thickness": "4mm",
    "width": "120mm",
    "length": "610mm",
    "surfaceApplicability": "Floor",
    "productLayout": "Herringbone",
    "topDownImageUrl": "https://yourstore.com/images/spc-305-topdown.jpg",
    "productPageUrl": "https://yourstore.com/products/spc-305",
    "addToCartUrl": "https://yourstore.com/cart/add?sku={sku}"
  }
]

Validation

  • Uploads are validated row by row — you get a per-row error report (missing columns, bad URLs, unknown surface values), never a silent partial import.
  • Re-uploads are diffed by SKU Number: changed rows update, missing rows can be disabled, analytics history is never wiped.
  • Duplicate SKU Numbers within one file are rejected with the row numbers listed.

Embed & JS API docs

The widget embed (one script tag), data-sku deep links, and the JavaScript API are documented in your dashboard once you create an account.

<script src="https://ruangmu.com/widget.js" data-ruangmu="YOUR_KEY" async></script>