All paths are under
/public/v1/environments/{environmentID}/themes/{themeID}.
Why the shape differs from a Theme’s
The Theme owns the structure: the tree, the names,$type, $description, $extensions. A Variant
owns $value and nothing else.
That is not a simplification of the API — it is the model. A Variant cannot add a token, cannot
rename one, cannot retype one, and cannot describe one. Overriding a path the Theme does not have is
silently ignored, because there is nothing for the override to apply to. See
Variants.
If you want a token’s type or description, ask the Theme. It is the only place that can answer
without two sources being able to disagree.
Read the overrides
integer
Read a specific published version. Remember that a Variant version number is a Theme version
number.
boolean
default:"false"
Response 200
groups is always empty and a token carries only path and value.
type, resolvedType and description are always null, and inferred is always false — there
is no type here that could have been inferred.
Edit the overrides
move to express.
The path is the token path as the Theme spells it —
color.brand.primary, not
/color/brand/primary.
Returns the whole override set, with the new etag.
Publish the overrides
Discard the draft
After the Theme publishes
When its Theme publishes a version, every Variant beneath it is automatically migrated: keys the Theme renamed are renamed here, and keys it removed — or retyped past fitting — are dropped. That migration writes each Variant’s draft. It does not publish. So after a Theme publish, expecthasUnpublishedChanges: true on Variants nobody touched; read the draft, check it, and publish.
A rename is only reliably tracked when the Theme’s edit used a
move operation. A
remove-and-add pair has to be inferred by matching removed content against added content, which can
lose an override when the rename also changed the value, or when two identically valued tokens are
renamed in the same publish.