Skip to main content
POST
/
v1
/
tools
/
stock_universe
curl
curl -sS "https://api.stockcontext.com/v1/tools/stock_universe" \
  -H "X-API-Key: $STOCKCONTEXT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"coverage":"has_fundamentals","limit":100}'
import requests

url = "https://api.stockcontext.com/v1/tools/stock_universe"

payload = {
    "coverage": "has_fundamentals",
    "limit": 100
}
headers = {
    "X-API-Key": "<api-key>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
  method: 'POST',
  headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
  body: JSON.stringify({coverage: 'has_fundamentals', limit: 100})
};

fetch('https://api.stockcontext.com/v1/tools/stock_universe', 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://api.stockcontext.com/v1/tools/stock_universe",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'coverage' => 'has_fundamentals',
    'limit' => 100
  ]),
  CURLOPT_HTTPHEADER => [
    "Content-Type: application/json",
    "X-API-Key: <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"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.stockcontext.com/v1/tools/stock_universe"

	payload := strings.NewReader("{\n  \"coverage\": \"has_fundamentals\",\n  \"limit\": 100\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("X-API-Key", "<api-key>")
	req.Header.Add("Content-Type", "application/json")

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

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

	fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.stockcontext.com/v1/tools/stock_universe")
  .header("X-API-Key", "<api-key>")
  .header("Content-Type", "application/json")
  .body("{\n  \"coverage\": \"has_fundamentals\",\n  \"limit\": 100\n}")
  .asString();
require 'uri'
require 'net/http'

url = URI("https://api.stockcontext.com/v1/tools/stock_universe")

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

request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"coverage\": \"has_fundamentals\",\n  \"limit\": 100\n}"

response = http.request(request)
puts response.read_body
{ "data": { "page": { "offset": 0, "limit": 100, "listings_total": 6976, "listings_returned": 100, "listings_omitted": 6876, "exhaustive": false, "next_offset": 100 }, "filters": { "coverage": "has_fundamentals" }, "columns": [ "ticker", "name", "cik", "exchange", "shape", "coverage" ], "rows": [ [ "AAPL", "Apple Inc.", "0000320193", "XNAS", "operating_company", "has_fundamentals" ] ] }, "meta": { "schema_version": "2" } }
stock_universe is schema-2 only. Omit schema or send { "schema": 2 }.
The default page returns 100 ticker-sorted listings. Use offset and limit (maximum 500) to continue, and filter by coverage or shape before running a fundamentals screen. The three coverage markers are mutually exclusive database facts: has_fundamentals, prices_only, and discovery_only. has_fundamentals means a published overview build exists; values inside it may still serve as verification_pending during scoring windows. This differs from stock_search preflight, which checks the financials pointer to answer whether statements are servable.

Authorizations

X-API-Key
string
header
required

Body

application/json

Schema-2-only listing universe page.

coverage
enum<string>

Optional mutually exclusive database-derived coverage marker.

Available options:
has_fundamentals,
prices_only,
discovery_only
shape
enum<string>

Optional published filer-shape filter.

Available options:
operating_company,
bank,
broker_dealer,
insurer,
reit,
bdc,
ifrs,
ifrs_bank,
ifrs_insurer
offset
integer
default:0
Required range: x >= 0
limit
integer
default:100
Required range: 1 <= x <= 500
schema
enum<integer>
default:2

This new endpoint is schema-2 only.

Available options:
2

Response

A columnar page with visible omitted-count and continuation metadata.

Schema-2 envelope. The OpenAPI schema is structural; captured examples are authoritative for full nested payload detail.

data
object
required

Tool payload or typed schema-2 refusal.

meta
object
required

Schema-2 metadata. Unknown optional fields are omitted, not emitted as null.

subject
object

Resolved entity and security when the tool has a single subject.