curl --request POST \
--url https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"artist": "<string>",
"album": "<string>",
"duration": 123,
"mbId": "<string>",
"isrc": "<string>",
"albumArt": "<string>",
"trackNumber": 123,
"releaseDate": "<string>",
"year": 123,
"discNumber": 123,
"lyrics": "<string>",
"composer": "<string>",
"copyrightMessage": "<string>",
"label": "<string>",
"artistPicture": "<string>",
"spotifyLink": "<string>",
"lastfmLink": "<string>",
"tidalLink": "<string>",
"appleMusicLink": "<string>",
"youtubeLink": "<string>",
"deezerLink": "<string>",
"timestamp": 123
}
'import requests
url = "https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble"
payload = {
"title": "<string>",
"artist": "<string>",
"album": "<string>",
"duration": 123,
"mbId": "<string>",
"isrc": "<string>",
"albumArt": "<string>",
"trackNumber": 123,
"releaseDate": "<string>",
"year": 123,
"discNumber": 123,
"lyrics": "<string>",
"composer": "<string>",
"copyrightMessage": "<string>",
"label": "<string>",
"artistPicture": "<string>",
"spotifyLink": "<string>",
"lastfmLink": "<string>",
"tidalLink": "<string>",
"appleMusicLink": "<string>",
"youtubeLink": "<string>",
"deezerLink": "<string>",
"timestamp": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
artist: '<string>',
album: '<string>',
duration: 123,
mbId: '<string>',
isrc: '<string>',
albumArt: '<string>',
trackNumber: 123,
releaseDate: '<string>',
year: 123,
discNumber: 123,
lyrics: '<string>',
composer: '<string>',
copyrightMessage: '<string>',
label: '<string>',
artistPicture: '<string>',
spotifyLink: '<string>',
lastfmLink: '<string>',
tidalLink: '<string>',
appleMusicLink: '<string>',
youtubeLink: '<string>',
deezerLink: '<string>',
timestamp: 123
})
};
fetch('https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'artist' => '<string>',
'album' => '<string>',
'duration' => 123,
'mbId' => '<string>',
'isrc' => '<string>',
'albumArt' => '<string>',
'trackNumber' => 123,
'releaseDate' => '<string>',
'year' => 123,
'discNumber' => 123,
'lyrics' => '<string>',
'composer' => '<string>',
'copyrightMessage' => '<string>',
'label' => '<string>',
'artistPicture' => '<string>',
'spotifyLink' => '<string>',
'lastfmLink' => '<string>',
'tidalLink' => '<string>',
'appleMusicLink' => '<string>',
'youtubeLink' => '<string>',
'deezerLink' => '<string>',
'timestamp' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"artist\": \"<string>\",\n \"album\": \"<string>\",\n \"duration\": 123,\n \"mbId\": \"<string>\",\n \"isrc\": \"<string>\",\n \"albumArt\": \"<string>\",\n \"trackNumber\": 123,\n \"releaseDate\": \"<string>\",\n \"year\": 123,\n \"discNumber\": 123,\n \"lyrics\": \"<string>\",\n \"composer\": \"<string>\",\n \"copyrightMessage\": \"<string>\",\n \"label\": \"<string>\",\n \"artistPicture\": \"<string>\",\n \"spotifyLink\": \"<string>\",\n \"lastfmLink\": \"<string>\",\n \"tidalLink\": \"<string>\",\n \"appleMusicLink\": \"<string>\",\n \"youtubeLink\": \"<string>\",\n \"deezerLink\": \"<string>\",\n \"timestamp\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"artist\": \"<string>\",\n \"album\": \"<string>\",\n \"duration\": 123,\n \"mbId\": \"<string>\",\n \"isrc\": \"<string>\",\n \"albumArt\": \"<string>\",\n \"trackNumber\": 123,\n \"releaseDate\": \"<string>\",\n \"year\": 123,\n \"discNumber\": 123,\n \"lyrics\": \"<string>\",\n \"composer\": \"<string>\",\n \"copyrightMessage\": \"<string>\",\n \"label\": \"<string>\",\n \"artistPicture\": \"<string>\",\n \"spotifyLink\": \"<string>\",\n \"lastfmLink\": \"<string>\",\n \"tidalLink\": \"<string>\",\n \"appleMusicLink\": \"<string>\",\n \"youtubeLink\": \"<string>\",\n \"deezerLink\": \"<string>\",\n \"timestamp\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"artist\": \"<string>\",\n \"album\": \"<string>\",\n \"duration\": 123,\n \"mbId\": \"<string>\",\n \"isrc\": \"<string>\",\n \"albumArt\": \"<string>\",\n \"trackNumber\": 123,\n \"releaseDate\": \"<string>\",\n \"year\": 123,\n \"discNumber\": 123,\n \"lyrics\": \"<string>\",\n \"composer\": \"<string>\",\n \"copyrightMessage\": \"<string>\",\n \"label\": \"<string>\",\n \"artistPicture\": \"<string>\",\n \"spotifyLink\": \"<string>\",\n \"lastfmLink\": \"<string>\",\n \"tidalLink\": \"<string>\",\n \"appleMusicLink\": \"<string>\",\n \"youtubeLink\": \"<string>\",\n \"deezerLink\": \"<string>\",\n \"timestamp\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"trackId": "<string>",
"title": "<string>",
"artist": "<string>",
"artistUri": "<string>",
"albumArtist": "<string>",
"album": "<string>",
"albumUri": "<string>",
"albumArt": "<string>",
"trackUri": "<string>",
"handle": "<string>",
"did": "<string>",
"avatar": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"uri": "<string>",
"sha256": "<string>",
"liked": true,
"likesCount": 123,
"cover": "<string>",
"date": "<string>",
"user": "<string>",
"userDisplayName": "<string>",
"userAvatar": "<string>",
"tags": [
"<string>"
],
"mbId": "<string>",
"mbid": "<string>",
"isrc": "<string>",
"spotifyLink": "<string>",
"composer": "<string>",
"trackNumber": 123,
"duration": 123,
"youtubeLink": "<string>",
"appleMusicLink": "<string>",
"tidalLink": "<string>",
"discNumber": 123,
"genre": "<string>",
"label": "<string>",
"copyrightMessage": "<string>",
"key": "<string>",
"xataVersion": 123,
"bpm": 123,
"updatedAt": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Create a new scrobble
curl --request POST \
--url https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"artist": "<string>",
"album": "<string>",
"duration": 123,
"mbId": "<string>",
"isrc": "<string>",
"albumArt": "<string>",
"trackNumber": 123,
"releaseDate": "<string>",
"year": 123,
"discNumber": 123,
"lyrics": "<string>",
"composer": "<string>",
"copyrightMessage": "<string>",
"label": "<string>",
"artistPicture": "<string>",
"spotifyLink": "<string>",
"lastfmLink": "<string>",
"tidalLink": "<string>",
"appleMusicLink": "<string>",
"youtubeLink": "<string>",
"deezerLink": "<string>",
"timestamp": 123
}
'import requests
url = "https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble"
payload = {
"title": "<string>",
"artist": "<string>",
"album": "<string>",
"duration": 123,
"mbId": "<string>",
"isrc": "<string>",
"albumArt": "<string>",
"trackNumber": 123,
"releaseDate": "<string>",
"year": 123,
"discNumber": 123,
"lyrics": "<string>",
"composer": "<string>",
"copyrightMessage": "<string>",
"label": "<string>",
"artistPicture": "<string>",
"spotifyLink": "<string>",
"lastfmLink": "<string>",
"tidalLink": "<string>",
"appleMusicLink": "<string>",
"youtubeLink": "<string>",
"deezerLink": "<string>",
"timestamp": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
artist: '<string>',
album: '<string>',
duration: 123,
mbId: '<string>',
isrc: '<string>',
albumArt: '<string>',
trackNumber: 123,
releaseDate: '<string>',
year: 123,
discNumber: 123,
lyrics: '<string>',
composer: '<string>',
copyrightMessage: '<string>',
label: '<string>',
artistPicture: '<string>',
spotifyLink: '<string>',
lastfmLink: '<string>',
tidalLink: '<string>',
appleMusicLink: '<string>',
youtubeLink: '<string>',
deezerLink: '<string>',
timestamp: 123
})
};
fetch('https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'artist' => '<string>',
'album' => '<string>',
'duration' => 123,
'mbId' => '<string>',
'isrc' => '<string>',
'albumArt' => '<string>',
'trackNumber' => 123,
'releaseDate' => '<string>',
'year' => 123,
'discNumber' => 123,
'lyrics' => '<string>',
'composer' => '<string>',
'copyrightMessage' => '<string>',
'label' => '<string>',
'artistPicture' => '<string>',
'spotifyLink' => '<string>',
'lastfmLink' => '<string>',
'tidalLink' => '<string>',
'appleMusicLink' => '<string>',
'youtubeLink' => '<string>',
'deezerLink' => '<string>',
'timestamp' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"artist\": \"<string>\",\n \"album\": \"<string>\",\n \"duration\": 123,\n \"mbId\": \"<string>\",\n \"isrc\": \"<string>\",\n \"albumArt\": \"<string>\",\n \"trackNumber\": 123,\n \"releaseDate\": \"<string>\",\n \"year\": 123,\n \"discNumber\": 123,\n \"lyrics\": \"<string>\",\n \"composer\": \"<string>\",\n \"copyrightMessage\": \"<string>\",\n \"label\": \"<string>\",\n \"artistPicture\": \"<string>\",\n \"spotifyLink\": \"<string>\",\n \"lastfmLink\": \"<string>\",\n \"tidalLink\": \"<string>\",\n \"appleMusicLink\": \"<string>\",\n \"youtubeLink\": \"<string>\",\n \"deezerLink\": \"<string>\",\n \"timestamp\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"artist\": \"<string>\",\n \"album\": \"<string>\",\n \"duration\": 123,\n \"mbId\": \"<string>\",\n \"isrc\": \"<string>\",\n \"albumArt\": \"<string>\",\n \"trackNumber\": 123,\n \"releaseDate\": \"<string>\",\n \"year\": 123,\n \"discNumber\": 123,\n \"lyrics\": \"<string>\",\n \"composer\": \"<string>\",\n \"copyrightMessage\": \"<string>\",\n \"label\": \"<string>\",\n \"artistPicture\": \"<string>\",\n \"spotifyLink\": \"<string>\",\n \"lastfmLink\": \"<string>\",\n \"tidalLink\": \"<string>\",\n \"appleMusicLink\": \"<string>\",\n \"youtubeLink\": \"<string>\",\n \"deezerLink\": \"<string>\",\n \"timestamp\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rocksky.app/xrpc/app.rocksky.scrobble.createScrobble")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"artist\": \"<string>\",\n \"album\": \"<string>\",\n \"duration\": 123,\n \"mbId\": \"<string>\",\n \"isrc\": \"<string>\",\n \"albumArt\": \"<string>\",\n \"trackNumber\": 123,\n \"releaseDate\": \"<string>\",\n \"year\": 123,\n \"discNumber\": 123,\n \"lyrics\": \"<string>\",\n \"composer\": \"<string>\",\n \"copyrightMessage\": \"<string>\",\n \"label\": \"<string>\",\n \"artistPicture\": \"<string>\",\n \"spotifyLink\": \"<string>\",\n \"lastfmLink\": \"<string>\",\n \"tidalLink\": \"<string>\",\n \"appleMusicLink\": \"<string>\",\n \"youtubeLink\": \"<string>\",\n \"deezerLink\": \"<string>\",\n \"timestamp\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"trackId": "<string>",
"title": "<string>",
"artist": "<string>",
"artistUri": "<string>",
"albumArtist": "<string>",
"album": "<string>",
"albumUri": "<string>",
"albumArt": "<string>",
"trackUri": "<string>",
"handle": "<string>",
"did": "<string>",
"avatar": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"uri": "<string>",
"sha256": "<string>",
"liked": true,
"likesCount": 123,
"cover": "<string>",
"date": "<string>",
"user": "<string>",
"userDisplayName": "<string>",
"userAvatar": "<string>",
"tags": [
"<string>"
],
"mbId": "<string>",
"mbid": "<string>",
"isrc": "<string>",
"spotifyLink": "<string>",
"composer": "<string>",
"trackNumber": 123,
"duration": 123,
"youtubeLink": "<string>",
"appleMusicLink": "<string>",
"tidalLink": "<string>",
"discNumber": 123,
"genre": "<string>",
"label": "<string>",
"copyrightMessage": "<string>",
"key": "<string>",
"xataVersion": 123,
"bpm": 123,
"updatedAt": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
Rocksky bearer token.
Body
The title of the track being scrobbled
The artist of the track being scrobbled
The album of the track being scrobbled
The duration of the track in milliseconds (e.g., 240000 for 4 minutes)
The MusicBrainz ID of the track, if available
The International Standard Recording Code (ISRC) of the track, if available
The URL of the album art for the track
The track number of the track in the album
The release date of the track, formatted as YYYY-MM-DD
The year the track was released
The disc number of the track in the album, if applicable
The lyrics of the track, if available
The composer of the track, if available
The copyright message for the track, if available
The record label of the track, if available
The URL of the artist's picture, if available
The Spotify link for the track, if available
The Last.fm link for the track, if available
The Tidal link for the track, if available
The Apple Music link for the track, if available
The Youtube link for the track, if available
The Deezer link for the track, if available
The timestamp of the scrobble in seconds since epoch (Unix timestamp)
Response
Success
The unique identifier of the scrobble.
The unique identifier of the track this scrobble is of.
The title of the scrobble.
The artist of the song.
The URI of the artist.
The album artist of the song.
The album of the song.
The URI of the album.
The album art URL of the song.
The URI of the track (song) this scrobble is of.
The handle of the user who created the scrobble.
The DID of the user who created the scrobble.
The avatar URL of the user who created the scrobble.
The timestamp when the scrobble was created.
The URI of the scrobble.
The SHA256 hash of the scrobble data.
Production returns a nullable floating-point number. Lexicon has no float primitive; retained as an open extension without changing response data.
Existing response fixtures contain an empty object while other presentations use a timestamp string. Lexicon cannot express an untagged object/string union; preserve the existing open extension.