Skip to content

List Products

The canonical admin product listing over GraphQL — a cursor-paginated query that mirrors the Bagisto admin Catalog → Products datagrid. Returns the full product row with filtering, sorting, and cursor pagination. This is the query you want for product-management screens.

How this menu works

For the product types, the two-step create flow, status vs. visibleIndividually, and the per-product sub-resources, see the Products overview.

Not the Create-Order search

adminCatalogProducts (this query) is the full product listing.

A separate slim search — adminProducts — powers the admin Create-Order "Add Product" modal only. Use this query for the actual product listing.

Operation

OperationTypePagination
adminCatalogProductsQueryCursor (first / after)

Authentication

Every request must include an admin Bearer token:

Authorization: Bearer <token>

Obtain a token via the createAdminLogin mutation.

Arguments

ArgumentTypeDescriptionExample
firstIntNumber of items to return per page (default 10, max 50)10
afterStringCursor from a previous pageInfo.endCursor for keyset pagination"MA=="
product_idStringFilter by product ID — single integer or comma-separated list"142" or "1,2,3"
skuStringPartial SKU match (SQL LIKE %value%)"SP-001"
nameStringPartial product name match (SQL LIKE %value%)"Classic Watch"
typeStringFilter by product type"simple"
statusIntFilter by status: 0 = disabled, 1 = enabled1
attribute_familyStringFilter by attribute family ID"1"
channelStringChannel code for value resolution (default: current channel)"default"
localeStringLocale code for name/category resolution (default: app locale)"en"
price_fromFloatMinimum price filter (inclusive)10.0
price_toFloatMaximum price filter (inclusive)500.0
sortStringColumn to sort by (see Sorting section below)"product_id"
orderStringSort direction: "asc" or "desc" (default "desc")"desc"

Valid type values

"simple", "configurable", "bundle", "grouped", "downloadable", "virtual", "booking"

Node Fields

Each edges[].node object contains the following fields:

FieldTypeDescription
idIDAPI Platform IRI (e.g. /api/admin/catalog/products/142)
_idIntRaw product ID
skuStringProduct SKU
nameStringProduct name (resolved via locale and channel)
typeStringProduct type
statusInt1 = enabled, 0 = disabled
priceStringRaw price as a decimal string (e.g. "3000.0000")
formattedPriceStringLocale-formatted price (e.g. "$3,000.00")
specialPriceStringRaw special (sale) price as a decimal string; null if none
formattedSpecialPriceStringLocale-formatted special price; null if none
specialPriceFromStringStart of the special-price window; null unless a dated window is set
specialPriceToStringEnd of the special-price window; null unless a dated window is set
quantityIntSum of inventory qty across all inventory sources
baseImageUrlStringStorage URL of the first product image; null if no images
imagesCountIntTotal number of images attached to the product
categoryIdIntID of the first category this product belongs to; null if uncategorized
categoryNameStringTranslated name of that category; null if uncategorized
channelStringChannel code used for resolution
localeStringLocale code used for resolution
attributeFamilyIdIntAttribute family ID
attributeFamilyNameStringAttribute family name
urlKeyStringURL slug (e.g. "acme-drawstring-bag")
visibleIndividuallyBooleanWhether the product appears in category/search listings
shortDescriptionStringShort description
metaTitleStringSEO meta title (empty string when unset)
metaDescriptionStringSEO meta description (empty string when unset)
metaKeywordsStringSEO meta keywords (empty string when unset)
weightFloatProduct weight
featuredBooleanWhether the product is flagged as featured
newBooleanWhether the product is flagged as "new"
createdAtStringCreation timestamp
updatedAtStringLast-update timestamp

Notes on the listing values:

  • price, specialPrice are decimal strings, not numbers.
  • specialPriceFrom / specialPriceTo are null unless a dated special-price window is configured.
  • quantity is the summed inventory across all sources.

The following fields are detail-only and always come back null on the listing — fetch them from the single-product query adminCatalogProduct(id:):

  • taxCategoryId, manageStock, inStock
  • the relation blocks: translations, images, categories, inventories, customerGroupPrices, superAttributes, variants, bundleOptions, linkedProducts, downloadableLinks, downloadableSamples, videos, channels, relatedProducts, upSells, crossSells.

Example Query

