Skip to main content
GET
/
v1
/
products
/
variants
List all variants
curl --request GET \
  --url https://api-eu.flexportal.io/v1/products/variants \
  --header 'Authorization: Bearer <token>' \
  --header 'Tenant-ID: <tenant-id>'
{
  "variants": [
    {
      "variantId": "<string>",
      "tenantId": "<string>",
      "productId": "<string>",
      "productSku": "<string>",
      "variantSku": "<string>",
      "variantName": "<string>",
      "grade": "<string>",
      "pricing": [
        {
          "contractLength": 123,
          "monthlyPrice": 123,
          "setupFee": 123,
          "discount": {
            "type": "percentage",
            "value": 123,
            "description": "<string>"
          },
          "source": "suggested",
          "calculatedAt": "<string>",
          "presetUsed": "<string>"
        }
      ],
      "status": "active",
      "createdAt": "<string>",
      "updatedAt": "<string>",
      "condition": "<string>",
      "colorName": "<string>",
      "images": [
        "<string>"
      ],
      "listPrice": 123,
      "acquisitionCost": 123
    }
  ],
  "count": 123,
  "limit": 123,
  "hasMore": true,
  "nextCursor": "<string>"
}

Overview

Query variants across all products. Unlike Get Product which returns variants for a single product, this endpoint lets you search, filter, and paginate across your entire variant catalog.

When to Use This Endpoint

Use CaseRecommended Endpoint
Get variants for one productGet Product
Search variants by SKUList Variants
Filter variants by grade/statusList Variants
Build variant search/autocompleteList Variants
Export variant catalogList Variants

Common Use Cases

SKU Lookup

Find variant details by SKU for order validation or inventory management

Inventory View

Display all variants with pricing for warehouse or operations teams

Grade Filtering

Find all Grade B or Grade C variants for promotional pricing

Bulk Export

Export complete variant catalog for external systems

Filtering Variants

# Get all active variants
GET /v1/products/variants?status=active

# Filter by grade
GET /v1/products/variants?grade=A

# Filter by category (from parent product)
GET /v1/products/variants?category=Laptops

# Find specific SKU
GET /v1/products/variants?sku=MACBOOK-PRO-16-M3

# Combine filters
GET /v1/products/variants?status=active&grade=A&brand=Apple

Response Fields

Each variant includes:
FieldDescription
variantIdUnique variant identifier
skuVariant SKU (used in orders)
productIdParent product ID
productNameParent product name
specificationTechnical specification
gradeCondition grade (A-E)
colorColor option
statusactive or inactive
listPriceMSRP/retail price
acquisitionCostYour cost to acquire
pricingMonthly prices by contract length

Pagination

This endpoint supports higher limits for bulk operations:
ParameterDefaultMaximum
limit505,000
startAfterCursor from previous response
# Fetch up to 1,000 variants at once
GET /v1/products/variants?limit=1000&status=active

Example: Build SKU Autocomplete

async function searchVariants(query) {
  // Search variants where SKU starts with query
  const { variants } = await listVariants({
    sku: query,  // Partial match support
    status: 'active',
    limit: 10
  });

  return variants.map(v => ({
    sku: v.sku,
    label: `${v.productName} - ${v.specification}`,
    price24mo: v.pricing['24']
  }));
}

// Usage
const results = await searchVariants('MACBOOK');
// Returns matching MacBook variants for autocomplete

Example: Export Pricing Catalog

async function exportPricingCatalog() {
  const allVariants = [];
  let cursor = null;

  do {
    const params = {
      status: 'active',
      limit: 1000
    };
    if (cursor) params.startAfter = cursor;

    const { variants, nextCursor } = await listVariants(params);
    allVariants.push(...variants);
    cursor = nextCursor;
  } while (cursor);

  // Transform for export
  return allVariants.map(v => ({
    sku: v.sku,
    product: v.productName,
    spec: v.specification,
    grade: v.grade,
    listPrice: v.listPrice,
    cost: v.acquisitionCost,
    price6mo: v.pricing['6'],
    price12mo: v.pricing['12'],
    price24mo: v.pricing['24'],
    price36mo: v.pricing['36']
  }));
}

Authorizations

Authorization
string
header
required

API key obtained from FlexPortal dashboard

Headers

Tenant-ID
string
required

Your tenant identifier

Query Parameters

limit
string

Items per page (default: 5000, max: 5000)

startAfter
string

Cursor for pagination

status
string

Filter by status (active, inactive)

productSku
string

Filter by product SKU

grade
string

Filter by grade (A, B, C, D, E)

Response

200 - application/json

List of variants

variants
object[]
required
count
number
required
limit
number
required
hasMore
boolean
required
nextCursor
string | null
required