---
title: "Three-property buyer evidence comparison"
method: POST
path: "/api/locus-three-property-buyer-comparison"
tags: ["data", "search", "real-estate", "property", "property-research", "due-diligence", "public-records", "x402", "buyer", "three-address-comparison", "property-records", "sale-listings", "market-context", "agent-next-calls", "rentcast", "category:economics"]
---

# Three-property buyer evidence comparison

`POST /api/locus-three-property-buyer-comparison`

## Request

- Base URL: `https://api.locus.report`
- URL: `https://api.locus.report/api/locus-three-property-buyer-comparison`
- Auth: API key in header `PAYMENT-SIGNATURE`

Exactly three US addresses compared using non-PII RentCast records, bounded Locus checks, deterministic differences, work items, and validated nextCalls. For buyer agents; no winner, value, or recommendation. Unpaid POST checks provider readiness but reserves nothing. Private, no-store. npx @velinussage/locus-agent-skill add.

## Request body

- object
  - `addresses` string[], required: Exactly three known US street addresses. Locus preserves input order and never selects a winner.

## Response `200`

Successful paid artifact, or a free pre-charge diagnostic when the request is outside current coverage.

- union
  - object
    - `kind` 'buyer_property_comparison', required
    - `generatedAt` string, required
    - `subjects` object[], required
      - `subject` object, required
        - `propertyId` string, required
        - `inputAddress` string, required
        - `matchedAddress` string
        - `parcelId` string
        - `jurisdiction` object, required
          - `state` string
          - `county` string
          - `city` string
          - `zip` string
        - `point` object, required
          - `latitude` number, required
          - `longitude` number, required
        - `pointPrecision` 'parcel' | 'rooftop' | 'street_number', required
        - `sourceNamespace` string, required
        - `matchingEvidence` string[], required
        - `observedAt` string, required
      - `property` object, required
        - `status` 'answered' | 'not_found' | 'identity_mismatch' | 'source_unavailable', required
        - `property` object
          - `providerRecordId` string
          - `formattedAddress` string
          - `propertyType` string
          - `bedrooms` number
          - `bathrooms` number
          - `squareFootage` number
          - `lotSizeSqft` number
          - `yearBuilt` number
          - `zoning` string
          - `assessorId` string
          - `ownerOccupiedIndicator` boolean
          - `lastSaleDate` string
          - `lastSalePriceUsd` number
          - `features` object
            - `floorCount` number
            - `roomCount` number
            - `unitCount` number
            - `architectureType` string
            - `exteriorType` string
            - `foundationType` string
            - `garage` boolean
            - `garageSpaces` number
            - `garageType` string
            - `fireplace` boolean
            - `fireplaceType` string
            - `pool` boolean
            - `poolType` string
            - `heating` boolean
            - `heatingType` string
            - `cooling` boolean
            - `coolingType` string
            - `roofType` string
            - `viewType` string
        - `taxHistory` object[], required
          - `year` integer, required
          - `assessedValueUsd` number
          - `annualTaxUsd` number
        - `taxChange` object
          - `fromYear` integer, required
          - `toYear` integer, required
          - `assessedValueChangeUsd` number
          - `assessedValueChangePct` number
          - `annualTaxChangeUsd` number
        - `source` object, required
          - `sourceName` 'RentCast via Locus x402', required
          - `sourceUrl` string, uri, required
          - `fetchedAt` string, required
          - `requestId` string, uuid
          - `requestStatusUrl` string
          - `usePolicy` object, required
            - `paidResponse` 'allowed' | 'allowed_with_attribution' | 'not_verified', required
            - `cache` 'allowed' | 'ephemeral_only' | 'no_store', required
            - `attributionRequired` boolean, required
            - `attributionText` string
            - `downstreamRedistribution` 'allowed' | 'restricted' | 'not_verified', required
            - `publicPinning` 'allowed' | 'prohibited' | 'not_verified', required
            - `policyUrl` string, uri, required
            - `verifiedAt` string, required
        - `caveats` string[], required
      - `saleListings` object, required
        - `status` 'answered' | 'not_found' | 'identity_mismatch' | 'source_unavailable', required
        - `listings` object[], required
          - `providerRecordId` string
          - `formattedAddress` string
          - `status` 'active' | 'inactive' | 'unknown'
          - `priceUsd` number
          - `listedDate` string
          - `lastSeenDate` string
          - `daysOnMarket` number
          - `propertyType` string
          - `bedrooms` number
          - `bathrooms` number
          - `squareFootage` number
        - `source` object, required
          - `sourceName` 'RentCast via Locus x402', required
          - `sourceUrl` string, uri, required
          - `fetchedAt` string, required
          - `requestId` string, uuid
          - `requestStatusUrl` string
          - `usePolicy` object, required
            - `paidResponse` 'allowed' | 'allowed_with_attribution' | 'not_verified', required
            - `cache` 'allowed' | 'ephemeral_only' | 'no_store', required
            - `attributionRequired` boolean, required
            - `attributionText` string
            - `downstreamRedistribution` 'allowed' | 'restricted' | 'not_verified', required
            - `publicPinning` 'allowed' | 'prohibited' | 'not_verified', required
            - `policyUrl` string, uri, required
            - `verifiedAt` string, required
        - `caveats` string[], required
      - `publicRecordContext` object, required
        - `summary` string, required
        - `components` object[], required
          - `tool` string, required
          - `result` unknown, required
    - `markets` object[], required
      - `status` 'answered' | 'not_found' | 'source_unavailable', required
      - `zip` string, required
      - `sale` object
        - `lastUpdatedDate` string
        - `averageDaysOnMarket` number
        - `totalListings` number
        - `newListings` number
        - `medianPriceUsd` number
        - `averagePriceUsd` number
        - `medianPricePerSquareFootUsd` number
      - `rental` object
        - `lastUpdatedDate` string
        - `averageDaysOnMarket` number
        - `totalListings` number
        - `newListings` number
        - `medianRentUsd` number
        - `averageRentUsd` number
        - `medianRentPerSquareFootUsd` number
      - `source` object, required
        - `sourceName` 'RentCast via Locus x402', required
        - `sourceUrl` string, uri, required
        - `fetchedAt` string, required
        - `requestId` string, uuid
        - `requestStatusUrl` string
        - `usePolicy` object, required
          - `paidResponse` 'allowed' | 'allowed_with_attribution' | 'not_verified', required
          - `cache` 'allowed' | 'ephemeral_only' | 'no_store', required
          - `attributionRequired` boolean, required
          - `attributionText` string
          - `downstreamRedistribution` 'allowed' | 'restricted' | 'not_verified', required
          - `publicPinning` 'allowed' | 'prohibited' | 'not_verified', required
          - `policyUrl` string, uri, required
          - `verifiedAt` string, required
      - `caveats` string[], required
    - `evidence` object[], required
      - `id` string, required
      - `category` 'identity' | 'property' | 'tax' | 'listing' | 'market' | 'rent' | 'public_record' | 'deadline', required
      - `headline` string
      - `statement` string, required
      - `sourceName` string, required
      - `sourceUrl` string, uri
      - `fetchedAt` string
      - `recordId` string
      - `sourceLocator` string
      - `subjectId` string
      - `deadlineDate` string
      - `derivation` object
        - `kind` 'deterministic_comparison', required
        - `inputEvidenceIds` string[], required
    - `sections` object[], required
      - `title` string, required
      - `body` string, required
      - `evidenceIds` string[], required
      - `citations` object[], required
        - `evidenceId` string, required
        - `inputEvidenceId` string
        - `sourceName` string, required
        - `sourceUrl` string, uri
        - `fetchedAt` string
        - `recordId` string
        - `sourceLocator` string
        - `subjectId` string
    - `workItems` object[], required
      - `id` string, required
      - `status` 'open' | 'awaiting_authority' | 'resolved_with_evidence', required
      - `question` string, required
      - `evidenceNeeded` string[], required
      - `sourceBackedDeadline` object
        - `date` string, required
        - `sourceUrl` string, uri, required
        - `sourceName` string
        - `recordId` string
        - `fetchedAt` string, required
      - `resolutionEvidence` object[], required
        - `sourceUrl` string, uri, required
        - `recordId` string
        - `observedAt` string, required
      - `supersedes` string[], required
    - `nextCalls` union[], required
      - union
        - object
          - `why` string, required
          - `evidenceIds` string[], required
          - `urgency` 'time-sensitive' | 'recommended' | 'optional', required
          - `tool` 'locus_appeal_filing_guide', required
          - `endpoint` '/tools/call', required
          - `input` object, required
            - `address` string, required
          - `access` 'free', required
          - `cost` 'free', required
          - `costAtGeneration` 'free', required
          - `requiresPaymentApproval` false, required
        - object
          - `why` string, required
          - `evidenceIds` string[], required
          - `urgency` 'time-sensitive' | 'recommended' | 'optional', required
          - `tool` 'locus_appeal_outcomes', required
          - `endpoint` '/tools/call', required
          - `input` object, required
            - `address` string, required
          - `access` 'free', required
          - `cost` 'free', required
          - `costAtGeneration` 'free', required
          - `requiresPaymentApproval` false, required
        - object
          - `why` string, required
          - `evidenceIds` string[], required
          - `urgency` 'time-sensitive' | 'recommended' | 'optional', required
          - `tool` 'locus_verify_citation', required
          - `endpoint` '/tools/call', required
          - `input` object, required
            - `sourceUrl` string, uri, required
            - `recordId` string
          - `access` 'free', required
          - `cost` 'free', required
          - `costAtGeneration` 'free', required
          - `requiresPaymentApproval` false, required
        - object
          - `why` string, required
          - `evidenceIds` string[], required
          - `urgency` 'time-sensitive' | 'recommended' | 'optional', required
          - `tool` 'locus_compare_properties', required
          - `endpoint` '/tools/call', required
          - `input` object, required
            - `properties` object[], required
              - …
            - `comparisonFocus` string, required
          - `access` 'free', required
          - `cost` 'free', required
          - `costAtGeneration` 'free', required
          - `requiresPaymentApproval` false, required
        - object
          - `why` string, required
          - `evidenceIds` string[], required
          - `urgency` 'time-sensitive' | 'recommended' | 'optional', required
          - `tool` 'locus-comps-brief', required
          - `endpoint` '/api/locus-comps-brief', required
          - `input` object, required
            - `address` string, required
          - `access` 'paid', required
          - `cost` '$0.05', required
          - `costAtGeneration` '$0.05', required
          - `requiresPaymentApproval` true, required
        - object
          - `why` string, required
          - `evidenceIds` string[], required
          - `urgency` 'time-sensitive' | 'recommended' | 'optional', required
          - `tool` 'locus-place-report-batch', required
          - `endpoint` '/api/locus-place-report-batch', required
          - `input` object, required
            - `addresses` string[], required
          - `access` 'paid', required
          - `cost` '$0.25', required
          - `costAtGeneration` '$0.25', required
          - `requiresPaymentApproval` true, required
        - object
          - `why` string, required
          - `evidenceIds` string[], required
          - `urgency` 'time-sensitive' | 'recommended' | 'optional', required
          - `tool` 'locus-local-trend-brief', required
          - `endpoint` '/api/locus-local-trend-brief', required
          - `input` object, required
            - `place` string, required
            - `intent` 'renter_due_diligence', required
          - `access` 'paid', required
          - `cost` '$0.05', required
          - `costAtGeneration` '$0.05', required
          - `requiresPaymentApproval` true, required
        - object
          - `why` string, required
          - `evidenceIds` string[], required
          - `urgency` 'time-sensitive' | 'recommended' | 'optional', required
          - `tool` 'locus-property-update', required
          - `endpoint` '/api/locus-property-update', required
          - `input` object, required
            - `address` string, required
            - `focus` string[], required
          - `access` 'paid', required
          - `cost` '$0.10', required
          - `costAtGeneration` '$0.10', required
          - `requiresPaymentApproval` true, required
    - `nextCallPlan` object, required
      - `status` 'generated' | 'repaired' | 'deterministic_fallback' | 'not_applicable', required
      - `includedInEndpointPrice` true, required
      - `model` string
      - `pricedAt` string, required
      - `candidateCount` integer, required
      - `selectedCount` integer, required
      - `diagnostics` object, required
        - `modelAttempted` boolean, required
        - `modelSucceeded` boolean, required
        - `reason` string
    - `costModel` object, required
      - `priceUsdc` '0.25' | '0.79' | '2.49', required
      - `includedInPrice` true, required
      - `nextCallPlanningIncluded` true, required
      - `providerUnitPriceUsdc` '0.033', required
      - `providerCalls` object, required
        - `properties` integer, required
        - `saleListings` integer, required
        - `rentEstimates` integer, required
        - `markets` integer, required
      - `signerProvider` 'turnkey', required
      - `signatureUnitCostUsd` '0.10', required
      - `maximumSignatures` integer, required
      - `maximumSignatureCostUsd` string, required
      - `pricingBasis` 'pay_as_you_go_after_free_allowance', required
      - `freeAllowanceExcluded` true, required
    - `caveats` string[], required
    - `skillContinuation` object
      - `skillId` string, required
      - `version` string, required
      - `url` string, required
      - `reason` string, required
  - object
    - `kind` 'property_workflow_diagnostic', required
    - `workflow` 'buyer_property_comparison' | 'owner_cost_review' | 'rental_operations_brief', required
    - `status` 'not_configured' | 'subject_unresolved' | 'insufficient_provider_evidence' | 'source_unavailable', required
    - `charged` false, required
    - `message` string, required
    - `componentStatus` object[], required
      - `component` string, required
      - `status` string, required
    - `caveats` string[], required

## Other responses

- `400`: Invalid request body.
- `402`: Payment Required. For x402 v2, repeat the identical request with a valid PAYMENT-SIGNATURE header (legacy X-PAYMENT is accepted for compatibility). MPP is disabled for this lifecycle-bound tool.

---

[API](https://skmtc.dev/locus/apis/locus-api.md) · [All operations](https://skmtc.dev/locus/apis/locus-api/llms.txt) · [OpenAPI document](https://skmtc.dev/locus/apis/locus-api/revisions/ba7786b74adb?raw)
