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.
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):
- HTTP Method:
GET - Content-Type:
application/json; charset=utf-8 - Date: The current timestamp in RFC 1123 format (e.g.,
Mon, 20 Jan 2025 12:00:00 GMT). - Request Path: The resource path.
2. Generate the HMAC Signature
- Create an HMAC SHA-256 hash of the string above using your Private API Key.
- 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": {}
}