AlphaLoops FMCSA Carrier Data API · OpenAPI Overlay 1.0.0

API Evangelist enhancements — AlphaLoops FMCSA Carrier Data API

27 actions 27 updates documentation extends ../openapi/alphaloops-fmcsa-carrier-data-api-openapi.json
Generated by API Evangelist Written by API Evangelist tooling for AlphaLoops FMCSA Carrier Data API's API. It is a proposal applied on top of the contract, not a document AlphaLoops FMCSA Carrier Data API publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

tagsx-results-keyx-paginationx-field-projectionx-piiexternalDocsx-rate-limitx-error-envelope

Targets 27 · first 16 shown; the file carries all of them

$
$.info
$.paths['/v1/carriers/{dot_number}'].get
$.paths['/v1/carriers/mc/{mc_number}'].get
$.paths['/v1/carriers/search'].get
$.paths['/v1/carriers/query'].post
$.paths['/v1/carriers/{dot_number}/overview'].get
$.paths['/v1/carriers/{dot_number}/similar'].get
$.paths['/v1/carriers/{dot_number}/authority'].get
$.paths['/v1/carriers/{dot_number}/insurance'].get
$.paths['/v1/carriers/mc/{mc_number}/insurance'].get
$.paths['/v1/carriers/{dot_number}/trucks'].get
$.paths['/v1/carriers/{dot_number}/trailers'].get
$.paths['/v1/carriers/{dot_number}/inspections'].get
$.paths['/v1/inspections/{inspection_id}/violations'].get
$.paths['/v1/carriers/{dot_number}/crashes'].get

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements — AlphaLoops FMCSA Carrier Data API
  version: 1.0.0
extends: ../openapi/alphaloops-fmcsa-carrier-data-api-openapi.json

# generated: '2026-08-11'
# method: generated
# source: >-
#   Authored by API Evangelist against the live provider spec fetched from
#   https://runalphaloops.com/openapi.json on 2026-08-11. This overlay carries OUR enhancements
#   only — it never mutates the original, which is preserved verbatim at
#   openapi/_original/alphaloops-fmcsa-carrier-data-api-openapi.json.
#
# WHAT THIS OVERLAY FIXES, and why each item is a real defect rather than a preference:
#   1. tags is an empty array and NO operation is tagged, so the 25 operations have no navigable
#      grouping in any renderer or catalog. We add eight tags and tag every operation.
#   2. Pagination style is split between page/limit and offset/limit with no machine-readable
#      marker, and the provider warns about it only in prose. We annotate each affected operation
#      with x-pagination so a client can branch on it.
#   3. The collection array is named differently in nearly every response envelope. We record the
#      real key per operation as x-results-key.
#   4. Rate-limit headers are returned on every response and documented in prose, but declared
#      nowhere in the spec. We document them at the info level as x-rate-limit.
#   5. enrichContact is credit-metered with a 402 path; searchContacts can return 202. Both are
#      commercial/runtime facts absent from the contract. We annotate them.
#   6. 500 and 502 are documented in the provider's own error table but declared on no operation.
#      We note this at info level rather than inventing response objects.

