/suggest/autocomplete - Autocomplete suggestions

Overview

The /suggest/autocomplete endpoint provides autocomplete/typeahead suggestions for resort search queries.

Purpose

Endpoint

GET /suggest/autocomplete

Parameters

Query parameters

q (string, required)

Search query term for autocomplete suggestions. Searches against resort names only.

Minimum length: Typically 1-2 characters for useful results

Examples:

Note: Search is case-insensitive and uses SQL LIKE matching with wildcards (%query%).


Response format

Success response structure

{
  "total": 12,
  "more_results": true,
  "result": [
    {
      "name": "Trysil",
      "site_path": "/trysil/"
    },
    {
      "name": "Trysilhøgda",
      "site_path": "/trysilhogda/"
    },
    {
      "name": "Oslo Vinterpark",
      "site_path": "/oslo-vinterpark/"
    },
    {
      "name": "Norefjell",
      "site_path": "/norefjell/"
    },
    {
      "name": "Kongsberg Skisenter",
      "site_path": "/kongsberg/"
    },
    {
      "name": "Varingskollen Alpinsenter",
      "site_path": "/varingskollen/"
    },
    {
      "name": "Hafjell",
      "site_path": "/hafjell/"
    },
    {
      "name": "Kvitfjell",
      "site_path": "/kvitfjell/"
    },
    {
      "name": "Gausdal",
      "site_path": "/gausdal/"
    },
    {
      "name": "Skeikampen",
      "site_path": "/skeikampen/"
    }
  ]
}

Error response (missing parameter)

{
  "error": "Missing required parameter: q"
}

Response fields

Top level fields

Individual Result Fields

Each suggestion in result contains:

Single Result Enhancement

When exactly one resort matches the query, each result object also includes:

Example with single match:

{
  "total": 1,
  "more_results": false,
  "result": [
    {
      "name": "Trysil",
      "site_path": "/trysil/",
      "nearby": [
        {
          "distance": 45300,
          "name": "Sjusjøen",
          "site_path": "/sjusjoen/",
          "id": 89,
          "sort": "0"
        }
      ]
    }
  ]
}

Behavior details

Search logic

Performance


Example requests

Search for "Trysil"

GET /suggest/autocomplete?q=Trysil

Response:

{
  "total": 2,
  "more_results": false,
  "result": [
    {
      "name": "Trysil",
      "site_path": "/trysil/"
    },
    {
      "name": "Trysilhøgda",
      "site_path": "/trysilhogda/"
    }
  ]
}

Search for "Oslo"

GET /suggest/autocomplete?q=Oslo

Response:

{
  "total": 5,
  "more_results": false,
  "result": [
    {
      "name": "Oslo Vinterpark",
      "site_path": "/oslo-vinterpark/"
    },
    {
      "name": "Varingskollen Alpinsenter",
      "site_path": "/varingskollen/"
    }
  ]
}

(Note: May include resorts with "Oslo" in description even if not in name)


Search with many results

GET /suggest/autocomplete?q=ski

Response:

{
  "total": 35,
  "more_results": true,
  "result": [
    {
      "name": "Kongsberg Skisenter",
      "site_path": "/kongsberg/"
    },
    {
      "name": "Hemsedal Skisenter",
      "site_path": "/hemsedal/"
    }
    // ... 8 more results (10 total)
  ]
}

(Note: more_results: true indicates 25 additional matches not shown)


GET /suggest/autocomplete?q=H

Response:

{
  "total": 18,
  "more_results": true,
  "result": [
    {
      "name": "Hafjell",
      "site_path": "/hafjell/"
    },
    {
      "name": "Hemsedal",
      "site_path": "/hemsedal/"
    }
    // ... up to 10 results
  ]
}

Use cases

  1. Typeahead search box: Real-time suggestions as users type in a search field
  2. Quick resort lookup: Fast resort finding without full search
  3. Mobile autocomplete: Optimized for mobile search experiences
  4. Resort discovery: Help users find resorts they may not know the exact name of
  5. Navigation shortcuts: Quick navigation to resort pages
  6. Search enhancement: Improve search UX with instant feedback
  7. Form inputs: Autocomplete for resort selection in forms

Frontend integration example

// Debounced autocomplete handler
let timeout;
function handleAutocomplete(query) {
  clearTimeout(timeout);
  timeout = setTimeout(async () => {
    if (query.length < 2) return; // Wait for at least 2 characters

    const response = await fetch(`/suggest/autocomplete?q=${encodeURIComponent(query)}`);
    const data = await response.json();

    // Display suggestions
    displaySuggestions(data.result);

    // Optionally show "X more results" if data.more_results is true
    if (data.more_results) {
      showMoreResultsIndicator(data.total - data.result.length);
    }
  }, 300); // 300ms debounce
}

Notes