curl --request GET \
--url https://app.realie.ai/api/public/property/parcelId/ \
--header 'Authorization: <api-key>'import requests
url = "https://app.realie.ai/api/public/property/parcelId/"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://app.realie.ai/api/public/property/parcelId/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.realie.ai/api/public/property/parcelId/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.realie.ai/api/public/property/parcelId/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.realie.ai/api/public/property/parcelId/")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.realie.ai/api/public/property/parcelId/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"property": {},
"parcelIdChange": {
"requestedParcelId": "11001-0298-~-0815",
"previousRealieParcelId": "11001-0298-~-0815",
"previousParcelId": "0298- -0815",
"realieParcelId": "11001-0314-~-0009",
"parcelId": "0314- -0009",
"realieId": "6650f1c2a1b2c3d4e5f60718",
"changedOn": "2026-07-01",
"reason": "renumbered"
}
}{
"error": "State, county, and parcelId are all required unless parcelId is a realieParcelId ({5-digit county FIPS}-{APN}), which may be passed alone"
}{
"error": "Unauthorized: API key is missing"
}{
"error": "Forbidden: Pay your outstanding invoices to restore access",
"code": "unpaid_invoices",
"action": "Open Billing and pay all outstanding invoices. Update your payment card if a payment fails, then retry once your subscription is active.",
"billing_url": "https://app.realie.ai/billing"
}{
"error": "No property found matching the criteria"
}{
"error": "That parcel number was a former number of more than one parcel; look the parcel up by realieId",
"realieIds": [
"6650f1c2a1b2c3d4e5f6071a",
"6650f1c2a1b2c3d4e5f6071b"
]
}{
"error": "Internal Server Error"
}Parcel ID Lookup
Get a single property by its parcel identifier. Pass the assessor’s parcel ID (APN) with “state” and “county”, or pass a stored “realieParcelId”, which also works on its own. When “state” or “county” is omitted, “parcelId” is interpreted only as a realieParcelId: a value that is not a valid realieParcelId returns 400, and if you pass just one of “state” or “county”, it must match the realieParcelId’s county or the request returns 400. You can also pass “realieId” (the “realieId” field of a v3 result) instead of “parcelId”; “state” and “county” are then ignored, and the lookup reads v3 data only. A parcel keeps its “realieId” when the county renumbers it and we link the new number to it, and on v3 data reads a former number that no parcel holds now returns the renumbered parcel with “parcelIdChange”; see Renumbered parcels.
curl --request GET \
--url https://app.realie.ai/api/public/property/parcelId/ \
--header 'Authorization: <api-key>'import requests
url = "https://app.realie.ai/api/public/property/parcelId/"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://app.realie.ai/api/public/property/parcelId/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.realie.ai/api/public/property/parcelId/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.realie.ai/api/public/property/parcelId/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.realie.ai/api/public/property/parcelId/")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.realie.ai/api/public/property/parcelId/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"property": {},
"parcelIdChange": {
"requestedParcelId": "11001-0298-~-0815",
"previousRealieParcelId": "11001-0298-~-0815",
"previousParcelId": "0298- -0815",
"realieParcelId": "11001-0314-~-0009",
"parcelId": "0314- -0009",
"realieId": "6650f1c2a1b2c3d4e5f60718",
"changedOn": "2026-07-01",
"reason": "renumbered"
}
}{
"error": "State, county, and parcelId are all required unless parcelId is a realieParcelId ({5-digit county FIPS}-{APN}), which may be passed alone"
}{
"error": "Unauthorized: API key is missing"
}{
"error": "Forbidden: Pay your outstanding invoices to restore access",
"code": "unpaid_invoices",
"action": "Open Billing and pay all outstanding invoices. Update your payment card if a payment fails, then retry once your subscription is active.",
"billing_url": "https://app.realie.ai/billing"
}{
"error": "No property found matching the criteria"
}{
"error": "That parcel number was a former number of more than one parcel; look the parcel up by realieId",
"realieIds": [
"6650f1c2a1b2c3d4e5f6071a",
"6650f1c2a1b2c3d4e5f6071b"
]
}{
"error": "Internal Server Error"
}Renumbered parcels
When a county renumbers a parcel, the parcel keeps itsrealieId, and a lookup by its former number returns it with a parcelIdChange object. A number several parcels once held returns 409 with their realieIds. Both work in this flat shape too, on v3 reads. See Renumbered parcels.Authorizations
Send your API key in the Authorization header. Preferred: the raw key (Authorization: YOUR_API_KEY). Also accepted: Bearer YOUR_API_KEY (Bearer scheme is case-insensitive), for HTTP clients that add the prefix automatically.
Query Parameters
The state (e.g. CA) where the property is located. Required unless "parcelId" is a realieParcelId or "realieId" is passed (ignored with "realieId").
The county where the property is located. Required unless "parcelId" is a realieParcelId or "realieId" is passed (ignored with "realieId").
The parcel to look up: the exact assessor's parcel ID (APN), which requires "state" and "county", or a stored "realieParcelId" (the 5-digit county FIPS code, a hyphen, then the APN with spaces written as ~, e.g. 11001-0314-~-0009). When "state" or "county" is omitted, the value is interpreted only as a realieParcelId. Required unless "realieId" is passed; do not pass both.
The "realieId" field of a v3 result: 24 hexadecimal characters, e.g. "6650f1c2a1b2c3d4e5f60718". Pass it instead of "parcelId"; "state" and "county" are not needed. Reads v3 data only.
^[0-9a-fA-F]{24}$