Agents
Configurable chart (measure × slice) over the agent's sales
Authorization
Body application/json
idstringidsstring[]measureenumdefault: "units"Which metric each bar reports, AND what the bars are ranked by — the list is ordered by the measure you ask for, descending. Defaults to units, so an unqualified "top originators" means the busiest; pass volume for the biggest by dollars, or an average to rank by that average. Two things to know about the averages specifically. Buckets built from fewer than 5 documents are dropped from an average chart entirely, because a mean says nothing about how many transactions produced it and a single-transaction bucket would otherwise outrank real ones; no floor is applied to units or volume, where a lone large transaction is a legitimate top bar. And ranking a bucket list by a sub-aggregated average is approximate in the search engine — each shard contributes its own local top-N before they are merged — so treat the ordering of an average chart as indicative near the boundary rather than exact. Every bucket publishes its own count, so the sample size behind a value is never implicit.
volumeunitsavgSalePriceperiodenumPre-aggregated period block. Rolling windows (last30Days, last60Days, last90Days, previousMonth, currentMonth) are NOT accepted here and return 400; they are supported on the loans, sales and market endpoints (list, count, breakdowns, analytics summary / time-series / chart) (see DatedPeriod).
2017201820192020202120222023202420252026last3Monthslast6Monthslast12Monthslast14Monthslast16Monthslast18Monthslast24MonthsyearToDateallTimesliceenumrequiredcitycountystatezipResponses
200objectChart dataShow attributesHide attributes
completenessobjectData-completeness watermark for this response. Present only when it could be measured; absence means it was not measured, NOT that the data is complete.
Show child attributesHide child attributes
throughdaterequiredThe last calendar date (YYYY-MM-DD) this query's matching records actually reach. Records arrive after the events they describe, so a period ending today is normally backed by data ending days or weeks earlier, and any bucket extending past this date is built from a partial period. Measured from THIS query's own matched set, not a global figure: the delay varies by geography and moves over time, so two requests with different filters can legitimately report different dates.
dataobject[]requiredShow child attributesHide child attributes
countnumberrequiredHow many documents this bucket was built from — the denominator behind value, published whatever the measure. It is the sample size of an average, the transaction count behind a volume sum, and (for measure: "units") value itself. Present on every bucket. Distinct from excluded, which reports how many of these documents a guarded measure's sentinel filter then dropped: a bucket can look well-populated here and still average over far fewer.
excludednumberHow many of this bucket's documents the measure's sentinel guard excluded — documents that carry the field but whose value is an out-of-range fill. Additive and optional: absent when the measure is unguarded (a document count, or a field with no fill values). Present per BUCKET because exclusion is not uniform — one period or slice can be almost entirely fill values while its neighbors are clean, and a single response-level total would hide exactly that.
idstringMachine value behind label when the bucket key is not itself the label. lender: label is the dictionary display name and id the normalized lender key — pass id, not label, back as a lender filter value. conforming: label is conforming / nonConforming and id the raw true / false flag. titleCompany (time-series segment): label is the most-used spelling and id the normalized name every spelling was merged under — match segments across buckets on id. Absent on slices whose label is already the machine value.
labelstringrequiredsegmentsobject[]Present only when the request named a segment: this bucket broken down by that second dimension, ranked by the same measure and capped at 25 per bucket (the rest is counted in segmentsOmittedCount). Documents with no value for the segment are not grouped and appear nowhere here, so segment counts sum to at most the bucket's count.
Show child attributesHide child attributes
countnumberrequiredDocuments in this segment of the parent bucket — the denominator behind value, whatever the measure.
idstringMachine value behind label when the bucket key is not itself the label. lender: label is the dictionary display name and id the normalized lender key — pass id, not label, back as a lender filter value. conforming: label is conforming / nonConforming and id the raw true / false flag. titleCompany (time-series segment): label is the most-used spelling and id the normalized name every spelling was merged under — match segments across buckets on id. Absent on slices whose label is already the machine value.
labelstringrequiredvaluenumberrequiredThe requested measure over the documents in BOTH this segment and its parent bucket.
segmentsOmittedCountnumberPresent only with segments: documents in this bucket whose segment value fell past the 25-per-bucket cap. A document COUNT, never a dollar figure. 0 means segments is the complete breakdown of every document that carries a segment value.
unattributedenumPresent and true on at most one bucket, which is NOT a real category: it collects the documents this breakdown could not attribute to any value of the slice, and its label ("(unknown)") is prose, not an identifier. Filter on THIS field, never on the label — a consumer plotting a map or joining the label to a real code must drop this row. It is always the LAST element of data, appended after ranking rather than placed by value, so it is the one bucket that does not obey the ordering measure describes. It exists so the bars account for the same population the summary reports: a document whose slice field holds no indexed term is absent from a terms breakdown entirely rather than forming a small bucket, so without it a chart silently omits part of its own corpus. That reconciliation is exact for units; on an average it is not, because buckets under the five-document floor are dropped and a slice with more than 200 distinct values still truncates — neither loss is collected in this row (the truncated tail is reported response-wide as omittedCount; the floor is reported nowhere). Absent when there is nothing unattributed, never false and never a zero-valued row.
truevaluenumberrequiredmeasurestringrequirednextCursorstringPaged party slices only (a chart request that passed size or after with slice originator / broker / loanCompany). Opaque cursor for the next page of the ranking — send it back as after with the same body. Absent on the last page.
omittedCountnumberHow many documents fell outside the bars — the size of the dropped tail, not its value. A chart groups by a capped number of distinct values, so a slice with more of them than the cap returns its largest groups and drops the rest; zip, city, lender and originator are the ones that reach it. It is the documents in the groups past the size cap, and only those: documents excluded from the slice by its empty-value filter, or carrying no value for it at all, are never grouped and are not counted here either. Where the response carries an unattributed row that row collects them; elsewhere a small residual against /analytics/summary can remain on city, lender, originator and similar, so bars plus this count reconcile with the summary's population exactly only on a slice with no such documents. 0 means the bars ARE the complete set, and the field is absent only where the grouping cannot truncate at all — so 0 and missing are different claims. Unlike a breakdown there is no next page to fetch: narrow the filters or pick a coarser slice. It is a DOCUMENT count and never a dollar or an average — the aggregation reports how many rows it left out, not what they were worth, so a truncated volume chart cannot be completed from this figure. One exception it does not cover: the average measures drop buckets thinner than a minimum sample size, and those are not counted here — compare against the summary when a mean matters.
segmentstring | nullrequiredThe second dimension echoed from the request, or null for a one-dimensional chart (then no bucket carries segments).
slicestringrequiredtotalintegerPaged party slices only. Distinct bucket keys (e.g. originators) in the filtered population — what a consumer paginates against. A cardinality ESTIMATE (see totalApproximate): near-exact below 40,000, approximate above. On an average measure it can exceed the ranked buckets, which drop keys under the 5-document floor. Use nextCursor, not total, to decide whether another page exists.
totalApproximatebooleanPresent (always true) alongside total: the total is a cardinality estimate, not an exact count.
400objectValidation error401objectUnauthorized403objectForbidden (authenticated, but missing required context — e.g. no active organization)404objectNot found413objectResponse payload too large — detail endpoint capped to fit Lambda response limits503objectSearch timed out or the cluster is overloaded — retry after `Retry-After` seconds.