---
title: "Get a carrier’s safety benchmark"
method: GET
path: "/v1/carriers/{dot_number}/safety-benchmark"
---

# Get a carrier’s safety benchmark

`GET /v1/carriers/{dot_number}/safety-benchmark`

A carrier’s safety standing: a FIXED overall score and letter grade (computed once against the canonical peer model — it never changes with the lens) plus a peer comparison re-framed against whichever peer_group you pick. Percentiles are always oriented so 100 is best. Check peer_group.reliable before presenting comparisons; thin buckets (n < 384) are returned flagged, never hidden. Data refreshes weekly (as_of). 404 no_benchmark means the carrier has no inspection history, not an invalid DOT.

## Path parameters

- `dot_number` string, required

## Query parameters

- `peer_group` string
- `include` string
- `peer_key` string
- `violations_limit` integer

## Response `200`

Fixed standing plus the requested sections framed by the chosen lens

- SafetyBenchmarkResponse
  - `dot_number` integer
  - `as_of` string, date, nullable — Weekly data vintage
  - `carrier` object
    - `name` string, nullable
    - `profile` object — The carrier’s axis values (region, carrier_type, fleet_size, radius, equipment, cab, mileage)
  - `peer_group` ResolvedPeerGroup — The peer frame the comparison was placed in.
    - `group_type` string
    - `label` string
    - `peer_key` string, nullable — The carrier’s bucket within the lens; null when unresolvable
    - `n` integer, nullable — Bucket size
    - `reliable` boolean — n >= 384; thin buckets are returned flagged, never hidden
    - `available` boolean — false when the carrier’s profile is missing an axis this lens needs — the fixed grade still returns, only the comparison is omitted
  - `overall` object — FIXED — computed against the canonical peer model; never moves with peer_group
    - `score` number, nullable
    - `grade` string, nullable
    - `peer_percentile` number, nullable — Standing within the chosen lens (mean of scored metric percentiles)
    - `industry_percentile` number, nullable
    - `data_confidence` string, nullable
  - `categories` object — Key set is whatever the pipeline emitted — do not hardcode it
  - `metrics` SafetyBenchmarkMetric[]
    - `metric` string
    - `label` string, nullable
    - `units` string, nullable
    - `carrier_value` number, nullable
    - `percentile` number, nullable — Oriented so 100 is always best
    - `direction` 'lower_is_better' | 'higher_is_better' — Orientation of the RAW value
    - `scored` boolean — Whether this metric feeds the overall peer percentile
    - `percentile_source` 'precomputed' | 'interpolated' | 'null', nullable — precomputed = the pipeline’s own number (canonical lenses, matches the grade); interpolated = placed inside the lens’s quantile distribution
    - `peer` object, nullable
      - `n` integer, nullable
      - `median` number, nullable
      - `boxplot` object, nullable
        - `min` number
        - `p10` number
        - `p25` number
        - `p50` number
        - `p75` number
        - `p90` number
        - `max` number
  - `violations` SafetyBenchmarkViolation[]
    - `unit` string, nullable
    - `unit_id` string
    - `family` string, nullable
    - `basic` string, nullable — FMCSA BASIC category
    - `severity` number, nullable
    - `eligible_denominator` boolean — true when both sides used the eligible-inspection denominator (vehicle-condition families are only citable at CVSA levels 1/2/5)
    - `carrier` object
      - `times_cited` integer, nullable
      - `last_cited_date` string, date, nullable
      - `days_since` integer, nullable
      - `trend_direction` string, nullable
      - `trend_slope_per_yr` number, nullable
      - `rate_per_1k` number, nullable — The rate the carrier is judged on, per the eligible_denominator rule
      - `total_inspections` integer, nullable
      - `q_citations` number[], nullable — Trailing quarters, oldest first
      - `q_inspections` number[], nullable
      - `q_inspections_eligible` number[], nullable
    - `peer` object, nullable — null when the lens resolves no bucket for this family
      - `rate_per_1k` number, nullable
      - `rate_per_1k_eligible` number, nullable
      - `oos_pct` number, nullable
      - `group_carriers` integer, nullable
      - `group_inspections` integer, nullable
      - `low_sample` boolean
      - `q_rate_per_1k` number[], nullable
      - `q_starts` string[], nullable
    - `over_index` number, nullable — carrier rate ÷ peer rate: 1.0 = at peer, 2.0 = double. Always computed from matched denominators; null when the peer side is missing.
  - `violations_truncated` boolean
  - `flags` object
    - `low_sample` boolean
    - `litigation_notes` string[]
    - `data_limitations` string[]

## Other responses

- `400` — Invalid parameters
- `401` — Invalid or missing API key
- `404` — Carrier has no inspections and therefore no safety benchmark
- `429` — Too many requests. Check X-RateLimit-Remaining and Retry-After headers.

---

[API](https://skmtc.net/runalphaloops/apis/alphaloops-fmcsa-carrier-data-api.md) · [All operations](https://skmtc.net/runalphaloops/apis/alphaloops-fmcsa-carrier-data-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/runalphaloops/alphaloops-fmcsa-carrier-data-api/revisions/ae58c064a7af/schema)
