A release: a top-level container that groups member leaves into a put-out work (FM-549 s38). Single-owner (distinct from collection.*, the curatorial multi-owner lens). Container points DOWN at its members.
tid
Timestamp-based ID
Properties
coverArtHash
string
Optional
SHA-256 hash of the cover art.
maxLength: 200 bytescoverArtUrl
string
uri
Optional
URL to cover art image.
maxLength: 3000 bytescreatedAt
string
datetime
Required
Record creation timestamp.
maxLength: 100 bytescurrency
string
Optional
ISO-4217 currency code. Phase 1 = USD only. INLINE sellability shape — keep in sync across sellable types.
maxLength: 3 bytesUSDdescription
string
Optional
Release description.
maxLength: 5000 byteskind
string
Required
The product form of the release (FM-549 s41: 8 values). OPEN enum by design — adding a kind later is a data change, not a lexicon change. `stems` = a stems bundle; `trackWithStems` = track + its stems; `samplePack` = samples as members; `djSet` = a DJ set.
maxLength: 50 bytessingle, ep, album, compilation, stems, trackWithStems, samplePack, djSetlicenseSummary
string
Optional
DERIVED summary cache (FM-549 s40): the shared license value when all member leaves agree, or 'mixed' when they differ. Powers Browse license search + display. Recomputed at publish and on any post-publish leaf edit. READ-ONLY for sort/display — NEVER read by enforcement (gate/cascade/charge read the LEAF, not this).
maxLength: 100 bytesmembers
array
of
object
Optional
Ordered member leaves of this release (FM-549 s38: containers point DOWN at members). Each is an AT-URI ref to a track / stem / sample / group.stems record.
maxLength: 200 itemspriceCents
integer
Optional
On-network price in integer cents (FM-549: price on-network; offer public, sale private). 0 or absent = free. Hard price floor enforced in app, not schema. INLINE sellability shape — authored identically in fm.freemix.release and fm.freemix.group.stemsGroup; keep in sync (s41).
minimum: 0royaltySummary
string
Optional
DERIVED summary cache (FM-549 s40): the shared royalty posture when member leaves agree, or 'mixed' when they differ. Same rules as licenseSummary — read-only, never read by enforcement. Royalties themselves stay track-level only.
maxLength: 100 bytesseller
string
did
Required
parties.seller (s39): the single account DID that owns and sells this release (owner = seller = uploader; may be an org account). Charge/entitlement read THIS field. INLINE — keep in sync.
title
string
Required
Release title.
maxLength: 300 bytesView raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"kind",
"title",
"seller",
"createdAt"
],
"properties": {
"kind": {
"type": "string",
"maxLength": 50,
"description": "The product form of the release (FM-549 s41: 8 values). OPEN enum by design — adding a kind later is a data change, not a lexicon change. `stems` = a stems bundle; `trackWithStems` = track + its stems; `samplePack` = samples as members; `djSet` = a DJ set.",
"knownValues": [
"single",
"ep",
"album",
"compilation",
"stems",
"trackWithStems",
"samplePack",
"djSet"
]
},
"title": {
"type": "string",
"maxLength": 300,
"description": "Release title."
},
"seller": {
"type": "string",
"format": "did",
"description": "parties.seller (s39): the single account DID that owns and sells this release (owner = seller = uploader; may be an org account). Charge/entitlement read THIS field. INLINE — keep in sync."
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"uri"
],
"properties": {
"cid": {
"type": "string",
"format": "cid",
"maxLength": 200,
"description": "CID of the member record (pins to exact version). Optional."
},
"uri": {
"type": "string",
"format": "at-uri",
"maxLength": 3000,
"description": "AT URI of the member leaf record (fm.freemix.track / .stem / .sample / .group.stems)."
},
"position": {
"type": "integer",
"minimum": 0,
"description": "Display order within the release (0-indexed)."
}
}
},
"maxLength": 200,
"description": "Ordered member leaves of this release (FM-549 s38: containers point DOWN at members). Each is an AT-URI ref to a track / stem / sample / group.stems record."
},
"currency": {
"type": "string",
"maxLength": 3,
"description": "ISO-4217 currency code. Phase 1 = USD only. INLINE sellability shape — keep in sync across sellable types.",
"knownValues": [
"USD"
]
},
"createdAt": {
"type": "string",
"format": "datetime",
"maxLength": 100,
"description": "Record creation timestamp."
},
"priceCents": {
"type": "integer",
"minimum": 0,
"description": "On-network price in integer cents (FM-549: price on-network; offer public, sale private). 0 or absent = free. Hard price floor enforced in app, not schema. INLINE sellability shape — authored identically in fm.freemix.release and fm.freemix.group.stemsGroup; keep in sync (s41)."
},
"coverArtUrl": {
"type": "string",
"format": "uri",
"maxLength": 3000,
"description": "URL to cover art image."
},
"description": {
"type": "string",
"maxLength": 5000,
"description": "Release description."
},
"coverArtHash": {
"type": "string",
"maxLength": 200,
"description": "SHA-256 hash of the cover art."
},
"licenseSummary": {
"type": "string",
"maxLength": 100,
"description": "DERIVED summary cache (FM-549 s40): the shared license value when all member leaves agree, or 'mixed' when they differ. Powers Browse license search + display. Recomputed at publish and on any post-publish leaf edit. READ-ONLY for sort/display — NEVER read by enforcement (gate/cascade/charge read the LEAF, not this)."
},
"royaltySummary": {
"type": "string",
"maxLength": 100,
"description": "DERIVED summary cache (FM-549 s40): the shared royalty posture when member leaves agree, or 'mixed' when they differ. Same rules as licenseSummary — read-only, never read by enforcement. Royalties themselves stay track-level only."
}
}
},
"description": "A release: a top-level container that groups member leaves into a put-out work (FM-549 s38). Single-owner (distinct from collection.*, the curatorial multi-owner lens). Container points DOWN at its members."
}