Overview
The catalog endpoint returns all available gift cards and digital products organized by categories like Gaming Cards, Streaming Services, etc. Products should be cached to minimize API calls since the catalog changes infrequently.
Cache catalog data for at least 24 hours . Products are added/removed
rarely.
API Reference
GET /v3/gift-cards/catalog Complete endpoint documentation
Basic Catalog Loading
async function loadCatalog () {
const response = await fetch (
"https://api.oneclickdz.com/v3/gift-cards/catalog" ,
{
headers: {
"X-Access-Token" : process . env . API_KEY ,
},
}
);
if ( ! response . ok ) {
throw new Error ( `Failed to load catalog: ${ response . status } ` );
}
const result = await response . json ();
return result . data ;
}
// Usage
const catalog = await loadCatalog ();
console . log ( `Total categories: ${ catalog . categories . length } ` );
console . log (
`Total products: ${ catalog . categories . reduce (
( sum , cat ) => sum + cat . products . length ,
0
) } `
);
Response Structure
{
"success" : true ,
"data" : {
"categories" : [
{
"name" : "Gaming Cards" ,
"products" : [
{
"id" : "507f1f77bcf86cd799439011" ,
"title" : "PlayStation Network" ,
"enabled" : true ,
"region" : "dz"
},
{
"id" : "507f1f77bcf86cd799439012" ,
"title" : "Google Play Gift Card" ,
"enabled" : true
}
]
},
{
"name" : "Streaming Services" ,
"products" : [
{
"id" : "507f1f77bcf86cd799439014" ,
"title" : "Netflix Gift Card" ,
"enabled" : true
}
]
}
]
},
"meta" : {
"totalCategories" : 8 ,
"totalProducts" : 127
}
}
Caching Implementation
class CatalogCache {
constructor ( ttlMinutes = 10 ) {
this . data = null ;
this . timestamp = 0 ;
this . ttl = ttlMinutes * 60 * 1000 ;
}
async get () {
const now = Date . now ();
// Return cached if still valid
if ( this . data && now - this . timestamp < this . ttl ) {
console . log ( "Returning cached catalog" );
return this . data ;
}
// Fetch fresh data
console . log ( "Fetching fresh catalog" );
const response = await fetch (
"https://api.oneclickdz.com/v3/gift-cards/catalog" ,
{
headers: { "X-Access-Token" : process . env . API_KEY },
}
);
this . data = await response . json ();
this . timestamp = now ;
return this . data ;
}
invalidate () {
this . data = null ;
this . timestamp = 0 ;
}
}
// Usage
const cache = new CatalogCache ( 10 ); // 24 hours TTL
// First call - fetches from API
const catalog1 = await cache . get ();
// Second call within 24 hours - returns cached
const catalog2 = await cache . get ();
// Force refresh
cache . invalidate ();
const catalog3 = await cache . get (); // Fetches fresh
Filtering Products
Only show enabled products to customers:
function getEnabledProducts ( catalog ) {
const enabled = [];
for ( const category of catalog . categories ) {
const enabledInCategory = category . products . filter (( p ) => p . enabled );
if ( enabledInCategory . length > 0 ) {
enabled . push ({
categoryName: category . name ,
products: enabledInCategory ,
});
}
}
return enabled ;
}
// Usage
const catalog = await cache . get ();
const enabledProducts = getEnabledProducts ( catalog . data );
console . log ( "Enabled products:" , JSON . stringify ( enabledProducts , null , 2 ));
Region Filtering
Filter products by region if targeting specific markets:
function filterByRegion ( catalog , region = "dz" ) {
return catalog . categories
. map (( category ) => ({
... category ,
products: category . products . filter (
( p ) => p . enabled && ( ! p . region || p . region === region )
),
}))
. filter (( cat ) => cat . products . length > 0 );
}
// Usage
const algerianProducts = filterByRegion ( catalog . data , "dz" );
Best Practices
Handle Errors Gracefully Fall back to cached data if API is temporarily unavailable
Organize by Category Use category structure for better user experience
Next Steps