MENU navbar-image

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
    }
}
 

Request      

GET api/activation-guides

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

q   string  optional  

Search in content (LIKE). Example: "Windows"

product_id   integer  optional  

Filter by product. Example: 12

type   string  optional  

Filter by type (text|html|pdf_url). Example: html

per_page   integer  optional  

Items per page (1..100, default 15). Example: 25

sort   string  optional  

Sort "field,dir" where field in (id,created_at,updated_at). Example: created_at,desc

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": []
}
 

Request      

POST api/activation-guides

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

product_id   integer   

Product ID you own. Example: 12

type   string   

One of text|html|pdf_url. Example: html

content   string    Do this...

"" data-component="body">

The guide body or URL (if pdf_url). Example: "<p>Do this...</p>"

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": []
}
 

Request      

GET api/activation-guides/{guide_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

guide_id   integer   

The ID of the guide. Example: 17

guide   integer   

Guide ID. Example: 17

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": []
}
 

Request      

PUT api/activation-guides/{guide_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

guide_id   integer   

The ID of the guide. Example: 17

guide   integer   

Guide ID. Example: 17

Body Parameters

product_id   integer  optional  

Optional, must be your product and unused by another guide. Example: 17

type   string  optional  

Optional. One of text|html|pdf_url. Example: consequatur

content   string  optional  

Optional. Example: consequatur

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": []
}
 

Request      

PATCH api/activation-guides/{guide_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

guide_id   integer   

The ID of the guide. Example: 17

guide   integer   

Guide ID. Example: 17

Body Parameters

product_id   integer  optional  

Optional, must be your product and unused by another guide. Example: 17

type   string  optional  

Optional. One of text|html|pdf_url. Example: consequatur

content   string  optional  

Optional. Example: consequatur

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": []
}
 

Request      

DELETE api/activation-guides/{guide_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

guide_id   integer   

The ID of the guide. Example: 17

guide   integer   

Guide ID. Example: 17

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": []
}
 

Request      

GET api/products/{product_id}/activation-guide

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

product_id   integer   

The ID of the product. Example: 17

product   integer   

Product ID. Example: 17

Licenses

API endpoints for managing license keys.

Status legend:

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
    }
}
 

Request      

GET api/licenses

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

status   integer  optional  

Filter by status (0,1,2). Example: 0

product_id   integer  optional  

Filter by product. Example: 12

supplier_id   integer  optional  

Filter by supplier. Example: 3

order_email   string  optional  

Filter by customer email (contains). Example: user@example.com

order_id   string  optional  

Filter by external order id (contains). Example: 100045

key_ends   string  optional  

Optional. Match last N chars of key (masked search). Example: ABC123

date_from   string  optional  

date ISO date for created_at >=. Example: 2025-08-01

date_to   string  optional  

date ISO date for created_at <=. Example: 2025-08-13

per_page   integer  optional  

Items per page (1..100). Defaults to 15. Example: 25

sort   string  optional  

Sort "field,dir" where field in (id, price, created_at, redeemed_at). Example: created_at,desc

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": []
}
 

Request      

POST api/licenses

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

product_id   integer   

When creating a single license. Example: 17

supplier_id   integer  optional  

optional Supplier reference. Example: 17

key   string   

The license key value. Example: consequatur

price   number  optional  

optional Price paid for the key. Example: 9.99

source   string  optional  

optional Origin label (WooCommerce, API, Manual). Example: consequatur

status   integer  optional  

optional 0|1|2. Default: 0. Example: 17

items   string[]  optional  

optional For bulk creates.

product_id   integer   

Example: 17

supplier_id   integer  optional  

optional Example: 17

key   string   

Example: consequatur

price   number  optional  

optional Example: 11613.31890586

source   string  optional  

optional Example: consequatur

status   integer  optional  

optional Example: 17

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": []
}
 

Request      

