Products
Catalog products represent physical products, services, fees, and digital goods. Product variants and bundles are the sellable objects used for automatic price resolution and inventory tracking.
Methods
/v1/productsCreate a new catalog product. Simple products use default_variant; optioned products use options and variants.
/v1/products/{product_id}Get a product by product_id.
/v1/products/{product_id}Update parent product fields using sparse update semantics. Categories and variant inventory use dedicated endpoints.
/v1/productsList products with filtering, sorting, and cursor pagination.
/v1/products/{product_id}/categoriesReplace the full category list for a product. Send an empty array to clear all categories.
/v1/products/{product_id}Permanently delete a product.
GET /v1/products/{product_id} and GET /v1/products accept optional fields, a comma-separated list of public response fields to include, such as product_id,name,status.
CreateProduct
Request Fields
namestringrequiredProduct name, 1-255 characters.
product_typestringrequiredProduct type: physical, service, fee, digital.
default_variantProductVariantInputRequired for simple products. Contains sellable-unit fields such as price, SKU, inventory policy, and initial quantity.
optionsProductOptionInput[]Required with variants for optioned products.
variantsProductVariantInput[]Required with options for optioned products.
descriptionstringProduct description.
categoriesstring[]Category labels.
image_urlstringURL to product image.
metadatamap<string, string>Up to 50 key-value pairs.
statusstringInitial product status: active or inactive. If omitted, Flint creates the product as active.
Example
{
"name": "Premium Widget",
"product_type": "physical",
"default_variant": {
"unit_price_money": { "amount": 2500, "currency": "USD" },
"sku": "WIDGET-001",
"initial_quantity_available": 100,
"enforce_inventory_limit": true
}
}
{
"data": {
"product_id": "prod_abc123",
"name": "Premium Widget",
"product_type": "physical",
"status": "active",
"default_variant": {
"variant_id": "var_abc123",
"unit_price_money": { "amount": 2500, "currency": "USD" },
"sku": "WIDGET-001",
"quantity_available": 100
}
}
}
UpdateProduct
Mutable fields: name, description, image_url, status, product_type, default_variant_id, metadata.
Sparse update semantics:
- Omitted fields are unchanged.
- Present fields replace the previous value.
description,image_url, anddefault_variant_idcan be cleared with"".metadatamerges by key. Send{}to clear all metadata. Send""as a metadata value to delete that key.- Requests with no mutable fields fail with
NO_FIELDS_TO_UPDATE.
Use PUT /v1/products/{product_id}/categories to manage categories after creation, and POST /v1/products/{product_id}/variants/{variant_id}/inventory-adjustments to change inventory levels. PATCH /v1/products/{product_id} does not mutate either field.
ReplaceProductCategories
Request field:
categories(string[]) replaces the full set of categories. Send[]to clear all categories.
AdjustProductVariantInventory
Request fields:
quantity_delta(integer, required): positive to add stock, negative to remove stock. Cannot be0.change_reason(string, optional):manual_adjustment,order_fulfillment,order_cancellation,order_refund,received_stock,inventory_count,damage,theft,loss.note(string, optional): free-form note stored with the inventory history entry.
ListProducts
Common filters:
queryproduct_typestatuscategoryonly_in_stockfieldscreated_aftercreated_beforeupdated_afterupdated_before
Use GET /v1/catalog/by-sku/{sku} for exact SKU lookup across variants and bundles.
Enums
Product Type
physical, service, fee, digital
Product Status
active, inactive (reversible), deleted (permanent)
Sort Options
name, created_at, updated_at
Pagination
GET /v1/products returns next_page_token. Pass it back as page_token with the same sort settings on the next request.
