Public guide

API Quick Start

This page helps you make your first successful API request without reading the full reference first. Use it to log in, get a bearer token, and start working with attribute groups, attributes, and products.

Base URL
https://print-label.cloud/api
Authorization header
Authorization: Bearer YOUR_BEARER_TOKEN

What you need before you start

  • Valid account credentials
  • Ability to send JSON HTTP requests
  • A bearer token from the login endpoint

Step 1. Get your bearer token

Send your email and password to the login endpoint. The API returns a token and token type. Use that token in all later requests.

POST

Login

https://print-label.cloud/api/login
Request body
{
  "email": "customer@example.com",
  "password": "secret123"
}
JavaScript (fetch)
fetch('https://print-label.cloud/api/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "email": "customer@example.com",
  "password": "secret123"
})
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X POST 'https://print-label.cloud/api/login' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "email": "customer@example.com",
  "password": "secret123"
}'
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('POST', 'https://print-label.cloud/api/login', [
    'headers' => [
        'Accept' => 'application/json',
        'Content-Type' => 'application/json',
    ],
    'body' => '{
  "email": "customer@example.com",
  "password": "secret123"
}',
]);

echo $response->getBody()->getContents();
Example response
{
  "token": "1|sanctum-token",
  "token_type": "Bearer"
}

Step 2. Send your first authenticated request

After login, send the token in the Authorization header. The example below lists attribute groups for the authenticated company.

GET

List attribute groups

https://print-label.cloud/api/cabinet/attribute-groups?page=1
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attribute-groups?page=1', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X GET 'https://print-label.cloud/api/cabinet/attribute-groups?page=1' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://print-label.cloud/api/cabinet/attribute-groups?page=1', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "data": [
    {
      "id": "group_01",
      "code": "size",
      "label": "Size",
      "attributes": []
    }
  ],
  "links": {
    "first": "https://print-label.cloud/api/cabinet/attribute-groups?page=1",
    "last": "https://print-label.cloud/api/cabinet/attribute-groups?page=1",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "path": "https://print-label.cloud/api/cabinet/attribute-groups",
    "per_page": 15,
    "to": 1,
    "total": 1
  }
}

Step 3. Work with attribute groups

Attribute groups help you organize related attributes. Use them before creating attributes.

Available endpoints

Method Path Purpose
GET /cabinet/attribute-groups List groups
POST /cabinet/attribute-groups Create group
GET /cabinet/attribute-groups/{groupId} Read one group
PUT /cabinet/attribute-groups/{groupId} Update group
DELETE /cabinet/attribute-groups/{groupId} Delete group
POST

Create attribute group

https://print-label.cloud/api/cabinet/attribute-groups
Request body
{
  "label": "Size",
  "sort": 10
}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attribute-groups', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "label": "Size",
  "sort": 10
})
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X POST 'https://print-label.cloud/api/cabinet/attribute-groups' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "label": "Size",
  "sort": 10
}'
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('POST', 'https://print-label.cloud/api/cabinet/attribute-groups', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'body' => '{
  "label": "Size",
  "sort": 10
}',
]);

echo $response->getBody()->getContents();
Example response
{
  "id": "group_01",
  "code": "size",
  "label": "Size",
  "attributes": []
}
GET

Read attribute group

https://print-label.cloud/api/cabinet/attribute-groups/{groupId}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attribute-groups/group_01', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X GET 'https://print-label.cloud/api/cabinet/attribute-groups/group_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://print-label.cloud/api/cabinet/attribute-groups/group_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "id": "group_01",
  "code": "size",
  "label": "Size",
  "attributes": []
}
PUT

Update attribute group

https://print-label.cloud/api/cabinet/attribute-groups/{groupId}
Request body
{
  "label": "Size & Dimensions",
  "sort": 20
}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attribute-groups/group_01', {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "label": "Size & Dimensions",
  "sort": 20
})
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X PUT 'https://print-label.cloud/api/cabinet/attribute-groups/group_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "label": "Size & Dimensions",
  "sort": 20
}'
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('PUT', 'https://print-label.cloud/api/cabinet/attribute-groups/group_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'body' => '{
  "label": "Size & Dimensions",
  "sort": 20
}',
]);

echo $response->getBody()->getContents();
Example response
{
  "id": "group_01",
  "code": "size_dimensions",
  "label": "Size & Dimensions",
  "attributes": []
}
DELETE

Delete attribute group

https://print-label.cloud/api/cabinet/attribute-groups/{groupId}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attribute-groups/group_01', {
  method: 'DELETE',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X DELETE 'https://print-label.cloud/api/cabinet/attribute-groups/group_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('DELETE', 'https://print-label.cloud/api/cabinet/attribute-groups/group_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "is_deleted": true
}

Step 4. Work with attributes

Attributes belong to an attribute group and define the product fields you can save later.

Available endpoints

Method Path Purpose
GET /cabinet/attributes/types List supported types
GET /cabinet/attributes List attributes
POST /cabinet/attributes Create attribute
GET /cabinet/attributes/{attributeId} Read one attribute
PUT /cabinet/attributes/{attributeId} Update attribute
DELETE /cabinet/attributes/{attributeId} Delete attribute
GET

