Skip to content

Track the Real Estate Market

Property coverage is spread across several industry classifiers — construction and brokerage, development, REITs. Combine them with industry.id for a single market feed, then use facets to see which countries are driving it and sentiment to see which way it is turning.

Step 1: Build the sector feed

Three IDs cover most of the market: 216 (Real Estate and Construction — development, sales, management, brokers, architects), 226 (Property Development) and 230 (Real Estate Investment Trusts).

bash
curl "https://api.apitube.io/v1/news/everything?industry.id=216,226,230&sort.by=published_at&sort.order=desc&per_page=20&api_key=YOUR_API_KEY"
python
import requests

response = requests.get(
    "https://api.apitube.io/v1/news/everything",
    params={
        "industry.id": "216,226,230",
        "sort.by": "published_at",
        "sort.order": "desc",
        "per_page": "20",
        "api_key": "YOUR_API_KEY",
    },
)
print(response.json())
javascript
const params = new URLSearchParams({ "industry.id": "216,226,230", "sort.by": "published_at", "sort.order": "desc", "per_page": "20", "api_key": "YOUR_API_KEY" });
const response = await fetch(`https://api.apitube.io/v1/news/everything?${params}`);
const data = await response.json();
console.log(data);
php
$query = http_build_query(["industry.id" => "216,226,230", "sort.by" => "published_at", "sort.order" => "desc", "per_page" => "20", "api_key" => "YOUR_API_KEY"]);
$response = file_get_contents("https://api.apitube.io/v1/news/everything?$query");
$data = json_decode($response, true);
print_r($data);
go
package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	u, _ := url.Parse("https://api.apitube.io/v1/news/everything")
	q := u.Query()
	q.Set("industry.id", "216,226,230")
	q.Set("sort.by", "published_at")
	q.Set("sort.order", "desc")
	q.Set("per_page", "20")
	q.Set("api_key", "YOUR_API_KEY")
	u.RawQuery = q.Encode()

	resp, _ := http.Get(u.String())
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	var data map[string]any
	json.Unmarshal(body, &data)
	fmt.Println(data)
}
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.apitube.io/v1/news/everything?industry.id=216,226,230&sort.by=published_at&sort.order=desc&per_page=20&api_key=YOUR_API_KEY"))
            .GET()
            .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
text
Write a script in your preferred language that calls the APITube News API:

GET https://api.apitube.io/v1/news/everything?industry.id=216,226,230&sort.by=published_at&sort.order=desc&per_page=20

Read the API key from an environment variable (do not hardcode it), handle request
errors, and print the key fields of each result.
Docs: https://docs.apitube.io/platform/news-api/parameters
  • Which part of the marketindustries on each article separates brokerage news from development and REIT news.
  • Where the property islocations_mentioned, extracted from the body.
  • Which press covered itsource.domain and source.country.code.

Step 2: See which markets are loudest

Real estate is local, so the useful question is not "how much coverage" but "coverage where". A facet on source.country.id answers that in one request.

bash
curl "https://api.apitube.io/v1/news/everything?industry.id=216,226,230&facet=true&facet.field=source.country.id&facet.limit=15&per_page=1&api_key=YOUR_API_KEY"
python
import requests

response = requests.get(
    "https://api.apitube.io/v1/news/everything",
    params={
        "industry.id": "216,226,230",
        "facet": "true",
        "facet.field": "source.country.id",
        "facet.limit": "15",
        "per_page": "1",
        "api_key": "YOUR_API_KEY",
    },
)
print(response.json())
javascript
const params = new URLSearchParams({ "industry.id": "216,226,230", "facet": "true", "facet.field": "source.country.id", "facet.limit": "15", "per_page": "1", "api_key": "YOUR_API_KEY" });
const response = await fetch(`https://api.apitube.io/v1/news/everything?${params}`);
const data = await response.json();
console.log(data);
php
$query = http_build_query(["industry.id" => "216,226,230", "facet" => "true", "facet.field" => "source.country.id", "facet.limit" => "15", "per_page" => "1", "api_key" => "YOUR_API_KEY"]);
$response = file_get_contents("https://api.apitube.io/v1/news/everything?$query");
$data = json_decode($response, true);
print_r($data);
go
package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	u, _ := url.Parse("https://api.apitube.io/v1/news/everything")
	q := u.Query()
	q.Set("industry.id", "216,226,230")
	q.Set("facet", "true")
	q.Set("facet.field", "source.country.id")
	q.Set("facet.limit", "15")
	q.Set("per_page", "1")
	q.Set("api_key", "YOUR_API_KEY")
	u.RawQuery = q.Encode()

	resp, _ := http.Get(u.String())
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	var data map[string]any
	json.Unmarshal(body, &data)
	fmt.Println(data)
}
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.apitube.io/v1/news/everything?industry.id=216,226,230&facet=true&facet.field=source.country.id&facet.limit=15&per_page=1&api_key=YOUR_API_KEY"))
            .GET()
            .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
