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

# One-property solar evidence screen

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

## Request

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

Verified parcel, dated Google Solar roof data, utility candidates, programs, and historical GridPulse reference for one US address. For solar diligence, not installation advice, current incentive, or utility-service finding. Private, no-store; missing or mismatched evidence is charge-free. npx @velinussage/locus-agent-skill add.

## Request body

- object
  - `address` string, required: One exact US street address with a five-digit ZIP code.
  - `financialZip` string: Optional five-digit ZIP override for the historical GridPulse reference. Defaults to the address ZIP.
  - `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_screen', required
    - `generatedAt` string, required
    - `priceUsdc` '0.49', required
    - `costModel` object, required
      - `downstreamProviderCostUsd` '0.12', required
      - `signerProvider` 'turnkey', required
      - `signatureUnitCostUsd` '0.10', required
      - `maximumSignatures` 2, required
      - `maximumSignatureCostUsd` '0.20', required
      - `pricingBasis` 'pay_as_you_go_after_free_allowance', required
      - `freeAllowanceExcluded` true, required
    - `subject` object
      - `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_screen_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)