graphql
query AdminCatalogProducts(
  $first: Int
  $after: String
  $sku: String
  $type: String
  $status: Int
  $priceFrom: Float
  $priceTo: Float
) {
  adminCatalogProducts(
    first: $first
    after: $after
    sku: $sku
    type: $type
    status: $status
    price_from: $priceFrom
    price_to: $priceTo
  ) {
    edges {
      cursor
      node {
        id
        _id
        sku
        name
        type
        status
        price
        formattedPrice
        specialPrice
        formattedSpecialPrice
        specialPriceFrom
        specialPriceTo
        quantity
        baseImageUrl
        imagesCount
        categoryId
        categoryName
        channel
        locale
        attributeFamilyId
        attributeFamilyName
        urlKey
        visibleIndividually
        shortDescription
        metaTitle
        metaDescription
        metaKeywords
        weight
        featured
        new
        createdAt
        updatedAt
      }
    }
    pageInfo {
      hasNextPage
      hasPreviousPage
      endCursor
      startCursor
    }
    totalCount
  }
}
json
{
  "first": 10,
  "sku": "SP-",
  "type": "simple",
  "status": 1
}

Example Response

json
{
  "data": {
    "adminCatalogProducts": {
      "edges": [
        {
          "cursor": "MA==",
          "node": {
            "id": "/api/admin/catalog/products/22",
            "_id": 22,
            "sku": "bagistoNGRY3424234KJCKJK",
            "name": "Acme Drawstring Bag",
            "type": "simple",
            "status": 1,
            "price": "3000.0000",
            "formattedPrice": "$3,000.00",
            "specialPrice": "2700.0000",
            "formattedSpecialPrice": "$2,700.00",
            "specialPriceFrom": null,
            "specialPriceTo": null,
            "quantity": 98,
            "baseImageUrl": "http://localhost:8000/storage/product/22/1qfyoglc5BP46kofrxYrkJ2MXRxu9lAVG3BDFlTZ.webp",
            "imagesCount": 1,
            "categoryId": null,
            "categoryName": null,
            "channel": "default",
            "locale": "en",
            "attributeFamilyId": 1,
            "attributeFamilyName": "Default",
            "urlKey": "acme-drawstring-bag",
            "visibleIndividually": true,
            "shortDescription": "Many desktop publishing packages and web page editors now use",
            "metaTitle": "",
            "metaDescription": "",
            "metaKeywords": "",
            "weight": 32,
            "featured": true,
            "new": true,
            "createdAt": "2024-04-19 11:56:43",
            "updatedAt": "2026-04-23 16:36:14"
          }
        }
      ],
      "pageInfo": {
        "hasNextPage": true,
        "hasPreviousPage": false,
        "endCursor": "MA==",
        "startCursor": "MA=="
      },
      "totalCount": 265
    }
  }
}

Sorting

Pass sort with the column name and order for direction. A compound form sort=name-asc is also accepted (splits on - to extract column and direction).

Sortable columns:

sort valueSorts by
product_idProduct ID (default)
nameProduct name
skuSKU
pricePrice
quantityInventory quantity (SUM across sources)
statusEnabled/disabled status
typeProduct type
attribute_familyAttribute family ID
channelChannel code

Cursor Pagination

  • first controls the page size (default 10, max 50).
  • To fetch the next page, pass the pageInfo.endCursor value as after in the next request.
  • totalCount reflects the full count of matching products across all pages.

How It Differs from adminProducts

adminCatalogProductsadminProducts
PurposeThe canonical product listing (catalog management)Slim Create-Order "Add Product" search
Row shapeFull product rowSlim row (9 fields)
FiltersFull set (price range, attribute family, status, type, etc.)A handful (query text, sku, type, status, categoryId, channel)
Default status filterNone — all statuses returnedNone — all statuses returned

Use this query for the product listing; use adminProducts only for the Create-Order product search.

Notes

  • Elasticsearch is not yet supported. Even when the Bagisto admin panel is configured to use Elasticsearch for catalog search, this query always uses the database path.
  • No automatic status filter — unlike GET /api/shop/products (the storefront product list), this query returns all statuses by default. Pass status: 1 to restrict to enabled products.
  • Multi-category products — only the first associated category's categoryId and categoryName are included (matching the datagrid display).

Released under the MIT License.