Introduction
The LicenseShipper API enables developers and partners to securely manage, deliver, and track digital product licenses across multiple sales channels.
Welcome to the **LicenseShipper API** documentation.
This API provides secure and efficient tools for:
- Delivering license keys in real time
- Managing product catalogs and stock
- Tracking orders and license usage
- Receiving alerts for low stock or high usage
## Authentication
All endpoints (except `GET /ping`) require authentication via a Bearer token.
Include the following header in each request:
```
Authorization: Bearer YOUR_API_TOKEN
```
## Getting Started
1. Obtain your API token from the LicenseShipper dashboard.
2. Test connectivity using the `/ping` endpoint.
3. Integrate your application by calling the appropriate endpoints for products, licenses, and orders.
For sample requests and responses, explore each endpoint section below.
You can also use the **"Try It Out"** feature to test API calls directly from this documentation.
Authenticating requests
To authenticate requests, include a X-API-KEY
header with the value "{YOUR_AUTH_KEY}"
.
All authenticated endpoints are marked with a requires authentication
badge in the documentation below.
You can retrieve your token by visiting your dashboard and clicking Generate API token.
Activation Guides
Manage activation guides for your products.
A product can have at most one guide. Recommended "type" values: text | html | pdf_url
List activation guides
requires authentication
Returns guides for the authenticated user with filters.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/activation-guides?q=%22Windows%22&product_id=12&type=html&per_page=25&sort=created_at%2Cdesc" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/activation-guides"
);
const params = {
"q": ""Windows"",
"product_id": "12",
"type": "html",
"per_page": "25",
"sort": "created_at,desc",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/activation-guides';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'q' => '"Windows"',
'product_id' => '12',
'type' => 'html',
'per_page' => '25',
'sort' => 'created_at,desc',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/activation-guides'
params = {
'q': '"Windows"',
'product_id': '12',
'type': 'html',
'per_page': '25',
'sort': 'created_at,desc',
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()
Example response (200):
{
"success": true,
"message": "Activation guide list retrieved successfully.",
"data": {
"guides": [
{
"id": 1,
"product_id": 12,
"type": "html",
"content": "<p>Steps...</p>"
}
]
},
"meta": {
"current_page": 1,
"per_page": 15,
"total": 1,
"last_page": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create activation guide
requires authentication
Creates a guide for a product owned by the user. Enforces one guide per product.
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/activation-guides" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"product_id\": 12,
\"type\": \"html\",
\"content\": \"\\\"<p>Do this...<\\/p>\\\"\"
}"
const url = new URL(
"https://app.licenseshipper.com/api/activation-guides"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"product_id": 12,
"type": "html",
"content": "\"<p>Do this...<\/p>\""
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/activation-guides';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'product_id' => 12,
'type' => 'html',
'content' => '"<p>Do this...</p>"',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/activation-guides'
payload = {
"product_id": 12,
"type": "html",
"content": "\"<p>Do this...<\/p>\""
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (201):
{
"success": true,
"message": "Activation guide created successfully.",
"data": {
"id": 1,
"product_id": 12,
"type": "html"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Show activation guide
requires authentication
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/activation-guides/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/activation-guides/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/activation-guides/17';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/activation-guides/17'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Activation guide details retrieved successfully.",
"data": {
"id": 1,
"product_id": 12,
"type": "html",
"content": "<p>...</p>"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update activation guide
requires authentication
Example request:
curl --request PUT \
"https://app.licenseshipper.com/api/activation-guides/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"product_id\": 17,
\"type\": \"consequatur\",
\"content\": \"consequatur\"
}"
const url = new URL(
"https://app.licenseshipper.com/api/activation-guides/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"product_id": 17,
"type": "consequatur",
"content": "consequatur"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/activation-guides/17';
$response = $client->put(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'product_id' => 17,
'type' => 'consequatur',
'content' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/activation-guides/17'
payload = {
"product_id": 17,
"type": "consequatur",
"content": "consequatur"
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PUT', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "Activation guide updated successfully.",
"data": {
"id": 1,
"type": "html"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update activation guide
requires authentication
Example request:
curl --request PATCH \
"https://app.licenseshipper.com/api/activation-guides/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"product_id\": 17,
\"type\": \"consequatur\",
\"content\": \"consequatur\"
}"
const url = new URL(
"https://app.licenseshipper.com/api/activation-guides/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"product_id": 17,
"type": "consequatur",
"content": "consequatur"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/activation-guides/17';
$response = $client->patch(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'product_id' => 17,
'type' => 'consequatur',
'content' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/activation-guides/17'
payload = {
"product_id": 17,
"type": "consequatur",
"content": "consequatur"
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "Activation guide updated successfully.",
"data": {
"id": 1,
"type": "html"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete activation guide
requires authentication
Example request:
curl --request DELETE \
"https://app.licenseshipper.com/api/activation-guides/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/activation-guides/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/activation-guides/17';
$response = $client->delete(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/activation-guides/17'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('DELETE', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Activation guide deleted successfully.",
"data": [],
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get activation guide by product
requires authentication
Convenience endpoint to fetch a guide via product ID.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/products/17/activation-guide" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/products/17/activation-guide"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products/17/activation-guide';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products/17/activation-guide'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Activation guide retrieved successfully.",
"data": {
"id": 1,
"product_id": 12,
"type": "html"
},
"meta": []
}
Example response (404):
{
"success": false,
"message": "Activation guide not found.",
"data": [],
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Licenses
API endpoints for managing license keys.
Status legend:
- 0 = available
- 1 = assigned
- 2 = redeemed
List licenses
requires authentication
Returns licenses for the authenticated user with filtering, sorting, and pagination. License keys are masked in list results.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/licenses?status=0&product_id=12&supplier_id=3&order_email=user%40example.com&order_id=100045&key_ends=ABC123&date_from=2025-08-01&date_to=2025-08-13&per_page=25&sort=created_at%2Cdesc" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/licenses"
);
const params = {
"status": "0",
"product_id": "12",
"supplier_id": "3",
"order_email": "user@example.com",
"order_id": "100045",
"key_ends": "ABC123",
"date_from": "2025-08-01",
"date_to": "2025-08-13",
"per_page": "25",
"sort": "created_at,desc",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'status' => '0',
'product_id' => '12',
'supplier_id' => '3',
'order_email' => 'user@example.com',
'order_id' => '100045',
'key_ends' => 'ABC123',
'date_from' => '2025-08-01',
'date_to' => '2025-08-13',
'per_page' => '25',
'sort' => 'created_at,desc',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses'
params = {
'status': '0',
'product_id': '12',
'supplier_id': '3',
'order_email': 'user@example.com',
'order_id': '100045',
'key_ends': 'ABC123',
'date_from': '2025-08-01',
'date_to': '2025-08-13',
'per_page': '25',
'sort': 'created_at,desc',
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()
Example response (200):
{
"success": true,
"message": "License list retrieved successfully.",
"data": {
"licenses": [
{
"id": 1,
"product_id": 12,
"supplier_id": 3,
"masked_key": "ABCD••••••••••1234",
"price": "9.99",
"status": 0,
"order_id": null,
"order_email": null,
"source": "Manual",
"redeemed_at": null,
"created_at": "2025-08-13T10:20:00Z"
}
]
},
"meta": {
"current_page": 1,
"per_page": 15,
"total": 1,
"last_page": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create license(s)
requires authentication
Create a single license or bulk create using "items". When bulk, each item must contain at least product_id and key.
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/licenses" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"product_id\": 17,
\"supplier_id\": 17,
\"key\": \"consequatur\",
\"price\": 9.99,
\"source\": \"consequatur\",
\"status\": 17,
\"items\": [
{
\"product_id\": 1,
\"key\": \"ABC\",
\"price\": 0
}
]
}"
const url = new URL(
"https://app.licenseshipper.com/api/licenses"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"product_id": 17,
"supplier_id": 17,
"key": "consequatur",
"price": 9.99,
"source": "consequatur",
"status": 17,
"items": [
{
"product_id": 1,
"key": "ABC",
"price": 0
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = [
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['stdClass'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('stdClass')),
],
null,
[
'stdClass' => [
'product_id' => [
1,
],
'key' => [
'ABC',
],
'price' => [
0,
],
],
],
[
'product_id' => 17,
'supplier_id' => 17,
'key' => 'consequatur',
'price' => 9.99,
'source' => 'consequatur',
'status' => 17,
'items' => [
$o[0],
],
],
[]
),
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses'
payload = {
"product_id": 17,
"supplier_id": 17,
"key": "consequatur",
"price": 9.99,
"source": "consequatur",
"status": 17,
"items": [
{
"product_id": 1,
"key": "ABC",
"price": 0
}
]
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (201):
{
"success": true,
"message": "License(s) created successfully.",
"data": {
"created": [
{
"id": 10,
"masked_key": "ABCD••••••••••1234",
"status": 0
}
]
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Show license (full key)
requires authentication
Returns a single license. The full key is included here.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/licenses/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/licenses/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses/17';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses/17'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "License details retrieved successfully.",
"data": {
"id": 1,
"product_id": 12,
"supplier_id": 3,
"key": "FULL-KEY-VALUE-HERE",
"price": "9.99",
"status": 0,
"order_id": null,
"order_email": null,
"source": "Manual",
"redeemed_at": null
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update license
requires authentication
Example request:
curl --request PUT \
"https://app.licenseshipper.com/api/licenses/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"product_id\": 17,
\"supplier_id\": 17,
\"key\": \"consequatur\",
\"price\": 11613.31890586,
\"status\": 17,
\"order_id\": \"consequatur\",
\"order_email\": \"qkunze@example.com\",
\"source\": \"consequatur\",
\"redeemed_at\": \"consequatur\"
}"
const url = new URL(
"https://app.licenseshipper.com/api/licenses/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"product_id": 17,
"supplier_id": 17,
"key": "consequatur",
"price": 11613.31890586,
"status": 17,
"order_id": "consequatur",
"order_email": "qkunze@example.com",
"source": "consequatur",
"redeemed_at": "consequatur"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses/17';
$response = $client->put(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'product_id' => 17,
'supplier_id' => 17,
'key' => 'consequatur',
'price' => 11613.31890586,
'status' => 17,
'order_id' => 'consequatur',
'order_email' => 'qkunze@example.com',
'source' => 'consequatur',
'redeemed_at' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses/17'
payload = {
"product_id": 17,
"supplier_id": 17,
"key": "consequatur",
"price": 11613.31890586,
"status": 17,
"order_id": "consequatur",
"order_email": "qkunze@example.com",
"source": "consequatur",
"redeemed_at": "consequatur"
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PUT', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "License updated successfully.",
"data": {
"id": 1,
"status": 1
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update license
requires authentication
Example request:
curl --request PATCH \
"https://app.licenseshipper.com/api/licenses/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"product_id\": 17,
\"supplier_id\": 17,
\"key\": \"consequatur\",
\"price\": 11613.31890586,
\"status\": 17,
\"order_id\": \"consequatur\",
\"order_email\": \"qkunze@example.com\",
\"source\": \"consequatur\",
\"redeemed_at\": \"consequatur\"
}"
const url = new URL(
"https://app.licenseshipper.com/api/licenses/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"product_id": 17,
"supplier_id": 17,
"key": "consequatur",
"price": 11613.31890586,
"status": 17,
"order_id": "consequatur",
"order_email": "qkunze@example.com",
"source": "consequatur",
"redeemed_at": "consequatur"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses/17';
$response = $client->patch(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'product_id' => 17,
'supplier_id' => 17,
'key' => 'consequatur',
'price' => 11613.31890586,
'status' => 17,
'order_id' => 'consequatur',
'order_email' => 'qkunze@example.com',
'source' => 'consequatur',
'redeemed_at' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses/17'
payload = {
"product_id": 17,
"supplier_id": 17,
"key": "consequatur",
"price": 11613.31890586,
"status": 17,
"order_id": "consequatur",
"order_email": "qkunze@example.com",
"source": "consequatur",
"redeemed_at": "consequatur"
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "License updated successfully.",
"data": {
"id": 1,
"status": 1
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete license
requires authentication
Example request:
curl --request DELETE \
"https://app.licenseshipper.com/api/licenses/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/licenses/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses/17';
$response = $client->delete(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses/17'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('DELETE', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "License deleted successfully.",
"data": [],
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Assign a license
requires authentication
Transition to assigned (1). Typically used when linking a license to an order.
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/licenses/17/assign" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"order_id\": \"consequatur\",
\"order_email\": \"qkunze@example.com\",
\"source\": \"WooCommerce\"
}"
const url = new URL(
"https://app.licenseshipper.com/api/licenses/17/assign"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"order_id": "consequatur",
"order_email": "qkunze@example.com",
"source": "WooCommerce"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses/17/assign';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'order_id' => 'consequatur',
'order_email' => 'qkunze@example.com',
'source' => 'WooCommerce',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses/17/assign'
payload = {
"order_id": "consequatur",
"order_email": "qkunze@example.com",
"source": "WooCommerce"
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "License assigned successfully.",
"data": {
"id": 1,
"status": 1,
"order_id": "100045"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Redeem a license
requires authentication
Transition to redeemed (2) and set redeemed_at
.
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/licenses/17/redeem" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"redeemed_at\": \"consequatur\"
}"
const url = new URL(
"https://app.licenseshipper.com/api/licenses/17/redeem"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"redeemed_at": "consequatur"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses/17/redeem';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'redeemed_at' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses/17/redeem'
payload = {
"redeemed_at": "consequatur"
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "License redeemed successfully.",
"data": {
"id": 1,
"status": 2,
"redeemed_at": "2025-08-13T11:12:13Z"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Unassign a license
requires authentication
Reset a license back to available (0). Clears order fields and redeemed_at
.
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/licenses/17/unassign" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/licenses/17/unassign"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/licenses/17/unassign';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/licenses/17/unassign'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "License unassigned successfully.",
"data": {
"id": 1,
"status": 0
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Fetch licenses
requires authentication
Assigns license keys for a given product SKU if the subscription is valid, blacklist rules pass, and stock is available.
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/license/fetch" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"sku\": \"WIN11-PRO-KEY\",
\"quantity\": 2,
\"order_id\": \"WC-102938\",
\"order_email\": \"buyer@example.com\",
\"source\": \"woocommerce\"
}"
const url = new URL(
"https://app.licenseshipper.com/api/license/fetch"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"sku": "WIN11-PRO-KEY",
"quantity": 2,
"order_id": "WC-102938",
"order_email": "buyer@example.com",
"source": "woocommerce"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/license/fetch';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'sku' => 'WIN11-PRO-KEY',
'quantity' => 2,
'order_id' => 'WC-102938',
'order_email' => 'buyer@example.com',
'source' => 'woocommerce',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/license/fetch'
payload = {
"sku": "WIN11-PRO-KEY",
"quantity": 2,
"order_id": "WC-102938",
"order_email": "buyer@example.com",
"source": "woocommerce"
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (200, Success):
{
"success": true,
"message": "All licenses assigned successfully.",
"data": {
"product": {
"name": "Windows 11 Pro",
"sku": "WIN11-PRO-KEY",
"download_link": "https://example.com/dl",
"activation_guide": "https://app.example.com/storage/temp-guides/guide.pdf"
},
"licenses": [
{
"license_id": 1,
"key": "AAAA-BBBB-CCCC-DDDD",
"price": 14.99
}
]
},
"meta": {
"delivered_total": 1
}
}
Example response (400, Already delivered):
{
"success": false,
"message": "This order has already received licenses.",
"meta": {
"already_delivered": 1
}
}
Example response (402, Subscription missing):
{
"success": false,
"message": "Subscription missing"
}
Example response (403, Blacklisted):
{
"success": false,
"message": "Request blocked by Blacklist Manager.",
"meta": {
"block_id": 12,
"scope": "global"
}
}
Example response (404, Product not found):
{
"success": false,
"message": "Product not found or unauthorized."
}
Example response (422, Validation error):
{
"success": false,
"message": "Validation failed.",
"errors": {
"sku": [
"The sku field is required."
]
}
}
Example response (429, Monthly quota reached):
{
"success": false,
"message": "Monthly quota reached. Upgrade plan or wait until next month."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Products
API endpoints for managing your products.
List products
requires authentication
Returns the authenticated user's active products.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/products?q=consequatur&active=&sort=consequatur&per_page=17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/products"
);
const params = {
"q": "consequatur",
"active": "0",
"sort": "consequatur",
"per_page": "17",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'q' => 'consequatur',
'active' => '0',
'sort' => 'consequatur',
'per_page' => '17',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products'
params = {
'q': 'consequatur',
'active': '0',
'sort': 'consequatur',
'per_page': '17',
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()
Example response (200):
{
"success": true,
"message": "Product list retrieved successfully.",
"data": {
"products": [
{
"id": 1,
"name": "Windows 11 Pro",
"sku": "WIN11-PRO-KEY"
}
]
},
"meta": {
"count": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create product
requires authentication
Adds a new product for the authenticated user.
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/products" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"consequatur\",
\"sku\": \"consequatur\",
\"download_link\": \"consequatur\",
\"active\": false
}"
const url = new URL(
"https://app.licenseshipper.com/api/products"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "consequatur",
"sku": "consequatur",
"download_link": "consequatur",
"active": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'consequatur',
'sku' => 'consequatur',
'download_link' => 'consequatur',
'active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products'
payload = {
"name": "consequatur",
"sku": "consequatur",
"download_link": "consequatur",
"active": false
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (201):
{
"success": true,
"message": "Product created successfully.",
"data": {
"id": 1,
"name": "Windows 11 Pro",
"sku": "WIN11-PRO-KEY"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Show product details
requires authentication
Displays full product information by ID.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/products/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/products/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products/17';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products/17'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Product details retrieved successfully.",
"data": {
"id": 1,
"name": "Windows 11 Pro",
"sku": "WIN11-PRO-KEY",
"download_link": "https://example.com/file.zip",
"active": true
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update product
requires authentication
Example request:
curl --request PUT \
"https://app.licenseshipper.com/api/products/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"consequatur\",
\"sku\": \"consequatur\",
\"download_link\": \"consequatur\",
\"active\": false
}"
const url = new URL(
"https://app.licenseshipper.com/api/products/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "consequatur",
"sku": "consequatur",
"download_link": "consequatur",
"active": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products/17';
$response = $client->put(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'consequatur',
'sku' => 'consequatur',
'download_link' => 'consequatur',
'active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products/17'
payload = {
"name": "consequatur",
"sku": "consequatur",
"download_link": "consequatur",
"active": false
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PUT', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "Product updated successfully.",
"data": {
"id": 1,
"name": "Windows 11 Pro",
"sku": "WIN11-PRO-KEY"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update product
requires authentication
Example request:
curl --request PATCH \
"https://app.licenseshipper.com/api/products/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"consequatur\",
\"sku\": \"consequatur\",
\"download_link\": \"consequatur\",
\"active\": false
}"
const url = new URL(
"https://app.licenseshipper.com/api/products/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "consequatur",
"sku": "consequatur",
"download_link": "consequatur",
"active": false
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products/17';
$response = $client->patch(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'consequatur',
'sku' => 'consequatur',
'download_link' => 'consequatur',
'active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products/17'
payload = {
"name": "consequatur",
"sku": "consequatur",
"download_link": "consequatur",
"active": false
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "Product updated successfully.",
"data": {
"id": 1,
"name": "Windows 11 Pro",
"sku": "WIN11-PRO-KEY"
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete product
requires authentication
Example request:
curl --request DELETE \
"https://app.licenseshipper.com/api/products/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/products/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products/17';
$response = $client->delete(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products/17'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('DELETE', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Product deleted successfully.",
"data": [],
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List licenses for a product
requires authentication
Returns licenses linked to a specific product you own.
License keys are masked in the list for security.
Use the GET /licenses/{license}
endpoint to see the full key.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/products/17/licenses?status=0&per_page=25&sort=created_at%2Cdesc" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/products/17/licenses"
);
const params = {
"status": "0",
"per_page": "25",
"sort": "created_at,desc",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products/17/licenses';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'status' => '0',
'per_page' => '25',
'sort' => 'created_at,desc',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products/17/licenses'
params = {
'status': '0',
'per_page': '25',
'sort': 'created_at,desc',
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()
Example response (200):
{
"success": true,
"message": "Product licenses retrieved successfully.",
"data": {
"licenses": [
{
"id": 101,
"masked_key": "ABCD••••••••••1234",
"price": "9.99",
"status": 0,
"order_id": null,
"order_email": null,
"source": "Manual",
"redeemed_at": null,
"created_at": "2025-08-13T10:20:00Z"
}
]
},
"meta": {
"counts": {
"total": 10,
"available": 6,
"assigned": 3,
"redeemed": 1
},
"current_page": 1,
"per_page": 15,
"total": 10,
"last_page": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List licenses by SKU
requires authentication
Returns licenses for a product you own, looked up by SKU. License keys are masked in the list for security.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/products/sku/WIN11-PRO-KEY/licenses?status=0&per_page=25&sort=created_at%2Cdesc" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/products/sku/WIN11-PRO-KEY/licenses"
);
const params = {
"status": "0",
"per_page": "25",
"sort": "created_at,desc",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/products/sku/WIN11-PRO-KEY/licenses';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'status' => '0',
'per_page' => '25',
'sort' => 'created_at,desc',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/products/sku/WIN11-PRO-KEY/licenses'
params = {
'status': '0',
'per_page': '25',
'sort': 'created_at,desc',
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()
Example response (200):
{
"success": true,
"message": "Product licenses (by SKU) retrieved successfully.",
"data": {
"licenses": []
},
"meta": {
"counts": {
"total": 0,
"available": 0,
"assigned": 0,
"redeemed": 0
},
"current_page": 1,
"per_page": 15,
"total": 0,
"last_page": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Suppliers
API endpoints for managing suppliers.
List suppliers
requires authentication
Returns suppliers belonging to the authenticated user.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/suppliers?q=%22Acme%22&status=1&sort=name%2Casc&per_page=25" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/suppliers"
);
const params = {
"q": ""Acme"",
"status": "1",
"sort": "name,asc",
"per_page": "25",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/suppliers';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'q' => '"Acme"',
'status' => '1',
'sort' => 'name,asc',
'per_page' => '25',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/suppliers'
params = {
'q': '"Acme"',
'status': '1',
'sort': 'name,asc',
'per_page': '25',
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()
Example response (200):
{
"success": true,
"message": "Supplier list retrieved successfully.",
"data": {
"suppliers": [
{
"id": 1,
"name": "Acme Keys",
"contact": "sales@acme.tld",
"status": true
}
]
},
"meta": {
"current_page": 1,
"per_page": 15,
"total": 1,
"last_page": 1,
"sort": [
"id",
"desc"
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create supplier
requires authentication
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/suppliers" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Acme Keys\",
\"contact\": \"sales@acme.tld\",
\"status\": false
}"
const url = new URL(
"https://app.licenseshipper.com/api/suppliers"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Acme Keys",
"contact": "sales@acme.tld",
"status": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/suppliers';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'Acme Keys',
'contact' => 'sales@acme.tld',
'status' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/suppliers'
payload = {
"name": "Acme Keys",
"contact": "sales@acme.tld",
"status": false
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (201):
{
"success": true,
"message": "Supplier created successfully.",
"data": {
"id": 1,
"name": "Acme Keys",
"contact": "sales@acme.tld",
"status": true
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Show supplier
requires authentication
Returns a supplier and quick license counts.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/suppliers/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/suppliers/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/suppliers/17';
$response = $client->get(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/suppliers/17'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Supplier details retrieved successfully.",
"data": {
"id": 1,
"name": "Acme Keys",
"contact": "sales@acme.tld",
"status": true,
"license_counts": {
"total": 20,
"available": 15,
"assigned": 3,
"redeemed": 2
}
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update supplier
requires authentication
Example request:
curl --request PUT \
"https://app.licenseshipper.com/api/suppliers/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"consequatur\",
\"contact\": \"consequatur\",
\"status\": false
}"
const url = new URL(
"https://app.licenseshipper.com/api/suppliers/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "consequatur",
"contact": "consequatur",
"status": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/suppliers/17';
$response = $client->put(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'consequatur',
'contact' => 'consequatur',
'status' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/suppliers/17'
payload = {
"name": "consequatur",
"contact": "consequatur",
"status": false
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PUT', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "Supplier updated successfully.",
"data": {
"id": 1,
"name": "Acme Keys",
"status": true
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update supplier
requires authentication
Example request:
curl --request PATCH \
"https://app.licenseshipper.com/api/suppliers/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"consequatur\",
\"contact\": \"consequatur\",
\"status\": false
}"
const url = new URL(
"https://app.licenseshipper.com/api/suppliers/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "consequatur",
"contact": "consequatur",
"status": false
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/suppliers/17';
$response = $client->patch(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'consequatur',
'contact' => 'consequatur',
'status' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/suppliers/17'
payload = {
"name": "consequatur",
"contact": "consequatur",
"status": false
}
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()
Example response (200):
{
"success": true,
"message": "Supplier updated successfully.",
"data": {
"id": 1,
"name": "Acme Keys",
"status": true
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete supplier
requires authentication
Note: Existing licenses referencing this supplier will be deleted
only if your foreign key is onDelete('cascade')
on licenses.supplier_id
.
Example request:
curl --request DELETE \
"https://app.licenseshipper.com/api/suppliers/17" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/suppliers/17"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/suppliers/17';
$response = $client->delete(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/suppliers/17'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('DELETE', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Supplier deleted successfully.",
"data": [],
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Toggle supplier status
requires authentication
Flips status
true/false.
Example request:
curl --request POST \
"https://app.licenseshipper.com/api/suppliers/17/toggle" \
--header "X-API-KEY: {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/suppliers/17/toggle"
);
const headers = {
"X-API-KEY": "{YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/suppliers/17/toggle';
$response = $client->post(
$url,
[
'headers' => [
'X-API-KEY' => '{YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/suppliers/17/toggle'
headers = {
'X-API-KEY': '{YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Supplier status toggled successfully.",
"data": {
"id": 1,
"status": false
},
"meta": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Utility
Ping (health check)
Lightweight endpoint to verify API availability and clock sync.
Example request:
curl --request GET \
--get "https://app.licenseshipper.com/api/ping" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.licenseshipper.com/api/ping"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://app.licenseshipper.com/api/ping';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json
url = 'https://app.licenseshipper.com/api/ping'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"message": "Ping successful.",
"data": {
"server_time": "2025-08-13 17:20:33"
},
"meta": {
"author": "LicenseShipper API"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.