Pengine Store API
Endpoints

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_3d

Supported 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

GET /store-api/2026-08/stores/:storeId/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, limitStandard 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"
200 OK, one item shown
{
  "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

GET /store-api/2026-08/stores/:storeId/catalog-products/:catalogProductId
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:

404 Not Found
{ "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.

On this page