curl --request GET \
--url https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives \
--header 'Authorization: Bearer <token>'import requests
url = "https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives', 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://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives",
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: Bearer <token>"
],
]);
$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://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "42",
"type": "narrative",
"attributes": {
"id": 42,
"geo_boundary_id": 94121,
"analysis_date": "2026-03-15",
"overview": "The Raleigh-Cary metro area continued to demonstrate strong fundamentals in Q1 2026, with steady rent growth and healthy absorption across most submarkets.",
"rent": "Average effective rents rose 3.2% year-over-year, outpacing the national average. Class A properties led gains at 4.1%, while Class B and C segments posted more modest increases of 2.8% and 2.1% respectively.",
"occupancy": "Occupancy rates held firm at 94.8%, supported by continued in-migration and job growth in the technology and life sciences sectors. Net absorption totaled approximately 2,400 units during the quarter.",
"construction": "The construction pipeline remains active with over 8,500 units currently under construction. Deliveries are expected to peak in mid-2026 before tapering through year-end.",
"sales": "Investment sales volume reached $420M across 12 transactions during the quarter, with cap rates averaging 5.2% for institutional-quality assets...",
"demographics": "The metro area added approximately 18,000 new residents over the past year, driven by strong employment growth in technology, healthcare, and professional services sectors."
}
}
]
}{
"error": "Invalid parameter",
"message": "account_id is required",
"errors": [
"<string>"
],
"quota_limit": 123,
"quota_usage": 123
}{
"error": "Invalid parameter",
"message": "account_id is required",
"errors": [
"<string>"
],
"quota_limit": 123,
"quota_usage": 123
}"You have exceeded the rate limit for this API.\n"Get Market Narrative
Retrieve a market narrative for a geographic boundary. Returns a structured analysis covering market overview, rent performance, occupancy and demand, construction pipeline, sales transactions, and demographics.
The response contains the most recent narrative available for the given geo boundary. Narratives are updated periodically as new market data becomes available.
sales section is truncated for accounts without Explore Pro+ access.curl --request GET \
--url https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives \
--header 'Authorization: Bearer <token>'import requests
url = "https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives', 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://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives",
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: Bearer <token>"
],
]);
$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://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.apartmentiq.io/apartmentiq/api/v1/markets/narratives")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "42",
"type": "narrative",
"attributes": {
"id": 42,
"geo_boundary_id": 94121,
"analysis_date": "2026-03-15",
"overview": "The Raleigh-Cary metro area continued to demonstrate strong fundamentals in Q1 2026, with steady rent growth and healthy absorption across most submarkets.",
"rent": "Average effective rents rose 3.2% year-over-year, outpacing the national average. Class A properties led gains at 4.1%, while Class B and C segments posted more modest increases of 2.8% and 2.1% respectively.",
"occupancy": "Occupancy rates held firm at 94.8%, supported by continued in-migration and job growth in the technology and life sciences sectors. Net absorption totaled approximately 2,400 units during the quarter.",
"construction": "The construction pipeline remains active with over 8,500 units currently under construction. Deliveries are expected to peak in mid-2026 before tapering through year-end.",
"sales": "Investment sales volume reached $420M across 12 transactions during the quarter, with cap rates averaging 5.2% for institutional-quality assets...",
"demographics": "The metro area added approximately 18,000 new residents over the past year, driven by strong employment growth in technology, healthcare, and professional services sectors."
}
}
]
}{
"error": "Invalid parameter",
"message": "account_id is required",
"errors": [
"<string>"
],
"quota_limit": 123,
"quota_usage": 123
}{
"error": "Invalid parameter",
"message": "account_id is required",
"errors": [
"<string>"
],
"quota_limit": 123,
"quota_usage": 123
}"You have exceeded the rate limit for this API.\n"Authorizations
Enter a Bearer token obtained via the OAuth client credentials flow or from the Access Tokens tab in your account settings.
Query Parameters
ID of the ApartmentIQ account.
ID of the geographic boundary to retrieve the narrative for. Find IDs using the Search Geo Boundaries endpoint.
Response
Successfully retrieved market narrative.
Array of market narrative resources. Contains at most one narrative (the most recent available for the geo boundary), or an empty array if no narrative exists.
Show child attributes
Show child attributes