API V2
SunLicense API V2 provides a secure, RESTful interface for managing products, licenses, blacklists, license requests, and customers.
Authentication & Intents
API Token: All endpoints (except
/healthy) require an API token in the request header:TOKEN: <your-api-token>
Intents: Each endpoint requires specific intents. If your token lacks the required intent, you will receive an error response with a list of accepted intents.
Error Handling
All error responses follow this structure:
{
"message": "invalid token or missing required intent",
"accepted_intents": ["PRODUCTS_READ", "PRODUCTS_READ_WRITE", ...]
}Always check the
messageandaccepted_intentsfields to understand why a request failed.
Update (PUT) Operations Warning
Important:
For every update (PUT) call, always perform a GET first and pass all fields (including unchanged ones) in your PUT request. Fields not included in the PUT body may be lost.
Endpoints
1. Health & Ping
GET /api/v2/healthy
Description: Health check endpoint. No authentication required.
Response:
200 OK—"healthy"
GET /api/v2/ping
Description: Ping endpoint to test authentication.
Headers:
TOKEN: <api-token>
Response:
200 OK—"pong"401 Unauthorized— Error response
2. Product API
GET /api/v2/products
Intents:
PRODUCTS_READ,PRODUCTS_READ_WRITE,ALL_READ,ALL_READ_WRITEResponse: List of products
GET /api/v2/products/{id}
Intents: Same as above
Response: Product object
POST /api/v2/products
Intents:
PRODUCTS_READ_WRITE,ALL_READ_WRITEBody:
Note: Do not include
id,createdDate, orupdatedDate.
PUT /api/v2/products/{id}
Intents: Same as POST
Body: All product fields (see GET response)
Warning: See update warning above.
DELETE /api/v2/products/{id}
Intents: Same as POST
Sample Product Response:
3. License API
GET /api/v2/licenses
Intents:
LICENSES_READ,LICENSES_READ_WRITE,ALL_READ,ALL_READ_WRITE
GET /api/v2/licenses/{id}
Intents: Same as above
POST /api/v2/licenses
Intents:
LICENSES_READ_WRITE,ALL_READ_WRITEBody:
Note: Do not include
id,createdDate,updatedDate,customer, orlicenseKey(license key is generated automatically).
GET /api/v2/licenses/by-license-key/{licenseKey}
Intents: Same as above
Description: Get a single license by its license key
Response: License object or 404 if not found
GET /api/v2/licenses/by-customer-email/{email}
Intents: Same as above
Description: Get all licenses associated with a customer email address
Response: Array of license objects
GET /api/v2/licenses/by-platform/{platform}/{platformId}
Intents: Same as above
Description: Get all licenses for a specific platform and platform ID
Query Parameters:
productId(optional): Filter by product ID
Path Parameters:
platform: One of SPIGOT, FORGE, BUKKIT, BUILT_BY_BIT, SOURCE_EXCHANGE, DISCORD, OTHERplatformId: The platform-specific user ID
Response: Array of license objects
GET /api/v2/licenses/by-customer-id/{customerId}
Intents: Same as above
Description: Get all licenses for a specific customer ID
Response: Array of license objects
GET /api/v2/licenses/by-product-id/{productId}
Intents: Same as above
Description: Get all licenses for a specific product
Response: Array of license objects
GET /api/v2/licenses/by-discord-id/{discordId}
Intents: Same as above
Description: Get all licenses associated with a Discord user ID
Response: Array of license objects
PUT /api/v2/licenses/{id}
Intents: Same as POST
Body: All license fields (see GET response)
Warning: See update warning above.
DELETE /api/v2/licenses/{id}
Intents: Same as POST
Sample License Response:
4. Blacklist API
GET /api/v2/blacklists
Intents:
BLACKLISTS_READ,BLACKLISTS_READ_WRITE,ALL_READ,ALL_READ_WRITE
GET /api/v2/blacklists/{id}
Intents: Same as above
POST /api/v2/blacklists
Intents:
BLACKLISTS_READ_WRITE,ALL_READ_WRITEBody:
Note: Do not include
id,createdAt, orupdatedAt.
PUT /api/v2/blacklists/{id}
Intents: Same as POST
Body: All blacklist fields (see GET response)
Warning: See update warning above.
DELETE /api/v2/blacklists/{id}
Intents: Same as POST
Sample Blacklist Response:
5. License Request API
GET /api/v2/requests
Intents:
REQUESTS_READ,ALL_READ,ALL_READ_WRITE
GET /api/v2/requests/{id}
Intents: Same as above
Sample License Request Response:
6. Customer API
GET /api/v2/customers
Intents:
CUSTOMERS_READ,ALL_READ,ALL_READ_WRITE
GET /api/v2/customers/{id}
Intents: Same as above
Sample Customer Response:
7. License Validation API
POST /api/v2/validate
Intents:
LICENSE_VALIDATE,ALL_READ_WRITEBody: See v1 LicenseRequestController for request structure.
Response: Same as v1 LicenseRequestController.
Enum Values Used in API Models
ProductType (Product)
MINECRAFT_JAVA_PLUGINMINECRAFT_JAVA_MODMINECRAFT_BEDROCK_PLUGINMINECRAFT_BEDROCK_MODMINECRAFT_SERVER_SETUPWEB_APPLICATIONDESKTOP_APPLICATIONMOBILE_APPLICATIONOTHER
LicenseType (License)
TEMPORARYPERMANENT
LicenseStatus (License)
ACTIVEEXPIREDDEACTIVATEDDELETED
LicensePlatform (License)
SPIGOTFORGEBUKKITBUILT_BY_BITSOURCE_EXCHANGEDISCORDOTHER
LicenseDataType (Blacklist)
IPHWID
ApiIntent (Token/Permissions)
PRODUCTS_READPRODUCTS_READ_WRITELICENSE_VALIDATELICENSES_READLICENSES_READ_WRITEBLACKLISTS_READBLACKLISTS_READ_WRITEREQUESTS_READCUSTOMERS_READALL_READALL_READ_WRITE
General Notes
Always include the
TOKENheader for all endpoints except/healthy.For all update (PUT) operations, always fetch the current object first and send all fields in your update request.
Error responses will always include a
messageand a list ofaccepted_intents.Do not send fields like
id,createdDate,updatedDate, or system-generated fields when creating new objects.For creating licenses, do not send the license key or customer object; these are handled by the system.
For further details or questions, contact the SunLicense support team.
Last updated