List products with pagination
curl --request GET \
--url https://api.sellfern.com/products/paging \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sellfern.com/products/paging"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sellfern.com/products/paging', 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://api.sellfern.com/products/paging",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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://api.sellfern.com/products/paging"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sellfern.com/products/paging")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sellfern.com/products/paging")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"data": [
{
"id": 1001,
"sku": "TSHIRT-BLACK-M",
"spu": "TSHIRT",
"title": "Classic T-Shirt - Black / M",
"description": "<string>",
"price": 123,
"design_link": "<string>",
"tags": [
"<string>"
],
"images": [
"<string>"
],
"videos": [
"<string>"
],
"stores": [
"<string>"
],
"platforms": [
"<string>"
],
"labels": [
"<string>"
],
"sizes": [
"<string>"
],
"organization_id": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
],
"total": 125,
"page": 1,
"limit": 50,
"totalPages": 3
},
"meta": {
"request_id": "<string>"
}
}{
"success": false,
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key."
},
"meta": {
"request_id": "<string>"
}
}{
"success": false,
"error": {
"code": "missing_scope",
"message": "Missing required scope."
},
"meta": {
"request_id": "<string>"
}
}{
"success": false,
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded."
},
"meta": {
"request_id": "<string>"
}
}Products And Catalog
List products with pagination
Lists products for the authenticated organization with search, store filters, and pagination. The backend filters products by organization before returning rows. Public schema excludes internal sync snapshots and system product payloads.
Scope notes: Requires product read scope and authenticated organization isolation.
Read-only endpoint.
GET
/
products
/
paging
List products with pagination
curl --request GET \
--url https://api.sellfern.com/products/paging \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sellfern.com/products/paging"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sellfern.com/products/paging', 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://api.sellfern.com/products/paging",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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://api.sellfern.com/products/paging"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sellfern.com/products/paging")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sellfern.com/products/paging")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"data": [
{
"id": 1001,
"sku": "TSHIRT-BLACK-M",
"spu": "TSHIRT",
"title": "Classic T-Shirt - Black / M",
"description": "<string>",
"price": 123,
"design_link": "<string>",
"tags": [
"<string>"
],
"images": [
"<string>"
],
"videos": [
"<string>"
],
"stores": [
"<string>"
],
"platforms": [
"<string>"
],
"labels": [
"<string>"
],
"sizes": [
"<string>"
],
"organization_id": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
],
"total": 125,
"page": 1,
"limit": 50,
"totalPages": 3
},
"meta": {
"request_id": "<string>"
}
}{
"success": false,
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key."
},
"meta": {
"request_id": "<string>"
}
}{
"success": false,
"error": {
"code": "missing_scope",
"message": "Missing required scope."
},
"meta": {
"request_id": "<string>"
}
}{
"success": false,
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded."
},
"meta": {
"request_id": "<string>"
}
}Authorizations
Sellfern public API key scoped to the authenticated organization. Do not use user JWTs for public integrations.
Query Parameters
Search by SKU or title.
Exclude automatically generated SKUs.
Only include products missing a design link.
Store filter accepted by the backend.
Page number, 1-indexed.
Required range:
x >= 1Number of results per page.
Required range:
1 <= x <= 100Product field to sort by.
Sort direction.
Available options:
asc, desc, ASC, DESC 