---
title: "Challenge a caller-supplied property price"
method: POST
path: "/api/locus-valuation-challenge"
tags: ["data", "search", "real-estate", "property", "property-research", "due-diligence", "public-records", "x402", "proposed-price", "price-challenge", "recorded-sales", "parcel-facts", "due-diligence", "category:economics"]
---

# Challenge a caller-supplied property price

`POST /api/locus-valuation-challenge`

## Request

- Base URL: `https://api.locus.report`
- URL: `https://api.locus.report/api/locus-valuation-challenge`
- Auth: one of:
  - API key in header `PAYMENT-SIGNATURE`
  - API key in header `Authorization`

Challenge a supplied price or assessment notice for one US address against cited sales, parcel, permit, tax, zoning, and same-roll uniformity records. Protest mode does not create or endorse a price or investment score. Charge-free below two substantive sections. npx @velinussage/locus-agent-skill add.

## Request body

- object: US street address plus the caller-supplied price or assessment-notice figure, source, tax year, and purpose. Protest or assessment-notice mode attempts a same-roll assessment-uniformity section; Locus echoes the figure but never creates or endorses a property number.
  - `address` string, required: US street address for the subject property.
  - `proposedValue` number, required: The caller's own proposed price/figure in USD. Locus echoes it but never creates or endorses it.
  - `source` 'zestimate' | 'appraisal' | 'bpo' | 'own' | 'assessment_notice', required: Caller-supplied origin for the proposed figure; use assessment_notice for an assessor or appraisal-district notice.
  - `noticeYear` integer, required: Tax year of the assessment notice; defaults to the current year.
  - `purpose` 'purchase' | 'protest', required: Use protest to request the same-roll assessment-uniformity section; defaults to purchase.
  - `radiusMeters` integer: Optional comps radius; default 1500m, max 1500m.
  - `monthsBack` integer: Optional comps lookback; default 24 months, max 24.

## Response `200`

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

- object: A cited proposed-price challenge artifact. Sections contain evidence[], direction, and citations[]; any dollar figure is either caller-submitted or a cited public-record amount. charged:false when fewer than two substantive sections resolve.
  - `kind` 'proposed_price_challenge', required
  - `generatedAt` string, required
  - `address` string, required
  - `submittedFigure` object, required
    - `amountUsd` number, required
    - `source` 'zestimate' | 'appraisal' | 'bpo' | 'own' | 'assessment_notice', required
    - `sourceTag` 'caller_submitted' | 'third_party_model' | 'appraisal' | 'broker_opinion' | 'assessment_notice', required
    - `caveat` string, required
  - `factualComparison` object, required
    - `submittedFigurePosition` 'below_all_recorded' | 'within_recorded_range' | 'above_all_recorded' | 'mixed_vs_subject_traits' | 'insufficient_recorded_sales', required
    - `comparableCount` integer, required
    - `thinComps` boolean, required
    - `uniformityPosition` string
  - `sections` object[], required
    - `id` string, required
    - `title` string, required
    - `direction` 'supports' | 'challenges' | 'neutral', required
    - `evidence` object[], required
      - `label` string, required
      - `text` string, required
      - `recordAmountUsd` number
      - `recordDate` string
      - `recordId` string
      - `citation` object
        - `sourceName` string, required
        - `sourceUrl` string, uri
        - `recordId` string
        - `fetchedAt` string
    - `citations` object[], required
      - `sourceName` string, required
      - `sourceUrl` string, uri
      - `recordId` string
      - `fetchedAt` string
  - `componentStatus` object[], required
    - `component` string, required
    - `status` string, required
    - `detail` string
  - `caveats` string[], required
  - `verifyNext` object[], required
    - `step` string, required
    - `url` string
    - `source` string
  - `workflowHandoff` object
    - `task` 'file_assessment_appeal', required
    - `portalUrl` string, uri, required
    - `portalKind` 'efile' | 'paper' | 'efile_or_paper' | 'unknown', required
    - `requiredInputs` string[], required
    - `attachments` string[], required
    - `providers` object[], required
      - `name` string, required
      - `origin` string, uri, required
      - `protocols` string[], required
      - `entry` string, required
      - `pricingNote` string, required
      - `kind` 'session' | 'task_agent' | 'step_list', required
    - `discovery` object, required
      - `bazaar` 'https://agentcash.ai', required
      - `query` 'browser automation fill and submit web forms', required
      - `note` string, required
    - `disclaimer` string, required
    - `verifiedAt` '2026-09-02', required
  - `charged` false

## 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), or use Authorization: Payment for MPP Tempo when advertised in x-payment-info.offers.

---

[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)
