---
title: "Poll a submission's market events (quotes, declines, progress)"
method: GET
path: "/broker/submissions/{submission_id}/events"
tags: ["Submissions"]
---

# Poll a submission's market events (quotes, declines, progress)

`GET /broker/submissions/{submission_id}/events`

## Request

- Base URL: `https://api.hedgespecialty.com/api/v1`
- URL: `https://api.hedgespecialty.com/api/v1/broker/submissions/{submission_id}/events`
- Auth: OAuth 2
  - Authorization code: `https://api.hedgespecialty.com/api/v1/oauth/authorize`
  - Client credentials
  - Token URL: `https://api.hedgespecialty.com/api/v1/oauth/token`

The change feed for one submission; poll it to surface outcomes
that arrive hours after submit on email/portal markets (a carrier
quoting back, declining, or a market being engaged) without diffing
the detail view. Events are ordered oldest-first with a stable
cursor.

**The end-of-stream signal is the cursor, never page length.** A
non-null `next_cursor` means more events may exist: store it and
poll again with `since=next_cursor` until you receive a null. A
page may hold fewer than `limit` events; or none at all; with a
non-null cursor (internal audit rows are scanned but never
returned, and a bounded per-request scan can stop early); never
treat a short page as the tail. `next_cursor` is null only when
the request proved your position is the tail of the
currently-visible stream; resume later polls from your last
non-null cursor. Event ids are stable, so re-reading an older
cursor is always safe (dedupe by `id`).

`type` is a closed set:

- `market_attached`; a market was engaged (sent to underwriter).
- `quote_received`; a quote was received and relayed to you (the
  quote itself is on the submission detail / proposal).
- `status_changed`; other movement, e.g. quote in progress or a
  market re-engaged.
- `declined`, `withdrawn`, `blocked`; terminal outcomes for a
  market; `detail` carries the recorded rationale when there is one.
- `bound`; coverage placed with that market.

Each event: `{id, type, occurred_at, market: {name, lines,
lane_id, category}, status, status_label, detail?}`. `category`
is the market's Hedge category (instant_quote, binding,
specialty) and `lane_id` matches `rail.lanes[].submission_market_id`. `status`/`status_label` use the
same vocabulary as the submission detail's `markets` roll-up.
Events reflect what is currently visible to your brokerage; the
same rules as the detail view (markets Hedge has actually engaged;
quotes only once relayed).

Because visibility is evaluated at read time while the cursor is a
position over the underlying log, a market that becomes visible
later (e.g. its quote gets relayed after your cursor passed its
early rows) can enter your stream mid-history; a `quote_received`
without a preceding `market_attached`. Treat each event as
self-contained rather than assuming lifecycle completeness, and
read `GET /broker/submissions/{submission_id}` for authoritative
current state. Re-reading from an older (or empty) cursor replays
the full currently-visible history when you need to backfill.

## Path parameters

- `submission_id` string, uuid, required

## Query parameters

- `since` string
- `limit` integer

## Response `200`

One page of events plus the follow-up cursor

- object
  - `events` object[]
    - `id` string, uuid
    - `type` 'market_attached' | 'quote_received' | 'status_changed' | 'declined' | 'withdrawn' | 'blocked' | 'bound'
    - `occurred_at` string, date-time
    - `market` object
      - `name` string
      - `lines` string[]
      - `lane_id` string, uuid, nullable: The market lane (same id as rail.lanes[].submission_market_id).
      - `category` 'instant_quote' | 'binding' | 'specialty': The Hedge category of a market program, derived from how Hedge submits to it. `instant_quote` ("Hedge Instant Quote"): carrier API, Hedge fills gaps with favorable assumptions and quotes in minutes; every assumption is listed for the retail agent to confirm before bind. `binding` ("Hedge Binding"): carrier portal, Hedge quotes on your behalf. `specialty` ("Hedge Specialty"): email to an underwriter; completed ACORDs, program supplements and loss runs are needed and a human reads them, so Hedge does not assume.
    - `status` string
    - `status_label` string
    - `detail` string, nullable
  - `next_cursor` string, nullable

## Other responses

- `404`: Not found (or not your brokerage's)
- `422`: Invalid since cursor

## Changes

- **2026-09-20** `7928528d98b2`: 2 info
  - added the optional property `events/items/market/category` to the response with the `200` status
  - added the optional property `events/items/market/lane_id` to the response with the `200` status

[Operation history](https://skmtc.dev/hedgespecialty/apis/hedge-submission-api/changes/broker/submissions/:submission_id/events/get.md)

---

[API](https://skmtc.dev/hedgespecialty/apis/hedge-submission-api.md) - [All operations](https://skmtc.dev/hedgespecialty/apis/hedge-submission-api/llms.txt) - [OpenAPI document](https://skmtc.dev/hedgespecialty/apis/hedge-submission-api/revisions/beefa9cdc11c?raw)
