Products
1. Overview
The Firework Product API allows you to manage products and product units and retrieve product-related media on the Firework platform. It supports listing, retrieving, upserting, partially updating, and deleting products; reading, updating, and deleting individual units; and retrieving videos or library images tagged with a product.
Products are scoped to a business store. You must have a business store before creating products. Use the Business Store API to manage stores.
The API supports flexible product identification — you can look up products by Firework ID, external product or unit ID, SKU, GTIN, MPN, or barcode.
Base URL: https://api.firework.com
2. Authentication
The Firework Product API uses OAuth 2.0 for authentication. Before using this API, you must obtain an access token.
Authentication Methods Supported:
Client Credentials: OAuth 2.0 Client Credentials flow for server-to-server authentication (machine-to-machine)
User Authentication: Standard OAuth 2.0 user authorization flow
Important: The access token must be from an authenticated user or OAuth app with permission to access the specified business.
Scopes:
products:read
Read access to products, product units, and product videos
products:write
Write access to products and product units. Implicitly grants products:read
images:read
List library images featuring a product; requires the images subscription feature
📖 Documentation:
Client Credentials OAuth - Server-to-server authentication for OAuth apps
3. Endpoint Summary
/api/v1/products
GET
products:read
List or search products in a store
/api/v1/products/{product_id}
GET
products:read
Get a product by Firework or external identifier
/api/v1/products
POST
products:write
Upsert a product; merge supplied units
/api/v1/products/{product_id}
PATCH
products:write
Partially update a product
/api/v1/products/{product_id}
DELETE
products:write
Delete a product
/api/v1/products/{product_id}/units/{id}
GET
products:read
Get one product unit
/api/v1/products/{product_id}/units/{id}
PATCH
products:write
Partially update one product unit
/api/v1/products/{product_id}/units/{id}
DELETE
products:write
Delete one product unit
/api/v1/products/{product_id}/videos
GET
products:read
Retrieve videos tagged with a product
/api/v1/products/{product_id}/images
GET
images:read
Retrieve published library images for a product
4. Product Object Reference
The product object is returned by the List, Get, Upsert, and Update endpoints. All Firework-managed IDs in responses are encoded strings.
4.1. Product Fields
id
string
❌
Encoded unique product identifier
external_id
string
❌
External product identifier from your system, or a Firework-generated identifier if omitted on create
name
string
❌
Display name of the product
description
string
✅
Product description (plain text)
currency
string
❌
Three-letter ISO 4217 currency code (e.g., "USD", "EUR")
handle
string
✅
URL handle or slug for the product page
options
string[]
❌
Available option names (e.g., ["color", "size"]). Empty if none
category
string
✅
Product category (free-form text)
hide_price
boolean
❌
Whether to hide price display (default: false)
brand
string
✅
Product brand name
subtitle
string
✅
Product subtitle (max 75 characters)
shipping
string
✅
Shipping information
business_store_id
string
❌
Encoded ID of the business store this product belongs to
4.2. Image Object
id
string
❌
Encoded unique image identifier
external_id
string
✅
External identifier for the image
url
string
❌
URL of the image
position
integer
❌
Display position (0-indexed), derived from image order during upsert
unit_external_ids
string[]
❌
External IDs of units this image applies to. Empty if global
4.3. Unit Object
id
string
❌
Encoded unique unit identifier
external_id
string
✅
External identifier for the unit/variant
name
string
❌
Display name of the unit/variant (e.g., "Red / Large")
price
number
❌
Current price as a number (e.g., 1338.00)
original_price
number
✅
Original price before discount
url
string
❌
Direct URL to purchase this variant
position
integer
❌
Display position (0-indexed). Defaults to 0 if omitted
quantity
integer
✅
Available stock quantity
sku
string
✅
Stock Keeping Unit
gtin
string
✅
Global Trade Item Number (UPC, EAN, ISBN, etc.)
mpn
string
✅
Manufacturer Part Number
barcode
string
✅
Barcode value
4.4. Unit Option
name
string
❌
Option name (e.g., "color")
value
string
❌
Option value (e.g., "Red")
4.5. Custom CTA Object
The custom call-to-action (CTA) object configures an optional action button that appears on the video overlay for this product. A product can have at most one custom CTA.
title
string
❌
One of the supported CTA title keys (see Supported CTA Titles). Must be present with url.
url
string
❌
Destination URL when the button is clicked. Max 4000 characters. Must be present with title.
target
string
❌
Link target behavior. One of "_blank" (default), "_self", "iframe".
hide_primary
boolean
❌
When true, hides Firework's default purchase button so only the custom CTA is visible. Default: false.
title_translation
string
❌
Response only. Localized display label for the title, derived from the merchant's locale. Not accepted on input.
Notes:
When a product has no custom CTA configured, the
custom_ctafield in API responses isnull. When non-null, all keys are guaranteed present.title_translationfalls back to the default English label (e.g.,"Buy Now"forbuy_now) when no localized translation exists for the merchant's locale.
Supported CTA Titles
order_now
Order Now
buy_now
Buy Now
sign_up
Sign Up
enter_now
Enter Now
enroll_now
Enroll Now >
claim_sample
Claim Sample
take_the_quiz
Take The Quiz
see_recipe
See Recipe
see_more
See More
see_details
See Details
start_the_journey
Start The Journey
personalize_my_blend
Personalize My Blend
order_your_welcome_kit
Order Your Welcome Kit
Display labels are localized per merchant locale via Firework's translation system.
Validation Rules
titleandurlmust both be present or both be absent. Sending only one returns422 Unprocessable Entity.titlemust be one of the supported title keys listed above.targetmust be one of"_blank","_self","iframe".urlmust not exceed 4000 characters.
5. List Products
List or search the products in a business store. By default (no search or brand), all of the store's products are returned newest-first. Supplying search and/or brand runs a full-text search over the store's catalog instead.
Endpoint: GET /api/v1/products Authentication: Bearer token required (OAuth 2.0 Client Credentials) Required Scope: products:read (for OAuth apps)
5.1. Request Headers
Authorization
Bearer token: Bearer {ACCESS_TOKEN}
✅
5.2. Query Parameters
business_store_id
string
✅
None
Encoded business store ID to list/search products in
search
string
❌
None
Full-text search term matched against the store's catalog. Omit to list every product in the store
brand
string
❌
None
Filter to products whose brand matches this value (case-insensitive exact match). Leading/trailing whitespace is trimmed; omit to not filter by brand
after
string
❌
None
Opaque cursor for the next page (from pagination.cursor or links.next). Ascending order
before
string
❌
None
Opaque cursor for the previous page. Descending order
page_size
integer
❌
10
Number of products per page (max: 100). Values above the max are clamped
Note:
searchandbrandare independent — you may supply either, both, or neither. Providing either one switches the endpoint from a plain store listing to a full-text search of the store's catalog.
5.3. List Products Response
Success Response: 200 OK
Each entry in products is a full product object as described in the Product Object Reference.
Pagination Envelope
The response uses cursor-based pagination. Treat the values in links and pagination as opaque and follow them verbatim.
links.next
string
✅
Relative path to the next page. null when there are no more results
pagination.cursor
string
✅
Opaque cursor for the next page (pass back as after/before). null when exhausted
pagination.has_more
boolean
❌
true when another page is available now
Note: This is a forward-only cursor feed, so
linksomitsprev. A deprecatedpagingobject ({"next": ...}) is also returned during the pagination migration window; preferlinks+paginationand do not build onpaging.
On the last page, links.next and pagination.cursor are null and pagination.has_more is false.
5.4. List Products Error Responses
400 Bad Request
Missing business_store_id, or invalid pagination parameters
401 Unauthorized
Invalid or missing authentication token
403 Forbidden
Insufficient scope or store belongs to another business
404 Not Found
Business store not found
5.5. Examples
List all products in a store
Full-text search
Filter by brand
Next page (using cursor from previous response)
6. Get Product
Retrieve details of a single product by Firework ID, external product/unit ID, SKU, GTIN, MPN, or barcode.
Endpoint: GET /api/v1/products/{product_id} Authentication: Bearer token required (OAuth 2.0 Client Credentials) Required Scope: products:read (for OAuth apps)
6.1. Request Headers
Authorization
Bearer token: Bearer {ACCESS_TOKEN}
✅
6.2. Path Parameters
6.3. Query Parameters
business_store_id
string
❌
Store used for non-ID identifiers. Required when the business has multiple stores; optional for an encoded product ID, but must match when supplied.
6.4. Get Product Response
Success Response: 200 OK
Note: The response fields are the same as those described in the Product Object Reference.
6.5. Get Product Error Responses
400 Bad Request
A non-ID identifier is ambiguous because business_store_id is required, or the store ID is malformed
401 Unauthorized
Invalid or missing authentication token
403 Forbidden
Insufficient scope or product belongs to another business
404 Not Found
Product not found for the supplied identifier
6.6. Examples
CURL Request — By Firework ID
CURL Request — By SKU
7. Upsert Product
Create or update a product in a business store. If a product with the same external_id already exists in the specified store, it is updated; otherwise, a new product is created.
Endpoint: POST /api/v1/products Authentication: Bearer token required (OAuth 2.0 Client Credentials) Required Scope: products:write (for OAuth apps) Content Type: application/json
7.1. Request Headers
Authorization
Bearer token: Bearer {ACCESS_TOKEN}
✅
Content-Type
Must be application/json
✅
7.2. Request Body
Product Fields
business_store_id
string
✅
None
Encoded business store ID to create/update the product in
external_id
string
❌
Auto-generated
External product identifier from your system (used for matching). If omitted, a unique ID is auto-generated and the request always creates a new product
name
string
✅
None
Display name of the product
description
string
❌
None
Product description (plain text)
handle
string
❌
None
URL handle or slug for the product page
options
string[]
❌
[]
Available option names (e.g., ["color", "size"])
category
string
❌
None
Product category (free-form text)
hide_price
boolean
❌
false
Whether to hide price display
brand
string
❌
None
Product brand name
subtitle
string
❌
None
Product subtitle (max 75 characters)
shipping
string
❌
None
Shipping information
custom_cta
object
❌
null
Custom call-to-action configuration (see Custom CTA Input). Send null to clear an existing CTA.
sku
string
❌
None
Simple-product convenience field applied to the product's single unit
gtin
string
❌
None
Simple-product convenience field applied to the product's single unit
mpn
string
❌
None
Simple-product convenience field applied to the product's single unit
barcode
string
❌
None
Simple-product convenience field applied to the product's single unit
price
number
❌
None
Simple-product convenience field applied to the product's single unit
original_price
number
❌
None
Simple-product convenience field applied to the product's single unit; null clears it
quantity
integer
❌
None
Simple-product convenience field applied to the product's single unit
url
string
❌
None
Simple-product convenience field applied to the product's single unit
Image Input
external_id
string
❌
None
External identifier for the image
url
string
✅
None
URL of the image
unit_identifiers
string[]
❌
[]
External IDs of units this image applies to
Image position is derived from the image's order in the product_images array. The request body does not accept a position field for images.
Unit Input
external_id
string
Conditional
None
Stable unit identifier. Optional on first create; required for every supplied unit when updating an existing product
name
string
✅
None
Display name of the unit/variant
price
number
✅
None
Current price (e.g., 129.99)
original_price
number
❌
None
Original price before discount (e.g., 149.99)
url
string
✅
None
Direct URL to purchase this variant
quantity
integer
❌
None
Available stock quantity
options
object[]
✅
None
Option values for this variant (pass [] if no options)
sku
string
❌
None
Stock Keeping Unit
gtin
string
❌
None
Global Trade Item Number (UPC, EAN, ISBN, etc.)
mpn
string
❌
None
Manufacturer Part Number
barcode
string
❌
None
Barcode value
Unit position is derived from the unit's order in the product_units array. The request body does not accept a position field for units.
Each unit option object has:
name
string
✅
Option name (e.g., "color")
value
string
✅
Option value (e.g., "Gray")
Custom CTA Input
Optional. If provided, must be an object matching the Custom CTA Object shape.
title
string
❌
None
One of the supported CTA title keys. Must be present together with url.
url
string
❌
None
Destination URL (max 4000 characters). Must be present together with title.
target
string
❌
"_blank"
Link behavior: "_blank", "_self", or "iframe".
hide_primary
boolean
❌
false
Hide Firework's default purchase button so only the custom CTA is visible.
Update and clearing semantics:
To clear an existing CTA, send
"custom_cta": null. The embedded CTA is removed from the product.To preserve an existing CTA unchanged, omit
custom_ctafrom the request body entirely.Partial updates are not supported. Because
titleandurlmust move together, you cannot update only one of them. Always send the full custom CTA object when modifying it.
Important Update Behavior
product_unitsare merged by unitexternal_id. Matching units update in place and keep their Firework IDs and video/listing associations; new identifiers add units; omitted units remain untouched.Every supplied
product_unitsentry must includeexternal_idwhen the product already exists. Omitting it returns422instead of creating a duplicate unit.Product upsert and update never remove units. Use
DELETE /api/v1/products/{product_id}/units/{id}to remove one.The product-level unit fields (
sku,gtin,mpn,barcode,price,original_price,quantity,url) are for simple products. They cannot be combined withproduct_units, and a product with multiple units rejects them with422.If
product_imagesis included, the product image collection follows the existing product-image replacement behavior. Image-to-unit associations are rebuilt fromproduct_images[].unit_identifiers.
7.3. Upsert Product Response
Success Response: 201 Created
The response returns the full product object as described in the Product Object Reference.
7.4. Upsert Product Error Responses
400 Bad Request
Missing required fields or malformed JSON
401 Unauthorized
Invalid or missing authentication token
403 Forbidden
Insufficient scope or no access to the specified business store
404 Not Found
Business store not found
422 Unprocessable Entity
Validation errors, a sent unit missing external_id on an existing product, conflicting simple-product/unit fields, multi-variant simple-field use, or invalid nested data/CTA
7.5. Examples
CURL Request
Minimal Upsert (product with no variants)
Upsert with Custom CTA (alongside default purchase button)
Both Firework's default purchase button and the custom "See Details" button are visible. target defaults to "_blank" and hide_primary defaults to false when omitted.
Upsert with Custom CTA (replacing default purchase button)
Only the custom "Buy Now" button is visible. Firework's default purchase button is hidden.
Clearing an existing Custom CTA
Sending "custom_cta": null removes the custom CTA entirely from the product. Omitting the custom_cta field (rather than setting it to null) leaves any existing CTA unchanged.
8. Update Product
Partially update a product without replacing omitted fields. This endpoint can also change the product's external_id; the upsert endpoint cannot re-key a product because it uses external_id to select the record.
Endpoint: PATCH /api/v1/products/{product_id} Authentication: Bearer token required Required Scope: products:write Content Type: application/json
8.1. Request Headers
Authorization
Bearer token: Bearer {ACCESS_TOKEN}
✅
Content-Type
Must be application/json
✅
8.2. Parameters
business_store_id
Query
string
❌
Store used for non-ID lookup. Required with multiple stores; optional for an encoded product ID, but must identify the product's store when supplied.
8.3. Request Body
The body accepts the product fields documented in Upsert Product, except business_store_id. Only supplied fields change.
Additional rules:
external_idchanges the product's identifier and must be unique in the store. An empty string generates a new identifier.product_unitsuse the same merge semantics as upsert: matchingexternal_idvalues update in place, omitted units remain, and every supplied unit must includeexternal_id.Product-level unit convenience fields update the single unit of a simple product. They cannot be combined with
product_unitsand cannot target a multi-variant product.custom_cta: nullclears the CTA; omitting it preserves the CTA.
8.4. Response and Errors
200 OK returns the complete updated Product Object.
400 Bad Request
Malformed identifier/store input, or a required store is ambiguous
401 Unauthorized
Missing or invalid token
403 Forbidden
Missing scope or product/store belongs to another business
404 Not Found
Product or store not found
422 Unprocessable Entity
Invalid field, duplicate external_id, invalid unit merge, or invalid simple-product field use
8.5. Example
9. Product Unit Endpoints
These endpoints address one unit within one product. The product can use any supported product identifier. The unit id path value accepts an encoded unit ID or the unit's external ID, SKU, GTIN, or MPN within the resolved store.
9.1. Shared Parameters
product_id
Path
string
✅
Parent product identifier
id
Path
string
✅
Unit ID, external ID, SKU, GTIN, or MPN
business_store_id
Query
string
❌
Store used for non-ID lookup. Required with multiple stores; optional for encoded IDs, but must match when supplied.
The resolved unit must belong to the resolved product; otherwise the API returns 404 Not Found.
9.2. Get Product Unit
Endpoint: GET /api/v1/products/{product_id}/units/{id} Required Scope: products:read
200 OK returns the Unit Object. Errors are 400, 401, 403, and 404.
9.3. Update Product Unit
Endpoint: PATCH /api/v1/products/{product_id}/units/{id} Required Scope: products:write Content Type: application/json
Only supplied fields change, and the unit keeps its Firework ID and existing media/listing associations.
external_id
string
❌
New stable external ID; must be unique within the product and cannot be null or empty
name
string
❌
Unit display name
price
number
❌
Current price
original_price
number
✅
Original price; null clears it
url
string
❌
Purchase URL
quantity
integer
❌
Stock quantity
sku
string
✅
SKU; null clears it
gtin
string
✅
GTIN; null clears it
mpn
string
✅
MPN; null clears it
barcode
string
✅
Barcode; null clears it
When price or original_price changes, the final original_price must be at least the final price. If raising price above the current original price, send a new original_price in the same request or clear it with null.
200 OK returns the updated Unit object. Errors are 400, 401, 403, 404, and 422; 422 includes duplicate external IDs/barcodes and validation failures.
9.4. Delete Product Unit
Endpoint: DELETE /api/v1/products/{product_id}/units/{id} Required Scope: products:write
This is the only public operation that removes a unit; product upserts and updates never delete omitted units. Success returns 204 No Content. Errors are 400, 401, 403, and 404.
10. Delete Product
Delete a product. This is a soft delete — the product is marked as deleted and will no longer appear in listings or search results.
Endpoint: DELETE /api/v1/products/{product_id} Authentication: Bearer token required (OAuth 2.0 Client Credentials) Required Scope: products:write (for OAuth apps)
Important: A product cannot be deleted if it is linked to a domain assistant (AVA knowledge base). Remove the product association first.
10.1. Request Headers
Authorization
Bearer token: Bearer {ACCESS_TOKEN}
✅
10.2. Path Parameters
10.3. Query Parameters
business_store_id
string
❌
Store used for non-ID lookup. Required when the business has multiple stores; optional for an encoded product ID, but must match when supplied
10.4. Delete Product Response
Success Response: 204 No Content
No response body. The product has been successfully deleted.
10.5. Delete Product Error Responses
400 Bad Request
Malformed business_store_id, or business_store_id is required because the business has multiple stores
401 Unauthorized
Invalid or missing authentication token
403 Forbidden
Insufficient scope or product belongs to another business
404 Not Found
Product not found
422 Unprocessable Entity
Product cannot be deleted (e.g., linked to a domain assistant)
10.6. Examples
CURL Request
CURL Request — By External ID (with store scoping)
Success Response
204 No Content (empty body)
Error Response — Product Linked to Domain Assistant
11. List Product Videos
Retrieve videos tagged with a specific product. Designed for PDP (Product Detail Page) integration.
Endpoint: GET /api/v1/products/{product_id}/videos Authentication: Bearer token required Required Scope: products:read (for OAuth apps)
11.1. Request Headers
Authorization
Bearer token: Bearer {ACCESS_TOKEN}
✅
11.2. Path Parameters
11.3. Query Parameters
Results are returned in descending order by video ID (newest first) unless an after cursor is supplied.
channel_id
string
✅
None
Firework encoded channel ID
business_store_id
string
❌
None
Encoded business store ID for product lookup
accesses
string
❌
public,private
Comma-separated access filter
archived
boolean
❌
false
Omitted or false returns only non-archived videos; true returns only archived videos
page_size
integer
❌
10
Number of videos per page (range: 1–100). Values above the max are clamped
after
string
❌
None
Opaque pagination cursor. Returns the page after this cursor (newer entries, ascending)
before
string
❌
None
Opaque pagination cursor. Returns the page before this cursor (older entries, descending)
Cursors are opaque. Treat
after/beforevalues as opaque tokens — obtain them frompagination.cursoror by followinglinks.next, and do not construct or parse them yourself.afterandbeforeare mutually exclusive; supplying both returns400 Bad Request.
Deprecated (legacy): The
since_idandbefore_idparameters are still accepted during the migration window but are deprecated.aftersupersedessince_id(newer, ascending) andbeforesupersedesbefore_id(older, descending). New integrations should useafter/before.
11.4. List Product Videos Response
Success Response: 200 OK
videos
object[]
❌
Array of video objects
links
object
❌
Pagination links (see the links Object table below)
pagination
object
❌
Pagination state (see the pagination Object table below)
paging
object
✅
Deprecated. Legacy pagination object; use links + pagination instead
Video Object
Each item uses the canonical Video object, plus the product-listing-specific hidden field.
id
string
❌
Encoded video ID
access
string
❌
Video visibility: "public", "private", or "unlisted"
audio_disabled
boolean
❌
Whether audio is disabled
caption
string
✅
Video title or caption
content_generation_type
string
✅
"aigc" for AI-generated content; otherwise null
description
string
✅
Video description
duration
number
✅
Duration in seconds
hashtags
string[]
❌
Hashtag strings
archived_at
string
✅
ISO 8601 archive time
published_at
string
✅
ISO 8601 publish time; a future value means scheduled publication
is_published
boolean
❌
Whether the video is currently published
action_type
string
✅
CTA action type
action_type_translation
string
✅
Translated CTA display label
action_url
string
✅
CTA destination URL
action_custom_label
string
✅
Custom CTA label
product_ids
string[]
❌
Firework-encoded product IDs
variant_ids
string[]
❌
Firework-encoded product variant IDs
custom_fields
object
❌
Custom key-value metadata
display_social_attributions
boolean
✅
Whether social attribution is displayed
external_media
object
✅
Social media source metadata
thumbnail_url
string
✅
CDN URL for the video thumbnail image
watch_url
string
❌
Web URL where a viewer can watch the video
video_posters
array
❌
Video poster images; see Video Poster Schema below
hidden
boolean
❌
Whether the video is hidden in this product listing
Video Poster Schema
id
string
❌
Encoded poster ID
url
string
❌
CDN URL for the poster image
aspect_ratio
string
✅
Aspect ratio (e.g. "9:16", "16:9", "1:1")
format
string
❌
Image format ("jpg", "webp", "gif", "png")
width
integer
❌
Image width in pixels
height
integer
❌
Image height in pixels
video_poster_type
string
❌
"static" or "animated"
source
string
✅
System that generated the poster
external_id
string
✅
Generating system's poster ID
weight
number
✅
Rotation weight from 0 to 1
links Object
next
string
✅
Relative path (beginning /api/v1/...) to the next page. null when there is no next page. Follow it verbatim
This endpoint is a forward-only feed, so
linkshas noprevkey.
pagination Object
cursor
string
✅
Opaque cursor for the next page; pass it as the before parameter. null when exhausted
has_more
boolean
❌
true when another page exists right now
Deprecated (legacy): The
pagingobject (with itspaging.nextURL, or{}when exhausted) is still returned during the migration window but is deprecated in favor oflinks+pagination. New integrations should ignorepaging.
11.5. List Product Videos Error Responses
400 Bad Request
Missing channel_id, a non-integer page_size, a malformed cursor, or both after and before supplied
401 Unauthorized
Missing or invalid token
403 Forbidden
Missing products:read scope or channel belongs to other business
404 Not Found
Product or channel not found
Authorization Note: The
channel_idmust belong to the same business as the authenticated user or OAuth app. Attempting to access a channel from another business returns 403.
11.6. Examples
CURL Request
Paginated Request (older entries)
Pass the pagination.cursor from the previous response as before (or simply follow links.next):
Paginated Request (newer entries)
Example Response
To fetch the next page, follow links.next verbatim, or pass pagination.cursor as the before query parameter.
Example Response (Last Page)
12. List Product Images
Retrieve published, non-archived library images that feature a product. This endpoint is part of the Image API and uses image authorization rather than product authorization.
Endpoint: GET /api/v1/products/{product_id}/images Authentication: Bearer token required Required Scope: images:read Feature: images
12.1. Request Headers
Authorization
Bearer token: Bearer {ACCESS_TOKEN}
✅
12.2. Parameters
product_id
Path
string
✅
None
Encoded Firework product ID
include_unpublished
Query
boolean
❌
false
Include draft and scheduled images
after
Query
string
❌
None
Opaque forward cursor
before
Query
string
❌
None
Opaque backward cursor
page_size
Query
integer
❌
10
Number of images, maximum 100
Archived/deleted images and listings with image_hidden: true are always excluded. Unpublished and scheduled images are excluded unless include_unpublished=true. Results use each listing's image_sort_position, with unranked images last.
12.3. Response
200 OK returns the standard image collection envelope (the item below is abbreviated):
See the Image API's Image Object for all fields.
12.4. Error Responses
400 Bad Request
Invalid pagination parameters
401 Unauthorized
Missing or invalid token
402 Payment Required
The business does not have the images feature
403 Forbidden
Missing images:read scope or inaccessible product business
404 Not Found
Product or store not found
12.5. Example
13. Pagination
The List Products, List Product Videos, and List Product Images endpoints use the standard cursor-based links + pagination response envelope.
How it works:
afterreturns the page after an opaque cursor (newer entries, ascending order).beforereturns the page before an opaque cursor (older entries, descending order).afterandbeforeare mutually exclusive; supplying both returns400 Bad Request.Without a cursor, results start from the newest entry (descending by ID).
Cursor values are opaque — obtain them from
pagination.cursoror by followinglinks.next, and never construct or parse them yourself.To advance, follow
links.nextverbatim, or passpagination.cursorback as thebeforeparameter. When there are no more results,links.nextandpagination.cursorarenullandpagination.has_moreisfalse.page_sizecontrols items per page (default 10, range 1–100; values above the max are clamped).
Deprecated (legacy): During the migration window, the List Product Videos endpoint also still accepts the legacy
since_id/before_idquery parameters and returns a legacypagingobject (with apaging.nextURL, or{}when exhausted). These are deprecated —aftersupersedessince_id(newer, ascending) andbeforesupersedesbefore_id(older, descending). New integrations should useafter/beforewith thelinks+paginationenvelope and ignorepaging.
Pagination Examples
14. Product Identifiers
The product_id path parameter in Get Product, Update Product, Delete Product, the product-unit endpoints, and List Product Videos accepts multiple identifier types for flexibility. List Product Images currently requires the encoded Firework product ID. Supported product identifier types are:
Firework encoded product ID — The internal Firework product identifier
External product ID — Your system's product identifier
External product unit ID — Your system's product variant/unit identifier
Product unit GTIN — Global Trade Item Number (UPC, EAN, ISBN, etc.)
Product unit SKU — Stock Keeping Unit
Product unit MPN — Manufacturer Part Number
Product unit barcode — Barcode value of the variant/unit
Product Lookup Rules
The system will attempt to resolve the product using each identifier type in sequence
If
business_store_idis provided, the lookup is scoped to that specific storeAn encoded product ID derives its store from the product; if
business_store_idis supplied, it must matchFor other identifiers,
business_store_idmay be omitted only when the authenticated business resolves to exactly one store. Multiple stores return400 Bad Requestrather than guessingIf the product cannot be found using any identifier type, a
404 Not Foundis returned
Identifier Examples
Last updated
Was this helpful?