Navigation

Get Customizations Summary

Retrieve a high-level summary of all customizations for the tracker.

Overview

Important This endpoint requires HMAC authentication.

Retrieve a high-level summary of all customizations for the tracker. This includes a count of customizations per recommender model and a list of all unique tags used across customizations.

Authentication

This endpoint requires HMAC authentication. You must include the Date and Authorization headers. See Authentication for details.

GET https://live.luigisbox.tech/v1/recommender/pin/{TRACKER_ID}/summary

Request Parameters

Path Parameters

Parameter Type Required Description
TRACKER_ID String Your unique tracker identifier.

Request Headers

Header Value Description
Content-Type application/json Required.
Date HTTP Date Required for HMAC.
Authorization Signature Required for HMAC.

Example Request

tracker_id="1234-5678"
private_key="your_private_api_key"
host="https://live.luigisbox.tech"
path="/v1/recommender/pin/${tracker_id}/summary"
method="GET"
content_type="application/json; charset=utf-8"
date=$(date -u "+%a, %d %b %Y %H:%M:%S GMT")

string_to_sign="$(printf "${method}\n${content_type}\n${date}\n${path}")" signature=$(echo -n "${string_to_sign}" | openssl dgst -sha256 -hmac "${private_key}" -binary | base64)

curl -X ${method} "${host}${path}" \ -H "Content-Type: ${content_type}" \ -H "Date: ${date}" \ -H "Authorization: ApiAuth ${tracker_id}:${signature}"

How to make a request

All requests to this endpoint must be authenticated using HMAC SHA-256. The examples on the right demonstrate the implementation in various languages, but the core logic follows these steps:

1. Construct the String to Sign

Create a string using the following components, separated by newlines (\n):

  1. HTTP Method: GET
  2. Content-Type: application/json; charset=utf-8
  3. Date: The current timestamp in RFC 1123 format (e.g., Mon, 20 Jan 2025 12:00:00 GMT).
  4. Request Path: The resource path.

2. Generate the HMAC Signature

  1. Create an HMAC SHA-256 hash of the string above using your Private API Key.
  2. Encode the result in Base64 and trim whitespace.

3. Send the Headers

Include Date, Content-Type, and Authorization: ApiAuth {TRACKER_ID}:{SIGNATURE} in your request.

Example Code

require 'faraday'
require 'base64'
require 'openssl'
require 'json'
require 'time'

def generate_luigisbox_digest(private_key, http_method, endpoint_path, date_header, content_type_header) data = "#{http_method}\n#{content_type_header}\n#{date_header}\n#{endpoint_path}" hash = OpenSSL::HMAC.digest('sha256', private_key, data) Base64.strict_encode64(hash).strip end

tracker_id = 'YOUR_TRACKER_ID' private_key = 'your_private_api_key' host = 'https://live.luigisbox.tech' endpoint_path = "/v1/recommender/pin/#{tracker_id}/summary"

conn = Faraday.new(url: host)

http_method = 'GET' content_type = 'application/json; charset=utf-8' date_header = Time.now.utc.strftime("%a, %d %b %Y %H:%M:%S GMT")

signature = generate_luigisbox_digest(private_key, http_method, endpoint_path, date_header, content_type) authorization_header = "ApiAuth #{tracker_id}:#{signature}"

response = conn.get(endpoint_path) do |req| req.headers['Date'] = date_header req.headers['Content-Type'] = content_type req.headers['Authorization'] = authorization_header end

puts response.body

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;

function generateLuigisboxDigest($privateKey, $httpMethod, $endpointPath, $dateHeader, $contentTypeHeader) { $data = "{$httpMethod}\n{$contentTypeHeader}\n{$dateHeader}\n{$endpointPath}"; $hash = hash_hmac('sha256', $data, $privateKey, true); return trim(base64_encode($hash)); }

$TRACKER_ID = "YOUR_TRACKER_ID"; $YOUR_PRIVATE_KEY = "your_private_api_key"; $LUIGISBOX_HOST = 'https://live.luigisbox.tech'; $ENDPOINT_PATH = "/v1/recommender/pin/{$TRACKER_ID}/summary";

$http_method = 'GET'; $content_type = 'application/json; charset=utf-8'; $current_date = gmdate('D, d M Y H:i:s') . ' GMT';

$signature = generateLuigisboxDigest($YOUR_PRIVATE_KEY, $http_method, $ENDPOINT_PATH, $current_date, $content_type); $authorization_header = "ApiAuth {$TRACKER_ID}:{$signature}";

$client = new GuzzleHttp\Client(); $response = $client->request($http_method, "{$LUIGISBOX_HOST}{$ENDPOINT_PATH}", [ 'headers' => [ 'Content-Type' => $content_type, 'Date' => $current_date, 'Authorization' => $authorization_header, ] ]);

echo $response->getBody(); ?>

const axios = require('axios');
const crypto = require('crypto');

function generateLuigisBoxDigest(privateKey, httpMethod, endpointPath, dateHeader, contentTypeHeader) { const data = </span><span class="p">${</span><span class="nx">httpMethod</span><span class="p">}</span><span class="s2">\n</span><span class="p">${</span><span class="nx">contentTypeHeader</span><span class="p">}</span><span class="s2">\n</span><span class="p">${</span><span class="nx">dateHeader</span><span class="p">}</span><span class="s2">\n</span><span class="p">${</span><span class="nx">endpointPath</span><span class="p">}</span><span class="s2">; const hmac = crypto.createHmac('sha256', privateKey); hmac.update(data); return hmac.digest('base64').trim(); }

const TRACKER_ID = "YOUR_TRACKER_ID"; const YOUR_PRIVATE_KEY = "your_private_api_key"; const LUIGISBOX_HOST = 'https://live.luigisbox.tech'; const ENDPOINT_PATH = /v1/recommender/pin/</span><span class="p">${</span><span class="nx">TRACKER_ID</span><span class="p">}</span><span class="s2">/summary;

const httpMethod = 'GET'; const contentType = 'application/json; charset=utf-8'; const dateHeader = new Date().toUTCString();

const signature = generateLuigisBoxDigest(YOUR_PRIVATE_KEY, httpMethod, ENDPOINT_PATH, dateHeader, contentType); const authorizationHeader = ApiAuth </span><span class="p">${</span><span class="nx">TRACKER_ID</span><span class="p">}</span><span class="s2">:</span><span class="p">${</span><span class="nx">signature</span><span class="p">}</span><span class="s2">;

axios({ method: httpMethod, url: </span><span class="p">${</span><span class="nx">LUIGISBOX_HOST</span><span class="p">}${</span><span class="nx">ENDPOINT_PATH</span><span class="p">}</span><span class="s2">, headers: { 'Content-Type': contentType, 'Date': dateHeader, 'Authorization': authorizationHeader } }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); });

Response Structure

The response contains counts by model and a distinct list of user tags.

Response Attributes

Attribute Type Description
scope_counts Object Map of model names to customization counts.
user_tags Array List of all unique tags found in customizations.

The Response Object

{
  "scope_counts": {
    "basket": 12,
    "basket_popup": 3,
    "item_detail_alternatives": 8,
    "trends": 2
  },
  "user_tags": [
    "black friday",
    "guitar",
    "fender - brand",
    "sale"
  ]
}

Error Handling

HTTP Status Description
200 OK Success.
401 Unauthorized Missing or invalid authentication.
404 Not Found Tracker not found.

Error Responses

{
  "reason": "Tracker not found",
  "exception_details": {}
}