Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/KingPsychopath/oooc-fete-finder/llms.txt

Use this file to discover all available pages before exploring further.

The tracking API enables OOOC Fête Finder to collect analytics on user interactions with events and discovery features. All endpoints return 202 Accepted regardless of processing outcome to avoid blocking user interactions.

POST /api/track

Tracks user engagement with specific events: clicks, outbound clicks, and calendar syncs.

Request body

eventKey
string
required
Unique event identifier (1-220 characters)
actionType
string
required
Type of engagement action:
  • click: User viewed event details
  • outbound_click: User clicked external event link
  • calendar_sync: User added event to calendar
sessionId
string
Anonymous session identifier (max 120 characters)
source
string
Traffic source or referrer (max 80 characters)
path
string
Page path where action occurred (max 280 characters)

Response

Always returns 202 Accepted with:
success
boolean
required
Always true

Rate limits

  • IP-based: 240 requests per minute per IP
  • Session-based: 200 requests per minute per session (when sessionId provided)
Unlike other endpoints, tracking endpoints do not return error responses when rate limited. Instead, they silently accept the request and return 202 Accepted to avoid disrupting user experience.

Validation

The endpoint validates that:
  • The eventKey exists in the live events catalog (cached for 5 minutes)
  • All request parameters match the expected schema
Invalid requests are silently accepted without recording analytics data.

Authentication

Authentication is optional. If the user has a valid session cookie (oooc_user_session), the engagement is recorded as authenticated.

Examples

const response = await fetch('/api/track', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    eventKey: 'jazz-sunset-2026-03-15',
    actionType: 'click',
    sessionId: 'anon_abc123',
    source: 'homepage',
    path: '/events/jazz-sunset-2026-03-15'
  })
});

const data = await response.json();
// { "success": true }
// Status: 202

POST /api/track/discovery

Tracks user discovery behavior: searches, filter applications, and filter clears.

Request body

actionType
string
required
Type of discovery action:
  • search: User performed a search
  • filter_apply: User applied a filter
  • filter_clear: User cleared a filter
sessionId
string
Anonymous session identifier (max 120 characters)
filterGroup
string
Filter category being applied/cleared (max 80 characters)Valid values: date_range, day_night, arrondissement, genre, nationality, venue_type, venue_setting, oooc_pick, price_range, age_range
filterValue
string
Specific filter value selected (max 120 characters)
searchQuery
string
Search query text (max 280 characters, minimum 2 characters)
path
string
Page path where action occurred (max 280 characters)

Response

Always returns 202 Accepted with:
success
boolean
required
Always true

Rate limits

  • IP-based: 180 requests per minute per IP
  • Session-based: 150 requests per minute per session (when sessionId provided)

Validation

The endpoint validates:
  • For filter_apply: filterGroup must be a known filter category and filterValue must not be empty
  • For search: searchQuery must be at least 2 characters
Invalid requests are silently accepted without recording analytics data.

Authentication

Authentication is optional. If the user has a valid session cookie, the action is associated with their email and marked as authenticated.

Examples

const response = await fetch('/api/track/discovery', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    actionType: 'search',
    searchQuery: 'jazz concerts',
    sessionId: 'anon_abc123',
    path: '/discover'
  })
});

const data = await response.json();
// { "success": true }
// Status: 202

Key characteristics

Build docs developers (and LLMs) love