Pengine Store API
Guides

Lists

How pagination, filtering and sorting work across list endpoints.

Products, catalog products, artworks, and orders use the same pagination, query syntax, and response envelope.

The envelope

200 OK
{
  "items": [],
  "totalItems": 16,
  "startItem": 1,
  "endItem": 2,
  "totalPages": 8,
  "query": {
    "page": 1,
    "limit": 2,
    "filter": {},
    "sort": { "createdAt": "desc" }
  }
}
FieldMeaning
itemsThe rows on this page, in the requested order.
totalItemsHow many rows match the filter, across every page.
startItem / endItemThe 1-based position of the first and last row on this page. Both are 0 when the page is empty.
totalPagesHow many pages the filter spans at this page size.
queryThe applied query, including default values. Use it to verify how the API interpreted your request.

Paging

ParameterDefaultRule
page11-based. A page past the end returns an empty items, not an error.
limit50Maximum 100. Anything larger is a 400.
curl "https://api.pengine.io/store-api/2026-08/stores/$STORE_ID/orders?page=2&limit=100" \
  -H "X-API-Key: $PENGINE_API_KEY"

Request pages until page reaches totalPages or items is empty.

Pagination uses offsets, so new records can shift later pages during a sync. For a full sync, sort by createdAt ascending. New records then appear after the pages you have already processed.

Filtering

Add filters with bracket notation. To pass multiple values, repeat the parameter or separate values with commas.

# One value
?filter[status]=active

# Several values, comma separated
?filter[status]=active,unlisted

# Several values, repeated
?filter[status]=active&filter[status]=unlisted

Dot notation works too, if your HTTP client prefers it. ?filter.status=active is the same request.

A value that is not a valid option is a 400 that names the ones that are:

400 Bad Request
{
  "message": [
    "filter.each value in fulfillmentStatus must be one of the following values: pending, production_requested, sent_to_production, in_production, fulfilled"
  ],
  "error": "Bad Request",
  "statusCode": 400
}

Available filters vary by endpoint. See each endpoint under Endpoints.

Sorting

Add sorts with bracket notation. Set each field to asc or desc.

?sort[name]=asc
?sort[createdAt]=asc
?sort[updatedAt]=desc&sort[createdAt]=desc

Each endpoint supports a fixed set of sort fields and applies them in a fixed order. Additional sorts break ties. createdAt is always applied last and defaults to descending, giving every list a stable order for pagination.

Unknown parameters

Unrecognized parameters are ignored, so ?utm_source=cron has no effect. Recognized parameters are validated, and invalid values fail the request.

On this page