List product versions
curl --request GET \
--url https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versionsimport requests
url = "https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions', 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://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyProducts
List product versions
Complete version history of one of your products, every status, with changelogs and file metadata.
GET
/
api
/
public
/
v1
/
studio
/
products
/
{slug}
/
versions
List product versions
curl --request GET \
--url https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versionsimport requests
url = "https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions', 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://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.nmcrate.com/api/public/v1/studio/products/{slug}/versions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyReturns the full version history of one of your products. Unlike the general public API, this includes versions in every status (drafts, pending review, published) and always includes file metadata, it’s your own product.
Versions are sorted newest first (by publish date, then creation date).
Tier: Free, any studio key.
Request
curl https://nmcrate.com/api/public/v1/studio/products/dungeon-pack/versions \
-H "x-api-key: nmk_studio_..."
Path parameters
| Parameter | Type | Description |
|---|---|---|
slug | string | Product slug, public id, or ObjectId. |
Response
{
"product": {
"id": "prod_8f3a2c",
"slug": "dungeon-pack",
"name": "Dungeon Pack"
},
"items": [
{
"id": "66a1b2c3d4e5f60718293a4b",
"version": "2.1.0",
"status": "published",
"changelog": "Added 10 new rooms.",
"releaseNotes": null,
"releaseType": "minor",
"isStable": true,
"isCurrentVersion": true,
"publishedAt": "2026-06-30T08:12:00.000Z",
"downloadCount": 812,
"supportedMinecraftVersions": ["1.20", "1.21"],
"supportedPlatforms": ["paper", "spigot"],
"fileSize": 4831204,
"fileCount": 1
}
],
"total": 7
}
This endpoint returns file metadata only (
fileSize, fileCount), never raw storage URLs. Downloads always go through the store’s download endpoints so per-buyer protection (license keys, watermarks, placeholders) is applied.Errors
| HTTP | Code | When |
|---|---|---|
| 404 | NOT_FOUND | No product with that identifier in this studio. |