openapi: 3.0.1 info: title: Audius challenges tracks API description: '## Overview The Audius API provides REST access to the world''s largest open music catalog, built on the [Open Audio Protocol](https://openaudio.org). Use it to query and stream tracks, users, playlists, and more—perfect for building music players, discovery apps, and audio-native products. ## Key Capabilities - **Users** — Profiles, followers, following, search - **Tracks** — Search, trending, stream, favorites, reposts - **Playlists** — Create, update, browse, curate - **Resolve** — Look up content by Audius canonical URLs (e.g. `audius.co/artist/...`) - **Explore** — Trending content, charts, discovery - **Comments, Tips, Rewards** — Social features and engagement ## Authentication - **Read-only** — Most endpoints work without credentials. Use an API key for higher rate limits. - **Writes** — Upload, favorite, repost, and other mutations require an API key and secret. Get keys at [api.audius.co/plans](https://api.audius.co/plans) or [audius.co/settings](https://audius.co/settings). ## Resources - [API Docs](https://docs.audius.co/api) — Full reference and guides - [API Plans](https://api.audius.co/plans) — Get API keys (free tier available) - [Log in with Audius](https://docs.audius.co/developers/guides/log-in-with-audius) — OAuth for user actions - [JavaScript SDK](https://www.npmjs.com/package/@audius/sdk) — `@audius/sdk` for Node and browser ' version: '1.0' contact: name: Audius url: https://audius.co x-logo: url: https://audius.co/favicons/favicon.ico servers: - url: https://api.audius.co/v1 description: Production tags: - name: tracks description: Track related operations paths: /tracks: get: tags: - tracks description: Gets a list of tracks using their IDs or permalinks operationId: Get Bulk Tracks security: - {} - OAuth2: - read parameters: - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: permalink in: query description: The permalink of the track(s) style: form explode: true schema: type: array items: type: string - name: id in: query description: The ID of the track(s) style: form explode: true schema: type: array items: type: string - name: isrc in: query description: The ISRC code of the track(s) style: form explode: true schema: type: array items: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' post: tags: - tracks description: Creates a new track operationId: Create Track security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: user_id in: query description: The user ID of the user making the request required: true schema: type: string requestBody: x-codegen-request-body-name: metadata required: true content: application/json: schema: $ref: '#/components/schemas/create_track_request_body' responses: '201': description: Track created successfully content: application/json: schema: $ref: '#/components/schemas/create_track_response' '400': description: Bad request content: {} '401': description: Unauthorized content: {} '500': description: Server error content: {} /tracks/download_counts: get: tags: - tracks description: Gets download counts for tracks by ID. Use this instead of loading full track objects when only download counts are needed. operationId: Get Track Download Counts security: - {} - OAuth2: - read parameters: - name: id in: query description: Track ID(s) required: true style: form explode: true schema: type: array items: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_download_counts_response' /tracks/inspect: get: tags: - tracks summary: Inspects the details of the files for multiple tracks description: Inspect multiple tracks operationId: Inspect Tracks parameters: - name: id in: query description: List of track IDs to inspect required: true style: form explode: true schema: type: array items: type: string - name: original in: query description: Optional - if set to true inspects the original file quality schema: type: boolean default: false responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_inspect_list' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/recent-premium: get: tags: - tracks description: Gets the most recently listed premium tracks operationId: Get Recent Premium Tracks security: - {} - OAuth2: - read parameters: - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/recommended: get: tags: - tracks description: Get recommended tracks operationId: Get Recommended Tracks security: - {} - OAuth2: - read parameters: - name: limit in: query description: The number of items to fetch schema: type: integer - name: genre in: query description: Filter trending to a specified genre schema: type: string - name: time in: query description: Calculate trending over a specified time range schema: type: string enum: - week - month - year - allTime - name: exclusion_list in: query description: List of track ids to exclude style: form explode: true schema: type: array items: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/recommended/{version}: get: tags: - tracks description: Get recommended tracks using the given trending strategy version operationId: Get Recommended Tracks With Version security: - {} - OAuth2: - read parameters: - name: version in: path description: The strategy version of trending to use required: true schema: type: string - name: limit in: query description: The number of items to fetch schema: type: integer - name: genre in: query description: Filter trending to a specified genre schema: type: string - name: time in: query description: Calculate trending over a specified time range schema: type: string enum: - week - month - year - allTime - name: exclusion_list in: query description: List of track ids to exclude style: form explode: true schema: type: array items: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/feeling-lucky: get: tags: - tracks description: Gets random tracks found on the "Feeling Lucky" smart playlist operationId: Get Feeling Lucky Tracks security: - {} - OAuth2: - read parameters: - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: limit in: query description: Number of tracks to fetch schema: type: integer default: 10 minimum: 1 maximum: 100 - name: with_users deprecated: true in: query description: Boolean to include user info with tracks schema: type: boolean default: false - name: min_followers in: query description: Fetch tracks from users with at least this number of followers schema: type: integer minimum: 1 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' '400': description: Bad request content: {} /tracks/recent-comments: get: tags: - tracks description: Gets the most recent tracks with active discussion operationId: Get Tracks With Recent Comments security: - {} - OAuth2: - read parameters: - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: limit in: query description: Number of tracks to fetch schema: type: integer default: 10 minimum: 1 maximum: 100 - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer default: 0 minimum: 0 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' '400': description: Bad request content: {} /tracks/most-shared: get: tags: - tracks description: Gets the most shared tracks for a given time range operationId: Get Most Shared Tracks security: - {} - OAuth2: - read parameters: - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: limit in: query description: Number of tracks to fetch schema: type: integer default: 10 minimum: 1 maximum: 100 - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer default: 0 minimum: 0 - name: time_range in: query description: The time range to consider schema: type: string default: week enum: - week - month - allTime responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/usdc-purchase: get: tags: - tracks description: Gets the top trending (most popular) USDC purchase tracks on Audius operationId: Get Trending USDC Purchase Tracks security: - {} - OAuth2: - read parameters: - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: genre in: query description: Filter trending to a specified genre schema: type: string - name: time in: query description: Calculate trending over a specified time range schema: type: string enum: - week - month - year - allTime responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/usdc-purchase/{version}: get: tags: - tracks description: Gets the top trending (most popular) USDC purchase tracks on Audius using a given trending strategy version operationId: Get Trending USDC Purchase Tracks With Version security: - {} - OAuth2: - read parameters: - name: version in: path description: The strategy version of trending to use required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: genre in: query description: Filter trending to a specified genre schema: type: string - name: time in: query description: Calculate trending over a specified time range schema: type: string enum: - week - month - year - allTime responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/search: get: tags: - tracks description: Search for a track or tracks operationId: Search Tracks parameters: - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: query in: query description: The search query schema: type: string - name: genre in: query description: The genres to filter by style: form explode: true schema: type: array items: type: string - name: sort_method in: query description: The sort method schema: type: string enum: - relevant - popular - recent - name: mood in: query description: The moods to filter by style: form explode: true schema: type: array items: type: string - name: only_downloadable in: query description: Return only downloadable tracks schema: type: string default: 'false' - name: includePurchaseable in: query description: Whether or not to include purchaseable content schema: type: string - name: is_purchaseable in: query description: Only include purchaseable tracks and albums in the track and album results schema: type: string - name: has_downloads in: query description: Only include tracks that have downloads in the track results schema: type: string - name: key in: query description: Only include tracks that match the musical key style: form explode: true schema: type: array items: type: string - name: bpm_min in: query description: Only include tracks that have a bpm greater than or equal to schema: type: string - name: bpm_max in: query description: Only include tracks that have a bpm less than or equal to schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_search' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/trending: get: tags: - tracks description: Gets the top 100 trending (most popular) tracks on Audius operationId: Get Trending Tracks security: - {} - OAuth2: - read parameters: - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: genre in: query description: Filter trending to a specified genre schema: type: string - name: time in: query description: Calculate trending over a specified time range schema: type: string enum: - week - month - year - allTime responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/trending/winners: get: tags: - tracks description: Gets weekly trending winners from the trending_results table. Returns track objects for the specified week. Defaults to the most recent week with data when no week is provided. operationId: Get Trending Winners security: - {} - OAuth2: - read parameters: - name: week in: query description: Target week in YYYY-MM-DD format. Defaults to the most recent week with data. schema: type: string format: date - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/trending/{version}: get: tags: - tracks description: Gets the top 100 trending (most popular) tracks on Audius using a given trending strategy version operationId: Get Trending Tracks With Version security: - {} - OAuth2: - read parameters: - name: version in: path description: The strategy version of trending to use required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: genre in: query description: Filter trending to a specified genre schema: type: string - name: time in: query description: Calculate trending over a specified time range schema: type: string enum: - week - month - year - allTime responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/trending/ids: get: tags: - tracks description: Gets the track IDs of the top trending tracks on Audius operationId: Get Trending Track IDs parameters: - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: genre in: query description: Filter trending to a specified genre schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/trending_ids_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/trending/ids/{version}: get: tags: - tracks description: Gets the track IDs of the top trending tracks on Audius based on the given trending strategy version operationId: Get Trending Tracks IDs With Version parameters: - name: version in: path description: The strategy version of trending to use required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: genre in: query description: Filter trending to a specified genre schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/trending_ids_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/trending/underground: get: tags: - tracks description: Gets the top 100 trending underground tracks on Audius operationId: Get Underground Trending Tracks security: - {} - OAuth2: - read parameters: - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/trending/underground/winners: get: tags: - tracks description: Gets weekly trending underground winners from the trending_results table. Returns track objects for the specified week. Defaults to the most recent week with data when no week is provided. operationId: Get Trending Underground Winners security: - {} - OAuth2: - read parameters: - name: week in: query description: Target week in YYYY-MM-DD format. Defaults to the most recent week with data. schema: type: string format: date - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/trending/underground/{version}: get: tags: - tracks description: Gets the top 100 trending underground tracks on Audius using a given trending strategy version operationId: Get Underground Trending Tracks With Version security: - {} - OAuth2: - read parameters: - name: version in: path description: The strategy version of trending to user required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/{track_id}: get: tags: - tracks description: Gets a track by ID. operationId: Get Track security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_response' put: tags: - tracks description: Updates an existing track operationId: Update Track security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request required: true schema: type: string requestBody: x-codegen-request-body-name: metadata required: true content: application/json: schema: $ref: '#/components/schemas/update_track_request_body' responses: '200': description: Track updated successfully content: application/json: schema: $ref: '#/components/schemas/write_response' '400': description: Bad request content: {} '401': description: Unauthorized content: {} '404': description: Track not found content: {} '500': description: Server error content: {} delete: tags: - tracks description: Deletes a track operationId: Delete Track security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request required: true schema: type: string responses: '200': description: Track deleted successfully content: application/json: schema: $ref: '#/components/schemas/write_response' '401': description: Unauthorized content: {} '404': description: Track not found content: {} '500': description: Server error content: {} /tracks/{track_id}/download_count: get: tags: - tracks description: Gets the download count for a single track. Full track + all stems (parent) or stem-only (stem). operationId: Get Track Download Count security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_download_count_response' /tracks/{track_id}/access-info: get: tags: - tracks description: Gets the information necessary to access the track and what access the given user has. operationId: Get Track Access Info security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/access_info_response' /tracks/{track_id}/comment_count: get: tags: - tracks description: Get the comment count for a track operationId: Get Track Comment Count security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_comment_count_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/{track_id}/comment_notification_setting: get: tags: - tracks description: Get the comment notification setting for a track operationId: Get Track Comment Notification Setting security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_comment_notification_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/{track_id}/comments: get: tags: - tracks description: Get a list of comments for a track operationId: Get Track Comments security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: sort_method in: query description: The sort method schema: type: string default: top enum: - top - newest - timestamp responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_comments_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/{track_id}/favorites: get: tags: - tracks description: Get users that favorited a track operationId: Get Users From Favorites security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_favorites_response' '400': description: Bad request content: {} '500': description: Server error content: {} post: tags: - tracks description: Favorite a track operationId: Favorite Track security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request required: true schema: type: string requestBody: required: false x-codegen-request-body-name: metadata content: application/json: schema: $ref: '#/components/schemas/favorite_request_body' responses: '200': description: Track favorited successfully content: application/json: schema: $ref: '#/components/schemas/write_response' '401': description: Unauthorized content: {} '404': description: Track not found content: {} '500': description: Server error content: {} delete: tags: - tracks description: Unfavorite a track operationId: Unfavorite Track security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request required: true schema: type: string responses: '200': description: Track unfavorited successfully content: application/json: schema: $ref: '#/components/schemas/write_response' '401': description: Unauthorized content: {} '404': description: Track not found content: {} '500': description: Server error content: {} /tracks/{track_id}/remixes: get: tags: - tracks description: Get all tracks that remix the given track operationId: Get Track Remixes security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: sort_method in: query description: The sort method to use schema: type: string default: recent enum: - likes - plays - recent - name: only_cosigns in: query description: Only remixes cosigned by the original artist schema: type: boolean - name: only_contest_entries in: query description: Only entries to a remix contest schema: type: boolean responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/remixes_response' /tracks/{track_id}/remixing: get: tags: - tracks description: Gets all the tracks that the given track remixes operationId: Get Track Remix Parents security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/remixing_response' /tracks/{track_id}/reposts: get: tags: - tracks description: Get the users that reposted a track operationId: Get Users From Reposts security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_reposts_response' '400': description: Bad request content: {} '500': description: Server error content: {} post: tags: - tracks description: Repost a track operationId: Repost Track security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request required: true schema: type: string requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/repost_request_body' responses: '200': description: Track reposted successfully content: application/json: schema: $ref: '#/components/schemas/write_response' '401': description: Unauthorized content: {} '404': description: Track not found content: {} '500': description: Server error content: {} delete: tags: - tracks description: Unrepost a track operationId: Unrepost Track security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request required: true schema: type: string responses: '200': description: Track unreposted successfully content: application/json: schema: $ref: '#/components/schemas/write_response' '401': description: Unauthorized content: {} '404': description: Track not found content: {} '500': description: Server error content: {} /tracks/{track_id}/download: get: tags: - tracks summary: Download the original or MP3 file of a track description: Download an original or mp3 track operationId: Download Track security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: user_signature in: query description: "Optional - signature from the requesting user's wallet.\n This is needed to authenticate the user and verify access in case the track is gated." schema: type: string - name: user_data in: query description: Optional - data which was used to generate the optional signature argument. schema: type: string - name: nft_access_signature in: query description: "Optional - nft access signature for this track which was previously generated by a registered DN.\n We perform checks on it and pass it through to CN." schema: type: string - name: filename in: query description: Optional - name of file to download. If not provided, defaults to track original filename or title. schema: type: string responses: '200': description: Success content: {} '216': description: Partial content content: {} '400': description: Bad request content: {} '416': description: Content range invalid content: {} '500': description: Server error content: {} /tracks/{track_id}/inspect: get: tags: - tracks summary: Inspects the details of the file for a track description: Inspect a track operationId: Inspect Track parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: original in: query description: Optional - if set to true inspects the original file quality schema: type: boolean default: false responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/track_inspect' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/{track_id}/stems: get: tags: - tracks description: Get the remixable stems of a track operationId: Get Track Stems parameters: - name: track_id in: path description: A Track ID required: true schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/stems_response' /tracks/{track_id}/shares: post: tags: - tracks description: Record a track share event operationId: Share Track security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: User ID required: true schema: type: string responses: '200': description: Track share recorded successfully content: application/json: schema: $ref: '#/components/schemas/write_response' '401': description: Unauthorized content: {} '404': description: Track not found content: {} '500': description: Server error content: {} /tracks/{track_id}/downloads: post: tags: - tracks description: Record a track download event operationId: Record Track Download security: - BearerAuth: [] - BasicAuth: [] - OAuth2: - write parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query required: false description: The user ID of the user making the request schema: type: string requestBody: x-codegen-request-body-name: location content: application/json: schema: $ref: '#/components/schemas/track_download_request_body' responses: '200': description: Track download recorded successfully content: application/json: schema: $ref: '#/components/schemas/write_response' '401': description: Unauthorized content: {} '404': description: Track not found content: {} '500': description: Server error content: {} /tracks/{track_id}/stream: get: tags: - tracks summary: Get the streamable MP3 file of a track description: 'Stream an mp3 track This endpoint accepts the Range header for streaming. https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests' operationId: Stream Track security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: preview in: query description: Optional - true if streaming track preview schema: type: boolean default: false - name: user_signature in: query description: "Optional - signature from the requesting user's wallet.\n This is needed to authenticate the user and verify access in case the track is gated." schema: type: string - name: user_data in: query description: Optional - data which was used to generate the optional signature argument. schema: type: string - name: nft_access_signature in: query description: "Optional - gated content signature for this track which was previously generated by a registered DN.\n We perform checks on it and pass it through to CN." schema: type: string - name: skip_play_count in: query description: Optional - boolean that disables tracking of play counts. schema: type: boolean default: false - name: api_key in: query description: Optional - API key for third party apps. This is required for tracks that only allow specific API keys. schema: type: string - name: skip_check in: query description: Optional - POC to skip node 'double dip' health check schema: type: boolean - name: no_redirect in: query description: Optional - If true will not return a 302 and instead will return the stream url in JSON schema: type: boolean responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/stream_url_response' '216': description: Partial content content: {} '400': description: Bad request content: {} '416': description: Content range invalid content: {} '500': description: Server error content: {} /tracks/{track_id}/top_listeners: get: tags: - tracks description: Get the users that have listened to a track the most operationId: Get Track Top Listeners security: - {} - OAuth2: - read parameters: - name: track_id in: path description: A Track ID required: true schema: type: string - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/top_listener' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/best_new_releases: get: tags: - tracks description: Gets the tracks found on the "Best New Releases" smart playlist operationId: Get Best New Releases security: - {} - OAuth2: - read parameters: - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: window in: query description: The window from now() to look back over required: true schema: type: string enum: - week - month - year - name: limit in: query description: The number of tracks to get schema: type: integer default: 25 - name: with_users in: query description: Boolean to include user info with tracks schema: type: boolean responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/most_loved: get: tags: - tracks description: Gets the tracks found on the "Most Loved" smart playlist operationId: Get Most Loved Tracks security: - {} - OAuth2: - read parameters: - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: limit in: query description: Number of tracks to fetch schema: type: integer default: 25 - name: with_users in: query description: Boolean to include user info with tracks schema: type: boolean responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' /tracks/remixables: get: tags: - tracks description: Gets a list of tracks that have stems available for remixing operationId: Get Remixable Tracks security: - {} - OAuth2: - read parameters: - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: with_users in: query description: Boolean to include user info with tracks schema: type: boolean responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/remixables_response' '400': description: Bad request content: {} '500': description: Server error content: {} /tracks/under_the_radar: get: tags: - tracks description: Gets the tracks found on the "Under the Radar" smart playlist operationId: Get Under the Radar Tracks security: - {} - OAuth2: - read parameters: - name: offset in: query description: The number of items to skip. Useful for pagination (page number * limit) schema: type: integer - name: limit in: query description: The number of items to fetch schema: type: integer - name: user_id in: query description: The user ID of the user making the request schema: type: string - name: filter in: query description: Filters for activity that is original vs reposts schema: type: string default: all enum: - all - repost - original - name: tracks_only in: query description: Whether to only include tracks schema: type: boolean - name: with_users in: query description: Boolean to include user info with tracks schema: type: boolean responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/tracks_response' components: schemas: access: required: - download - stream type: object properties: stream: type: boolean download: type: boolean track: required: - access - artwork - blocknumber - comment_count - cover_art_sizes - created_at - download - duration - favorite_count - field_visibility - followee_favorites - followee_reposts - genre - has_current_user_reposted - has_current_user_saved - id - is_available - is_delete - is_download_gated - is_downloadable - is_original_available - is_owned_by_user - is_scheduled_release - is_stream_gated - is_unlisted - permalink - play_count - preview - remix_of - repost_count - route_id - stream - title - track_segments - updated_at - user - user_id type: object properties: artwork: $ref: '#/components/schemas/track_artwork' description: type: string genre: type: string id: type: string track_cid: type: string preview_cid: type: string orig_file_cid: type: string orig_filename: type: string is_original_available: type: boolean mood: type: string release_date: type: string format: date remix_of: $ref: '#/components/schemas/remix_parent' repost_count: type: integer favorite_count: type: integer comment_count: type: integer tags: type: string title: type: string user: $ref: '#/components/schemas/user' duration: type: integer is_downloadable: type: boolean play_count: type: integer permalink: type: string is_streamable: type: boolean ddex_app: type: string playlists_containing_track: type: array items: type: integer pinned_comment_id: type: integer album_backlink: $ref: '#/components/schemas/album_backlink' access: type: object description: Describes what access the given user has allOf: - $ref: '#/components/schemas/access' blocknumber: type: integer description: The blocknumber this track was last updated create_date: type: string cover_art_sizes: type: string cover_art_cids: $ref: '#/components/schemas/cover_art' created_at: type: string credits_splits: type: string isrc: type: string license: type: string iswc: type: string field_visibility: $ref: '#/components/schemas/field_visibility' followee_reposts: type: array items: $ref: '#/components/schemas/repost' has_current_user_reposted: type: boolean is_scheduled_release: type: boolean is_unlisted: type: boolean has_current_user_saved: type: boolean followee_favorites: type: array items: $ref: '#/components/schemas/favorite' route_id: type: string stem_of: $ref: '#/components/schemas/stem_parent' track_segments: type: array items: $ref: '#/components/schemas/track_segment' updated_at: type: string user_id: type: string is_delete: type: boolean cover_art: type: string is_available: type: boolean ai_attribution_user_id: type: integer allowed_api_keys: type: array items: type: string audio_upload_id: type: string preview_start_seconds: type: number bpm: type: number is_custom_bpm: type: boolean musical_key: type: string is_custom_musical_key: type: boolean audio_analysis_error_count: type: integer comments_disabled: type: boolean ddex_release_ids: type: object properties: {} artists: type: array items: type: object properties: {} resource_contributors: type: array nullable: true items: $ref: '#/components/schemas/ddex_resource_contributor' indirect_resource_contributors: type: array nullable: true items: $ref: '#/components/schemas/ddex_resource_contributor' rights_controller: nullable: true $ref: '#/components/schemas/ddex_rights_controller' copyright_line: nullable: true allOf: - $ref: '#/components/schemas/ddex_copyright' producer_copyright_line: nullable: true allOf: - $ref: '#/components/schemas/ddex_copyright' parental_warning_type: type: string nullable: true is_stream_gated: type: boolean description: Whether or not the owner has restricted streaming behind an access gate access_authorities: type: array nullable: true items: type: string description: Wallet addresses that can sign to authorize stream access (programmable distribution). When empty or omitted, the track is public and validator/creator nodes can serve it. stream_conditions: type: object description: How to unlock stream access to the track allOf: - $ref: '#/components/schemas/access_gate' is_download_gated: type: boolean description: Whether or not the owner has restricted downloading behind an access gate download_conditions: type: object description: How to unlock the track download allOf: - $ref: '#/components/schemas/access_gate' cover_original_song_title: type: string cover_original_artist: type: string is_owned_by_user: type: boolean description: Indicates whether the track is owned by the user for MRI sake stream: $ref: '#/components/schemas/url_with_mirrors' download: $ref: '#/components/schemas/url_with_mirrors' preview: $ref: '#/components/schemas/url_with_mirrors' playlist_library: type: object properties: contents: type: array items: type: object properties: {} track_comments_response: required: - latest_chain_block - latest_chain_slot_plays - latest_indexed_block - latest_indexed_slot_plays - signature - timestamp - version type: object properties: latest_chain_block: type: integer latest_indexed_block: type: integer latest_chain_slot_plays: type: integer latest_indexed_slot_plays: type: integer signature: type: string timestamp: type: string version: $ref: '#/components/schemas/version_metadata' data: type: array items: $ref: '#/components/schemas/comment' related: $ref: '#/components/schemas/related' field_visibility: required: - genre - mood - play_count - remixes - share - tags type: object properties: mood: type: boolean tags: type: boolean genre: type: boolean share: type: boolean play_count: type: boolean remixes: type: boolean track_inspect: type: object properties: data: $ref: '#/components/schemas/blob_info' track_access_info: required: - blocknumber - user_id type: object properties: access: type: object description: Describes what access the given user has allOf: - $ref: '#/components/schemas/access' user_id: type: string description: The user ID of the owner of this track blocknumber: type: integer description: The blocknumber this track was last updated is_stream_gated: type: boolean description: Whether or not the owner has restricted streaming behind an access gate stream_conditions: type: object description: How to unlock stream access to the track allOf: - $ref: '#/components/schemas/extended_access_gate' is_download_gated: type: boolean description: Whether or not the owner has restricted downloading behind an access gate download_conditions: type: object description: How to unlock the track download allOf: - $ref: '#/components/schemas/extended_access_gate' track_reposts_response: required: - latest_chain_block - latest_chain_slot_plays - latest_indexed_block - latest_indexed_slot_plays - signature - timestamp - version type: object properties: latest_chain_block: type: integer latest_indexed_block: type: integer latest_chain_slot_plays: type: integer latest_indexed_slot_plays: type: integer signature: type: string timestamp: type: string version: $ref: '#/components/schemas/version_metadata' data: type: array items: $ref: '#/components/schemas/user' remix_parent: type: object properties: tracks: type: array items: $ref: '#/components/schemas/remix' trending_times_ids: type: object properties: week: type: array items: $ref: '#/components/schemas/track_id' month: type: array items: $ref: '#/components/schemas/track_id' year: type: array items: $ref: '#/components/schemas/track_id' track_id: required: - id type: object properties: id: type: string playlist_artwork: type: object properties: 150x150: type: string 480x480: type: string 1000x1000: type: string mirrors: type: array items: type: string track_artwork: type: object properties: 150x150: type: string 480x480: type: string 1000x1000: type: string mirrors: type: array items: type: string update_track_request_body: type: object description: Request body for updating track information. All fields are optional. properties: title: type: string description: Track title genre: $ref: '#/components/schemas/genre' description: type: string nullable: true description: Track description maxLength: 1000 mood: nullable: true allOf: - $ref: '#/components/schemas/mood' bpm: type: number nullable: true description: Beats per minute (tempo) musical_key: type: string nullable: true description: Musical key of the track tags: type: string nullable: true description: Comma-separated tags license: type: string nullable: true description: License type isrc: type: string nullable: true description: International Standard Recording Code iswc: type: string nullable: true description: International Standard Musical Work Code release_date: type: string format: date description: Release date track_cid: type: string description: CID for the track audio file orig_file_cid: type: string description: CID for the original track file orig_filename: type: string description: Original filename of the track cover_art_sizes: type: string description: CID for the track cover art preview_cid: type: string description: CID for the track preview preview_start_seconds: type: number format: float description: Preview start time in seconds minimum: 0 duration: type: number format: float description: Track duration in seconds minimum: 0 is_downloadable: type: boolean description: Whether the track is downloadable is_unlisted: type: boolean description: Whether the track is unlisted is_stream_gated: type: boolean description: Whether streaming is restricted behind an access gate access_authorities: type: array nullable: true items: type: string description: Wallet addresses that can sign to authorize stream access (programmable distribution). When empty or omitted, the track is public and validator/creator nodes can serve it. stream_conditions: nullable: true allOf: - $ref: '#/components/schemas/access_gate' download_conditions: nullable: true allOf: - $ref: '#/components/schemas/access_gate' field_visibility: $ref: '#/components/schemas/field_visibility' placement_hosts: type: string description: Placement hosts for the track stem_of: $ref: '#/components/schemas/stem_parent' remix_of: $ref: '#/components/schemas/remix_parent_write' ddex_app: type: string nullable: true description: DDEX application identifier parental_warning_type: type: string nullable: true description: Parental warning type track_favorites_response: required: - latest_chain_block - latest_chain_slot_plays - latest_indexed_block - latest_indexed_slot_plays - signature - timestamp - version type: object properties: latest_chain_block: type: integer latest_indexed_block: type: integer latest_chain_slot_plays: type: integer latest_indexed_slot_plays: type: integer signature: type: string timestamp: type: string version: $ref: '#/components/schemas/version_metadata' data: type: array items: $ref: '#/components/schemas/user' create_track_response: type: object properties: transaction_hash: type: string description: The blockchain transaction hash block_hash: type: string description: The blockchain block hash block_number: type: integer format: int64 description: The blockchain block number/height track_id: type: string description: The ID of the created track ddex_rights_controller: type: object description: DDEX rights controller required: - name - roles properties: name: type: string minLength: 1 roles: type: array minItems: 1 items: type: string minLength: 1 rights_share_unknown: type: string description: Optional comment_notification_setting: required: - is_muted type: object properties: is_muted: type: boolean token_gate: required: - token_gate type: object properties: token_gate: type: object description: Must hold an NFT of the given collection to unlock allOf: - $ref: '#/components/schemas/extended_token_gate' remixing_response: required: - latest_chain_block - latest_chain_slot_plays - latest_indexed_block - latest_indexed_slot_plays - signature - timestamp - version type: object properties: latest_chain_block: type: integer latest_indexed_block: type: integer latest_chain_slot_plays: type: integer latest_indexed_slot_plays: type: integer signature: type: string timestamp: type: string version: $ref: '#/components/schemas/version_metadata' data: type: array items: $ref: '#/components/schemas/track' comment: required: - created_at - entity_id - entity_type - id - is_edited - message - react_count - reply_count type: object properties: id: type: string entity_id: type: string entity_type: $ref: '#/components/schemas/comment_entity_type' user_id: type: string message: type: string mentions: type: array items: $ref: '#/components/schemas/comment_mention' track_timestamp_s: type: integer react_count: type: integer reply_count: type: integer is_edited: type: boolean is_current_user_reacted: type: boolean is_artist_reacted: type: boolean is_tombstone: type: boolean is_muted: type: boolean created_at: type: string updated_at: type: string replies: type: array items: $ref: '#/components/schemas/reply_comment' parent_comment_id: type: integer tip_gate: required: - tip_user_id type: object properties: tip_user_id: type: integer description: Must tip the given user ID to unlock usdc_gate: required: - price - splits type: object properties: price: type: integer description: The price in USDC needed to unlock splits: type: array items: $ref: '#/components/schemas/payment_split' album_backlink: required: - permalink - playlist_id - playlist_name type: object properties: playlist_id: type: integer playlist_name: type: string permalink: type: string payment_split: required: - user_id - percentage type: object properties: user_id: type: integer example: 1234 percentage: type: number remixes_response: type: object properties: data: type: object required: - count properties: count: type: integer tracks: type: array items: $ref: '#/components/schemas/track' extended_purchase_gate: required: - usdc_purchase type: object properties: usdc_purchase: type: object description: Must pay the total price and split to the given addresses to unlock allOf: - $ref: '#/components/schemas/extended_usdc_gate' extended_usdc_gate: required: - price - splits type: object properties: price: type: integer splits: type: array items: $ref: '#/components/schemas/extended_payment_split' remix: required: - has_remix_author_reposted - has_remix_author_saved - parent_track_id - user type: object properties: parent_track_id: type: string user: $ref: '#/components/schemas/user' has_remix_author_reposted: type: boolean has_remix_author_saved: type: boolean track_comment_count_response: type: object properties: data: type: integer track_response: required: - latest_chain_block - latest_chain_slot_plays - latest_indexed_block - latest_indexed_slot_plays - signature - timestamp - version type: object properties: latest_chain_block: type: integer latest_indexed_block: type: integer latest_chain_slot_plays: type: integer latest_indexed_slot_plays: type: integer signature: type: string timestamp: type: string version: $ref: '#/components/schemas/version_metadata' data: $ref: '#/components/schemas/track' access_gate: oneOf: - $ref: '#/components/schemas/tip_gate' - $ref: '#/components/schemas/follow_gate' - $ref: '#/components/schemas/purchase_gate' - $ref: '#/components/schemas/token_gate' repost_request_body: type: object description: Optional metadata for repost operations properties: is_repost_of_repost: type: boolean description: Set to true when reposting an item that was reposted (used for notifications) reply_comment: required: - created_at - entity_id - entity_type - id - is_edited - message - react_count - user_id type: object properties: id: type: string entity_id: type: string entity_type: $ref: '#/components/schemas/comment_entity_type' user_id: type: string message: type: string mentions: type: array items: $ref: '#/components/schemas/comment_mention' track_timestamp_s: type: integer react_count: type: integer is_edited: type: boolean is_current_user_reacted: type: boolean is_artist_reacted: type: boolean created_at: type: string updated_at: type: string parent_comment_id: type: integer stream_url_response: required: - data type: object properties: data: type: string mood: type: string description: Music mood enum: - Peaceful - Romantic - Sentimental - Tender - Easygoing - Yearning - Sophisticated - Sensual - Cool - Gritty - Melancholy - Serious - Brooding - Fiery - Defiant - Aggressive - Rowdy - Excited - Energizing - Empowering - Stirring - Upbeat - Other track_download_counts_response: type: object required: - data properties: data: type: array items: type: object required: - id - download_count properties: id: type: string description: Track ID (hash) download_count: type: integer description: Full track + all stems (parent) or stem-only (stem) track_search: type: object properties: data: type: array items: $ref: '#/components/schemas/track' top_listener: type: object properties: data: type: array items: $ref: '#/components/schemas/top_listener' comment_entity_type: type: string description: Type of entity that can be commented on enum: - Track stem_parent: required: - category - parent_track_id type: object properties: category: type: string parent_track_id: type: integer ddex_copyright: type: object required: - year - text properties: year: type: string minLength: 4 maxLength: 4 description: Copyright year (4 characters) text: type: string minLength: 1 description: Copyright text remixables_response: required: - latest_chain_block - latest_chain_slot_plays - latest_indexed_block - latest_indexed_slot_plays - signature - timestamp - version type: object properties: latest_chain_block: type: integer latest_indexed_block: type: integer latest_chain_slot_plays: type: integer latest_indexed_slot_plays: type: integer signature: type: string timestamp: type: string version: $ref: '#/components/schemas/version_metadata' data: type: array items: $ref: '#/components/schemas/track' extended_token_gate: required: - token_mint - token_amount type: object properties: token_mint: type: string description: The mint of the token needed to unlock token_amount: type: integer description: The amount of the token needed to unlock version_metadata: required: - service - version type: object properties: service: type: string version: type: string ddex_resource_contributor: type: object required: - name - roles properties: name: type: string minLength: 1 description: Contributor name roles: type: array minItems: 1 items: type: string minLength: 1 description: Contributor roles sequence_number: type: integer minimum: 0 description: Sequence number for ordering track_element_write: required: - parent_track_id type: object properties: parent_track_id: type: string example: x5pJ3Az comment_mention: required: - handle - user_id type: object properties: user_id: type: integer handle: type: string playlist: required: - access - added_timestamps - blocknumber - created_at - favorite_count - followee_favorites - followee_reposts - has_current_user_reposted - has_current_user_saved - id - is_album - is_delete - is_image_autogenerated - is_private - is_scheduled_release - is_stream_gated - permalink - playlist_contents - playlist_name - repost_count - total_play_count - track_count - updated_at - user - user_id type: object properties: artwork: $ref: '#/components/schemas/playlist_artwork' description: type: string permalink: type: string id: type: string is_album: type: boolean is_image_autogenerated: type: boolean playlist_name: type: string playlist_contents: type: array items: $ref: '#/components/schemas/playlist_added_timestamp' repost_count: type: integer favorite_count: type: integer total_play_count: type: integer user: $ref: '#/components/schemas/user' ddex_app: type: string access: $ref: '#/components/schemas/access' upc: type: string track_count: type: integer blocknumber: type: integer created_at: type: string followee_reposts: type: array items: $ref: '#/components/schemas/repost' followee_favorites: type: array items: $ref: '#/components/schemas/favorite' has_current_user_reposted: type: boolean has_current_user_saved: type: boolean is_delete: type: boolean is_private: type: boolean updated_at: type: string added_timestamps: type: array description: DEPRECATED. Use playlist_contents instead. items: $ref: '#/components/schemas/playlist_added_timestamp' user_id: type: string tracks: type: array items: $ref: '#/components/schemas/track' cover_art: type: string cover_art_sizes: type: string cover_art_cids: $ref: '#/components/schemas/playlist_artwork' is_stream_gated: type: boolean stream_conditions: type: object description: How to unlock stream access to the track allOf: - $ref: '#/components/schemas/access_gate' is_scheduled_release: type: boolean release_date: type: string format: date ddex_release_ids: type: object properties: {} artists: type: array items: type: object properties: {} copyright_line: type: object properties: {} producer_copyright_line: type: object properties: {} parental_warning_type: type: string nullable: true track_inspect_list: type: object properties: data: type: array items: $ref: '#/components/schemas/blob_info' favorite: required: - created_at - favorite_item_id - favorite_type - user_id type: object properties: favorite_item_id: type: string favorite_type: type: string user_id: type: string created_at: type: string track_download_request_body: type: object properties: city: type: string description: City where the download occurred region: type: string description: Region where the download occurred country: type: string description: Country where the download occurred tracks_response: required: - latest_chain_block - latest_chain_slot_plays - latest_indexed_block - latest_indexed_slot_plays - signature - timestamp - version type: object properties: latest_chain_block: type: integer latest_indexed_block: type: integer latest_chain_slot_plays: type: integer latest_indexed_slot_plays: type: integer signature: type: string timestamp: type: string version: $ref: '#/components/schemas/version_metadata' data: type: array items: $ref: '#/components/schemas/track' cover_photo: type: object properties: 640x: type: string 2000x: type: string mirrors: type: array items: type: string track_comment_notification_response: type: object properties: data: $ref: '#/components/schemas/comment_notification_setting' cover_art: type: object properties: 150x150: type: string 480x480: type: string 1000x1000: type: string mirrors: type: array items: type: string playlist_added_timestamp: required: - timestamp - track_id type: object properties: metadata_timestamp: type: integer description: Optional. Metadata timestamp for when the track was added to the playlist. timestamp: type: integer track_id: type: string access_info_response: type: object properties: data: $ref: '#/components/schemas/track_access_info' track_segment: required: - duration - multihash type: object properties: duration: type: number multihash: type: string favorite_request_body: type: object description: Optional metadata for favorite/save operations properties: is_save_of_repost: type: boolean description: Set to true when favoriting a reposted item (used for notifications) extended_payment_split: required: - amount - payout_wallet - percentage type: object properties: user_id: type: integer example: 1234 percentage: type: number eth_wallet: type: string payout_wallet: type: string amount: type: integer remix_parent_write: type: object required: - tracks properties: tracks: type: array items: $ref: '#/components/schemas/track_element_write' purchase_gate: required: - usdc_purchase type: object properties: usdc_purchase: type: object description: Must pay the total price and split to the given addresses to unlock allOf: - $ref: '#/components/schemas/usdc_gate' stem: required: - blocknumber - category - cid - id - orig_filename - parent_id - user_id type: object properties: id: type: string parent_id: type: string category: type: string cid: type: string user_id: type: string blocknumber: type: integer orig_filename: type: string related: type: object properties: users: type: array items: $ref: '#/components/schemas/user' tracks: type: array items: $ref: '#/components/schemas/track' playlists: type: array items: $ref: '#/components/schemas/playlist' create_track_request_body: type: object required: - title - genre - track_cid properties: track_id: type: string description: Optional track ID (will be generated if not provided) example: x5pJ3Az title: type: string description: Track title example: My New Track genre: $ref: '#/components/schemas/genre' description: type: string nullable: true description: Track description maxLength: 1000 mood: nullable: true allOf: - $ref: '#/components/schemas/mood' bpm: type: number nullable: true description: Beats per minute (tempo) musical_key: type: string nullable: true description: Musical key of the track tags: type: string nullable: true description: Comma-separated tags license: type: string nullable: true description: License type isrc: type: string nullable: true description: International Standard Recording Code iswc: type: string nullable: true description: International Standard Musical Work Code release_date: type: string format: date description: Release date track_cid: type: string description: CID for the track audio file (required) orig_file_cid: type: string description: CID for the original track file orig_filename: type: string description: Original filename of the track cover_art_sizes: type: string description: CID for the track cover art preview_cid: type: string description: CID for the track preview preview_start_seconds: type: number format: float description: Preview start time in seconds minimum: 0 duration: type: number format: float description: Track duration in seconds minimum: 0 is_downloadable: type: boolean description: Whether the track is downloadable is_unlisted: type: boolean description: Whether the track is unlisted is_stream_gated: type: boolean nullable: true description: Whether streaming is restricted behind an access gate access_authorities: type: array nullable: true items: type: string description: Wallet addresses that can sign to authorize stream access (programmable distribution). When empty or omitted, the track is public and validator/creator nodes can serve it. stream_conditions: nullable: true allOf: - $ref: '#/components/schemas/access_gate' download_conditions: nullable: true allOf: - $ref: '#/components/schemas/access_gate' field_visibility: $ref: '#/components/schemas/field_visibility' placement_hosts: type: string description: Placement hosts for the track stem_of: $ref: '#/components/schemas/stem_parent' remix_of: $ref: '#/components/schemas/remix_parent_write' ddex_app: type: string nullable: true description: DDEX application identifier ddex_release_ids: type: object nullable: true description: DDEX release identifiers artists: type: array nullable: true items: type: object description: DDEX resource contributors / artists resource_contributors: type: array nullable: true items: $ref: '#/components/schemas/ddex_resource_contributor' description: DDEX resource contributors indirect_resource_contributors: type: array nullable: true items: $ref: '#/components/schemas/ddex_resource_contributor' description: DDEX indirect resource contributors rights_controller: nullable: true $ref: '#/components/schemas/ddex_rights_controller' description: DDEX rights controller copyright_line: nullable: true allOf: - $ref: '#/components/schemas/ddex_copyright' description: DDEX copyright line producer_copyright_line: nullable: true allOf: - $ref: '#/components/schemas/ddex_copyright' description: DDEX producer copyright line parental_warning_type: type: string nullable: true description: Parental warning type cover_original_song_title: type: string nullable: true description: Original song title for cover tracks cover_original_artist: type: string nullable: true description: Original artist for cover tracks is_owned_by_user: type: boolean description: Whether the track is owned by the user territory_codes: type: array nullable: true items: type: string description: Territory codes for distribution no_ai_use: type: boolean description: Whether AI use is prohibited url_with_mirrors: required: - mirrors type: object properties: url: type: string mirrors: type: array items: type: string genre: type: string description: Music genre enum: - Electronic - Rock - Metal - Alternative - Hip-Hop/Rap - Experimental - Punk - Folk - Pop - Ambient - Soundtrack - World - Jazz - Acoustic - Funk - R&B/Soul - Devotional - Classical - Reggae - Podcasts - Country - Spoken Word - Comedy - Blues - Kids - Audiobooks - Latin - Lo-Fi - Hyperpop - Dancehall - Techno - Trap - House - Tech House - Deep House - Disco - Electro - Jungle - Progressive House - Hardstyle - Glitch Hop - Trance - Future Bass - Future House - Tropical House - Downtempo - Drum & Bass - Dubstep - Jersey Club - Vaporwave - Moombahton profile_picture: type: object properties: 150x150: type: string 480x480: type: string 1000x1000: type: string mirrors: type: array items: type: string trending_ids_response: type: object properties: data: $ref: '#/components/schemas/trending_times_ids' track_download_count_response: type: object required: - data properties: data: type: object required: - id - download_count properties: id: type: string description: Track ID (hash) download_count: type: integer description: Full track + all stems (parent) or stem-only (stem) write_response: type: object properties: transaction_hash: type: string description: The blockchain transaction hash block_hash: type: string description: The blockchain block hash block_number: type: integer format: int64 description: The blockchain block number/height stems_response: required: - latest_chain_block - latest_chain_slot_plays - latest_indexed_block - latest_indexed_slot_plays - signature - timestamp - version type: object properties: latest_chain_block: type: integer latest_indexed_block: type: integer latest_chain_slot_plays: type: integer latest_indexed_slot_plays: type: integer signature: type: string timestamp: type: string version: $ref: '#/components/schemas/version_metadata' data: type: array items: $ref: '#/components/schemas/stem' user: required: - album_count - allow_ai_attribution - artist_coin_badge - associated_sol_wallets_balance - associated_wallets_balance - balance - blocknumber - created_at - current_user_followee_follow_count - does_current_user_follow - does_current_user_subscribe - does_follow_current_user - erc_wallet - followee_count - follower_count - handle - handle_lc - has_collectibles - id - is_available - is_deactivated - is_storage_v2 - is_verified - name - playlist_count - repost_count - spl_wallet - spl_usdc_wallet - supporter_count - supporting_count - total_audio_balance - total_balance - track_count - updated_at - verified_with_instagram - verified_with_tiktok - verified_with_twitter - wallet - waudio_balance type: object properties: album_count: type: integer artist_pick_track_id: type: string artist_coin_badge: type: object properties: mint: type: string logo_uri: type: string banner_image_url: type: string ticker: type: string description: The coin symbol/ticker coin_flair_mint: type: string bio: type: string cover_photo: $ref: '#/components/schemas/cover_photo' followee_count: type: integer follower_count: type: integer handle: type: string id: type: string is_verified: type: boolean twitter_handle: type: string instagram_handle: type: string tiktok_handle: type: string verified_with_twitter: type: boolean verified_with_instagram: type: boolean verified_with_tiktok: type: boolean website: type: string donation: type: string location: type: string name: type: string playlist_count: type: integer profile_picture: $ref: '#/components/schemas/profile_picture' repost_count: type: integer track_count: type: integer is_deactivated: type: boolean is_available: type: boolean erc_wallet: type: string spl_wallet: type: string spl_usdc_wallet: type: string spl_usdc_payout_wallet: type: string supporter_count: type: integer supporting_count: type: integer total_audio_balance: type: integer wallet: type: string description: The user's Ethereum wallet address for their account balance: type: string associated_wallets_balance: type: string total_balance: type: string waudio_balance: type: string associated_sol_wallets_balance: type: string blocknumber: type: integer created_at: type: string is_storage_v2: type: boolean creator_node_endpoint: type: string current_user_followee_follow_count: type: integer does_current_user_follow: type: boolean does_current_user_subscribe: type: boolean does_follow_current_user: type: boolean handle_lc: type: string updated_at: type: string cover_photo_sizes: type: string cover_photo_cids: $ref: '#/components/schemas/cover_photo' cover_photo_legacy: type: string profile_picture_sizes: type: string profile_picture_cids: $ref: '#/components/schemas/profile_picture' profile_picture_legacy: type: string has_collectibles: type: boolean playlist_library: $ref: '#/components/schemas/playlist_library' allow_ai_attribution: type: boolean profile_type: type: string follow_gate: required: - follow_user_id type: object properties: follow_user_id: type: integer description: Must follow the given user ID to unlock repost: required: - repost_item_id - repost_type - user_id type: object properties: repost_item_id: type: string repost_type: type: string user_id: type: string blob_info: required: - content_type - size type: object properties: size: type: integer content_type: type: string extended_access_gate: oneOf: - $ref: '#/components/schemas/tip_gate' - $ref: '#/components/schemas/follow_gate' - $ref: '#/components/schemas/extended_purchase_gate' - $ref: '#/components/schemas/token_gate' securitySchemes: OAuth2: type: oauth2 description: 'OAuth 2.0 Authorization Code flow with PKCE for third-party applications. Allows apps to authenticate users and obtain access tokens scoped to read or read+write permissions on behalf of the user. **Scopes:** - `read` — Read-only access to the user''s public and private data. - `write` — Read and write access, allowing mutations on behalf of the user. **PKCE Required:** All authorization code requests must include `code_challenge` and `code_challenge_method=S256` parameters. ' flows: authorizationCode: authorizationUrl: /v1/oauth/authorize tokenUrl: /v1/oauth/token scopes: read: Read-only access to user data write: Read and write access on behalf of the user BasicAuth: type: http scheme: basic description: 'HTTP Basic Authentication with Ethereum private key for write operations. **Authentication** Use HTTP Basic Authentication where the password field contains your Ethereum private key: ``` Authorization: Basic ``` The username can be any value. The password must be your Ethereum private key in hex format (with or without 0x prefix). Example: ``` Authorization: Basic dXNlcm5hbWU6MHgxMjM0NTY3ODkwYWJjZGVmLi4u ``` **How it works:** 1. The API decodes the Basic Auth credentials 2. Extracts the private key from the password field 3. Derives the Ethereum address from the private key 4. Uses this address for authorization checks **Authorization** The derived wallet address must be either: - The wallet of the user being acted upon (direct ownership) - A wallet with an approved, non-revoked grant for the user (manager mode) ' BearerAuth: type: http scheme: bearer bearerFormat: JWT description: 'The API bearer token or OAuth JWT token for the user. ' x-original-swagger-version: '2.0'