Pengine Store API
Endpoints

Products

How to read the products you created in Pengine.

Products are read-only in the Store API. Create and edit them in the Pengine app, then use these endpoints to display them in your storefront.

A product is the item a customer browses. A variant is a purchasable combination of color and size with its own SKU and price. Every product has at least one variant.

The product object

Prop

Type

Variant

Prop

Type

Image

Prop

Type

The URL lives on the nested image object, not on the entry itself.

Color metadata

Prop

Type

Statuses

StatusMeaningOrderable
activePublished and for sale.Yes
unlistedHidden from listings but available through direct links or private collections.Yes
draftStill being built in the app.No
archivedRetired.No

You get all of them, on purpose

The API returns products with every status. Filter to active for a public listing, and treat draft and archived as internal. Trying to order either one is a 400.

List products

GET /store-api/2026-08/stores/:storeId/products
Parameter
filter[status]One or more of active, draft, unlisted, archived.
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/products?filter[status]=active,unlisted&sort[name]=asc&limit=50" \
  -H "X-API-Key: $PENGINE_API_KEY"
200 OK, one item shown
{
  "items": [
    {
      "id": "saryo4m9p6ki3u1558m6h56j",
      "name": "Midweight Hoodie",
      "vendor": "Northbound",
      "productType": "Independent Trading Co. Midweight Hooded Sweatshirt (SS4500)",
      "tags": ["hoodie", "winter"],
      "status": "active",
      "isDiscontinued": false,
      "colors": ["Black", "White"],
      "sizes": ["S", "M", "XL"],
      "colorMetadata": [
        { "color": "Black", "colorCode": "#000000" },
        { "color": "White", "colorCode": "#FFFFFF" }
      ],
      "variants": [
        {
          "id": "ak88bwfjjqn5cjt5jaczmn1n",
          "sku": "PGN70872789915240044115",
          "name": "Black",
          "color": "Black",
          "size": "S",
          "price": 166.8,
          "compareAtPrice": 199.0,
          "cost": 130.7,
          "isDiscontinued": false,
          "position": 1
        }
      ],
      "images": [
        {
          "id": "zkk2lkpxredez88sw0ljgwia",
          "color": "Black",
          "image": {
            "id": "kl1v18gmjnd420uziof6ecv0",
            "url": "https://cdn.pengine.io/files/kl1v18gmjnd420uziof6ecv0/Midweight-Hoodie-Front-Black.png"
          },
          "position": 1
        }
      ],
      "createdAt": "2026-08-19T12:34:17.664Z",
      "updatedAt": "2026-08-19T12:34:17.664Z"
    }
  ],
  "totalItems": 1,
  "startItem": 1,
  "endItem": 1,
  "totalPages": 1,
  "query": {
    "page": 1,
    "limit": 50,
    "filter": { "status": ["active", "unlisted"] },
    "sort": { "createdAt": "desc", "name": "asc" }
  }
}

Get one product

GET /store-api/2026-08/stores/:storeId/products/:productId
curl https://api.pengine.io/store-api/2026-08/stores/$STORE_ID/products/saryo4m9p6ki3u1558m6h56j \
  -H "X-API-Key: $PENGINE_API_KEY"

Returns the same object as the list endpoint, regardless of status. A product from another store and an ID that does not exist return the same response:

404 Not Found
{ "message": "Product not found", "error": "Not Found", "statusCode": 404 }

Working with products

Cache products and refresh them through webhooks. Sync the list once, then use products_create, products_update, and products_delete to update only the affected record. See Webhooks.

Two prices, two meanings. price and compareAtPrice are the retail prices you set for your own storefront to display. cost is what Pengine charges you for the variant. Nothing here decides what your customer pays.

Respect discontinued flags. A discontinued product or variant cannot be ordered. Remove it from your storefront before checkout.

Images are per color. Group them by color to build a gallery for the variant a customer is looking at.

On this page