---
title: "Create Property"
method: POST
path: "/api/properties"
tags: ["Properties"]
---

# Create Property

`POST /api/properties`

## Request

- Base URL: `https://api.earmarkiq.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.earmarkiq.app/api/properties`
- Auth: HTTP bearer

Register a property. Resolves the postcode via postcodes.io (once) and
warms the global HPI index cache for its location. Pro feature: property
tracking requires a paid tier (existing properties keep working after a
downgrade — only adding new ones is gated).

## Request body

- PropertyCreate
  - `postcode` string, required
  - `property_type` 'detached' | 'semi_detached' | 'terraced' | 'flat', required
  - `purchase_price` union, required
    - number
    - string
  - `purchase_month` string, date, required
  - `nickname` string, nullable
  - `mortgage_balance` union
    - number
    - string
  - `uprn` string, nullable

## Response `201`

Successful Response

- PropertyResponse
  - `id` string, required
  - `nickname` string, nullable, required
  - `postcode` string, required
  - `admin_district` string, nullable, required
  - `region` string, nullable, required
  - `property_type` string, required
  - `purchase_price` number, required
  - `purchase_month` string, required
  - `mortgage_balance` number, nullable, required
  - `estimated_value` number, nullable, required
  - `equity` number, nullable, required
  - `index_month_used` string, nullable, required
  - `location_level_used` string, nullable, required
  - `is_active` boolean, required
  - `created_at` string, required
  - `attribution` string, required
  - `valuation_source` string, nullable
  - `valuation_date` string, nullable
  - `valuation_confidence` string, nullable
  - `valuation_lower_bound` string, nullable
  - `valuation_upper_bound` string, nullable
  - `manual_value` number, nullable
  - `uprn` string, nullable
  - `value_label` string, nullable
  - `needs_value` boolean
  - `pmi_verdict` string, nullable
  - `pmi_rejected_reason` string, nullable
  - `pmi_checked_at` string, nullable
  - `pmi_estimate_seen` number, nullable
  - `pmi_estimate_confidence` string, nullable
  - `pmi_estimate_lower_bound` number, nullable
  - `pmi_estimate_upper_bound` number, nullable

## Other responses

- `422`: Validation Error

---

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