Skip to main content
GET
/
api
/
product-catalog
GetProductCatalog
curl --request GET \
  --url https://www.worldmonitor.app/api/product-catalog
import requests

url = "https://www.worldmonitor.app/api/product-catalog"

response = requests.get(url)

print(response.text)
const options = {method: 'GET'};

fetch('https://www.worldmonitor.app/api/product-catalog', 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://www.worldmonitor.app/api/product-catalog",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);

$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://www.worldmonitor.app/api/product-catalog"

req, _ := http.NewRequest("GET", url, nil)

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://www.worldmonitor.app/api/product-catalog")
.asString();
require 'uri'
require 'net/http'

url = URI("https://www.worldmonitor.app/api/product-catalog")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
{
  "tiers": [
    {
      "name": "Free",
      "description": "Get started with the essentials",
      "features": [
        "Core dashboard panels",
        "Global news feed"
      ],
      "highlighted": false,
      "price": 0,
      "period": "forever"
    },
    {
      "name": "Pro",
      "description": "Full intelligence dashboard",
      "features": [
        "Everything in Free",
        "AI stock analysis & backtesting"
      ],
      "highlighted": true,
      "monthlyPrice": 39.99,
      "monthlyProductId": "pdt_0Nbtt71uObulf7fGXhQup",
      "annualPrice": 399.99,
      "annualProductId": "pdt_0NbttMIfjLWC10jHQWYgJ"
    },
    {
      "name": "API",
      "description": "Programmatic access to intelligence data",
      "features": [
        "REST API + official SDKs (npm, PyPI, RubyGems, Go)",
        "1,000 requests/day included"
      ],
      "highlighted": false,
      "monthlyPrice": 99.99,
      "monthlyProductId": "pdt_0NbttVmG1SERrxhygbbUq",
      "annualPrice": 999,
      "annualProductId": "pdt_0Nbu2lawHYE3dv2THgSEV"
    },
    {
      "name": "API Business",
      "description": "High-volume API for teams",
      "features": [
        "Everything in API Starter",
        "300 requests/minute",
        "10,000 requests/day included"
      ],
      "highlighted": false,
      "monthlyPrice": 249.99,
      "monthlyProductId": "pdt_0Nbttg7NuOJrhbyBGCius"
    },
    {
      "name": "Enterprise",
      "description": "Custom solutions for organizations",
      "features": [
        "Everything in Pro + API",
        "Unlimited API requests"
      ],
      "highlighted": false,
      "price": null
    }
  ],
  "fetchedAt": 1751700000000,
  "cachedUntil": 1751703600000,
  "priceSource": "dodo"
}

Response

200 - application/json

Successful response

tiers
object[]

One entry per plan (Free, Pro, API, API Business, Enterprise).

fetchedAt
integer

Epoch ms when the catalog was assembled.

cachedUntil
integer

Epoch ms until which the cached copy is served.

priceSource
enum<string>

Provenance of the prices in this payload — dodo (all live), partial (some live, gaps from static fallback), fallback (all static). Cache hits retain the value stored at seed time; the X-Product-Catalog-Source header additionally reports cache.

Available options:
dodo,
partial,
fallback