curl --request GET \
--url https://api.skylit.ai/v1/stream \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.skylit.ai/v1/stream"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.skylit.ai/v1/stream', 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.skylit.ai/v1/stream",
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://api.skylit.ai/v1/stream"
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://api.skylit.ai/v1/stream")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.skylit.ai/v1/stream")
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"<string>"{
"error": {
"code": "no_data",
"message": "<string>"
}
}{
"error": {
"code": "no_data",
"message": "<string>"
}
}{
"error": {
"code": "no_data",
"message": "<string>"
}
}{
"error": {
"code": "no_data",
"message": "<string>"
}
}{
"error": {
"code": "no_data",
"message": "<string>"
}
}Live SSE stream (one symbol per connection)
A Server-Sent Events (text/event-stream) feed of live per-strike
heatmap updates for one symbol. Open one connection per symbol.
Events:
connected— handshake, payload{symbol, creditsRemaining}.initial_data— current heatmap snapshot on connect.snapshot_update— full heatmap on each change.velocity_update— per-strike % change.credits— emitted every minute boundary, payload{remaining}.closed— stream terminates with{reason: "insufficient_credits" | "account_suspended" | "credit_check_failed"}.reconnect— server is recycling the connection (after ~1h), payload{reason: "max_duration"}. Reconnect to continue.: keepalivecomment every 30s for proxy keepalive.
Pricing. 1 credit on connect (charged before the SSE upgrade —
an under-funded client gets a clean 402 HTTP response, not a
half-open stream), then 1 credit per minute open. The per-minute
ticker emits event: credits {remaining: N} after each successful
debit so clients can budget the next minute.
Concurrency. The number of concurrent streams per customer is
capped. Exceeding the cap returns 429 stream_limit_reached.
OpenAPI is request/response-oriented and can’t fully model an event stream; the events listed above cover the stream lifecycle.
curl --request GET \
--url https://api.skylit.ai/v1/stream \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.skylit.ai/v1/stream"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.skylit.ai/v1/stream', 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.skylit.ai/v1/stream",
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://api.skylit.ai/v1/stream"
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://api.skylit.ai/v1/stream")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.skylit.ai/v1/stream")
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"<string>"{
"error": {
"code": "no_data",
"message": "<string>"
}
}{
"error": {
"code": "no_data",
"message": "<string>"
}
}{
"error": {
"code": "no_data",
"message": "<string>"
}
}{
"error": {
"code": "no_data",
"message": "<string>"
}
}{
"error": {
"code": "no_data",
"message": "<string>"
}
}Authorizations
Skylit API key in the Authorization header
(Authorization: Bearer <key>). X-API-Key is also accepted.
Query Parameters
Single ticker to stream (e.g. SPY). One symbol per connection.
"SPY"
Which Greek exposure to return per strike.
gamma, vanna Maximum number of strikes around spot to return.
1 <= x <= 400Response
An SSE stream of heatmap events.
SSE frames, e.g. event: snapshot_update then data: {SymbolHeatmap}.
The snapshot_update data payload matches #/components/schemas/SymbolHeatmap.
Was this page helpful?

