Every response includes a status field in the JSON body. The HTTP status code may
differ from the application status for some errors.
Status
HTTP
Meaning
800
200
License is valid. Returns product info, enabled addition IDs, and optional changelog entries.
801
801
License not found — the API key does not exist.
802
802
License exists but is not active.
803
803
Product mismatch — key is registered to a different product.
804
804
Unauthorized IP — request IP is not on the license allowlist.
805
805
API key is missing from the Authorization header.
806
806
Product field is missing from the request body.
807
807
UserID field is missing from the request body.
808
806
Username field is missing from the request body.
810
500
Internal server error.
Success response
JSON
1
{
2
"status":800,
3
"message":"License is valid",
4
"isValid":true,
5
"active":true,
6
"disabled":false,
7
"info":{
8
"Product":"my-product",
9
"authIP":"1.2.3.4",
10
"extraIPs":[],
11
"additions":["A7K2"],
12
"requestIP":"1.2.3.4",
13
"allowAnyIp":false
14
},
15
"product":{"name":"...","version":"1.0.0"},
16
"changelog":[]
17
}
When autoActivateOnFirstCheck is enabled in site settings, an inactive license
with no bound IP will activate automatically on the first successful check from a valid IP.
Example (curl)
Bash
1
curl -X POST https://your-domain/api/license/check \
Automate release archives and catalog updates from CI. Authenticate with the PRODUCT_UPLOAD_API_KEY env secret. Use the stable product id (e.g. my_script), not the Mongo ObjectId.
Authentication
X-Api-Key: <PRODUCT_UPLOAD_API_KEY> — preferred
or Authorization: Bearer <PRODUCT_UPLOAD_API_KEY>
If the key is unset on the server, all endpoints return 503. Invalid keys return 401. Rate limited to 20 requests / minute / IP.
Endpoints
Method
Path
Purpose
GET
/api/products
List products
GET
/api/products/:productId
Product detail + releases
PATCH
/api/products/:productId
Update catalog fields (JSON)
GET
/api/products/:productId/releases
List releases
POST
/api/products/:productId/releases
Upload / replace a release archive
DELETE
/api/products/:productId/releases/:version
Delete a release
Upload a release
multipart/form-data with version, file (.zip / .rar /
.7z, max 200 MB), and optional updateCatalogVersion=true to bump the shop
version string. Jipy Tool products are rejected — use the Blender Repo admin flow instead.
Bash
1
curl -X POST https://your-domain/api/products/my_script/releases \
const res = awaitfetch(`${API}/api/products/${productId}`, {
9
method: "PATCH",
10
headers: {
11
"X-Api-Key": KEY,
12
"Content-Type": "application/json"
13
},
14
body: JSON.stringify(fields)
15
});
16
const data = await res.json();
17
if (!res.ok || !data.success) {
18
thrownewError(data.error ?? res.statusText);
19
}
20
}
Lua / FiveM: use PerformHttpRequest for JSON
(GET/PATCH/DELETE). For ZIP uploads, shell out to curl or run the TypeScript/Python snippet from CI — native multipart from Lua is
painful.