curl --request GET \
--url https://www.worldmonitor.app/api/product-catalogimport 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": 299.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"
}GetProductCatalog
Returns the live tier view-model used by the /pro pricing page: plan names, descriptions, feature bullets, monthly/annual USD prices, and Dodo Payments product IDs. Public — no API key required. Cached in Redis for 1 hour; on cache miss, prices are fetched live from Dodo Payments with a static fallback if Dodo is unreachable. The X-Product-Catalog-Source response header distinguishes cache hits (“cache”) from live fetches (“dodo”) and fallback pricing (“fallback”). Markdown twin: https://worldmonitor.app/pricing.md
curl --request GET \
--url https://www.worldmonitor.app/api/product-catalogimport 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": 299.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
Successful response
One entry per plan (Free, Pro, API, API Business, Enterprise).
Show child attributes
Show child attributes
Epoch ms when the catalog was assembled.
Epoch ms until which the cached copy is served.
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.
dodo, partial, fallback Was this page helpful?
