A sample: a first-class leaf audio record (FM-549 s38: promoted from a DB-only concept to a real ATProto record). A building block — samples carry a 0% royalty by tier principle and no structured credits/notes (s41).
tid
Timestamp-based ID
Properties
aiDeclaration
object
Optional
Declaration of AI involvement in creation.
audioDurationMs
integer
Required
Duration of the sample in milliseconds.
audioFormat
string
Required
Audio file format.
maxLength: 100 byteswav, flac, mp3, aiffaudioHash
string
Required
SHA-256 hash of the sample audio content.
maxLength: 200 bytesaudioSizeBytes
integer
Required
Size of the audio file in bytes.
audioUrl
string
uri
Optional
DEPRECATED-by-default (FM-508 parity): sample audio is private (gated download / app-served preview), not surfaced in the portable record. Samples never carry a public clip. Optional, tolerated for compatibility.
maxLength: 3000 bytesbpmCentis
integer
Optional
Centi-BPM (BPM x 100), integer — decode as bpmCentis/100 on read. Mirrors the track/stem lexicons. Relevant for loops.
minimum: 2000maximum: 99900coverArtUrl
string
uri
Optional
URL to cover art image.
maxLength: 3000 bytescreatedAt
string
datetime
Required
Record creation timestamp.
maxLength: 100 bytesdescription
string
Optional
Sample description.
maxLength: 5000 bytesgenres
array
of
string
Optional
Genre classifications. Plural `genres` (it IS an array), matching the stem lexicon convention.
maxLength: 10 itemslabel
string
Required
Human-readable name (e.g., '808 Kick', 'Vinyl Crackle', 'Amen Break Chop').
maxLength: 100 byteslicense
string
at-uri
Optional
AT URI of the license grant record. License lives on the leaf (s40).
maxLength: 3000 bytesmusicalKey
string
Optional
Musical key (e.g., 'Am', 'F#m', 'Bb'). Named musicalKey (collision-proof), matching the stem lexicon's intentional divergence from track's `key`.
maxLength: 10 bytesparentGroup
string
at-uri
Optional
AT URI of a parent group/release this sample belongs to (optional). Samples are referenceable as release/collection/samplePack members.
maxLength: 3000 bytessampleType
string
Required
Category of the sample. Note: one-shot vs loop/snippet matters for the sampling royalty cap at the product layer (one-shot 0%, loop/snippet capped) — but samples as an UPLOAD type carry 0% royalty by the tier principle.
maxLength: 100 bytesoneShot, loop, snippet, fx, othertags
array
of
string
Optional
Freeform tags.
maxLength: 10 itemstitle
string
Optional
Sample title. `label` remains the required human-readable name; `title` mirrors the stem lexicon's unified-on-title field.
maxLength: 300 bytesView raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"sampleType",
"label",
"audioHash",
"audioDurationMs",
"audioFormat",
"audioSizeBytes",
"createdAt"
],
"properties": {
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 50
},
"maxLength": 10,
"description": "Freeform tags."
},
"label": {
"type": "string",
"maxLength": 100,
"description": "Human-readable name (e.g., '808 Kick', 'Vinyl Crackle', 'Amen Break Chop')."
},
"title": {
"type": "string",
"maxLength": 300,
"description": "Sample title. `label` remains the required human-readable name; `title` mirrors the stem lexicon's unified-on-title field."
},
"genres": {
"type": "array",
"items": {
"type": "string",
"maxLength": 50
},
"maxLength": 10,
"description": "Genre classifications. Plural `genres` (it IS an array), matching the stem lexicon convention."
},
"license": {
"type": "string",
"format": "at-uri",
"maxLength": 3000,
"description": "AT URI of the license grant record. License lives on the leaf (s40)."
},
"audioUrl": {
"type": "string",
"format": "uri",
"maxLength": 3000,
"description": "DEPRECATED-by-default (FM-508 parity): sample audio is private (gated download / app-served preview), not surfaced in the portable record. Samples never carry a public clip. Optional, tolerated for compatibility."
},
"audioHash": {
"type": "string",
"maxLength": 200,
"description": "SHA-256 hash of the sample audio content."
},
"bpmCentis": {
"type": "integer",
"maximum": 99900,
"minimum": 2000,
"description": "Centi-BPM (BPM x 100), integer — decode as bpmCentis/100 on read. Mirrors the track/stem lexicons. Relevant for loops."
},
"createdAt": {
"type": "string",
"format": "datetime",
"maxLength": 100,
"description": "Record creation timestamp."
},
"musicalKey": {
"type": "string",
"maxLength": 10,
"description": "Musical key (e.g., 'Am', 'F#m', 'Bb'). Named musicalKey (collision-proof), matching the stem lexicon's intentional divergence from track's `key`."
},
"sampleType": {
"type": "string",
"maxLength": 100,
"description": "Category of the sample. Note: one-shot vs loop/snippet matters for the sampling royalty cap at the product layer (one-shot 0%, loop/snippet capped) — but samples as an UPLOAD type carry 0% royalty by the tier principle.",
"knownValues": [
"oneShot",
"loop",
"snippet",
"fx",
"other"
]
},
"audioFormat": {
"type": "string",
"maxLength": 100,
"description": "Audio file format.",
"knownValues": [
"wav",
"flac",
"mp3",
"aiff"
]
},
"coverArtUrl": {
"type": "string",
"format": "uri",
"maxLength": 3000,
"description": "URL to cover art image."
},
"description": {
"type": "string",
"maxLength": 5000,
"description": "Sample description."
},
"parentGroup": {
"type": "string",
"format": "at-uri",
"maxLength": 3000,
"description": "AT URI of a parent group/release this sample belongs to (optional). Samples are referenceable as release/collection/samplePack members."
},
"aiDeclaration": {
"type": "object",
"required": [
"category"
],
"properties": {
"tools": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"maxLength": 10,
"description": "AI tools used."
},
"category": {
"type": "string",
"maxLength": 100,
"description": "Level of AI involvement.",
"knownValues": [
"none",
"assisted",
"augmented",
"generated"
]
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "Creator's description of how AI was used."
}
},
"description": "Declaration of AI involvement in creation."
},
"audioSizeBytes": {
"type": "integer",
"description": "Size of the audio file in bytes."
},
"audioDurationMs": {
"type": "integer",
"description": "Duration of the sample in milliseconds."
}
}
},
"description": "A sample: a first-class leaf audio record (FM-549 s38: promoted from a DB-only concept to a real ATProto record). A building block — samples carry a 0% royalty by tier principle and no structured credits/notes (s41)."
}