FRAYT · AsyncAPI Specification

Frayt Match Webhooks

Version

View Spec View on GitHub CompanyLast Mile DeliveryLogisticsCouriersOn-Demand DeliveryShippingFreightSupply ChainTransportationThird Party LogisticsDelivery TrackingWebhookAsyncAPIEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-16'
method: derived
source: openapi/_original/frayt-api-openapi-original.json (OpenAPI callbacks) + https://api.frayt.com/docs/api/v2.2
spec_type: null
note: >-
  FRAYT publishes NO AsyncAPI document — probed /asyncapi.yaml, /asyncapi.json and
  the docs host, all 404. It DOES ship a real, machine-readable webhook contract, and
  in an unusually good place: the webhook is declared as an OpenAPI 3.0 `callbacks`
  object on three operations, with the payload bound by $ref to the same
  MatchResponse schema the GET returns. That means a webhook subscriber can generate
  its receiver directly from the published spec — a stronger position than most
  providers who describe webhooks only in prose. This artifact is the derived
  catalog of that surface; it is not an AsyncAPI document and is not presented as one.
surface:
  transport: http
  direction: provider-to-subscriber
  delivery: POST to a single fixed subscriber URL
  subscription_model: provider-configured
  subscription_note: >-
    There is NO self-service webhook subscription API. The destination is stored on
    the FRAYT side as `match.shipper.location.company.webhook_url` and is configured
    by the FRAYT team — the docs say "To receive webhook updates from FRAYT, contact
    the FRAYT team for setup and configuration at dev@frayt.com". One URL per
    company location, optional custom headers on the payload.
  payload_schema: MatchResponse
  payload_note: >-
    The webhook body is byte-for-byte the same envelope as GET /api/v2.2/matches/{id}
    — `{"response": {...Match...}}` — so one parser serves both surfaces.
  expected_response: 'HTTP 200 from the subscriber acknowledges the callback'
  retries: undocumented
  signing: undocumented
  note_security: >-
    FRAYT documents no HMAC signature, no shared secret and no replay protection on
    webhook delivery; the only stated authentication affordance is optional custom
    headers included in the payload configuration. Subscribers should treat the
    payload as unauthenticated and re-read the Match via GET before acting on it.
events:
- name: match_update
  declared_on:
  - openapi/frayt-matches-openapi.yml#FraytElixirWeb.API.V2x2.MatchController.create
  - openapi/frayt-matches-openapi.yml#FraytElixirWeb.API.V2x2.MatchController.update
  - openapi/frayt-matches-openapi.yml#FraytElixirWeb.API.V2x2.MatchController.delete
  summary: Send back Match transitions
  description: >-
    Fires every time the Match state transitions, a child stop state transitions, or
    the driver's location is updated while en route. Only sent when webhooks are
    configured for the company.
  payload: MatchResponse
  triggers:
  - match state transition
  - match stop state transition
  - driver location update while en route
match_states:
  field: response.state
  transition_record: response.state_transition (from, to, notes, match_id, stop_id, updated_at)
  happy_path: [pending, inactive, scheduled, assigning_driver, offered, accepted, en_route_to_pickup,
    arrived_at_pickup, picked_up, completed, charged]
  enum: [accepted, admin_canceled, arrived_at_pickup, arrived_at_return, assigning_driver,
    canceled, charged, completed, driver_canceled, en_route_to_pickup, en_route_to_return,
    inactive, offer_not_accepted, offered, pending, picked_up, scheduled, unable_to_pickup]
  terminal: [charged, admin_canceled, canceled, unable_to_pickup]
  note: >-
    `driver_canceled` is NOT terminal — the driver removed themselves and FRAYT
    re-offers the Match to the marketplace. Subscribers that treat it as a failure
    will cancel deliveries that were about to succeed.
stop_states:
  field: response.stops[].state
  happy_path: [pending, en_route, arrived, signed, delivered]
  enum: [arrived, delivered, en_route, pending, re_routed, returned, signed, undeliverable, unserved]
probes:
- {url: 'https://api.frayt.com/asyncapi.yaml', status: 404}
- {url: 'https://api.frayt.com/asyncapi.json', status: 404}
- {url: 'https://www.frayt.com/asyncapi.yaml', status: 404}

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/frayt-match-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.