get_rfp_performance is the Seller Account’s aggregate RFP reporting query.
Use get({ "kind": "rfp", "id": "..." }) for an individual RFP’s response,
evaluation, feedback, outcome, and receipt. This query returns grouped metrics,
not per-RFP records.
The default population is live production RFPs. Draft and evaluation RFPs
enter a report only when you explicitly include their
purpose. Commercial
metrics always use live, released RFPs.Run a query
Choose 1–6 metrics, up to three group-by dimensions, an inclusive UTC range, and optional exact-match filters and ordering. This example is also the checked-in MCP documentation fixture:available or unavailable status, its own
population, freshness.dataThrough, and finality. Unavailable data includes
a reason; missing observations are never invented as zero.
Metrics
All metrics use terminal lifecycle turns created within the requested range. Quality and efficiency follow the purposes you selected. Commercial metrics exclude drafts, evaluations, and unreleased turns regardless of that selection.Quality
Efficiency
Commercial
Commercial rates and money require at least three observations. A money datum
is unavailable with
missing_currency if any included booked value lacks an
outcome-level denomination; request or response currency is never substituted.
Multiple denominations make it unavailable with mixed_currency.
Each booked amount must also be finite, nonnegative, and no greater than
JavaScript’s safe numeric maximum, with no more precision than its currency’s
minor units. Invalid or unrepresentable values make the datum unavailable with
invalid_booked_budget or unrepresentable_booked_budget. Reporting converts
valid values to integer minor units, sums them exactly, and publishes only a
numeric total that round-trips to that same integer. Precision-losing or
over-bound totals fail with unrepresentable_booked_budget_total instead of
appearing available with a wrong or null value.
record_outcome accepts any nonempty result. Aggregate reporting applies one
closed normalization taxonomy: accepted; booked, delivered, won, or
closed_won → won; lost, closed_lost, rejected, declined,
declined_fit, or declined_policy → lost; and pending. Matching ignores
case and treats spaces or hyphens like underscores. An unknown value makes
acceptance, win, and money metrics unavailable with unknown_outcome instead
of silently counting it as false. responded and not_live are brief
dispositions, not commercial synonyms.
For each metric, population.eligible is the selected turn or RFP population
before that metric’s exclusions, observed is the denominator or aggregate
input, excluded is their difference, and exclusionReasons partitions the
missing grade, feedback, receipt, cache, outcome, release, purpose, budget, or
currency evidence. Row-level provenance remains the shared lifecycle authority
and explicit turn attribution.
Dimensions and filters
You can group bydate, week, selected_posture, playbook_version,
material, quick_preset, category, location, market, channel,
origin, purpose, buyer, advertiser, product,
response_recipe_version, model_version, judge_version, cache_mode, or
currency. These values come from the selected turn’s immutable request,
origin, response, evaluation, and composition receipt.
Exact-match filters are purpose, origin, selectedPosture,
playbookVersion, material, quickPreset, category, location, market,
channel, buyer, advertiser, product, responseRecipeVersion,
modelVersion, judgeVersion, cacheMode, currency, responseState,
evaluationState, and outcome. The camel-case filter names map to the
corresponding snake-case dimensions, such as selectedPosture to
selected_posture and quickPreset to quick_preset. Values within one
filter are OR-matched; different filters combine with AND. Each filter accepts
at most 10 unique values, with at most 20 values across all filters. Input and
returned labels are capped at 128 characters; stored labels above the cap use a
deterministic hash suffix.
Select at most one multivalue dimension from material, channel, and
product so one turn cannot create an unbounded cross-product. A turn appears
in every matching group for that selected dimension, so those grouped rows are
not additive. Run the query again without that dimension for an overall total.
quick_preset is the saved Quick origin preset identity, while cache_mode
states whether the response was composed from scratch, reused and hydrated, or
reused with customization.
Privacy and pagination
Buyer or advertiser grouping and filtering suppresses groups backed by fewer than three distinct RFPs. The response reports whether counterparty rows were suppressed. Empty and below-threshold counterparty queries share the same suppression signal, and the operation never exposes the underlying RFP IDs. Ranges are limited to 366 inclusive days. The service first scans terminal turns for the Seller Account, date range, and snapshot, then applies optional filters; if that initial population exceeds 50,000, shorten the date range. Pages contain at most five rows. The first page fixessnapshotAt; pass its
opaque nextCursor back with the exact same query. The cursor is bound to the
query, snapshot, and last grouped row. Later lifecycle changes do not leak into
a continuation, and changed or stale cursors are rejected rather than silently
restarting.
The structured response is guarded at 40,000 UTF-8 bytes and 10,000 estimated
tokens. A checked maximum-schema fixture (six metrics, three dimensions, 20
maximum-length filter labels, maximum returned labels, all exclusion fields,
five rows, and a maximum cursor) measures 37,282 bytes and 7,136 estimated
tokens.