Bidder Engagement feed
Per-bidder engagement for a Sourcing Event is available through the Bidder Engagement feed. The feed provides one
record per supplier per event, summarising how actively each bidder has participated: how many bids they have
submitted, how many of the lots they were invited to they have bid on, and when they last acted. See the
OpenAPI specification for full details.
The feed is updated whenever a bidder's engagement changes. Each record carries the full recomputed state for that
bidder, so the latest record for a (sourcing_event, supplier) pair always reflects the current totals.
Events in Draft state do not appear in the feed.
What counts as an action
The action counts (supplier_bid_submission_count, surrogate_bid_submission_count) count bid-submission
actions only: submitting lot bids, bundle bids, or a Dutch auction bid.
Japanese auction bids are not yet counted. A bidder whose only activity is a Japanese auction bid has no record in
this feed, rather than a record showing zeros.
Withdrawals are deliberately excluded from these counts: a withdrawal retracts participation rather than putting
a bid forward, so it does not increase the count. Withdrawals likewise do not advance the last_supplier_action /
last_surrogate_action timestamps.
The two counts distinguish who performed the action:
supplier_bid_submission_count: actions the supplier performed themselves.
surrogate_bid_submission_count: the same actions performed by a purchaser on the supplier's behalf (surrogate bidding).
Coverage
lots_invited and lots_bid are as of the bidder's most recent action. If a buyer changes which lots a bidder can
see, the new figures appear only once that bidder next acts.
Examples
Basic Bidder Engagement feed
This example shows simple use of the feed. It is unfiltered so returns all BidderEngagement records in the order
they have been added or modified, starting from the oldest.
Request
GET /api/feeds/bidder-engagement
Response
{
"data": [
{
"id": "10000000-0000-0000-0000-000000000001",
"sourcing_event": "00000000-1111-0000-0000-000000000000",
"supplier": "00000000-1111-1111-0000-000000000000",
"supplier_bid_submission_count": 8,
"surrogate_bid_submission_count": 0,
"lots_invited": 12,
"lots_bid": 10,
"last_supplier_action": "2026-04-10T09:30:00.000000Z",
"current_round": "00000000-0aaa-0000-0000-000000000001",
"modified": "2026-04-10T09:30:00.000000Z"
},
{
"id": "10000000-0000-0000-0000-000000000002",
"sourcing_event": "00000000-1111-0000-0000-000000000000",
"supplier": "00000000-1111-2222-0000-000000000000",
"supplier_bid_submission_count": 3,
"surrogate_bid_submission_count": 2,
"lots_invited": 12,
"lots_bid": 5,
"last_supplier_action": "2026-04-11T08:00:00.000000Z",
"last_surrogate_action": "2026-04-11T10:15:00.000000Z",
"modified": "2026-04-11T10:15:00.000000Z"
},
{
"id": "10000000-0000-0000-0000-000000000003",
"sourcing_event": "00000000-1111-0000-0000-000000000000",
"supplier": "00000000-1111-3333-0000-000000000000",
"supplier_bid_submission_count": 0,
"surrogate_bid_submission_count": 0,
"lots_invited": 12,
"lots_bid": 0,
"modified": "2026-04-09T12:00:00.000000Z"
}
]
}
Including supplier and sourcing event data
Because every record is keyed by a supplier UUID, the suppliers include is the intended way to resolve those UUIDs to
a supplier name and external ID without a separate call. This example resolves each record's supplier alongside the
sourcing event summary. See Including additional data on the usage page for how
includes work in general.
Request
GET /api/feeds/bidder-engagement?include=sourcing_events&include=suppliers
Response
{
"data": [
{
"id": "10000000-0000-0000-0000-000000000001",
"sourcing_event": "00000000-1111-0000-0000-000000000000",
"supplier": "00000000-1111-1111-0000-000000000000",
"supplier_bid_submission_count": 8,
"surrogate_bid_submission_count": 0,
"lots_invited": 12,
"lots_bid": 10,
"last_supplier_action": "2026-04-10T09:30:00.000000Z",
"current_round": "00000000-0aaa-0000-0000-000000000001",
"modified": "2026-04-10T09:30:00.000000Z"
},
{
"id": "10000000-0000-0000-0000-000000000002",
"sourcing_event": "00000000-1111-0000-0000-000000000000",
"supplier": "00000000-1111-2222-0000-000000000000",
"supplier_bid_submission_count": 3,
"surrogate_bid_submission_count": 2,
"lots_invited": 12,
"lots_bid": 5,
"last_supplier_action": "2026-04-11T08:00:00.000000Z",
"last_surrogate_action": "2026-04-11T10:15:00.000000Z",
"modified": "2026-04-11T10:15:00.000000Z"
},
{
"id": "10000000-0000-0000-0000-000000000003",
"sourcing_event": "00000000-1111-0000-0000-000000000000",
"supplier": "00000000-1111-3333-0000-000000000000",
"supplier_bid_submission_count": 0,
"surrogate_bid_submission_count": 0,
"lots_invited": 12,
"lots_bid": 0,
"modified": "2026-04-09T12:00:00.000000Z"
}
],
"includes": {
"sourcing_events": [
{
"id": "00000000-1111-0000-0000-000000000000",
"name": "Event 1",
"type": "RFQ",
"status": "CLOSED",
"primary_currency": "USD",
"secondary_currencies": [
{ "code": "EUR", "exchange_rate": "1.2" },
{ "code": "GBP", "exchange_rate": "1.4" }
],
"tags": [
{ "name": "Category", "value": "PACKAGING" }
]
}
],
"suppliers": [
{
"id": "00000000-1111-1111-0000-000000000000",
"name": "Supplier 1",
"bidder_contacts": [
{
"name": "Joe Blogs",
"email": "joe.blogs@test.com",
"invitation_state": "UNSENT"
}
],
"external_id": "SUPP_1",
"contacts": [
{
"id": "00000000-1111-1111-0000-000000000001",
"name": "John Doe",
"email": "john.doe@email.com"
}
]
},
{
"id": "00000000-1111-2222-0000-000000000000",
"name": "Supplier 2",
"external_id": "SUPP_2"
},
{
"id": "00000000-1111-3333-0000-000000000000",
"name": "Supplier 3"
}
]
}
}
Filtered example
The below example filters to a single supplier across a specific Sourcing Event. This is the natural query for
"how engaged is this bidder in this event".
Request
GET /api/feeds/bidder-engagement?sourcing_event=00000000-1111-0000-0000-000000000000&supplier=00000000-1111-1111-0000-000000000000
Response
{
"data": [
{
"id": "10000000-0000-0000-0000-000000000001",
"sourcing_event": "00000000-1111-0000-0000-000000000000",
"supplier": "00000000-1111-1111-0000-000000000000",
"supplier_bid_submission_count": 8,
"surrogate_bid_submission_count": 0,
"lots_invited": 12,
"lots_bid": 10,
"last_supplier_action": "2026-04-10T09:30:00.000000Z",
"current_round": "00000000-0aaa-0000-0000-000000000001",
"modified": "2026-04-10T09:30:00.000000Z"
}
]
}
Filters
The following filters are available on the Bidder Engagement feed. These are also detailed on the
OpenAPI specification. Filters are applied additively.
Filter to records associated with a specific Sourcing Event.
GET /api/feeds/bidder-engagement?sourcing_event=00000000-1111-0000-0000-000000000000
Filter to records associated with a specific Sourcing Request.
GET /api/feeds/bidder-engagement?sourcing_request=00000000-1111-0000-0000-111111111111
Filter to a specific bidder within an event. A supplier identifier is specific to a single event, so this
scopes to that event's bidder rather than following a bidder across events.
GET /api/feeds/bidder-engagement?supplier=00000000-1111-1111-0000-000000000000
Filter to records associated with Sourcing Events that have specific tags.
GET /api/feeds/bidder-engagement?filter[sourcing_event.tags.Category]=LOGISTICS
Filter to records modified within a date range. One or both ends may be provided. If a date is supplied
without a time, the time defaults to 00:00 UTC.
GET /api/feeds/bidder-engagement?modified_after=2026-01-01&modified_before=2026-04-01
Data updates
The data returned by the Bidder Engagement feed represents a snapshot of the latest engagement state. Records are
recreated whenever a bidder acts and are appended to the end of the feed (see
Data Updates for details on how updates work). Because a record is recreated on every
bidder action, this feed is one of the more frequently changing feeds for an active event.
Records returned from the feed can be uniquely identified using the id field, which is stable across updates for a
given (sourcing_event, supplier) pair. This ID can be used to track changes as described in the
Data Updates section of the usage document.