Appearance
Management API Documentation ​
Complete API for managing licenses and subscriptions programmatically.
Overview ​
The Management API allows you to:
- License Management: create, retrieve, extend, delete, pause, and retrieve licenses
- Subscription Management: Create, edit , and delete subscriptions
- HWID Management: Configure hardware ID binding, resets, and restrictions
- User Credentials: Manage licenses' username
- Metadata: Store custom data with licenses (Discord IDs, emails, etc.)
Use this API to build your own license management system, automate bulk operations, or integrate licensing into your backend systems.
Authentication ​
All endpoints require an API key passed in the x-api-key header.
bash
curl -X POST https://api.keycrate.dev/license/create \
-H "x-api-key: kc_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"app_id": "...", ...}'API Key Format: Starts with kc_ (e.g., kc_abc123xyz)
Getting Your API Key: Generate one in your dashboard under Sidebar → API
Common Workflows ​
Create and Distribute 100 Trial Licenses ​
cURL:
bash
curl -X POST https://api.keycrate.dev/license/create-bulk \
-H "x-api-key: kc_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"key_amount": 100,
"app_id": "your-app-id",
"subscription_id": "trial-subscription-id",
"duration_unit": "days",
"duration_value": 7,
"hwid_lock": true,
"tags": ["trial", "batch-001"]
}'Python:
python
import requests
response = requests.post(
'https://api.keycrate.dev/license/create-bulk',
headers={'x-api-key': 'kc_your_api_key'},
json={
'key_amount': 100,
'app_id': 'your-app-id',
'subscription_id': 'trial-subscription-id',
'duration_unit': 'days',
'duration_value': 7,
'hwid_lock': True,
'tags': ['trial', 'batch-001']
}
)
print(response.json())Extend specific licenses ​
cURL:
bash
curl -X POST https://api.keycrate.dev/license/extend-bulk \
-H "x-api-key: kc_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"license_keys": ["key1", "key2", "key3"],
"extend_seconds": 2592000
}'Python:
python
response = requests.post(
'https://api.keycrate.dev/license/extend-bulk',
headers={'x-api-key': 'kc_your_api_key'},
json={
'license_keys': ['key1', 'key2', 'key3'],
'extend_seconds': 2592000
}
)Pause a licenses ​
cURL:
bash
curl -X POST https://api.keycrate.dev/license/update-status \
-H "x-api-key: kc_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"license_key": "key1",
"status": "paused"
}'Python:
python
response = requests.post(
'https://api.keycrate.dev/license/update-status',
headers={'x-api-key': 'kc_your_api_key'},
json={
'license_key' : "key1",
'status': 'paused'
}
)Get All Active Licenses for an App ​
cURL:
bash
curl -X POST https://api.keycrate.dev/license/get-bulk \
-H "x-api-key: kc_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"app_id": "your-app-id",
"status": "active",
"per_page": 100,
"sort_field": "created_at",
"sort_order": "desc"
}'Python:
python
response = requests.post(
'https://api.keycrate.dev/license/get-bulk',
headers={'x-api-key': 'kc_your_api_key'},
json={
'app_id': 'your-app-id',
'status': 'active',
'per_page': 100,
'sort_field': 'created_at',
'sort_order': 'desc'
}
)
licenses = response.json()['data']Create a Subscription with Tier Levels ​
cURL:
bash
curl -X POST https://api.keycrate.dev/subscription/create \
-H "x-api-key: kc_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"app_id": "your-app-id",
"name": "premium",
"level": 2,
"single_key_per_hwid": true
}'Python:
python
response = requests.post(
'https://api.keycrate.dev/subscription/create',
headers={'x-api-key': 'kc_your_api_key'},
json={
'app_id': 'your-app-id',
'name': 'premium',
'level': 2,
'single_key_per_hwid': True
}
)Error Handling ​
All errors follow this format:
json
{
"error": "Human-readable error message",
"error_code": "ERROR_CODE"
}Common Error Codes:
| Code | Meaning | Action |
|---|---|---|
MISSING_AUTH | No API key provided | Add x-api-key header |
INVALID_API_KEY | API key is invalid or inactive | Check your API key |
ACCESS_DENIED | You don't have access to this app | Verify app_id ownership |
APP_NOT_FOUND | App doesn't exist | Check app_id |
LICENSE_NOT_FOUND | License key doesn't exist | Verify license key |
INVALID_INPUT | Request body has validation errors | Check parameter types/values |
SERVER_ERROR | Unexpected server error | Retry after a delay |
Rate Limiting ​
The rate limits are pretty generous for normal usage, If you hit rate limits, retry with exponential backoff (wait 1s, 4s, 10s, etc.).
Full API Reference ​
For complete endpoint documentation including all parameters, request/response schemas, and examples, see the OpenAPI Specification.
Key endpoints:
Licenses
POST /license/create- Create single licensePOST /license/create-bulk- Create multiple licensesPOST /license/extend- Extend license durationPOST /license/extend-bulk- Extend multiple licensesPOST /license/delete- Delete licensePOST /license/delete-bulk- Delete multiple licensesPOST /license/get- Get license detailsPOST /license/get-bulk- Query licenses with filtersPOST /license/update-status- Pause/activate licensePOST /license/update-status-bulk- Update multiple statusesPOST /license/update-subscription- Change license subscriptionPOST /license/update-user-credentials- Update usernamePOST /license/update-metadata- Update custom metadata
HWID Management
POST /hwid/edit- Set or clear HWIDPOST /hwid/toggle-lock- Enable/disable HWID bindingPOST /hwid/toggle-lock-bulk- Bulk HWID lock togglePOST /hwid/toggle-reset-allowed- Allow/disallow HWID resetsPOST /hwid/update-reset-interval- Set HWID reset cooldown
Subscriptions
POST /subscription/create- Create subscription tierPOST /subscription/edit- Update subscription propertiesPOST /subscription/delete- Delete subscriptionPOST /subscription/get-bulk- List all subscriptions
Best Practices ​
- Use Bulk Operations for actions on multiple licenses -
create-bulk,extend-bulk,delete-bulkare more efficient - Cache API Responses - Don't query the same license repeatedly
- Implement Retry Logic - Network errors happen, retry with backoff
- Validate Inputs - Check UUIDs and required fields before sending
- Store API Keys Securely - Never commit them to version control
- Use Metadata - Store user IDs, Discord IDs, emails in license metadata
Support ​
For issues or questions:
- Check the error code first
- Review the full endpoint documentation
- Contact support with your request details and error response