---
title: "Read historical fare and delay patterns"
method: GET
path: "/v1/routes/{routeId}/insights"
tags: ["History"]
---

# Read historical fare and delay patterns

`GET /v1/routes/{routeId}/insights`

## Request

- Base URL: `https://sweetsaverfare.com`
- URL: `https://sweetsaverfare.com/v1/routes/{routeId}/insights`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://sweetsaverfare.com/oauth/auth`, token URL `https://sweetsaverfare.com/oauth/token`, scopes: `fares:read`)

Returns recorded fare and delay summaries for one route and traveller profile. Historical patterns are not future guarantees.

## Path parameters

- `routeId` 'TSA_SWB' | 'SWB_TSA' | 'TSA_DUK' | 'DUK_TSA' | 'TSA_NAN' | 'HSB_NAN' | 'NAN_HSB' | 'SWB_FUL' | 'FUL_SWB' | 'HSB_LNG' | 'LNG_HSB' | 'ERL_SLT' | 'SLT_ERL' | 'CMX_PWR' | 'PWR_CMX', required

## Query parameters

- `profile_id` 'ADULT_NO_VEHICLE' | 'ADULT_STANDARD_VEHICLE' | 'ADULT_OVERHEIGHT_VEHICLE'

## Response `200`

Route fare and delay patterns

- RouteInsightsResponse
  - `observation_id` string, uuid, nullable, required
  - `observed_at` string, date-time, required
  - `stale_after` string, date-time, required
  - `freshness_state` 'fresh' | 'stale' | 'expired', required
  - `source_status` 'ok' | 'missing' | 'provider_queue_active' | 'session_expired' | 'blocked' | 'unknown', required
  - `data_source` 'demo' | 'fake_worker' | 'fixture' | 'live_provider' | 'schedule_reference', required
  - `parser_version` string, required
  - `observation_trace_id` string, nullable, required
  - `fixture_sha` string, nullable, required
  - `observation_outcome` 'verified' | 'partial' | 'unavailable' | 'failed'
  - `disclaimer` 'Ferry fares can change. Confirm final availability and price directly with BC Ferries before making travel decisions.', required
  - `route_id` 'TSA_SWB' | 'SWB_TSA' | 'TSA_DUK' | 'DUK_TSA' | 'TSA_NAN' | 'HSB_NAN' | 'NAN_HSB' | 'SWB_FUL' | 'FUL_SWB' | 'HSB_LNG' | 'LNG_HSB' | 'ERL_SLT' | 'SLT_ERL' | 'CMX_PWR' | 'PWR_CMX', required
  - `profile_id` 'ADULT_NO_VEHICLE' | 'ADULT_STANDARD_VEHICLE' | 'ADULT_OVERHEIGHT_VEHICLE', required
  - `period_start` string, date, required
  - `period_end` string, date, required
  - `fare_by_weekday` RouteInsightFareBucket[], required
    - `key` string, required
    - `label` string, required
    - `median_price_cents` number, nullable, required
    - `lowest_price_cents` integer, nullable, required
    - `saver_percent` number, nullable, required
    - `eligible_sailings` integer, required
    - `examples` RouteInsightExample[], required
      - `travel_date` string, date, required
      - `departure_time` string, required
      - `price_cents` integer, required
      - `fare_family` 'SAVER' | 'PREPAID' | 'RESERVATION_ONLY' | 'STANDARD', required
  - `fare_by_time_block` RouteInsightFareBucket[], required
    - `key` string, required
    - `label` string, required
    - `median_price_cents` number, nullable, required
    - `lowest_price_cents` integer, nullable, required
    - `saver_percent` number, nullable, required
    - `eligible_sailings` integer, required
    - `examples` RouteInsightExample[], required
      - `travel_date` string, date, required
      - `departure_time` string, required
      - `price_cents` integer, required
      - `fare_family` 'SAVER' | 'PREPAID' | 'RESERVATION_ONLY' | 'STANDARD', required
  - `fare_by_booking_window` RouteInsightFareBucket[], required
    - `key` string, required
    - `label` string, required
    - `median_price_cents` number, nullable, required
    - `lowest_price_cents` integer, nullable, required
    - `saver_percent` number, nullable, required
    - `eligible_sailings` integer, required
    - `examples` RouteInsightExample[], required
      - `travel_date` string, date, required
      - `departure_time` string, required
      - `price_cents` integer, required
      - `fare_family` 'SAVER' | 'PREPAID' | 'RESERVATION_ONLY' | 'STANDARD', required
  - `delay_by_time_block` RouteInsightDelayBucket[], required
    - `key` 'early_morning' | 'morning' | 'afternoon' | 'evening' | 'late_evening', required
    - `label` string, required
    - `delayed_percent` number, nullable, required
    - `eligible_sailings` integer, required
    - `delayed_sailings` integer, required
    - `threshold_minutes` 10, required

## Other responses

- `400`: Invalid request
- `401`: Authentication required
- `403`: Permission or plan entitlement required
- `429`: Request rate limit exceeded
- `500`: Internal server error

---

[API](https://skmtc.dev/sweetsaverfare/apis/sweet-saver-fare-public-api.md) · [All operations](https://skmtc.dev/sweetsaverfare/apis/sweet-saver-fare-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sweetsaverfare/apis/sweet-saver-fare-public-api/revisions/102cb8af7798?raw)