List attributes

https://print-label.cloud/api/cabinet/attributes?page=1
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attributes?page=1', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X GET 'https://print-label.cloud/api/cabinet/attributes?page=1' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://print-label.cloud/api/cabinet/attributes?page=1', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "data": [
    {
      "code": "color",
      "id": "attr_01",
      "type": "select",
      "attribute_group_id": "group_01",
      "attribute_group": {
        "id": "group_01",
        "code": "size",
        "label": "Size"
      },
      "options": []
    }
  ],
  "links": {
    "first": "https://print-label.cloud/api/cabinet/attributes?page=1",
    "last": "https://print-label.cloud/api/cabinet/attributes?page=1",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 1
  }
}
GET

List available attribute types

https://print-label.cloud/api/cabinet/attributes/types
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attributes/types', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X GET 'https://print-label.cloud/api/cabinet/attributes/types' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://print-label.cloud/api/cabinet/attributes/types', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
[
  {
    "code": "text",
    "label": "Text"
  },
  {
    "code": "select",
    "label": "Select"
  }
]
POST

Create attribute

https://print-label.cloud/api/cabinet/attributes
Request body
{
  "attribute_group_id": "group_01",
  "label": "Color",
  "type": "select",
  "sort": 10
}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attributes', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "attribute_group_id": "group_01",
  "label": "Color",
  "type": "select",
  "sort": 10
})
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X POST 'https://print-label.cloud/api/cabinet/attributes' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "attribute_group_id": "group_01",
  "label": "Color",
  "type": "select",
  "sort": 10
}'
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('POST', 'https://print-label.cloud/api/cabinet/attributes', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'body' => '{
  "attribute_group_id": "group_01",
  "label": "Color",
  "type": "select",
  "sort": 10
}',
]);

echo $response->getBody()->getContents();
Example response
{
  "code": "color",
  "id": "attr_01",
  "type": "select",
  "attribute_group_id": "group_01",
  "attribute_group": {
    "id": "group_01",
    "code": "size",
    "label": "Size"
  },
  "options": []
}
GET

Read attribute

https://print-label.cloud/api/cabinet/attributes/{attributeId}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attributes/attr_01', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X GET 'https://print-label.cloud/api/cabinet/attributes/attr_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://print-label.cloud/api/cabinet/attributes/attr_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "code": "color",
  "id": "attr_01",
  "type": "select",
  "attribute_group_id": "group_01",
  "attribute_group": {
    "id": "group_01",
    "code": "size",
    "label": "Size"
  },
  "options": []
}
PUT

Update attribute

https://print-label.cloud/api/cabinet/attributes/{attributeId}
Request body
{
  "attribute_group_id": "group_01",
  "label": "Product Color",
  "type": "select",
  "sort": 20
}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attributes/attr_01', {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "attribute_group_id": "group_01",
  "label": "Product Color",
  "type": "select",
  "sort": 20
})
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X PUT 'https://print-label.cloud/api/cabinet/attributes/attr_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "attribute_group_id": "group_01",
  "label": "Product Color",
  "type": "select",
  "sort": 20
}'
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('PUT', 'https://print-label.cloud/api/cabinet/attributes/attr_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'body' => '{
  "attribute_group_id": "group_01",
  "label": "Product Color",
  "type": "select",
  "sort": 20
}',
]);

echo $response->getBody()->getContents();
Example response
{
  "code": "product_color",
  "id": "attr_01",
  "type": "select",
  "attribute_group_id": "group_01",
  "attribute_group": {
    "id": "group_01",
    "code": "size",
    "label": "Size"
  },
  "options": []
}
DELETE

Delete attribute

https://print-label.cloud/api/cabinet/attributes/{attributeId}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/attributes/attr_01', {
  method: 'DELETE',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X DELETE 'https://print-label.cloud/api/cabinet/attributes/attr_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('DELETE', 'https://print-label.cloud/api/cabinet/attributes/attr_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "is_deleted": true
}

Step 5. Work with products

Products are saved through an array of attribute codes and values. Use the attribute codes you created earlier.

Available endpoints

Method Path Purpose
GET /cabinet/products List products
POST /cabinet/products/search Search products
POST /cabinet/products Create product
GET /cabinet/products/{productId} Read one product
PUT /cabinet/products/{productId} Replace product
PATCH /cabinet/products/{productId} Partial update
DELETE /cabinet/products/{productId} Delete product
POST

Create product

https://print-label.cloud/api/cabinet/products
Request body
{
  "attributes": [
    {
      "code": "color",
      "value": "red"
    },
    {
      "code": "weight",
      "value": 42
    }
  ]
}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/products', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "attributes": [
    {
      "code": "color",
      "value": "red"
    },
    {
      "code": "weight",
      "value": 42
    }
  ]
})
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X POST 'https://print-label.cloud/api/cabinet/products' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "attributes": [
    {
      "code": "color",
      "value": "red"
    },
    {
      "code": "weight",
      "value": 42
    }
  ]
}'
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('POST', 'https://print-label.cloud/api/cabinet/products', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'body' => '{
  "attributes": [
    {
      "code": "color",
      "value": "red"
    },
    {
      "code": "weight",
      "value": 42
    }
  ]
}',
]);

