Skip to content

Auction Bid Terminal Responses

auction.bid.place is synchronous and transactionally serialized. Every request ends with exactly one correlated ack or error; there is no intermediate bid acceptance acknowledgement and no rejection realtime event.

Request

{
  "id": "bid-request-001",
  "type": "auction.bid.place",
  "data": {
    "auctionId": "auction-1",
    "amountMinor": "150000"
  }
}

The id is required. Reuse it only when retrying the identical bid after an uncertain transport or database response.

Accepted or replayed

{
  "id": "bid-request-001",
  "type": "ack",
  "data": {
    "eventType": "auction.bid.place",
    "status": "accepted",
    "commandId": "bid-request-001",
    "auctionId": "auction-1",
    "cycleId": "cycle-1",
    "bidId": "bid-1",
    "amountMinor": "150000",
    "stateVersion": 42
  }
}

status is accepted for a new commit and replayed when the same scoped id and payload already committed. Both are successful terminal outcomes. Reusing the id with changed bid details returns an error.

Rejected

Business, validation, authorization, and infrastructure failures use the existing correlated WebSocket error envelope. Use its safe public code and message; never infer acceptance from a timeout or closed connection.

After an uncertain response, preserve the pending UI state and retry the same payload with the same id. If the original transaction committed, the retry returns replayed; otherwise it is evaluated against the latest committed auction state. A stored bid can still be replayed after the live window or room join window closes; mutable eligibility checks apply only to a new bid.

Realtime feed

Successful commits continue to publish auction.bid.created and, when the previous leader is outbid, auction.bid.updated. These events synchronize the room and are ordered by serverSequence. A post-commit publication failure does not invalidate the terminal bid acknowledgement; recover with snapshot/replay.

Client state

SUBMITTED ── ack:accepted ──> ACCEPTED
SUBMITTED ── ack:replayed ──> ACCEPTED
SUBMITTED ── error ─────────> REJECTED
SUBMITTED ── disconnect ────> UNCERTAIN ── retry same id ──> terminal response

Checklist:

  • Generate one stable id per bid intent.
  • Send integer-string amountMinor; do not send client timing or ordering data.
  • Clear pending state only on a terminal response.
  • Treat accepted and replayed as committed.
  • Update the shared feed from created/updated events and snapshot replay.