GET api/licenses/{license_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

license_id   integer   

The ID of the license. Example: 17

license   integer   

The license ID. Example: 17

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": []
}
 

Request      

PUT api/licenses/{license_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

license_id   integer   

The ID of the license. Example: 17

license   integer   

The license ID. Example: 17

Body Parameters

product_id   integer  optional  

optional Must belong to the user. Example: 17

supplier_id   integer  optional  

optional Example: 17

key   string  optional  

optional Example: consequatur

price   number  optional  

optional Example: 11613.31890586

status   integer  optional  

optional 0|1|2 Example: 17

order_id   string  optional  

optional Example: consequatur

order_email   string  optional  

optional Example: qkunze@example.com

source   string  optional  

optional Example: consequatur

redeemed_at   datetime  optional  

optional ISO8601, for admins/backfills. Example: consequatur

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": []
}
 

Request      

PATCH api/licenses/{license_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

license_id   integer   

The ID of the license. Example: 17

license   integer   

The license ID. Example: 17

Body Parameters

product_id   integer  optional  

optional Must belong to the user. Example: 17

supplier_id   integer  optional  

optional Example: 17

key   string  optional  

optional Example: consequatur

price   number  optional  

optional Example: 11613.31890586

status   integer  optional  

optional 0|1|2 Example: 17

order_id   string  optional  

optional Example: consequatur

order_email   string  optional  

optional Example: qkunze@example.com

source   string  optional  

optional Example: consequatur

redeemed_at   datetime  optional  

optional ISO8601, for admins/backfills. Example: consequatur

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": []
}
 

Request      

DELETE api/licenses/{license_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

license_id   integer   

The ID of the license. Example: 17

license   integer   

The license ID. Example: 17

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": []
}
 

Request      

POST api/licenses/{license_id}/assign

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

license_id   integer   

The ID of the license. Example: 17

license   integer   

The license ID. Example: 17

Body Parameters

order_id   string  optional  

optional External order id. Example: consequatur

order_email   string  optional  

optional Customer email. Example: qkunze@example.com

source   string  optional  

optional Origin label. Example: WooCommerce

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": []
}
 

Request      

POST api/licenses/{license_id}/redeem

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

license_id   integer   

The ID of the license. Example: 17

license   integer   

The license ID. Example: 17

Body Parameters

redeemed_at   datetime  optional  

optional ISO8601 (defaults to now). Example: consequatur

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": []
}
 

Request      

POST api/licenses/{license_id}/unassign

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

license_id   integer   

The ID of the license. Example: 17

license   integer   

The license ID. Example: 17

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."
}
 

Request      

POST api/license/fetch

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

sku   string   

The product SKU. Example: WIN11-PRO-KEY

quantity   integer   

Minimum: 1. Example: 2

order_id   string   

Merchant order ID. Example: WC-102938

order_email   string   

A valid email. Example: buyer@example.com

source   string   

Source system label. Example: woocommerce

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
    }
}
 

Request      

GET api/products

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

q   string  optional  

Optional. Search term for name or SKU. Example: consequatur

active   boolean  optional  

Optional. Filter by active status (1 or 0). Example: false

sort   string  optional  

Optional. Sort field and direction (e.g. name,asc). Example: consequatur

per_page   integer  optional  

Optional. Results per page (default: 15). Example: 17

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": []
}
 

Request      

POST api/products

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

Product name. Example: consequatur

sku   string   

Unique SKU code. Example: consequatur

download_link   string  optional  

Optional. Direct download URL. Example: consequatur

active   boolean  optional  

Optional. Default: true. Example: false

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": []
}
 

Request      

GET api/products/{product_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

product_id   integer   

The ID of the product. Example: 17

id   integer   

The ID of the product. Example: 17

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": []
}
 

Request      

