curl --request GET \
--url https://{companyName}.api.joinluminous.com/external/api/v1/products/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://{companyName}.api.joinluminous.com/external/api/v1/products/export"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{companyName}.api.joinluminous.com/external/api/v1/products/export', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{companyName}.api.joinluminous.com/external/api/v1/products/export",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{companyName}.api.joinluminous.com/external/api/v1/products/export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{companyName}.api.joinluminous.com/external/api/v1/products/export")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{companyName}.api.joinluminous.com/external/api/v1/products/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": 123,
"name": "<string>",
"description": "<string>",
"retail_price": 123,
"wholesale_price": 123,
"unit_cost": 123,
"sellable": true,
"discontinued": true,
"custom_fields": {},
"sku": "<string>",
"alternate_skus": [
{
"id": 123,
"sku": "<string>",
"unit_conversion_rule_id": 123
}
],
"upc": "<string>",
"tags": [
{
"id": 123,
"name": "<string>",
"description": "<string>",
"icon": "<string>",
"color": "<string>"
}
],
"substitutions": [
{}
],
"boms": [
{
"id": 123
}
],
"type": "PRODUCT",
"kit_items": [
{
"id": 123,
"product_id": 123,
"quantity": 123,
"uom_id": 123,
"base_uom_quantity": 123,
"price": 123,
"original_price": 123,
"total": 123
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"landed_cost": 123,
"product_length": 123,
"product_width": 123,
"product_height": 123,
"box_length": 123,
"box_width": 123,
"box_height": 123,
"carton_length": 123,
"carton_width": 123,
"carton_height": 123,
"shipping_length": 123,
"shipping_width": 123,
"shipping_height": 123,
"pallet_length": 123,
"pallet_width": 123,
"pallet_height": 123,
"product_weight": {
"unit": "lb",
"value": 123
},
"product_weight_oz": 123,
"product_weight_lb": 123,
"box_weight": {
"unit": "lb",
"value": 123
},
"box_weight_oz": 123,
"box_weight_lb": 123,
"carton_weight": {
"unit": "lb",
"value": 123
},
"carton_weight_oz": 123,
"carton_weight_lb": 123,
"shipping_weight": {
"unit": "lb",
"value": 123
},
"shipping_weight_oz": 123,
"shipping_weight_lb": 123,
"pallet_weight": {
"unit": "lb",
"value": 123
},
"pallet_weight_oz": 123,
"pallet_weight_lb": 123,
"dimensional_weight": {
"unit": "lb",
"value": 123
},
"dimensional_weight_oz": 123,
"dimensional_weight_lb": 123,
"qty_low_alert": 123,
"qty_reorder_threshold": 123,
"qty_minimum": 123,
"image_url": "<string>",
"category": {
"id": 123,
"name": "<string>"
},
"subcategory": {
"id": 123,
"name": "<string>"
},
"variant_attributes": "<unknown>",
"supplier": {
"id": 123,
"status": 123,
"name": "<string>",
"description": "<string>",
"street_address": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"country": "<string>",
"supplier_admin_id": 123,
"contact_name": "<string>",
"contact_email": "<string>",
"contact_phone": "<string>",
"created_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_by": "<string>",
"updated_at": "2023-11-07T05:31:56Z"
}
}
],
"next_cursor": "eyJ2IjoxLCJtb2RlIjoiZXhwb3J0In0.abc123",
"has_more": true,
"meta": {
"rows": 1
}
}{
"message": "<string>",
"error": "invalid_cursor"
}{
"error": "Unauthorized",
"message": "Authentication credentials are missing or invalid",
"status_code": 401
}{
"message": "<string>",
"errors": {}
}Export products (cursor pagination)
Bulk-export active products (status = 1) using cursor-based keyset
pagination. Designed for bulk catalog syncs and pipelines.
Each run is anchored to a fixed cutoff time (set on the first request),
so pages are stable even if records are updated mid-run. Order is ascending
by (updated_at, id).
Pagination
| Parameter | Description |
|---|---|
since | Lower bound for updated_at (inclusive). Required on the first page. ISO 8601 date or datetime, UTC recommended. |
cursor | Opaque token from next_cursor on the previous response. Required on follow-up pages. Do not send with since. |
limit | Max records per page. Default 100, maximum 1000. |
Example flow
# 1. Start a run
GET /products/export?since=1970-01-01T00:00:00Z&limit=1000
# 2. Continue while has_more is true
GET /products/export?cursor=<next_cursor>
# 3. Stop when has_more is false
Notes
- The cursor is cryptographically signed; do not modify it.
- Nested data omitted for performance: full BOM line items, variant SKU
rows, attachments, substitutions, priority list, alternate-SKU unit
conversion rule expansion. Use
GET /products/{id}for full detail. - Some deployments rewrite to
index.php?q=$uri&$args; the server ignores theqquery parameter during validation.
curl --request GET \
--url https://{companyName}.api.joinluminous.com/external/api/v1/products/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://{companyName}.api.joinluminous.com/external/api/v1/products/export"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{companyName}.api.joinluminous.com/external/api/v1/products/export', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{companyName}.api.joinluminous.com/external/api/v1/products/export",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{companyName}.api.joinluminous.com/external/api/v1/products/export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{companyName}.api.joinluminous.com/external/api/v1/products/export")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{companyName}.api.joinluminous.com/external/api/v1/products/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": 123,
"name": "<string>",
"description": "<string>",
"retail_price": 123,
"wholesale_price": 123,
"unit_cost": 123,
"sellable": true,
"discontinued": true,
"custom_fields": {},
"sku": "<string>",
"alternate_skus": [
{
"id": 123,
"sku": "<string>",
"unit_conversion_rule_id": 123
}
],
"upc": "<string>",
"tags": [
{
"id": 123,
"name": "<string>",
"description": "<string>",
"icon": "<string>",
"color": "<string>"
}
],
"substitutions": [
{}
],
"boms": [
{
"id": 123
}
],
"type": "PRODUCT",
"kit_items": [
{
"id": 123,
"product_id": 123,
"quantity": 123,
"uom_id": 123,
"base_uom_quantity": 123,
"price": 123,
"original_price": 123,
"total": 123
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"landed_cost": 123,
"product_length": 123,
"product_width": 123,
"product_height": 123,
"box_length": 123,
"box_width": 123,
"box_height": 123,
"carton_length": 123,
"carton_width": 123,
"carton_height": 123,
"shipping_length": 123,
"shipping_width": 123,
"shipping_height": 123,
"pallet_length": 123,
"pallet_width": 123,
"pallet_height": 123,
"product_weight": {
"unit": "lb",
"value": 123
},
"product_weight_oz": 123,
"product_weight_lb": 123,
"box_weight": {
"unit": "lb",
"value": 123
},
"box_weight_oz": 123,
"box_weight_lb": 123,
"carton_weight": {
"unit": "lb",
"value": 123
},
"carton_weight_oz": 123,
"carton_weight_lb": 123,
"shipping_weight": {
"unit": "lb",
"value": 123
},
"shipping_weight_oz": 123,
"shipping_weight_lb": 123,
"pallet_weight": {
"unit": "lb",
"value": 123
},
"pallet_weight_oz": 123,
"pallet_weight_lb": 123,
"dimensional_weight": {
"unit": "lb",
"value": 123
},
"dimensional_weight_oz": 123,
"dimensional_weight_lb": 123,
"qty_low_alert": 123,
"qty_reorder_threshold": 123,
"qty_minimum": 123,
"image_url": "<string>",
"category": {
"id": 123,
"name": "<string>"
},
"subcategory": {
"id": 123,
"name": "<string>"
},
"variant_attributes": "<unknown>",
"supplier": {
"id": 123,
"status": 123,
"name": "<string>",
"description": "<string>",
"street_address": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"country": "<string>",
"supplier_admin_id": 123,
"contact_name": "<string>",
"contact_email": "<string>",
"contact_phone": "<string>",
"created_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_by": "<string>",
"updated_at": "2023-11-07T05:31:56Z"
}
}
],
"next_cursor": "eyJ2IjoxLCJtb2RlIjoiZXhwb3J0In0.abc123",
"has_more": true,
"meta": {
"rows": 1
}
}{
"message": "<string>",
"error": "invalid_cursor"
}{
"error": "Unauthorized",
"message": "Authentication credentials are missing or invalid",
"status_code": 401
}{
"message": "<string>",
"errors": {}
}Authorizations
Authenticate using a bearer token. To create a token, navigate to /settings/api-tokens and click Create API Token.
Query Parameters
Lower bound for updated_at (inclusive). Required on the first page;
omit when using cursor.
"1970-01-01T00:00:00Z"
Signed continuation token from a previous response's next_cursor.
Required on follow-up pages; cannot be combined with since.
"eyJ2IjoxLCJtb2RlIjoiZXhwb3J0In0.abc123"
Maximum number of products to return per page.
1 <= x <= 1000Response
Successful export page
Show child attributes
Show child attributes
Signed cursor token to fetch the next page. null when the export is complete.
"eyJ2IjoxLCJtb2RlIjoiZXhwb3J0In0.abc123"
true when the page is full (data.length === limit), indicating more rows may exist.
Show child attributes
Show child attributes