The custom fields this organisation keeps on its variants
A page of custom field definitions: what this organisation has added to its variants beyond the catalogue's own columns. Each carries id, name, field_type (string, decimal, integer, boolean or date), source, description, is_active, is_editable, is_value_editable, access_type, and its timestamps.
Read this before reading or writing a variant's custom_fields map: the map is keyed on the field's id, and field_type is the type a value must parse as.
source says where the field came from: tightly for one declared here, otherwise the connector that brought it. The two counts beside the page are that split, over the active fields: total_active_tightly_specific and total_active_integration. is_value_editable is computed rather than stored: true when source is tightly, and otherwise true only when access_type is read_write.
label is what a face prints and name is the key values are stored under. bound_to names the connection filling the field, and while it is set a write to its values is refused; used_in counts the families and saved filters that read it.
Paging is offset and limit, limit at most 100 and 25 by default; max_size is every field matching the filters and size is this page. search matches name and description. filter_args is a JSON array of {key, operation, value} over is_active, is_editable, field_type, name and source.
Scope: products:read.
Request
- Base URL: https://api.app.tightly.io
- URL: https://api.app.tightly.io/api/v1/variants/custom-fields
- Auth: HTTP bearer
Query parameters
Definitions to skip before this page.
Definitions in this page.
Free text over name and description.
A JSON array of {key, operation, value}. is_active and is_editable take eq and ne on a boolean; field_type and source take eq, ne and in; name takes eq, ilike and in.
Headers
The date train to answer on. One train exists today, 2026-11, the one this reference describes and the one every key is minted on, so the call answers on it with or without this header. Send it anyway, so a client built now names its train from the start.
Response
A page of definitions, with the active split and the size of the matching set.
Example response
{
"data": {
"custom_fields": [
{
"access_type": "read_only",
"bound_to": {
"field_key": "product.custom_field.fabric",
"source_path": "metafields.custom.fabric"
},
"description": "The mill's stated composition.",
"field_type": "string",
"grain": "product",
"id": "123",
"is_active": true,
"is_editable": true,
"is_value_editable": true,
"label": "Fabric",
"name": "fabric",
"source": "tightly"
}
]
}
}Changes
No recorded changes to this operation across all 1 revision of this API.