# fm.freemix.track

> Published by [lex-publisher.freemix.fm](https://lexicon.garden/identity/did:plc:bt7c6cqevgefnvej5cmgke4g)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:bt7c6cqevgefnvej5cmgke4g/fm.freemix.track)
- [Documentation](https://lexicon.garden/lexicon/did:plc:bt7c6cqevgefnvej5cmgke4g/fm.freemix.track/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:bt7c6cqevgefnvej5cmgke4g/fm.freemix.track/examples)

## Definitions

### `fm.freemix.track`

**Type**: `record`

A music track record on FreeMix. Top-level leaf (FM-549 s38: pulled out from under the release.* prefix; release.track -> track).

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `key` | `string` | No | Musical key (e.g., 'Am', 'F#m', 'Bb') |
| `isrc` | `string` | No | International Standard Recording Code (this recording). MIGRATED from the old top-level `isrc` field (FM-549 s41); existing records carrying top-level isrc are relocated here by the T3 data migration. |
| `iswc` | `string` | No | International Standard Musical Work Code (the composition). FM-550. |
| `tags` | `array` | No | Freeform tags |
| `genre` | `array` | No | Genre classifications |
| `title` | `string` | Yes | Track title |
| `artist` | `string` | Yes | Artist name |
| `seller` | `string` (did) | No | parties.seller (s39): the single account DID that owns and sells this item (owner = seller = uploader; may be an org account). Charge/entitlement read THIS field. One-field indirection from record author. INLINE — keep in sync. |
| `buyLink` | `string` (uri) | No | URL to purchase or stream (Bandcamp, Beatport, Spotify, etc.) |
| `clipUrl` | `string` (uri) | No | FM-508: public URL to a short (~30s) truncated audio clip — the record's only public audio artifact. Tracks only; stems and samples never carry a clip. Optional. |
| `credits` | `array` | No | Descriptive credit lines (FM-550). Repeatable; multiple entries may share a role. Record-of-fact only — read by NO money/control code (s41). PRO-registration shape, not a split sheet: no percentages, no payout fields. |
| `license` | `string` (at-uri) | Yes | AT URI to the license grant record |
| `audioUrl` | `string` (uri) | No | DEPRECATED (FM-508): no longer emitted. Full-quality audio is private (gated download only) and is never surfaced in the portable record. Field kept (optional) to tolerate pre-FM-508 records without a putRecord rewrite. |
| `currency` | `string` | No | ISO-4217 currency code. Phase 1 = USD only. INLINE sellability shape — keep in sync across sellable types. |
| `audioHash` | `string` | Yes | SHA-256 hash of the audio file content |
| `bpmCentis` | `integer` | No | Beats per minute in centiBPM (multiply actual BPM by 100, e.g., 174.50 BPM = 17450) |
| `createdAt` | `string` (datetime) | Yes | Record creation timestamp |
| `isReleased` | `boolean` | No | Whether this track was previously released outside FreeMix |
| `priceCents` | `integer` | No | On-network price in integer cents (FM-549: price goes on-network; offer is public, sale is 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). |
| `stemAccess` | `string` | No | Who can access stems. Defaults to 'open'. Phase 1 only supports 'open' and 'community'. |
| `artworkSeed` | `string` | No | FM-729: seed the generative cover placeholder is drawn from. Grammar "<title>#deck<gen>#regen<n>"; both counters recompute from this one string, so there are no separate deck/attempt fields. Optional - absent means fall back to the title (the pre-FM-729 implicit seed), which renders the existing cover unchanged. Never an empty string (an empty seed is a fixed point of the generator's LCG and collapses the art). Kept on the record even when coverArtUrl is set, so removing an uploaded cover restores the same generated art. maxLength 384 = title's 300 plus suffix headroom. |
| `audioFormat` | `string` | Yes | Audio file format |
| `coverArtUrl` | `string` (uri) | No | URL to cover art image |
| `description` | `string` | No | Track description |
| `releaseDate` | `string` (datetime) | No | Original release date (ISO 8601) |
| `coverArtHash` | `string` | No | SHA-256 hash of the cover art |
| `releaseLabel` | `string` | No | Label name (e.g., 'Vizual Records', 'self-released') |
| `aiDeclaration` | `object` | No | Declaration of AI involvement in creation |
| `catalogNumber` | `string` | No | Catalog number (e.g., 'VIZ-042') |
| `audioSizeBytes` | `integer` | Yes | Size of the audio file in bytes |
| `audioDurationMs` | `integer` | No | Duration of the track in milliseconds |
| `derivativeSubType` | `string` | No | The derivative kind for Remix/Edit/Mashup uploads. Absent on Original tracks. Durable provenance — the authoritative signal that a track is a derivative, independent of source count. knownValues (not a closed enum) so future subtypes don't break existing records. |
| `copyrightRecording` | `string` | No | ℗ line for the sound recording, e.g. '2026 <label>'. FM-550. NOTE: label rides here + the Previously-Released fields, NOT the credits role vocabulary (s41). |
| `copyrightComposition` | `string` | No | © line for the composition, e.g. '2026 Joshua Michaels'. FM-550. |
| `noAttributableSourcesAttested` | `boolean` | No | True only when the uploader affirmed via the upload UI that this derivative has no FreeMix-attributable source (own work, licensed, off-platform, or since-deleted). Never set automatically from source count — it is an explicit human attestation, not a computed value. |

## Raw Schema

```json
{
  "id": "fm.freemix.track",
  "defs": {
    "main": {
      "key": "tid",
      "type": "record",
      "record": {
        "type": "object",
        "required": [
          "title",
          "artist",
          "audioHash",
          "audioFormat",
          "audioSizeBytes",
          "license",
          "createdAt"
        ],
        "properties": {
          "key": {
            "type": "string",
            "maxLength": 10,
            "description": "Musical key (e.g., 'Am', 'F#m', 'Bb')"
          },
          "isrc": {
            "type": "string",
            "maxLength": 15,
            "description": "International Standard Recording Code (this recording). MIGRATED from the old top-level `isrc` field (FM-549 s41); existing records carrying top-level isrc are relocated here by the T3 data migration."
          },
          "iswc": {
            "type": "string",
            "maxLength": 15,
            "description": "International Standard Musical Work Code (the composition). FM-550."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 50
            },
            "maxLength": 10,
            "description": "Freeform tags"
          },
          "genre": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 50
            },
            "maxLength": 5,
            "description": "Genre classifications"
          },
          "title": {
            "type": "string",
            "maxLength": 300,
            "description": "Track title"
          },
          "artist": {
            "type": "string",
            "maxLength": 200,
            "description": "Artist name"
          },
          "seller": {
            "type": "string",
            "format": "did",
            "description": "parties.seller (s39): the single account DID that owns and sells this item (owner = seller = uploader; may be an org account). Charge/entitlement read THIS field. One-field indirection from record author. INLINE — keep in sync."
          },
          "buyLink": {
            "type": "string",
            "format": "uri",
            "maxLength": 500,
            "description": "URL to purchase or stream (Bandcamp, Beatport, Spotify, etc.)"
          },
          "clipUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 3000,
            "description": "FM-508: public URL to a short (~30s) truncated audio clip — the record's only public audio artifact. Tracks only; stems and samples never carry a clip. Optional."
          },
          "credits": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "role",
                "name"
              ],
              "properties": {
                "did": {
                  "type": "string",
                  "format": "did",
                  "description": "ATProto identity of the credited party, when on-network. OPTIONAL and load-bearing — named-but-unlinked credits are the common case."
                },
                "ipi": {
                  "type": "string",
                  "maxLength": 20,
                  "description": "IPI/CAE number for PRO reconciliation. Optional."
                },
                "name": {
                  "type": "string",
                  "maxLength": 256,
                  "description": "Credited party's name. Required. Works for off-network parties (sampled composer, session player) with no ATProto identity.",
                  "maxGraphemes": 128
                },
                "role": {
                  "type": "string",
                  "maxLength": 64,
                  "description": "Credit role. OPEN knownValues (not a closed enum) — off-list roles allowed without a lexicon bump; the list is UI-picker guidance.",
                  "knownValues": [
                    "composer",
                    "lyricist",
                    "composerLyricist",
                    "writer",
                    "arranger",
                    "adapter",
                    "translator",
                    "performer",
                    "featuredArtist",
                    "vocalist",
                    "producer",
                    "remixer",
                    "mixEngineer",
                    "masteringEngineer",
                    "sampledArtist",
                    "originalArtist"
                  ]
                }
              }
            },
            "maxLength": 64,
            "description": "Descriptive credit lines (FM-550). Repeatable; multiple entries may share a role. Record-of-fact only — read by NO money/control code (s41). PRO-registration shape, not a split sheet: no percentages, no payout fields."
          },
          "license": {
            "type": "string",
            "format": "at-uri",
            "maxLength": 3000,
            "description": "AT URI to the license grant record"
          },
          "audioUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 3000,
            "description": "DEPRECATED (FM-508): no longer emitted. Full-quality audio is private (gated download only) and is never surfaced in the portable record. Field kept (optional) to tolerate pre-FM-508 records without a putRecord rewrite."
          },
          "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"
            ]
          },
          "audioHash": {
            "type": "string",
            "maxLength": 200,
            "description": "SHA-256 hash of the audio file content"
          },
          "bpmCentis": {
            "type": "integer",
            "maximum": 99900,
            "minimum": 2000,
            "description": "Beats per minute in centiBPM (multiply actual BPM by 100, e.g., 174.50 BPM = 17450)"
          },
          "createdAt": {
            "type": "string",
            "format": "datetime",
            "maxLength": 100,
            "description": "Record creation timestamp"
          },
          "isReleased": {
            "type": "boolean",
            "description": "Whether this track was previously released outside FreeMix"
          },
          "priceCents": {
            "type": "integer",
            "minimum": 0,
            "description": "On-network price in integer cents (FM-549: price goes on-network; offer is public, sale is 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)."
          },
          "stemAccess": {
            "type": "string",
            "maxLength": 100,
            "description": "Who can access stems. Defaults to 'open'. Phase 1 only supports 'open' and 'community'.",
            "knownValues": [
              "open",
              "community",
              "request",
              "pro"
            ]
          },
          "artworkSeed": {
            "type": "string",
            "maxLength": 384,
            "description": "FM-729: seed the generative cover placeholder is drawn from. Grammar \"<title>#deck<gen>#regen<n>\"; both counters recompute from this one string, so there are no separate deck/attempt fields. Optional - absent means fall back to the title (the pre-FM-729 implicit seed), which renders the existing cover unchanged. Never an empty string (an empty seed is a fixed point of the generator's LCG and collapses the art). Kept on the record even when coverArtUrl is set, so removing an uploaded cover restores the same generated art. maxLength 384 = title's 300 plus suffix headroom."
          },
          "audioFormat": {
            "type": "string",
            "maxLength": 100,
            "description": "Audio file format",
            "knownValues": [
              "wav",
              "flac",
              "mp3",
              "aac",
              "ogg",
              "aiff"
            ]
          },
          "coverArtUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 3000,
            "description": "URL to cover art image"
          },
          "description": {
            "type": "string",
            "maxLength": 5000,
            "description": "Track description"
          },
          "releaseDate": {
            "type": "string",
            "format": "datetime",
            "description": "Original release date (ISO 8601)"
          },
          "coverArtHash": {
            "type": "string",
            "maxLength": 200,
            "description": "SHA-256 hash of the cover art"
          },
          "releaseLabel": {
            "type": "string",
            "maxLength": 255,
            "description": "Label name (e.g., 'Vizual Records', 'self-released')"
          },
          "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"
          },
          "catalogNumber": {
            "type": "string",
            "maxLength": 100,
            "description": "Catalog number (e.g., 'VIZ-042')"
          },
          "audioSizeBytes": {
            "type": "integer",
            "description": "Size of the audio file in bytes"
          },
          "audioDurationMs": {
            "type": "integer",
            "description": "Duration of the track in milliseconds"
          },
          "derivativeSubType": {
            "type": "string",
            "maxLength": 100,
            "description": "The derivative kind for Remix/Edit/Mashup uploads. Absent on Original tracks. Durable provenance — the authoritative signal that a track is a derivative, independent of source count. knownValues (not a closed enum) so future subtypes don't break existing records.",
            "knownValues": [
              "remix",
              "edit",
              "mashup"
            ]
          },
          "copyrightRecording": {
            "type": "string",
            "maxLength": 256,
            "description": "℗ line for the sound recording, e.g. '2026 <label>'. FM-550. NOTE: label rides here + the Previously-Released fields, NOT the credits role vocabulary (s41).",
            "maxGraphemes": 128
          },
          "copyrightComposition": {
            "type": "string",
            "maxLength": 256,
            "description": "© line for the composition, e.g. '2026 Joshua Michaels'. FM-550.",
            "maxGraphemes": 128
          },
          "noAttributableSourcesAttested": {
            "type": "boolean",
            "description": "True only when the uploader affirmed via the upload UI that this derivative has no FreeMix-attributable source (own work, licensed, off-platform, or since-deleted). Never set automatically from source count — it is an explicit human attestation, not a computed value."
          }
        }
      },
      "description": "A music track record on FreeMix. Top-level leaf (FM-549 s38: pulled out from under the release.* prefix; release.track -> track)."
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1
}
```
