Skip to main content

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:
Check the message and accepted_intents fields to understand why a request failed.
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", or 401 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, or updatedDate.
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
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_WRITE
  • Body:
  • Note: Do not include id, createdDate, updatedDate, customer, or licenseKey (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 of SPIGOT, FORGE, BUKKIT, BUILT_BY_BIT, SOURCE_EXCHANGE, DISCORD, OTHER
    • platformId: 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
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_WRITE
  • Body:
  • Note: Do not include id, createdAt, or updatedAt.
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
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

Enum values

MINECRAFT_JAVA_PLUGIN, MINECRAFT_JAVA_MOD, MINECRAFT_BEDROCK_PLUGIN, MINECRAFT_BEDROCK_MOD, MINECRAFT_SERVER_SETUP, WEB_APPLICATION, DESKTOP_APPLICATION, MOBILE_APPLICATION, OTHER
TEMPORARY, PERMANENT
ACTIVE, EXPIRED, DEACTIVATED, DELETED
SPIGOT, FORGE, BUKKIT, BUILT_BY_BIT, SOURCE_EXCHANGE, DISCORD, OTHER
IP, HWID
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_WRITE

General notes

  • Always include the TOKEN header 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 message and a list of accepted_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.
For further questions, contact the SunLicense support team.