API reference / Products

List products with pagination

q is a case-insensitive partial match on product title only. It does not search SKU, description, or other fields — a SKU fragment can return meta.total: 0. Use GET /open/v1/inventory?sku= for an exact SKU.

GET/open/v1/productsLimitedScope: catalog:read

Limited. This endpoint can be called, with the limitation described here. About availability tiers

Product listing is available with limited support for deep cursor traversal.

Workaround: Use returned pages as-is; contact MallPlus before relying on deep cursor traversal for high-volume sync.

Service Endpoint Seller token required

EnvironmentBase URL + Path
Productionhttps://open.mallplus.ph/open/v1/products
Sandboxhttps://sandbox.open.mallplus.ph/open/v1/products
Common Signing and Seller Headers
HeaderTypeRequiredRulesDescription
X-MallPlus-Partner-IdstringYesIssued client ID for the calling app.Identifies the partner app whose secret signs the request.
X-MallPlus-TimestampintegerYesUnix timestamp in seconds; default acceptance window is 90 seconds.Prevents replay outside the allowed signing window.
X-MallPlus-Signature-VersionstringYesUse 3 for HMAC v3.Selects the request signing algorithm.
X-MallPlus-NoncestringYes32-64 lowercase hexadecimal characters, unique per request.Replay-protection nonce included in the v3 signing base string.
X-MallPlus-SignaturestringYesHMAC-SHA256 over timestamp, client ID, method, path, canonical query, body hash, and nonce.Cryptographic proof that the request was signed with the app secret.
X-MallPlus-Access-TokenstringYesRequired when the operation says seller token required.Seller OAuth access token returned by the authorization flow.
X-MallPlus-Seller-IdstringYesRequired when X-MallPlus-Access-Token is required.Seller ID bound to the seller OAuth token.

Parameters

NameInTypeRequiredRulesDescription
pagequeryintegerNoMinimum: 1; Default: 11-based page number to return.
limitqueryintegerNoMinimum: 1; Maximum: 100; Default: 20Maximum number of records to return.
page_sizequeryintegerNoMinimum: 1; Maximum: 100Requested page size. When omitted, the endpoint uses the standard limit value.
qquerystringNo-Case-insensitive partial match on product title only. Does not search SKU, description, or other fields — a SKU fragment can return meta.total: 0. Exact SKU lookup is GET /open/v1/inventory?sku=.
statusqueryenumNoAllowed: live, unlisted, delisted, proposed, under_review, archived, published, draftProduct status to include in the list. Accepts every status a product can be observed in — settable by the partner: live, unlisted, delisted; read-only, set by the platform: proposed, under_review, archived. Deprecated aliases accepted for compatibility: published (= live), draft (= unlisted). archived returns the products you deleted; on production it also returns products removed by MallPlus moderation, which read archived too but can still be edited. Without status, deleted products are left out.
categoryquerystringNo-Product category ID or category slug used to filter products.
sortqueryenumNoAllowed: created_at_asc, created_at_desc, price_asc, price_descProduct sort order. Supported values sort by creation time or price.
cursorquerystringNo-Pagination cursor returned by a previous response page as meta.nextCursor.

Request Body

This operation has no JSON request body.

Response Parameters

Success status: HTTP 200