PUT api/products/{product_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

product_id   integer   

The ID of the product. Example: 17

id   integer   

The ID of the product. Example: 17

Body Parameters

name   string  optional  

Optional. Product name. Example: consequatur

sku   string  optional  

Optional. Unique SKU. Example: consequatur

download_link   string  optional  

Optional. Direct download URL. Example: consequatur

active   boolean  optional  

Optional. Example: false

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": []
}
 

Request      

PATCH api/products/{product_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

product_id   integer   

The ID of the product. Example: 17

id   integer   

The ID of the product. Example: 17

Body Parameters

name   string  optional  

Optional. Product name. Example: consequatur

sku   string  optional  

Optional. Unique SKU. Example: consequatur

download_link   string  optional  

Optional. Direct download URL. Example: consequatur

active   boolean  optional  

Optional. Example: false

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": []
}
 

Request      

DELETE api/products/{product_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

product_id   integer   

The ID of the product. Example: 17

id   integer   

The ID of the product. Example: 17

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
    }
}
 

Request      

GET api/products/{product_id}/licenses

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

product_id   integer   

The ID of the product. Example: 17

product   integer   

The product ID. Example: 12

Query Parameters

status   integer  optional  

Optional. Filter by status (0=available, 1=assigned, 2=redeemed). Example: 0

per_page   integer  optional  

Optional. Items per page (1..100, default 15). Example: 25

sort   string  optional  

Optional. Sort "field,dir" where field in (id,price,created_at,redeemed_at). Example: created_at,desc

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
    }
}
 

Request      

GET api/products/sku/{sku}/licenses

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sku   string   

The product SKU. Example: WIN11-PRO-KEY

Query Parameters

status   integer  optional  

Optional. Filter by status (0=available, 1=assigned, 2=redeemed). Example: 0

per_page   integer  optional  

Optional. Items per page (1..100, default 15). Example: 25

sort   string  optional  

Optional. Sort "field,dir" where field in (id,price,created_at,redeemed_at). Example: created_at,desc

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"
        ]
    }
}
 

Request      

GET api/suppliers

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

q   string  optional  

Optional. Search in name or contact. Example: "Acme"

status   boolean  optional  

Optional. 1 or 0. Example: true

sort   string  optional  

Optional. "field,dir" where field in (id,name,created_at). Example: name,asc

per_page   integer  optional  

Optional. 1..100 (default 15). Example: 25

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": []
}
 

Request      

POST api/suppliers

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

Supplier name. Example: Acme Keys

contact   string   

Contact email/phone/handle. Example: sales@acme.tld

status   boolean  optional  

Optional. Default true. Example: false

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": []
}
 

Request      

GET api/suppliers/{supplier_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

supplier_id   integer   

The ID of the supplier. Example: 17

supplier   integer   

Supplier ID. Example: 17

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": []
}
 

Request      

PUT api/suppliers/{supplier_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

supplier_id   integer   

The ID of the supplier. Example: 17

supplier   integer   

Supplier ID. Example: 17

Body Parameters

name   string  optional  

Optional. Must be unique per user. Example: consequatur

contact   string  optional  

Optional. Example: consequatur

status   boolean  optional  

Optional. Example: false

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": []
}
 

Request      

PATCH api/suppliers/{supplier_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

supplier_id   integer   

The ID of the supplier. Example: 17

supplier   integer   

Supplier ID. Example: 17

Body Parameters

name   string  optional  

Optional. Must be unique per user. Example: consequatur

contact   string  optional  

Optional. Example: consequatur

status   boolean  optional  

Optional. Example: false

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": []
}
 

Request      

DELETE api/suppliers/{supplier_id}

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

supplier_id   integer   

The ID of the supplier. Example: 17

supplier   integer   

Supplier ID. Example: 17

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": []
}
 

Request      

POST api/suppliers/{supplier_id}/toggle

Headers

X-API-KEY      

Example: {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

supplier_id   integer   

The ID of the supplier. Example: 17

supplier   integer   

Supplier ID. Example: 17

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"
    }
}
 

Request      

GET api/ping

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json