Base properties (baseProperties)
The Insights Base Property query (baseProperties) returns U.S. assessor and public-record style property rows from the BaseProperties OData entity. Each row is keyed by CID together with county FIPS and parcel context. The GraphQL schema groups attributes into objects such as location, characteristics, structure, tax, latestTransfer, currentLoans, and estimatedValue, plus optional history expansions: historicalEstimate, taxHistory, salesAndTransferHistory, and mortgageHistory.
Connection result
| Field | Type | Description |
|---|---|---|
totalCount | Int! | Count of records matching the filter (from OData where available). |
nodes | [BaseProperty] | Page of BaseProperty objects for the current limit and offset. |
Endpoint
POST /graphqlRoot query (example)
query BasePropertyQuery(
$filter: BasePropertyFilter!
$limit: Int
$offset: Int
$orderBy: BasePropertySort
) {
baseProperties(filter: $filter, limit: $limit, offset: $offset, orderBy: $orderBy) {
totalCount
nodes {
cid
countyFipsCode
parcelNumber
modificationTimestamp
propertyType
propertySubType
location {
address { unparsedAddress city stateOrProvince postalCode }
census {
administrative {
countyOrParish {
id
name
stateOrProvince
country
type
geom
latitude
longitude
version
}
}
}
gis { latitude longitude }
}
characteristics { lotSizeSquareFeet view poolFeatures }
structure {
bedroomsTotal
bathroomsTotalInteger
livingArea
yearBuilt
}
latestTransfer { salesPrice recordingDate }
estimatedValue { estimate confidenceScore }
historicalEstimate(limit: 4) {
estimateDate
estimate
rangeMin
rangeMax
}
taxHistory {
taxYear
taxAnnualAmount
taxAssessedValue
marketValue
}
salesAndTransferHistory(limit: 5, orderBy: { modificationTimestamp: DESC }) {
transactionId
recordingDate
salesPrice
sellerFullName1
buyerFullName1
titleCompanyName
}
mortgageHistory(limit: 5, orderBy: { modificationTimestamp: DESC }) {
loanId
transactionId
loanAmount
interestRate
loanType
lenderNameBeneficiary
recordingDate
}
resoProperties { listingKey }
}
}
}Variables (example)
{
"filter": {
"countyFipsCode": { "eq": "06037" },
"polygon": {
"wkt": "POLYGON((-118.5 34.0, -118.3 34.0, -118.3 34.2, -118.5 34.2, -118.5 34.0))"
},
"structure": { "bedroomsTotal": { "ge": 3 }, "livingArea": { "ge": 1500 } },
"estimatedValue": { "estimate": { "lt": 1000000 } },
"dates": { "modificationTimeStamp": { "ge": "2026-01-01" } }
},
"limit": 10,
"offset": 0,
"orderBy": {
"latestTransfer": { "recordingDate": "DESC" },
"estimatedValue": { "estimate": "ASC" }
}
}How filtering works
Arguments use the input type BasePropertyFilter. The server forwards filters to Insights as an OData $filter string.
- Flat vs nested: You may pass a single “flat” object of conditions (e.g.
countyFipsCode+structure). The resolver wraps it as{ and: filter }when you do not supply top-levelandoror, so all clauses are combined with AND. - Explicit logic: To use OR or mixed logic, structure variables with top-level
andororkeys whose values are objects of field filters (same pattern as other Insights-backed queries). - Nested sections: Filters mirror the schema: e.g.
location.address.city,structure.livingArea,latestTransfer.salesPrice,estimatedValue.estimate,dates.modificationTimeStamp. - Polygon search: Use top-level
polygonwithwkt(a WKTPOLYGONstring of longitude/latitude pairs). The server maps this to ODatageo.intersects(location, geography'POLYGON((...))'). The ring must be closed (first and last coordinate pair identical). - Operators:
StringFiltersupportseq, contains, startswith;IntFilterandFloatFiltersupporteq, gt, ge, lt, le;DateTimeFiltersupportseq, gt, ge, lt, le(ISO date strings). - Enums:
propertyTypeandpropertySubTypeuse GraphQL enums (e.g.Residential,SingleFamilyResidence) - pass them without wrapping ineqat the filter field. - OData mapping: GraphQL
cidmaps to ODataCID;dates.modificationTimeStampmaps to ODatamodificationTimestamp.
| BasePropertyFilter field | Purpose |
|---|---|
cid, countyFipsCode, parcelNumber | Identify or constrain parcel keys. |
location | BaseLocationFilter -> address (city, postalCode, unparsedAddress, …). |
propertyType, propertySubType | Enumerated property classification. |
characteristics | Lot size and related numeric filters. |
structure | Bed/bath counts, living area, year built, stories. |
latestTransfer | Sale price and contract/sale date filters. |
estimatedValue | AVM estimate thresholds. |
dates | BaseDatesFilter -> modificationTimeStamp for record change time. |
polygon | GeoPolygonFilter -> wkt: properties whose location intersects the polygon (OData geo.intersects). |
How sorting works
Use optional orderBy: BasePropertySort. Only certain leaf fields are mapped to OData $orderby:
| Group | Sortable fields -> OData |
|---|---|
characteristics | lotSizeSquareFeet |
structure | bedroomsTotal, bathroomsTotalInteger, livingArea |
latestTransfer | salesPrice, recordingDate |
estimatedValue | estimate |
Each sort direction is ASC or DESC (SortOrder enum). Multiple groups can appear in one orderBy object; the server builds a comma-separated OData order list.
How expansion works
In GraphQL, “expansion” means requesting nested fields in the query. There are no separate REST-style expand parameters.
- Nested objects: Ask for
location { address census gis },tax { … },occupantOwner { … }, etc. Null objects appear when the source has no data. location.gis.parcel: Resolved via DataLoader / ParcelBoundary API by CID (extra round-trip when selected).- History fields: Request
historicalEstimate,taxHistory,salesAndTransferHistory, ormortgageHistoryunder eachBasePropertynode. Each loads a related Insights history entity by CID (batched). Omit them to avoid the extra work. If Insights denies a history entity (HTTP 403), that field resolves to null and GraphQL may include an entry inerrorswhile the rest ofbasePropertiesstill returns. resoProperties: When listed underBaseProperty, the resolver loads linked MLS/RESO listings for the same CID (batched per request). Omit this field to avoid that work.
Pagination
| Argument | Maps to OData | Description |
|---|---|---|
limit | $top | Maximum rows returned for this call. |
offset | $skip | Rows to skip from the start of the filtered set. |
Operators (filter leaf inputs)
| Operator | Typical input types | Meaning |
|---|---|---|
eq | String, Int, date string | Equal. |
contains, startswith | String | Substring / prefix (string filters). |
gt, ge, lt, le | Numeric / date | Range comparisons. |
wkt | GeoPolygonFilter | WKT POLYGON string (closed ring of longitude/latitude pairs). |
BaseProperty - root fields (schema)
| Field | Description |
|---|---|
cid | Constellation property identifier (U.S.). |
countyFipsCode | 5-digit state + county FIPS. |
parcelNumber | County assessor parcel id. |
modificationTimestamp | Last modification time for the base record. |
propertyType, propertySubType | General and detailed property classification strings. |
location | BaseLocation: address, census geographies, GIS + optional parcel boundary. |
characteristics | BaseCharacteristics: lot, topography, views, pool, waterfront, community features, etc. |
structure | BaseStructure: rooms, area, year built, construction, garage, heating/cooling, etc. |
tax | BaseTax: assessed values, tax amounts, legal description, zoning, PLSS, subdivision. |
occupantOwner | BaseOccupantOwner: owner names, mailing address, occupant type. |
latestTransfer | BaseLatestTransfer: deed/sale parties, price, dates, REO flags. |
currentLoans | BaseCurrentLoans: summary plus up to five lien slots. |
estimatedValue | BaseEstimatedValue: current AVM snapshot (estimate, range, confidence). |
historicalEstimate | [BaseHistoricalEstimate!]: monthly AVM history from AvmHistoryAggregate. Args: filter, limit (default 1, max 120), orderBy. |
taxHistory | [BaseTaxHistory!]: annual tax/assessment history from AssessorHistoryAggregate. Args: filter (taxYear), orderBy. |
salesAndTransferHistory | [BaseSalesAndTransferHistory!]: deed/sale history from SalesAndTransferHistory. Args: limit (default 1, max 100), orderBy (modificationTimestamp). |
mortgageHistory | [BaseMortgageHistory!]: mortgage/lien history from MortgageHistoryAggregate. Args: limit (default 1, max 100), orderBy (modificationTimestamp). |
resoProperties | List of RESOProperty for this CID (requires resolver expansion). |
Nested highlights: location.address (full addressing components); location.census (administrative, legislative, statistical GeoIDs and boundary details); location.gis (lat/long, precision, parcel boundary); latestTransfer.buyers/sellers arrays; currentLoans.loans array of BaseLoan.
Historical fields (schema detail)
History fields are requested on each BaseProperty node. They are not part of the root BasePropertyFilter; filtering and sorting for history apply only to that field’s arguments. If the caller’s Insights credentials lack access to a history entity, that field returns null (with a GraphQL error) and the rest of the base property payload is unchanged.
historicalEstimate → [BaseHistoricalEstimate!]
Backed by OData AvmHistoryAggregate. Returns monthly AVM point estimates for the property.
| Argument | Type | Description |
|---|---|---|
filter | BaseHistoricalEstimateFilter | Optional. estimateDate (DateTimeFilter) constrains months (use first-of-month values such as 2026-06-01). |
limit | Int | How many monthly rows to return (default 1, max 120). |
orderBy | BaseHistoricalEstimateSort | Sort by estimateDate (ASC / DESC). |
| Field | Description |
|---|---|
estimateDate | First day of the estimate month (e.g. 2026-06-01). |
estimate | AVM point estimate for that month. |
rangeMin, rangeMax | Low / high end of the estimated value range for that month. |
taxHistory → [BaseTaxHistory!]
Backed by OData AssessorHistoryAggregate. Returns annual tax and assessment history.
| Argument | Type | Description |
|---|---|---|
filter | BaseTaxHistoryFilter | Optional. taxYear (IntFilter) to constrain years. |
orderBy | BaseTaxHistorySort | Sort by taxYear (ASC / DESC). |
| Field | Description |
|---|---|
taxYear | Tax year for taxAnnualAmount. |
taxAnnualAmount | Annual taxes due for that year. |
taxAssessedValue, taxAssessedValueLand, taxAssessedValueImprovements | Assessed values for the year. |
marketValue, marketValueLand, marketValueImprovements | Market values for the year. |
taxAnnualAmountYOYC, taxAssessedValueYOYC, marketValueYOYC (+ percent variants) | Year-over-year change metrics. |
avmAnnualMedian, avmAnnualAverage, avmAnnualLow, avmAnnualHigh, avmAnnualCount | Annual AVM aggregates for the tax year. |
saleYN, salePrice, saleRecordingDate | Sale indicators tied to the tax year, when present. |
modificationTimestamp | When the tax history record was last modified. |
See GraphQL introspection for the full BaseTaxHistory leaf list (exemptions, certification date, value-per-sqft fields, and related flags).
salesAndTransferHistory → [BaseSalesAndTransferHistory!]
Backed by OData SalesAndTransferHistory. Returns recorded sales and ownership transfers for the property.
| Argument | Type | Description |
|---|---|---|
limit | Int | How many transfer rows to return (default 1, max 100). |
orderBy | BaseSalesAndTransferHistorySort | Sort by modificationTimestamp (ASC / DESC). |
| Field | Description |
|---|---|
transactionId | CDL transaction identifier. |
documentType, recordingDate, originalDateOfContract | Recording / contract metadata. |
salesPrice, pricePerSquareFoot | Transfer price metrics. |
sellerFullName1, buyerFullName1 (+ secondary party fields) | Seller and buyer parties. |
titleCompanyName, totalTransferTax, reoStatus, distressedSaleYN | Title, tax, and distress indicators. |
modificationTimestamp | When the history record was last modified. |
mortgageHistory → [BaseMortgageHistory!]
Backed by OData MortgageHistoryAggregate. Returns historical mortgage and lien records for the property.
| Argument | Type | Description |
|---|---|---|
limit | Int | How many mortgage rows to return (default 1, max 100). |
orderBy | BaseMortgageHistorySort | Sort by modificationTimestamp (ASC / DESC). |
| Field | Description |
|---|---|
loanId, transactionId, recordId | Loan and transaction identifiers. |
loanAmount, interestRate, loanType, termMonths | Core loan terms (see schema for the full term set). |
lenderNameBeneficiary, borrowerName1 | Lender and borrower parties. |
recordingDate, modificationTimestamp | Recording and last-modified timestamps. |
See GraphQL introspection for the complete BaseMortgageHistory and BaseSalesAndTransferHistory field lists.
Example history selection
nodes {
cid
estimatedValue { estimate confidenceScore }
historicalEstimate(limit: 12, orderBy: { estimateDate: DESC }) {
estimateDate
estimate
rangeMin
rangeMax
}
taxHistory(filter: { taxYear: { ge: 2018 } }, orderBy: { taxYear: DESC }) {
taxYear
taxAnnualAmount
taxAssessedValue
marketValue
}
salesAndTransferHistory(limit: 10, orderBy: { modificationTimestamp: DESC }) {
transactionId
recordingDate
salesPrice
buyerFullName1
sellerFullName1
}
mortgageHistory(limit: 10, orderBy: { modificationTimestamp: DESC }) {
loanId
loanAmount
interestRate
lenderNameBeneficiary
recordingDate
}
}CensusGeo fields (used under location.census.*)
| Field | Description |
|---|---|
id | Census boundary identifier stored on the base property record. |
name | Boundary display name from CensusBoundary (for example county/parish name). |
stateOrProvince | State or province code associated with the boundary. |
country | Country code for the boundary (typically US). |
type | Census boundary classification (for example Census County or Parish, Census Designated Place). |
geom | Boundary geometry payload (GeoJSON-like structure). |
latitude, longitude | Representative coordinates for the boundary. |
version | Boundary data version year. |
Example response (abbreviated)
{
"data": {
"baseProperties": {
"totalCount": 1,
"nodes": [{
"cid": "06037123456",
"countyFipsCode": "06037",
"parcelNumber": "1234-567-890",
"modificationTimestamp": "2026-01-10",
"propertyType": "Residential",
"structure": { "bedroomsTotal": 4, "livingArea": 2500 },
"estimatedValue": { "estimate": 1012000, "confidenceScore": 95 }
}]
}
}
}