Skip to content

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.