echo $response->getBody()->getContents();
Example response
{
  "id": "product_01",
  "code": "SKU-001",
  "createdAt": "2026-03-30T10:00:00Z",
  "updatedAt": "2026-03-30T10:00:00Z",
  "values": [
    {
      "attribute_id": "attr_01",
      "attribute_code": "color",
      "value": "red"
    }
  ]
}
GET

List products

https://print-label.cloud/api/cabinet/products?page=1&perPage=50
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/products?page=1&perPage=50', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X GET 'https://print-label.cloud/api/cabinet/products?page=1&perPage=50' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://print-label.cloud/api/cabinet/products?page=1&perPage=50', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "data": [
    {
      "id": "product_01",
      "code": "SKU-001",
      "createdAt": "2026-03-30T10:00:00Z",
      "updatedAt": "2026-03-30T10:00:00Z",
      "values": []
    }
  ],
  "links": {
    "first": "https://print-label.cloud/api/cabinet/products?page=1",
    "last": "https://print-label.cloud/api/cabinet/products?page=1",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "per_page": 50,
    "total": 1
  }
}
GET

Read product

https://print-label.cloud/api/cabinet/products/{productId}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/products/product_01', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X GET 'https://print-label.cloud/api/cabinet/products/product_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('GET', 'https://print-label.cloud/api/cabinet/products/product_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "id": "product_01",
  "code": "SKU-001",
  "createdAt": "2026-03-30T10:00:00Z",
  "updatedAt": "2026-03-30T10:00:00Z",
  "values": []
}
PUT

Update product

https://print-label.cloud/api/cabinet/products/{productId}
Request body
{
  "attributes": [
    {
      "code": "color",
      "value": "blue"
    }
  ]
}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/products/product_01', {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "attributes": [
    {
      "code": "color",
      "value": "blue"
    }
  ]
})
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X PUT 'https://print-label.cloud/api/cabinet/products/product_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "attributes": [
    {
      "code": "color",
      "value": "blue"
    }
  ]
}'
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('PUT', 'https://print-label.cloud/api/cabinet/products/product_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'body' => '{
  "attributes": [
    {
      "code": "color",
      "value": "blue"
    }
  ]
}',
]);

echo $response->getBody()->getContents();
Example response
{
  "id": "product_01",
  "code": "SKU-001",
  "createdAt": "2026-03-30T10:00:00Z",
  "updatedAt": "2026-03-30T10:15:00Z",
  "values": [
    {
      "attribute_id": "attr_01",
      "attribute_code": "color",
      "value": "blue"
    }
  ]
}
DELETE

Delete product

https://print-label.cloud/api/cabinet/products/{productId}
JavaScript (fetch)
fetch('https://print-label.cloud/api/cabinet/products/product_01', {
  method: 'DELETE',
  headers: {
    'Authorization': 'Bearer YOUR_BEARER_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(async (response) => {
    const data = await response.json();
    return { status: response.status, data };
  })
  .then(({ status, data }) => {
    console.log('Status:', status);
    console.log(data);
  });
PHP with cURL
curl -X DELETE 'https://print-label.cloud/api/cabinet/products/product_01' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
PHP with Guzzle
<?php

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('DELETE', 'https://print-label.cloud/api/cabinet/products/product_01', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer YOUR_BEARER_TOKEN',
    ],
]);

echo $response->getBody()->getContents();
Example response
{
  "is_deleted": true
}

Response format

Most collection endpoints return paginated JSON with three top-level keys: data, links, and meta.

Single-resource endpoints return the resource object directly. Delete operations return { "is_deleted": true }.

Validation error example
{
  "message": "The given data was invalid.",
  "errors": {
    "label": [
      "The label field is required."
    ]
  }
}

Common errors

Missing auth header

Make sure every protected request includes the Authorization header in the form: Bearer {token}.

Wrong content type

For JSON requests, send Content-Type: application/json and encode the request body as valid JSON.

Invalid token

Get a fresh token by calling the login endpoint again with valid credentials. Do not forget the Bearer prefix.

Rate limits

If the API starts rejecting rapid repeated requests, slow down retries and use exponential backoff in your client.

Wrong endpoint URL

The authenticated resource paths are under /api/cabinet/... . Verify the method and exact URL before debugging payloads.

Pagination

Use the page query parameter on list endpoints. Product listing also supports perPage.

  • https://print-label.cloud/api/cabinet/attribute-groups?page=2
  • https://print-label.cloud/api/cabinet/attributes?page=3
  • https://print-label.cloud/api/cabinet/products?page=1&perPage=50

Need full request schemas and all endpoints?

Use the full Swagger reference for complete endpoint coverage and the latest schema details.

Open Swagger reference