naftiko: 1.0.0-alpha2 info: label: TIDAL Playback API — Downloads, Offline Tasks, Usage Rules description: TIDAL Playback API — Downloads, Offline Tasks, Usage Rules. 12 operations. Self-contained Naftiko capability covering one TIDAL business surface. tags: - TIDAL - Music - downloads - offlineTasks - usageRules created: '2026-05-25' modified: '2026-05-25' binds: - namespace: env keys: TIDAL_ACCESS_TOKEN: TIDAL_ACCESS_TOKEN capability: consumes: - type: http namespace: playback-downloads baseUri: https://openapi.tidal.com description: TIDAL Playback API — Downloads, Offline Tasks, Usage Rules business capability. Self-contained, no shared references. resources: - name: downloads path: /downloads operations: - name: getdownloads method: GET description: Get multiple downloads. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: include in: query type: array description: 'Allows the client to customize which related resources should be returned. Available options: owners' required: false - name: filter[id] in: query type: array description: Download id (e.g. `VFJBQ0tTOjEyMzQ1`) required: false - name: downloads-id path: /downloads/{id} operations: - name: getdownloads method: GET description: Get single download. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: id in: path type: string description: Download id required: true - name: include in: query type: array description: 'Allows the client to customize which related resources should be returned. Available options: owners' required: false - name: downloads-id-relationships-owners path: /downloads/{id}/relationships/owners operations: - name: getdownloads method: GET description: Get owners relationship ("to-many"). outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: id in: path type: string description: Download id required: true - name: include in: query type: array description: 'Allows the client to customize which related resources should be returned. Available options: owners' required: false - name: page[cursor] in: query type: string description: Server-generated cursor value pointing a certain page of items. Optional, targets first page if not specified required: false - name: offlineTasks path: /offlineTasks operations: - name: getofflinetasks method: GET description: Get multiple offlineTasks. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: page[cursor] in: query type: string description: Server-generated cursor value pointing a certain page of items. Optional, targets first page if not specified required: false - name: include in: query type: array description: 'Allows the client to customize which related resources should be returned. Available options: collection, item, owners' required: false - name: filter[id] in: query type: array description: List of offline task IDs (e.g. `a468bee8-8def-4a1b-8c1e-123456789abc`) required: false - name: filter[installation.id] in: query type: array description: List of offline task IDs (e.g. `a468bee88def`) required: false - name: offlineTasks-id path: /offlineTasks/{id} operations: - name: getofflinetasks method: GET description: Get single offlineTask. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: id in: path type: string description: Offline task id required: true - name: include in: query type: array description: 'Allows the client to customize which related resources should be returned. Available options: collection, item, owners' required: false - name: patchofflinetasks method: PATCH description: Update single offlineTask. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: id in: path type: string description: Offline task id required: true - name: body in: body type: object description: JSON:API document request body. required: true - name: offlineTasks-id-relationships-collection path: /offlineTasks/{id}/relationships/collection operations: - name: getofflinetasks method: GET description: Get collection relationship ("to-one"). outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: id in: path type: string description: Offline task id required: true - name: include in: query type: array description: 'Allows the client to customize which related resources should be returned. Available options: collection' required: false - name: offlineTasks-id-relationships-item path: /offlineTasks/{id}/relationships/item operations: - name: getofflinetasks method: GET description: Get item relationship ("to-one"). outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: id in: path type: string description: Offline task id required: true - name: include in: query type: array description: 'Allows the client to customize which related resources should be returned. Available options: item' required: false - name: offlineTasks-id-relationships-owners path: /offlineTasks/{id}/relationships/owners operations: - name: getofflinetasks method: GET description: Get owners relationship ("to-many"). outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: id in: path type: string description: Offline task id required: true - name: include in: query type: array description: 'Allows the client to customize which related resources should be returned. Available options: owners' required: false - name: page[cursor] in: query type: string description: Server-generated cursor value pointing a certain page of items. Optional, targets first page if not specified required: false - name: usageRules path: /usageRules operations: - name: getusagerules method: GET description: Get multiple usageRules. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: filter[id] in: query type: array description: List of usage rules IDs (e.g. `VFJBQ0tTOjEyMzpOTw`) required: false - name: postusagerules method: POST description: Create single usageRule. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: body in: body type: object description: JSON:API document request body. required: true - name: usageRules-id path: /usageRules/{id} operations: - name: getusagerules method: GET description: Get single usageRule. outputRawFormat: json outputParameters: - name: result type: object value: $. inputParameters: - name: id in: path type: string description: Usage rules id required: true authentication: type: bearer value: '{{env.TIDAL_ACCESS_TOKEN}}' placement: header header: Authorization prefix: 'Bearer ' exposes: - type: rest namespace: playback-downloads-rest port: 8080 description: REST adapter for TIDAL Playback API — Downloads, Offline Tasks, Usage Rules. One Spectral-compliant resource per consumed operation, prefixed with /v2. resources: - path: /v2/downloads name: downloads description: REST surface for downloads. operations: - method: GET name: getdownloads description: Get multiple downloads. call: playback-downloads.getdownloads with: include: rest.query.include filter[id]: rest.query.filter[id] outputParameters: - type: object mapping: $. - path: /v2/downloads/{id} name: downloads-id description: REST surface for downloads-id. operations: - method: GET name: getdownloads description: Get single download. call: playback-downloads.getdownloads with: id: rest.path.id include: rest.query.include outputParameters: - type: object mapping: $. - path: /v2/downloads/{id}/relationships/owners name: downloads-id-relationships-owners description: REST surface for downloads-id-relationships-owners. operations: - method: GET name: getdownloads description: Get owners relationship ("to-many"). call: playback-downloads.getdownloads with: id: rest.path.id include: rest.query.include page[cursor]: rest.query.page[cursor] outputParameters: - type: object mapping: $. - path: /v2/offlineTasks name: offlineTasks description: REST surface for offlineTasks. operations: - method: GET name: getofflinetasks description: Get multiple offlineTasks. call: playback-downloads.getofflinetasks with: page[cursor]: rest.query.page[cursor] include: rest.query.include filter[id]: rest.query.filter[id] filter[installation.id]: rest.query.filter[installation.id] outputParameters: - type: object mapping: $. - path: /v2/offlineTasks/{id} name: offlineTasks-id description: REST surface for offlineTasks-id. operations: - method: GET name: getofflinetasks description: Get single offlineTask. call: playback-downloads.getofflinetasks with: id: rest.path.id include: rest.query.include outputParameters: - type: object mapping: $. - method: PATCH name: patchofflinetasks description: Update single offlineTask. call: playback-downloads.patchofflinetasks with: id: rest.path.id body: rest.body outputParameters: - type: object mapping: $. - path: /v2/offlineTasks/{id}/relationships/collection name: offlineTasks-id-relationships-collection description: REST surface for offlineTasks-id-relationships-collection. operations: - method: GET name: getofflinetasks description: Get collection relationship ("to-one"). call: playback-downloads.getofflinetasks with: id: rest.path.id include: rest.query.include outputParameters: - type: object mapping: $. - path: /v2/offlineTasks/{id}/relationships/item name: offlineTasks-id-relationships-item description: REST surface for offlineTasks-id-relationships-item. operations: - method: GET name: getofflinetasks description: Get item relationship ("to-one"). call: playback-downloads.getofflinetasks with: id: rest.path.id include: rest.query.include outputParameters: - type: object mapping: $. - path: /v2/offlineTasks/{id}/relationships/owners name: offlineTasks-id-relationships-owners description: REST surface for offlineTasks-id-relationships-owners. operations: - method: GET name: getofflinetasks description: Get owners relationship ("to-many"). call: playback-downloads.getofflinetasks with: id: rest.path.id include: rest.query.include page[cursor]: rest.query.page[cursor] outputParameters: - type: object mapping: $. - path: /v2/usageRules name: usageRules description: REST surface for usageRules. operations: - method: GET name: getusagerules description: Get multiple usageRules. call: playback-downloads.getusagerules with: filter[id]: rest.query.filter[id] outputParameters: - type: object mapping: $. - method: POST name: postusagerules description: Create single usageRule. call: playback-downloads.postusagerules with: body: rest.body outputParameters: - type: object mapping: $. - path: /v2/usageRules/{id} name: usageRules-id description: REST surface for usageRules-id. operations: - method: GET name: getusagerules description: Get single usageRule. call: playback-downloads.getusagerules with: id: rest.path.id outputParameters: - type: object mapping: $. - type: mcp namespace: playback-downloads-mcp port: 9090 transport: http description: MCP adapter for TIDAL Playback API — Downloads, Offline Tasks, Usage Rules. One tool per consumed operation. tools: - name: tidal-getdownloads description: Get multiple downloads. hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getdownloads with: include: tools.include filter[id]: tools.filter[id] outputParameters: - type: object mapping: $. - name: tidal-getdownloads description: Get single download. hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getdownloads with: id: tools.id include: tools.include outputParameters: - type: object mapping: $. - name: tidal-getdownloads description: Get owners relationship ("to-many"). hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getdownloads with: id: tools.id include: tools.include page[cursor]: tools.page[cursor] outputParameters: - type: object mapping: $. - name: tidal-getofflinetasks description: Get multiple offlineTasks. hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getofflinetasks with: page[cursor]: tools.page[cursor] include: tools.include filter[id]: tools.filter[id] filter[installation.id]: tools.filter[installation.id] outputParameters: - type: object mapping: $. - name: tidal-getofflinetasks description: Get single offlineTask. hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getofflinetasks with: id: tools.id include: tools.include outputParameters: - type: object mapping: $. - name: tidal-patchofflinetasks description: Update single offlineTask. hints: readOnly: false destructive: false idempotent: false call: playback-downloads.patchofflinetasks with: id: tools.id body: tools.body outputParameters: - type: object mapping: $. - name: tidal-getofflinetasks description: Get collection relationship ("to-one"). hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getofflinetasks with: id: tools.id include: tools.include outputParameters: - type: object mapping: $. - name: tidal-getofflinetasks description: Get item relationship ("to-one"). hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getofflinetasks with: id: tools.id include: tools.include outputParameters: - type: object mapping: $. - name: tidal-getofflinetasks description: Get owners relationship ("to-many"). hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getofflinetasks with: id: tools.id include: tools.include page[cursor]: tools.page[cursor] outputParameters: - type: object mapping: $. - name: tidal-getusagerules description: Get multiple usageRules. hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getusagerules with: filter[id]: tools.filter[id] outputParameters: - type: object mapping: $. - name: tidal-postusagerules description: Create single usageRule. hints: readOnly: false destructive: false idempotent: false call: playback-downloads.postusagerules with: body: tools.body outputParameters: - type: object mapping: $. - name: tidal-getusagerules description: Get single usageRule. hints: readOnly: true destructive: false idempotent: true call: playback-downloads.getusagerules with: id: tools.id outputParameters: - type: object mapping: $.