Inspekt
Get a key

Embed parameters

Every option the embed reads, whether you set it through CS2Embed.mount() or by hand on the /embed URL. The bounds below are enforced by the frame itself. An out-of-range or malformed value is dropped silently and the default is used instead: nothing you pass on this surface can produce a 400.

The one required input

Pass either inspect or s. Nothing else is required.

If you pass both, inspect wins. s, wear, seed and st are ignored, and the inspect link's own float, pattern, stickers, charm and StatTrak count are used instead.

Item and condition

ParamType / boundsDefaultNotes
inspectSteam inspect link, any lengthn/a Decoded client-side. Carries wear, seed and stickers with it: see above.
s/^[a-z0-9][a-z0-9_.-]*$/in/a A catalog id. Unrecognised ids fail to load (see fallback codes).
wearnumber, 0-1kit default Float value. Out-of-range or non-numeric is dropped, not clamped.
seedinteger, 0-100000kit default Pattern seed.
stslot:stickerId:wear[,…], up to 5none Each entry: slot (1-2 digits), stickerId (1-6 digits), wear (one digit, optional up to 4 decimals). Malformed strings are dropped whole (falls back to no stickers).
name≤20 printable characters, no control charactersnone A StatTrak-style nametag. Trimmed; over-length or containing a control character is dropped whole.

Scene, view and chrome

ParamType / boundsDefaultNotes
scene/^[a-z0-9_]{1,64}$/iscene bg default A backdrop id, e.g. plate_train_video. An id that doesn't match a known backdrop degrades to the studio's own default rather than failing.
viewfront | back | hero frontCamera framing on boot.
autorotate1/true to enableoff Always off under the visitor's prefers-reduced-motion, regardless of this param. Stops for good on the visitor's first pointer-down.
bgscene | blackscene Whether the backdrop plate renders or the frame is a flat black background.
uiminimal | noneminimal See UI and the wordmark below. none does not always remove the attribution mark.
themedark | lightdark The chrome only (name plate, wordmark). The render itself is the render.

Identity and access

ParamType / boundsDefaultNotes
key/^[a-z0-9_-]{4,64}$/inone (anonymous) Your publishable key. It's meant to be published: it rides in the iframe's src, in your page source. Security comes from the origin allowlist you register in the dashboard, not from keeping the key secret.
originan http(s) originthe page's referrer, if any The host page's own origin, for targeting postMessage traffic. CS2Embed.mount() sets this for you automatically. Set it yourself if you hand-build the iframe: see postMessage API.

UI and the wordmark

ui=minimal (the default) shows a small item name plate and the corner attribution wordmark. ui=none hides the name plate, but the wordmark is a request, not a right: it only disappears when your key's plan allows removing it (Pro and Enterprise). On Free and Starter it stays regardless of ui. That's the Free and Starter tiers' attribution requirement, and the server enforces it from the plan it injects into the page when it serves /embed, not from a query parameter a page could omit. See Pricing for which plans include wordmark removal.

The loader: CS2Embed.mount(el, options)

Everything above, as an options object, plus two loader-only fields:

OptionTypeDefaultNotes
titlestring"3D skin viewer" The iframe's accessible title attribute.
lazybooleantrue Pass false to load eagerly (loading="eager") instead of the browser's native lazy loading.
javascript
var viewer = CS2Embed.mount(document.getElementById('viewer'), {
  inspect: 'steam://rungame/730/76561202255233023/+csgo_econ_action_preview 0018...',
  scene: 'plate_train_video',
  view: 'front',
  autorotate: true,
  bg: 'scene',
  ui: 'minimal',
  theme: 'dark',
  key: 'cs2pk_your_key_here',
  title: 'AK-47 | Redline in 3D',
  lazy: false,
});

The handle it returns has methods for everything you'd otherwise pass as a param up front: setItem, setScene, setView, setAutorotate, setQuality, resetView, screenshot, destroy, plus on/off for events. See postMessage API for the full command and event list, and Frameworks for React/Vue wrappers around it.

Without a script tag: the raw /embed URL

If you won't add a script tag, build the iframe by hand. Every param above is a query parameter on GET /embed:

html
<iframe
  src="https://inspekt.gg/embed?inspect=steam%3A%2F%2Frungame%2F730%2F76561202255233023%2F%2Bcsgo_econ_action_preview%2000180720...&scene=plate_train_video&autorotate=1&origin=https%3A%2F%2Fyoursite.example"
  style="width:640px;height:400px;border:0"
  loading="lazy"
  allow="autoplay; fullscreen"
  referrerpolicy="strict-origin"
  title="3D skin viewer"
></iframe>

Set origin yourself on a hand-built iframe. Without it, the frame falls back to your page's document.referrer (which some browsers withhold), and with neither, outbound postMessage traffic is addressed to * instead of your page specifically. The loader script sets this for you automatically, which is one more reason to prefer it over a raw iframe when you can.

Access control

Whether the frame is allowed to paint at all is enforced twice: by our server, and, for a key with registered origins, by the browser itself, through a Content-Security-Policy: frame-ancestors header scoped to that key's origins. A key lifted from one customer's page source and pasted into a different site is refused by the visitor's own browser, before any of our code runs. Register and manage your origins in the dashboard; see Error codes for what a refusal looks like from inside the frame.