Catalog products
How to browse the blanks your store can print on.
A catalog product is a printable blank available in specific colors and sizes. Build a product from it in the Pengine app, or order it as a custom item with your artwork.
Catalog products are read-only and do not include prices. Costs appear on the order response.
What your store can see
The list includes all public blanks and any private blanks assigned to your store. Available catalog products can differ between stores.
The catalog product object
Prop
Type
Decoration location
Prop
Type
Read decorationMethods per location, not per product
The product-level list is everything the blank supports anywhere. A location can exclude some of
those, so the list inside decorationLocations is the one to validate against before you order.
Variant
Prop
Type
Image
Prop
Type
Color metadata
Prop
Type
Decoration methods
These are the values decorationMethods can contain, and the values you send as decorationMethod on
a custom line item.
direct_to_garment direct_to_film screen_printing
screen_print_transfer heat_transfer_vinyl heat_seal_patch
sewn_on_patch embroidery engraving
uv_printing liquid_3dSupported methods and their costs vary by blank. New methods can be added without a new API version, so handle known values and provide a fallback for unknown ones.
Decoration locations
decorationLocation names a place on the blank, such as front, back, left_chest,
left_sleeve_short or cap_front. The set is large and differs by product type, so read the locations
from the blank itself rather than hard-coding a list.
List catalog products
| Parameter | |
|---|---|
filter[productType] | One or more product types. |
filter[decorationMethod] | One or more methods. Matches a blank that supports any of them. |
sort[name] | asc or desc. |
sort[updatedAt] | asc or desc. |
sort[createdAt] | asc or desc. Defaults to desc, and is always applied last as a tiebreak. |
page, limit | Standard paging. See Lists. |
curl "https://api.pengine.io/store-api/2026-08/stores/$STORE_ID/catalog-products?filter[productType]=shirts&filter[decorationMethod]=direct_to_garment&sort[name]=asc" \
-H "X-API-Key: $PENGINE_API_KEY"{
"items": [
{
"id": "yfv2qeltvoedfmjayf1kzom9",
"name": "Unisex Heavy Cotton Tee",
"brand": "Gildan",
"style": "5000",
"productType": "shirts",
"isDiscontinued": false,
"colors": ["Black", "White"],
"sizes": ["S", "M", "L"],
"colorMetadata": [
{ "color": "Black", "colorCode": "#000000" },
{ "color": "White", "colorCode": "#FFFFFF" }
],
"decorationMethods": ["direct_to_garment", "screen_printing"],
"decorationLocations": [
{
"decorationLocation": "front",
"decorationMethods": ["direct_to_garment", "screen_printing"],
"physicalWidth": 12,
"physicalHeight": 14,
"position": 1
},
{
"decorationLocation": "left_chest",
"decorationMethods": ["direct_to_garment"],
"physicalWidth": 4,
"physicalHeight": 3.5,
"position": 2
}
],
"variants": [
{
"id": "zt1vz7szjeiv64qezrzakzc8",
"name": "Black",
"color": "Black",
"size": "S",
"isDiscontinued": false,
"position": 1
}
],
"images": [
{
"id": "pslmra182p9w5411kw8cl0mj",
"image": {
"id": "xyezzmo7zd2md895c3h56hp7",
"url": "https://cdn.pengine.io/files/xyezzmo7zd2md895c3h56hp7/Gildan-5000.png"
},
"position": 1
}
],
"createdAt": "2026-05-04T09:12:44.201Z",
"updatedAt": "2026-07-21T16:03:10.885Z"
}
],
"totalItems": 1,
"startItem": 1,
"endItem": 1,
"totalPages": 1,
"query": {
"page": 1,
"limit": 50,
"filter": { "productType": ["shirts"], "decorationMethod": ["direct_to_garment"] },
"sort": { "createdAt": "desc", "name": "asc" }
}
}Get one catalog product
curl https://api.pengine.io/store-api/2026-08/stores/$STORE_ID/catalog-products/yfv2qeltvoedfmjayf1kzom9 \
-H "X-API-Key: $PENGINE_API_KEY"Returns the same object as the list endpoint. A blank unavailable to your store and an ID that does not exist return the same response:
{ "message": "Catalog product not found", "error": "Not Found", "statusCode": 404 }Working with catalog products
Cache the catalog. It changes far less often than your products do. Refresh it on a schedule rather than on every page view.
Validate placement before checkout. The print area dimensions are what an order is checked against,
so checking them yourself while the customer is still designing avoids a 400 at the end. See
Custom items.
Watch the discontinued flags. A discontinued blank or variant cannot be ordered. Remove it from your storefront before checkout.