Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/VisualGraphxLLC/API-HUB/llms.txt

Use this file to discover all available pages before exploring further.

The catalog module stores the canonical product data normalized from all supplier adapters. Products are typed as either apparel or print, which determines how their variants and pricing are structured. The list endpoint is the primary catalog browsing surface; the detail endpoint is used by the storefront PDP.

List products

Returns a paginated list of products with computed variant aggregates. Excludes archived products by default.
curl "https://your-hub.example.com/api/products?supplier_id=3fa85f64-5717-4562-b3fc-2c963f66afa6&limit=50"
Query parameters
supplier_id
string (UUID)
Filter to a specific supplier.
category_id
string (UUID)
Filter to a category and all its descendants. Uses a PostgreSQL recursive CTE to include subcategories automatically.
customer_id
string (UUID)
Filter to products that have been pushed to a specific customer’s OPS storefront (i.e., products with a ProductPushLog entry for that customer).
brand
string
Exact-match filter on the brand field.
Case-insensitive substring search across product_name, supplier_sku, and brand.
archived
boolean
default:"false"
Set to true to return only archived products. Defaults to false (active products only).
skip
integer
default:"0"
Number of records to skip for pagination.
limit
integer
default:"50"
Maximum records to return. Hard cap of 1000.
Response — 200 OK — array of ProductListRead
[
  {
    "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "supplier_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "supplier_name": "SanMar",
    "supplier_sku": "PC61",
    "product_name": "Port & Company Essential Tee",
    "brand": "Port & Company",
    "category": "T-Shirts",
    "category_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
    "product_type": "apparel",
    "image_url": "https://cdn.sanmar.com/catalog/images/pc61_nat_model_front.jpg",
    "ops_product_id": null,
    "external_catalogue": null,
    "variant_count": 84,
    "price_min": 2.98,
    "price_max": 9.98,
    "total_inventory": 142500,
    "archived_at": null
  }
]
id
string (UUID)
Product’s unique identifier.
supplier_id
string (UUID)
Supplier that owns this product.
supplier_name
string | null
Supplier display name. Joined in the list query for convenience.
supplier_sku
string
Supplier-assigned product number (e.g., PC61). Used as the primary lookup key with the supplier.
product_name
string
Normalized product name.
brand
string | null
Brand or manufacturer name.
category
string | null
Category name string (denormalized). Use category_id for hierarchical queries.
product_type
string
Either apparel or print. Determines variant shape and pricing method.
image_url
string | null
Primary image URL for list display.
ops_product_id
string | null
OPS storefront product ID if this product has been pushed.
variant_count
integer
Number of color × size combinations (apparel) or print configurations.
price_min
number | null
Lowest base_price across all variants.
price_max
number | null
Highest base_price across all variants.
total_inventory
integer
Sum of inventory across all variants.
archived_at
string | null
ISO 8601 timestamp when archived. null for active products.

Get product detail

Returns the full product record including variants with tiered prices, all images grouped by color, configurable options with attributes, and type-specific details (apparel_details or print_details).
curl https://your-hub.example.com/api/products/b2c3d4e5-f6a7-8901-bcde-f12345678901
product_id
string (UUID)
required
Unique product identifier.
Response — 200 OKProductRead
{
  "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "supplier_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "supplier_name": "SanMar",
  "supplier_has_decoration_overlay": false,
  "supplier_sku": "PC61",
  "product_name": "Port & Company Essential Tee",
  "brand": "Port & Company",
  "category": "T-Shirts",
  "category_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
  "description": "Our best-selling tee...",
  "product_type": "apparel",
  "image_url": "https://cdn.sanmar.com/catalog/images/pc61_nat_model_front.jpg",
  "ops_product_id": null,
  "external_catalogue": null,
  "last_synced": "2026-05-07T12:00:00Z",
  "archived_at": null,
  "variants": [
    {
      "id": "d4e5f6a7-b8c9-0123-def0-234567890123",
      "color": "Natural",
      "size": "S",
      "sku": "PC61-NAT-S",
      "base_price": 4.58,
      "inventory": 1200,
      "warehouse": "LAS",
      "prices": [
        { "price_type": "Net", "quantity_min": 1, "quantity_max": 11, "price": "4.58" },
        { "price_type": "Net", "quantity_min": 12, "quantity_max": 143, "price": "4.18" },
        { "price_type": "MSRP", "quantity_min": 1, "quantity_max": null, "price": "9.98" }
      ]
    }
  ],
  "images": [
    {
      "id": "e5f6a7b8-c9d0-1234-ef01-345678901234",
      "url": "https://cdn.sanmar.com/catalog/images/pc61_nat_model_front.jpg",
      "supplier_image_url": null,
      "image_type": "front",
      "color": "Natural",
      "sort_order": 0,
      "checksum": null
    }
  ],
  "images_by_color": {
    "natural": [...]
  },
  "options": [
    {
      "id": "f6a7b8c9-d0e1-2345-f012-456789012345",
      "option_key": "imprint_location",
      "title": "Imprint Location",
      "options_type": "select",
      "sort_order": 0,
      "master_option_id": null,
      "ops_option_id": null,
      "required": false,
      "attributes": [
        {
          "id": "a7b8c9d0-e1f2-3456-0123-567890123456",
          "title": "Left Chest",
          "sort_order": 0,
          "ops_attribute_id": null,
          "master_attribute_id": null,
          "attribute_key": null,
          "price": null,
          "setup_cost": null,
          "multiplier": null
        }
      ]
    }
  ],
  "apparel_details": {
    "pricing_method": "tiered_variant",
    "raw_payload": null
  },
  "print_details": null,
  "sizes": []
}
variants
array
images_by_color
object
Images grouped by color key (lowercase, spaces replaced with underscores). Keys are color names; values are arrays of ProductImageRead.
apparel_details
object | null
Present for product_type = "apparel". Contains pricing_method ("tiered_variant") and optional raw_payload.
print_details
object | null
Present for product_type = "print". Contains pricing_method ("formula"), dimension bounds (min_width, max_width, min_height, max_height), size_unit, and base_price_per_sq_unit.
sizes
array
Preset print sizes. Each has width, height, unit, and label. Non-empty only for print products.
Error responses
StatusDetail
404 Not Found"Product not found"

Archive and restore

Products can be soft-archived without deleting them from the database.
# Archive
curl -X POST https://your-hub.example.com/api/products/{product_id}/archive

# Restore
curl -X POST https://your-hub.example.com/api/products/{product_id}/restore
Archived products are excluded from the default list response. Pass archived=true to the list endpoint to retrieve them.

Build docs developers (and LLMs) love