actions:
  # --- 1. Tag vocabulary + external docs -----------------------------------------------------
  - target: $
    description: Add a tag vocabulary; the source spec declares an empty tags array.
    update:
      tags:
        - name: Carriers
          description: Carrier lookup, search, filtering and profile retrieval.
        - name: Authority
          description: Operating authority history and insurance filings.
        - name: Fleet
          description: VIN-level trucks and trailers.
        - name: Safety
          description: Roadside inspections, violations and crash history.
        - name: Risk
          description: Fraud, chameleon-carrier and financial-distress signals.
        - name: Contacts
          description: Decision-maker search and metered enrichment.
        - name: VINs
          description: VIN lookup and VIN-to-carrier association.
        - name: Signals
          description: Change events, news and market listings.
      externalDocs:
        description: AlphaLoops FMCSA API reference
        url: https://runalphaloops.com/fmcsa-api/docs

  # --- 2. Info-level runtime semantics --------------------------------------------------------
  - target: $.info
    description: >-
      Record the runtime contract the provider documents in prose but does not express in the spec.
    update:
      x-rate-limit:
        tier: Enterprise REST
        per_minute: 60
        per_day: 5000
        headers_on_every_response:
          - X-RateLimit-Limit
          - X-RateLimit-Remaining
          - X-RateLimit-Reset
          - X-DailyLimit-Limit
          - X-DailyLimit-Remaining
          - X-DailyLimit-Reset
        exhausted_status: 429
        retry_after: true
        source: https://runalphaloops.com/fmcsa-api/docs
      x-error-envelope:
        shape: '{"error": "...", "message": "..."}'
        rfc9457: false
        enumerated_error_values: false
      x-undeclared-responses:
        note: >-
          The provider's published error table documents 405, 500 and 502, none of which is
          declared on any operation in this spec. 405's stated rule ("only GET is supported")
          also contradicts the two POST operations the spec defines.
        statuses: [405, 500, 502]
      x-cors:
        preflight: 'OPTIONS -> 204'
        allow_origin: '*'
        caution: >-
          Wildcard origin with a static unscoped bearer key — browser use exposes the credential.
      x-pagination-warning: >-
        Two pagination styles coexist. page/limit is the default; trucks, trailers, inspections,
        authority and timeline use offset/limit instead.
      x-artifacts:
        conventions: conventions/alphaloops-conventions.yml
        errors: errors/alphaloops-problem-types.yml
        rate_limits: rate-limits/alphaloops-rate-limits.yml
        data_model: data-model/alphaloops-data-model.yml
        mcp_crosswalk: mcp/alphaloops-tool-crosswalk.yml

  # --- 3. Carriers -----------------------------------------------------------------------------
  - target: $.paths['/v1/carriers/{dot_number}'].get
    update:
      tags: [Carriers]
      x-field-projection: true
      x-results-key: null
  - target: $.paths['/v1/carriers/mc/{mc_number}'].get
    update:
      tags: [Carriers]
      x-field-projection: true
      x-mc-number-format-note: >-
        Provider examples show both bare ("183261") and prefixed ("MC-728261") forms; no canonical
        form is stated.
  - target: $.paths['/v1/carriers/search'].get
    update:
      tags: [Carriers]
      x-pagination: {style: page-limit, params: [page, limit], default_limit: 10, max_limit: 50}
      x-results-key: results
      x-required-query-param: company_name
      x-confidence-scored: true
  - target: $.paths['/v1/carriers/query'].post
    update:
      tags: [Carriers]
      x-pagination: {style: page-limit, params: [page, limit], default_limit: 25}
      x-results-key: results
      x-field-projection: {style: body-array, param: fields}
      x-capability: >-
        The most capable operation in the API — include/exclude filters, range objects, array
        membership, geo-radius, sorting.
  - target: $.paths['/v1/carriers/{dot_number}/overview'].get
    update:
      tags: [Carriers]
  - target: $.paths['/v1/carriers/{dot_number}/similar'].get
    update:
      tags: [Carriers]
      x-results-key: similar_carriers
      x-powered-by: carrier embedding model

  # --- 4. Authority + insurance ----------------------------------------------------------------
  - target: $.paths['/v1/carriers/{dot_number}/authority'].get
    update:
      tags: [Authority]
      x-pagination: {style: offset-limit, params: [offset, limit], default_limit: 50}
      x-results-key: authority_history
  - target: $.paths['/v1/carriers/{dot_number}/insurance'].get
    update:
      tags: [Authority]
      x-pagination: {style: page-limit, params: [page, limit]}
      x-results-key: insurance
  - target: $.paths['/v1/carriers/mc/{mc_number}/insurance'].get
    update:
      tags: [Authority]
      x-results-key: insurance

  # --- 5. Fleet ---------------------------------------------------------------------------------
  - target: $.paths['/v1/carriers/{dot_number}/trucks'].get
    update:
      tags: [Fleet]
      x-pagination: {style: offset-limit, params: [offset, limit], default_limit: 50}
      x-results-key: trucks
  - target: $.paths['/v1/carriers/{dot_number}/trailers'].get
    update:
      tags: [Fleet]
      x-pagination: {style: offset-limit, params: [offset, limit], default_limit: 50}
      x-results-key: trailers

  # --- 6. Safety ---------------------------------------------------------------------------------
  - target: $.paths['/v1/carriers/{dot_number}/inspections'].get
    update:
      tags: [Safety]
      x-pagination: {style: offset-limit, params: [offset, limit], default_limit: 50}
      x-results-key: inspections
  - target: $.paths['/v1/inspections/{inspection_id}/violations'].get
    update:
      tags: [Safety]
      x-pagination: {style: page-limit, params: [page, limit]}
      x-results-key: violations
  - target: $.paths['/v1/carriers/{dot_number}/crashes'].get
    update:
      tags: [Safety]
      x-pagination: {style: page-limit, params: [page, limit]}
      x-results-key: crashes
      x-enum-severity: [FATAL, INJURY, TOW, PROPERTY_DAMAGE]

  # --- 7. Risk + signals -------------------------------------------------------------------------
  - target: $.paths['/v1/carriers/{dot_number}/risk-signals'].get
    update:
      tags: [Risk]
  - target: $.paths['/v1/carriers/{dot_number}/connections'].get
    update:
      tags: [Risk]
      x-response-shape: graph
      x-results-key: [nodes, edges]
  - target: $.paths['/v1/carriers/{dot_number}/mc-sales'].get
    update:
      tags: [Risk]
      x-results-key: mc_sale
      x-missing-404: >-
        Unlike every other carrier sub-resource, this operation declares no 404 response. A client
        cannot distinguish an unknown DOT number from a carrier with no listing.
  - target: $.paths['/v1/carriers/{dot_number}/equipment-for-sale'].get
    update:
      tags: [Risk]
      x-pagination: {style: page-limit, params: [page, limit]}
      x-results-key: equipment
  - target: $.paths['/v1/carriers/{dot_number}/timeline'].get
    update:
      tags: [Signals]
      x-pagination: {style: offset-limit, params: [offset, limit], default_limit: 50}
      x-results-key: events
      x-change-feed: >-
        Change-data-capture over the carrier record (event_type, field_name, old_value, new_value,
        source). The documented polling substitute for the webhooks AlphaLoops sells but does not
        specify.
  - target: $.paths['/v1/carriers/{dot_number}/news'].get
    update:
      tags: [Signals]
      x-results-key: articles

  # --- 8. Contacts — the metered, async surface --------------------------------------------------
  - target: $.paths['/v1/contacts/search'].get
    update:
      tags: [Contacts]
      x-pagination: {style: page-limit, params: [page, limit]}
      x-results-key: contacts
      x-enum-levels: [c_suite, vp, director, manager]
      x-async: >-
        Can return 202 Accepted — contacts are fetched asynchronously and the client must re-issue
        the request after a delay. No Location header, job id, or recommended poll interval is
        published, so the client must choose its own backoff. This is a SUCCESS path, not an error.
      x-pii: true
  - target: $.paths['/v1/contacts/{contact_id}/enrich'].get
    update:
      tags: [Contacts]
      x-metered:
        unit: enrichment credit
        cost: 1 per new enrichment
        cached_cost: 0
        balance_header: X-Enrichment-Credits-Remaining
        balance_body_field: credits
        exhausted_status: 402
        retryable: false
      x-pii:
        returns: [work_email, personal_emails, phone_numbers, mobile_phone, location_name, experience, education]
        note: >-
          The only operation returning personal data about a named individual. Provider claims
          GDPR/CCPA compliance for the contact dataset; lawful basis for downstream use rests with
          the caller.

  # --- 9. VINs ------------------------------------------------------------------------------------
  - target: $.paths['/v1/vins'].get
    update:
      tags: [VINs]
      x-results-key: results
  - target: $.paths['/v1/vins'].post
    update:
      tags: [VINs]
      x-results-key: results
      x-batch: true
  - target: $.paths['/v1/inspections/vin/{vin}'].get
    update:
      tags: [VINs, Safety]
      x-results-key: [dot_numbers, locations]
      x-reverse-lookup: >-
        Resolves a VIN back to the carriers it has been associated with — the mechanism for
        spotting equipment moving between a revoked carrier and its successor.