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’ll receive an error response with a list of accepted intents.
Error handling
All error responses follow this structure:message and accepted_intents fields to understand why a request failed.
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", or401 Unauthorized— error response
2. Product API
GET /api/v2/products
- Intents:
PRODUCTS_READ,PRODUCTS_READ_WRITE,ALL_READ,ALL_READ_WRITE - Response: 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_WRITE - Body:
- Note: Do not include
id,createdDate, orupdatedDate.
PUT /api/v2/products/{id}
- Intents: Same as POST
- Body: All product fields (see GET response)
DELETE /api/v2/products/{id}
- Intents: Same as POST
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_WRITE - Body:
- Note: Do not include
id,createdDate,updatedDate,customer, orlicenseKey(the 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 ofSPIGOT,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)
DELETE /api/v2/licenses/{id}
- Intents: Same as POST
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_WRITE - Body:
- Note: Do not include
id,createdAt, orupdatedAt.
PUT /api/v2/blacklists/{id}
- Intents: Same as POST
- Body: All blacklist fields (see GET response)
DELETE /api/v2/blacklists/{id}
- Intents: Same as POST
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
6. Customer API
GET /api/v2/customers
- Intents:
CUSTOMERS_READ,ALL_READ,ALL_READ_WRITE
GET /api/v2/customers/{id}
- Intents: Same as above
7. License Validation API
POST /api/v2/validate
- Intents:
LICENSE_VALIDATE,ALL_READ_WRITE - Body and response: Same as the V1 validation request.
Enum values
ProductType (Product)
ProductType (Product)
MINECRAFT_JAVA_PLUGIN, MINECRAFT_JAVA_MOD, MINECRAFT_BEDROCK_PLUGIN, MINECRAFT_BEDROCK_MOD, MINECRAFT_SERVER_SETUP, WEB_APPLICATION, DESKTOP_APPLICATION, MOBILE_APPLICATION, OTHERLicenseType (License)
LicenseType (License)
TEMPORARY, PERMANENTLicenseStatus (License)
LicenseStatus (License)
ACTIVE, EXPIRED, DEACTIVATED, DELETEDLicensePlatform (License)
LicensePlatform (License)
SPIGOT, FORGE, BUKKIT, BUILT_BY_BIT, SOURCE_EXCHANGE, DISCORD, OTHERLicenseDataType (Blacklist)
LicenseDataType (Blacklist)
IP, HWIDApiIntent (Token permissions)
ApiIntent (Token permissions)
PRODUCTS_READ, PRODUCTS_READ_WRITE, LICENSE_VALIDATE, LICENSES_READ, LICENSES_READ_WRITE, BLACKLISTS_READ, BLACKLISTS_READ_WRITE, REQUESTS_READ, CUSTOMERS_READ, ALL_READ, ALL_READ_WRITEGeneral notes
- Always include the
TOKENheader for all endpoints except/healthy. - For all update (PUT) operations, fetch the current object first and send all fields in your update request.
- Error responses always include a
messageand a list ofaccepted_intents. - Don’t send
id,createdDate,updatedDate, or other system-generated fields when creating new objects. - When creating licenses, don’t send the license key or customer object; these are handled by the system.