---
title: "Three-property solar evidence comparison"
method: POST
path: "/api/locus-solar-property-comparison"
tags: ["data", "search", "real-estate", "property", "property-research", "due-diligence", "public-records", "x402", "solar", "rooftop-solar", "three-address-comparison", "google-solar", "gridpulse", "utility-territory", "property-programs", "category:economics"]
---

# Three-property solar evidence comparison

`POST /api/locus-solar-property-comparison`

## Request

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

Three US addresses compared using verified parcels, dated Google Solar roof evidence, utility candidates, programs, and a historical GridPulse reference. No score or property recommendation. Licensed results stay private and no-store; thin physical coverage is charge-free. npx @velinussage/locus-agent-skill add.

## Request body

- object
  - `addresses` string[], required: Exactly three US street addresses to compare. Locus preserves input order and does not enumerate or rank a town.
  - `financialZip` string, required: One five-digit ZIP for the shared GridPulse reference scenario.
  - `systemKw` number, required: GridPulse reference-system size in kilowatts. This does not resize the Google roof model.

## Response `200`

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

- union
  - object
    - `kind` 'solar_property_comparison', required
    - `generatedAt` string, required
    - `comparisonScope` object, required
      - `submittedAddressCount` 3, required
      - `comparisonMetric` 'modeled_annual_energy_dc_kwh', required
      - `priceUsdc` '1.09', required
    - `costModel` object, required
      - `downstreamProviderCostUsd` '0.16', required
      - `signerProvider` 'turnkey', required
      - `signatureUnitCostUsd` '0.10', required
      - `maximumSignatures` 4, required
      - `maximumSignatureCostUsd` '0.40', required
      - `pricingBasis` 'pay_as_you_go_after_free_allowance', required
      - `freeAllowanceExcluded` true, required
    - `subjects` object[], required
      - `subject` object, required
        - `propertyId` string, required
        - `inputAddress` string, required
        - `parcelId` string, required
        - `matchedAddress` string
        - `jurisdiction` object, required
          - `state` string, required
          - `county` string, required
          - `city` string
        - `pointPrecision` 'parcel' | 'rooftop' | 'street_number', required
        - `matchingEvidence` string[], required
        - `observedAt` string, required
      - `parcel` object, required
        - `acreage` number
        - `landUse` string
        - `zoning` string
        - `citation` object
          - `sourceName` string, required
          - `sourceUrl` string, uri, required
          - `fetchedAt` string
          - `recordId` string
      - `physical` object, required
        - `status` 'answered' | 'not_found' | 'source_unavailable' | 'identity_mismatch', required
        - `imageryQuality` 'LOW' | 'MEDIUM' | 'HIGH'
        - `imageryDate` string
        - `maxArrayAreaMeters2` number
        - `maxPanelsCount` integer
        - `maxSunshineHoursPerYear` number
        - `modeledAnnualEnergyDcKwh` number
        - `roofSegments` object[], required
          - `segmentIndex` integer, required
          - `azimuthDegrees` number
          - `pitchDegrees` number
          - `areaMeters2` number
          - `panelsCount` integer
          - `yearlyEnergyDcKwh` number
          - `maxSunshineHoursPerYear` number
        - `source` object
          - `sourceName` string, required
          - `sourceUrl` string, uri, required
          - `fetchedAt` string
          - `attemptedAt` string
          - `recordId` string
          - `imageryDate` 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
      - `utility` object, required
        - `status` 'candidate_found' | 'no_mapped_territory' | 'source_unavailable' | 'unknown', required
        - `multipleMatches` boolean, required
        - `candidates` object[], required
          - `utilityId` string, required
          - `name` string, required
          - `state` string
          - `website` string
          - `sourceDate` string
          - `dataYear` string
        - `source` object
          - `sourceName` string, required
          - `sourceUrl` string, uri, required
          - `fetchedAt` string
          - `sourceVintage` string
        - `caveats` string[], required
        - `verifyNext` object[], required
          - `step` string, required
          - `sourceUrl` string, uri
      - `programs` object[], required
        - `id` string, required
        - `name` string, required
        - `fact` string
        - `moneyNote` string
        - `window` string
        - `sourceUrl` string, uri, required
        - `verifiedAt` string
    - `financialReference` object, required
      - `status` 'historical_reference' | 'source_unavailable' | 'not_requested', required
      - `provider` 'GridPulse', required
      - `geography` object, required
        - `zip` string, required
        - `authority` 'caller_supplied', required
      - `systemKw` number, required
      - `fetchedAt` string
      - `preface` string, required
      - `solarResourceRating` string
      - `solarRadiationKwhPerM2PerDay` number
      - `annualProductionKwh` number
      - `systemCostUsd` object
        - `low` number, required
        - `high` number, required
      - `afterCreditCostUsd` object
        - `low` number, required
        - `high` number, required
      - `paybackYears` number
      - `savings25YearUsd` object
        - `low` number, required
        - `high` number, required
      - `netMeteringProviderClaim` union
        - boolean
        - string
      - `staleAssumptions` object[], required
        - `id` 'residential_clean_energy_credit_30_percent' | 'unconfirmed_utility_tariff' | 'production_model_fallback_not_verified', required
        - `status` 'expired' | 'not_verified', required
        - `explanation` string, required
        - `sourceUrl` string, uri
      - `excludedFromPhysicalComparison` true, required
      - `source` object
        - `sourceName` string, required
        - `sourceUrl` string, uri, required
        - `fetchedAt` string
        - `attemptedAt` string
        - `recordId` string
        - `imageryDate` 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
    - `componentStatus` object[], required
      - `component` string, required
      - `status` string, required
      - `detail` string
    - `caveats` string[], required
    - `verifyNext` object[], required
      - `step` string, required
      - `sourceUrl` string, uri
    - `charged` false
  - object
    - `kind` 'solar_property_comparison_replay', required
    - `status` 'licensed_result_not_retained', required
    - `generatedAt` string, required
    - `message` string, required
    - `originalResultDelivered` true, required
    - `recheckRequired` true, required
    - `sourcePolicies` object[], required
      - `sourceName` string, required
      - `cache` 'allowed' | 'ephemeral_only' | 'no_store', required
      - `downstreamRedistribution` 'allowed' | 'restricted' | 'not_verified', required
      - `publicPinning` 'allowed' | 'prohibited' | 'not_verified', required
      - `policyUrl` string, uri, 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)