text
Write a script in your preferred language that calls the APITube News API:

GET https://api.apitube.io/v1/news/everything?industry.id=216,226,230&facet=true&facet.field=source.country.id&facet.limit=15&per_page=1

Read the API key from an environment variable (do not hardcode it), handle request
errors, and print the key fields of each result.
Docs: https://docs.apitube.io/platform/news-api/parameters

Once you know which markets matter, pin the feed to one with source.country.code=us. Note that this filters by where the outlet is based, which is the right proxy for local property press but will miss a foreign paper writing about the same market.

Step 3: Watch sentiment turn

Housing coverage flips tone well before the numbers do. Filter to negative articles and see whether the share is growing.

bash
curl "https://api.apitube.io/v1/news/everything?industry.id=216,226,230&sentiment.overall.polarity=negative&published_at.start=2026-07-01&per_page=20&api_key=YOUR_API_KEY"
python
import requests

response = requests.get(
    "https://api.apitube.io/v1/news/everything",
    params={
        "industry.id": "216,226,230",
        "sentiment.overall.polarity": "negative",
        "published_at.start": "2026-07-01",
        "per_page": "20",
        "api_key": "YOUR_API_KEY",
    },
)
print(response.json())
javascript
const params = new URLSearchParams({ "industry.id": "216,226,230", "sentiment.overall.polarity": "negative", "published_at.start": "2026-07-01", "per_page": "20", "api_key": "YOUR_API_KEY" });
const response = await fetch(`https://api.apitube.io/v1/news/everything?${params}`);
const data = await response.json();
console.log(data);
php
$query = http_build_query(["industry.id" => "216,226,230", "sentiment.overall.polarity" => "negative", "published_at.start" => "2026-07-01", "per_page" => "20", "api_key" => "YOUR_API_KEY"]);
$response = file_get_contents("https://api.apitube.io/v1/news/everything?$query");
$data = json_decode($response, true);
print_r($data);
go
package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	u, _ := url.Parse("https://api.apitube.io/v1/news/everything")
	q := u.Query()
	q.Set("industry.id", "216,226,230")
	q.Set("sentiment.overall.polarity", "negative")
	q.Set("published_at.start", "2026-07-01")
	q.Set("per_page", "20")
	q.Set("api_key", "YOUR_API_KEY")
	u.RawQuery = q.Encode()

	resp, _ := http.Get(u.String())
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	var data map[string]any
	json.Unmarshal(body, &data)
	fmt.Println(data)
}
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.apitube.io/v1/news/everything?industry.id=216,226,230&sentiment.overall.polarity=negative&published_at.start=2026-07-01&per_page=20&api_key=YOUR_API_KEY"))
            .GET()
            .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
text
Write a script in your preferred language that calls the APITube News API:

GET https://api.apitube.io/v1/news/everything?industry.id=216,226,230&sentiment.overall.polarity=negative&published_at.start=2026-07-01&per_page=20

Read the API key from an environment variable (do not hardcode it), handle request
errors, and print the key fields of each result.
Docs: https://docs.apitube.io/platform/news-api/parameters

The share of negative coverage is more informative than its absolute volume, and /v1/news/count gives you both halves in two cheap requests:

python
import requests

REAL_ESTATE = "216,226,230"

def negativity(api_key, country="us", since="2026-07-01"):
    def count(**extra):
        params = {
            "industry.id": REAL_ESTATE,
            "source.country.code": country,
            "published_at.start": since,
            "api_key": api_key,
            **extra,
        }
        return requests.get("https://api.apitube.io/v1/news/count", params=params).json()["count"]

    total = count()
    negative = count(**{"sentiment.overall.polarity": "negative"})
    return {"total": total, "negative": negative, "share": round(negative / total, 3) if total else 0}

Tip: narrow the topic with title before reading tone — title=mortgage isolates rate and lending coverage, which turns negative earlier than the market-wide feed.