Subvert, a new cooperatively owned online music store similar to bandcamp launched yesterday. Has anyone started working on an importer userscript yet?
Doesn’t seem like they currently have an API, already been requested as a feature.
For those that don’t know, resonate.coop is a similar model.
EDIT: It seems the coop dissolved just recently.
There is a JSON object in the HTML containing everything: <script id="__NEXT_DATA__" type="application/json">.
So this should be trivial with AI.
Does that include all metadata like barcodes, label, etc?
Should be trivial without ai :)
It does not include barcodes it seems, but it does include basic info like label and catalog number. I don’t know if the platform even stores barcodes at all, or if they allow people to set them (someone can test with an artist account, looks like they’re free to create)
I’ve been poking around the site and trying different things for a userscript already :)
Here’s an example of the metadata you can get, from this release for example
JSON
{
"id": "cmney6au6000eumojywsod4in",
"name": "Let The Spiders In",
"slug": "let-the-spiders-in",
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"description": "Recorded amidst the sun-scorched landscapes of Austin's Hill Country with renowned producer Machine (Clutch, Lamb Of God, King Crimson), the follow-up to their 2023 debut \"West Coast Hard Rock\" is heavier, more versatile and packed with soulful, vocal-driven hooks. \n\nMarrying the melodic-centered vision of Scandinavian hard rock with a bluesy, southern-crisp flavor and a healthy slab of fuzz, \"Let The Spiders In\" is a distilled shot of pure stadium-tailored heavy rock. Ten tracks poised to break hearts and rattle cages that should win over fans of Spiritual Beggars, The Parlor Mob, Rival Sons, Orchid and Dozer.\n\nSome quotes for the album: \n\nMasheena has delivered the No. 1 feel-good album this spring. It has everything from heaviness to soft sweetness, but most of all, it puts me in a very good mood when listening to this album. The heavy blues mixed with a 70s vibe are absolute dynamite, and with Louis masterclass in vocal performance, all I can say is – hats off to you boys, this is a fantastic record!\n\nStaale Rodvelt aka Captain, singer in Kal-El\n\n\"It’s great to hear someone inject a good dose of pop-sensibility into stoner rock. Broad-shouldered men with hair on their chests baring their souls to hairy riffs! I love the track 'One Eye,' which leans as much toward catchy Soundgarden as it does toward stoner rock.\n\nWest Coast Hard Rock FTW!\"\n\nTorkjell Roed aka Toschie, singer in Audrey Horne",
"credits": [
{
"name": "Luis-Alberto Salomonsen Salomon",
"role": "Vocals"
},
{
"name": "Luis-Alberto Salomonsen Salomon",
"role": "Guitars"
},
{
"name": "Tarjei A Heggernes",
"role": "Bass"
},
{
"name": "Tarjei A Heggernes",
"role": "Vocals"
},
{
"name": "Bård Nordvik",
"role": "Drums"
},
{
"name": "Machine",
"role": "Producer"
},
{
"name": "Machine",
"role": "Mixer"
}
],
"links": [],
"genres": [
"hard rock",
"stoner rock",
"grunge",
"classic rock",
"stoner grunge",
"west coast hard rock",
"southern rock",
"heavy boogie blues"
],
"releaseDate": "2026-04-09T22:00:00.000Z",
"createdAt": "2026-03-31T18:25:31.230Z",
"originalReleaseDate": null,
"releaseType": "album",
"isPublic": true,
"isExclusive": false,
"exclusiveUntilDate": null,
"license": "All Rights Reserved",
"priceCents": 900,
"memberPriceCents": 700,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"isStreamingAllowed": true,
"isFlagged": false,
"_count": {
"musicOwnerships": 0,
"collections": 0
},
"artists": [
{
"id": "cmhh3ltmt0xt2gy8ez3nmwha1",
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
],
"musicOwnerships": [],
"collections": [],
"labelsOnReleases": [
{
"label": {
"name": "Descamisado"
},
"catalogNumber": ""
}
],
"tracks": [
{
"trackNumber": 1,
"track": {
"id": "cmney6au7000numojlgbkh5w4",
"name": "Been Waiting",
"slug": "been-waiting",
"duration": 222,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 445,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 222,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 2,
"track": {
"id": "cmney6au7000wumojoq4y25fu",
"name": "Going To The Mountain",
"slug": "going-to-the-mountain",
"duration": 197,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 395,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 197,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 3,
"track": {
"id": "cmney6au80015umojfbxfckkq",
"name": "One Eye",
"slug": "one-eye",
"duration": 215,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 429,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 215,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 4,
"track": {
"id": "cmney6au8001eumojpqi6nzbp",
"name": "A Game You Don't Want To Lose",
"slug": "a-game-you-dont-want-to-lose",
"duration": 221,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 443,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 221,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 5,
"track": {
"id": "cmney6au9001numojts9bta49",
"name": "Life Is But A Sin",
"slug": "life-is-but-a-sin",
"duration": 267,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 535,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 267,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 6,
"track": {
"id": "cmney6au9001wumojdvyswsng",
"name": "Sara Lost Her Way",
"slug": "sara-lost-her-way",
"duration": 172,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 345,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 172,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 7,
"track": {
"id": "cmney6aua0025umoje3x2dz0l",
"name": "In Her Eyes",
"slug": "in-her-eyes",
"duration": 216,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 433,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 216,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 8,
"track": {
"id": "cmney6aua002eumojvzb59wiq",
"name": "Don't Tell Her",
"slug": "dont-tell-her",
"duration": 211,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 422,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 211,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 9,
"track": {
"id": "cmney6aua002numoj5sbpb88d",
"name": "Riffy",
"slug": "riffy",
"duration": 213,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 427,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 213,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
},
{
"trackNumber": 10,
"track": {
"id": "cmney6aub002wumojj7fcak3i",
"name": "You Owe Me",
"slug": "you-owe-me",
"duration": 166,
"coverImageId": "cmney68d500076vjjhkrefw34",
"artistDisplayName": null,
"isExplicit": false,
"isExclusive": false,
"exclusiveUntilDate": null,
"isDeleted": false,
"isStreamingAllowed": true,
"isDownloadAllowed": true,
"isOverpayAllowed": true,
"priceCents": 150,
"memberPriceCents": 100,
"audio": {
"peaks": {
"bits": 8,
"data": [
],
"length": 331,
"version": 2,
"channels": 1,
"sample_rate": 48000,
"samples_per_pixel": 24000
},
"duration": 166,
"originalBitrate": 2304000,
"originalSampleRate": 48000,
"originalCodec": "pcm_s24le",
"originalBitDepth": 24
},
"artists": [
{
"name": "Masheena",
"slug": "masheena",
"profileImageId": "cmnewje9m000h1f203e7bt7vc"
}
]
}
}
]
}
I’ll keep working on my script but I’m not the fastest at these things
so if someone else writes one or prompts a chatbot to create one feel free to post it
