---
title: "Owner cost, tax, and deadline review"
method: POST
path: "/api/locus-owner-cost-review"
tags: ["data", "search", "real-estate", "property", "property-research", "due-diligence", "public-records", "x402", "homeowner", "property-tax", "costs", "deadlines", "owner-programs", "agent-next-calls", "rentcast", "category:economics"]
---

# Owner cost, tax, and deadline review

`POST /api/locus-owner-cost-review`

## Request

- Base URL: `https://api.locus.report`
- URL: `https://api.locus.report/api/locus-owner-cost-review`
- Auth: API key in header `PAYMENT-SIGNATURE`

Non-PII RentCast tax history, cited owner programs, work items, and validated nextCalls for one exact property. For owner research, not an eligibility, savings, appeal, or property recommendation. Unpaid POST checks provider readiness, reserves nothing. Private, no-store. npx @velinussage/locus-agent-skill add.

## Request body

- object
  - `address` string, required
  - `noticeDate` string, date
  - `withinDays` integer

## Response `200`

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

- union
  - object
    - `kind` 'owner_cost_review', required
    - `generatedAt` string, 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
    - `ownerActionContext` union, required
      - object
        - `generatedAt` string, date-time, required
        - `address` string, required
        - `place` string
        - `jurisdictionIds` string[], required
        - `sections` object, required
          - `programs` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `programWindows` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `appealWindow` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `taxCalendar` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `lomaScreen` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `specialValuation` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
        - `componentStatus` object[], required
          - `component` 'programs' | 'programWindows' | 'appealWindow' | 'taxCalendar' | 'lomaScreen' | 'specialValuation', required
          - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
          - `substantive` boolean, required
          - `detail` string
        - `substantiveSectionCount` integer, required
        - `caveats` string[], required
        - `verifyNext` object[], required
          - `step` string, required
          - `url` string, uri
          - `source` string
        - `kind` 'owner_action_brief', required
      - object
        - `generatedAt` string, date-time, required
        - `address` string, required
        - `place` string
        - `jurisdictionIds` string[], required
        - `sections` object, required
          - `programs` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `programWindows` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `appealWindow` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `taxCalendar` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `lomaScreen` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
          - `specialValuation` object, required
            - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
            - `citations` object[], required
              - …
        - `componentStatus` object[], required
          - `component` 'programs' | 'programWindows' | 'appealWindow' | 'taxCalendar' | 'lomaScreen' | 'specialValuation', required
          - `status` 'ok' | 'partial' | 'not_applicable' | 'not_covered' | 'not_substantive' | 'unavailable', required
          - `substantive` boolean, required
          - `detail` string
        - `substantiveSectionCount` integer, required
        - `caveats` string[], required
        - `verifyNext` object[], required
          - `step` string, required
          - `url` string, uri
          - `source` string
        - `kind` 'owner_action_brief_diagnostic', required
        - `charged` false, required
    - `areaTaxContext` unknown
    - `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
  - 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)
