Track and retrieve user visits to chess openings with intelligent deduplication.
All endpoints in this API require valid user authentication. Unauthenticated requests will receive 401 Unauthorized.
/api/user/visitsRecords a visit to a specific opening. Implements intelligent deduplication by updating existing visits rather than creating duplicates.
{
"openingId": "string (required)"
}const response = await fetch('/api/user/visits', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
openingId: 'clk9x8d4q0001vq2o6q7q8r9s'
})
});{
"success": true
}{
"error": "Missing openingId"
}/api/user/visitsRetrieves a paginated list of the authenticated user's opening visits, ordered by most recent first.
pagelimit// Fetch visit history with pagination
const response = await fetch('/api/user/visits?page=1&limit=15');
const data = await response.json();
console.log(data.visits); // Array of visit objects with opening details
console.log(data.total); // Total number of unique visited openings
console.log(data.page); // Current page number
console.log(data.totalPages); // Total number of pages{
"visits": [
{
"id": "string",
"userId": "string",
"openingId": "string",
"count": 5,
"visitedAt": "2024-01-15T10:30:00.000Z",
"opening": {
"id": "string",
"name": "Ruy Lopez",
"eco": "C60",
"fen": "string",
"pgn": "string",
"totalVisits": 300,
"totalFavorites": 25,
"totalPracticeSessions": 150,
"aliases": [
{
"id": "string",
"name": "Spanish Opening",
"openingId": "string"
}
]
}
}
],
"total": 45,
"page": 1,
"totalPages": 3
}