FieldTypeRulesDescription
successboolean-Whether the request completed successfully.
dataarray<Product>-Response or event payload for this schema.
data[]ProductNo additional propertiesPartner-safe product view. Supplier-internal fields are stripped at the API boundary.
data[].product_idstring-Product ID associated with this value.
data[].short_idstring-Human-friendly alternate product identifier
data[].namestring-Partner-visible name.
data[].descriptionstring-Human-readable description.
data[].statusenumAllowed: live, unlisted, delisted, proposed, under_review, archivedCurrent product status. This is the complete set — settable by the partner via POST /open/v1/products/{id}/status: live, unlisted, delisted; read-only, set by the platform: proposed, under_review, archived (proposed after create, under_review while in review, archived after delete; on production archived also marks a product removed by moderation). Every value here is also accepted by GET /open/v1/products?status=.
data[].skustring-SKU of the primary variant
data[].priceinteger-Integer amount in PHP centavos.
data[].stockinteger-Stock of the primary variant
data[].categorystring-Display name of the category the product is filed under, or Other when it has none. Send category_id, not this name, on create and update.
data[].category_idstring-Id of the category the product is filed under — the value create and update take. Omitted when the product has no category.
data[].attribute_valuesarray<object>-Category attribute values stored on the product. Omitted when the product has none. name is present on the product detail read.
data[].attribute_values[]object--
data[].attribute_values[].attribute_idstring-Attribute id, as sent in the create attribute_values.
data[].attribute_values[].namestring-Attribute display name, e.g. Condition.
data[].attribute_values[].valuestring-Stored value.
data[].thumbnailstring-Product thumbnail image URL.
data[].imagesarray<string>-Product image URLs, in display order.
data[].images[]string-Publicly reachable https image URL.
data[].weightnumber-Weight in grams
data[].dimensionsobjectNo additional propertiesPackage dimensions in centimetres.
data[].dimensions.lengthnumber-Package length in centimetres.
data[].dimensions.widthnumber-Package width in centimetres.
data[].dimensions.heightnumber-Package height in centimetres.
data[].variantsarray<ProductVariant>-Product variants.
data[].variants[]ProductVariantNo additional propertiesA single purchasable variant of a product.
data[].variants[].variant_idstring-Product variant ID associated with this value.
data[].variants[].skustringNullableSeller SKU.
data[].variants[].priceintegerNullableInteger amount in PHP centavos.
data[].variants[].stock_quantityintegerNullableAvailable stock on hand at the default location
data[].variants[].optionsarray<object>-Variant option values (e.g. Size=M, Color=Black).
data[].variants[].options[]objectNo additional propertiesOne option of the variant, as a name/value pair.
data[].variants[].options[].namestringNullableOption name, for example Size.
data[].variants[].options[].valuestringNullableOption value, for example M.
data[].variants[].dimensionsobjectNo additional propertiesPackage dimensions in centimetres.
data[].variants[].dimensions.lengthnumber-Package length in centimetres.
data[].variants[].dimensions.widthnumber-Package width in centimetres.
data[].variants[].dimensions.heightnumber-Package height in centimetres.
data[].variants[].weightnumber-Weight in grams
data[].variants[].imagesarray<string>-Variant image URLs, in display order.
data[].variants[].images[]string-Publicly reachable https image URL.
data[].options_orderarray<object>-Variant option groups in display order, each with its values in order — the order a storefront renders the variant picker in. Derived at create time from the order the options were submitted in; absent on products with no option groups.
data[].options_order[]objectNo additional properties-
data[].options_order[].titlestring-Option group name, e.g. Colour.
data[].options_order[].valuesarray<string>-The group's values, in display order.
data[].options_order[].values[]string--
data[].created_atstring<date-time>Format: date-timeCreated at as an ISO-8601 timestamp.
data[].updated_atstring<date-time>Format: date-timeUpdated at as an ISO-8601 timestamp.
metaPaginationMeta-Response metadata, including pagination when the endpoint returns a list.
meta.pageinteger-1-based page number represented by this response page. Offset paging only — omitted during a cursor walk.
meta.limitinteger-Maximum number of records returned in this response page.
meta.totalinteger-Total number of records matching the request filters. Offset paging only — omitted during a cursor walk, where no total is computed.
meta.nextCursorstring-Opaque cursor for the next page of a keyset walk. Present only while walking by cursor and only while more rows may remain; its absence ends the walk. Pass it back unchanged as cursor.

Error Codes

HTTP StatusSchemaDescription
400PlatformError400ResponseValidation error, or a missing/malformed required signing header (BAD_REQUEST)
401PlatformError401ResponseUnauthorized — invalid credentials, invalid signature, or expired timestamp (TIMESTAMP_EXPIRED)
403PlatformError403ResponseForbidden — insufficient scope
429PlatformError429ResponseThe partner or endpoint rate limit has been exceeded
502PlatformError502ResponseThe upstream commerce service rejected the request or returned an invalid response
503PlatformError503ResponseA required platform or upstream dependency is temporarily unavailable
504PlatformError504ResponseThe upstream commerce service did not respond before the platform timeout

This operation can return these codes in error.code: VALIDATION_ERROR

Any operation can also return the authentication, signing, scope, rate-limit and system codes listed in the Error code reference.

Request Example

# Sandbox: https://sandbox.open.mallplus.ph/open/v1/products
curl -X GET "https://open.mallplus.ph/open/v1/products" \
  -H "X-MallPlus-Partner-Id: mp_partner_123" \
  -H "X-MallPlus-Timestamp: 1786924800" \
  -H "X-MallPlus-Signature-Version: 3" \
  -H "X-MallPlus-Nonce: 4f8b9a0c4d5e6f708192a3b4c5d6e7f8" \
  -H "X-MallPlus-Signature: <hex_hmac_sha256>" \
  -H "X-MallPlus-Access-Token: seller_access_token" \
  -H "X-MallPlus-Seller-Id: seller_123"

Response Example

{
  "success": true,
  "data": [
    {
      "product_id": "product_id_123",
      "short_id": "short_id_123",
      "name": "example_name",
      "description": "example_description",
      "status": "live",
      "sku": "example_sku",
      "price": 1,
      "stock": 1,
      "category": "example_category",
      "category_id": "category_id_123",
      "attribute_values": [
        {
          "attribute_id": "attribute_id_123",
          "name": "example_name",
          "value": "example_value"
        }
      ],
      "thumbnail": "example_thumbnail",
      "images": [
        "example_images"
      ],
      "weight": 1,
      "dimensions": {
        "length": 1,
        "width": 1,
        "height": 1
      },
      "variants": [
        {
          "variant_id": "variant_id_123",
          "sku": "example_sku",
          "price": 1,
          "stock_quantity": 1,
          "options": [
            "object"
          ],
          "dimensions": {
            "length": "number",
            "width": "number",
            "height": "number"
          },
          "weight": 1,
          "images": [
            "string"
          ]
        }
      ],
      "options_order": [
        {
          "title": "example_title",
          "values": [
            "string"
          ]
        }
      ],
      "created_at": "2026-08-17T00:00:00Z",
      "updated_at": "2026-08-17T00:00:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 150,
    "nextCursor": "eyJ0cyI6IjIwMjYtMDgtMTVUMDk6MzA6MDAuMDAwWiIsImlkIjoicGNhdF8xIn0"
  }
}