API Reference
One product of the shopping carousels of a topic
The product as the product list shapes it, and every card it was in the scope, newest first, with the prompt, the model, the slot against the carousel size, the price and the merchant of each. 404 when the product was not observed in the scope.
AuthorizationBearer <token>
Session JWT signed with HS256. Verification pins the algorithm and rejects expired tokens, per RFC8725.
In: header
Path Parameters
domainId*string
topicId*string
Query Parameters
key*string
The key of a product row, passed back verbatim; it is opaque and not rebuildable from the brand and title.
limit?number
Appearances to return, newest first; total always counts every appearance of the scope.
Range
value <= 1000Default
200skip?number
Appearances to skip, for paging
Default
0startDate?string
endDate?string
usedModels?string
Comma-separated shopping model ids to include (chatgpt, amazon-alexa-shopping).
tagIds?string
Comma-separated prompt tag ids; narrows the scope to the tagged prompts.
Response Body
application/json
curl -X GET "https://example.com/api/domains/string/topics/string/shopping/products/detail?key=back+market%3A%3Aiphone+13+128+go+reconditionn%C3%A9"{ "product": { "key": "back market::iphone 13 128 go reconditionné", "title": "iPhone 13 128 Go reconditionné", "brand": "Back Market", "isOwned": true, "isTracked": false, "image": "https://cdn.backmarket.fr/iphone-13.jpg", "url": "https://www.backmarket.fr/fr-fr/p/iphone-13", "carousels": 12, "presence": 0.4, "avgSlot": 1.6, "bestSlot": 1, "price": 389, "currency": "EUR" }, "carousels": 30, "appearances": [ { "executionId": "4f0c6b2e-3d3a-4a4a-9f7b-2c3b8a1d5e6f", "promptId": "p1", "prompt": "best refurbished iphone", "model": "chatgpt", "observedAt": "2026-09-14T10:00:00.000Z", "slot": 2, "cards": 6, "price": 389, "currency": "EUR", "merchant": "Back Market", "merchantUrl": "https://www.backmarket.fr/fr-fr/p/iphone-13" } ], "total": 12}