Skip to content

Quickstart

Prerequisites

  • OS: Windows 10+ or Windows Server 2016+ (macOS and Linux are not currently supported)
  • Disk: ~150 MB (self-contained, no additional components required)
  • Network: Outbound HTTPS access (the gateway pulls market data and validates your subscription)

1. Start the Gateway

  1. Subscribe at gateway.lavender-ts.com
  2. Check your email for the download link and credentials
  3. Run Lavender.exe and enter the email associated with your subscription
  4. The gateway starts on localhost:2112

Didn't receive the email?

Check your spam folder. If it's not there, contact info@lavender-ts.com or visit gateway access for next steps.

What you should see

After launching, the gateway starts immediately and localhost:2112 is ready to accept requests.

Gateway console after startup

Troubleshooting

  • "Email not recognized" — verify you're using the exact email from your subscription confirmation
  • Port 2112 already in use — close any other application on that port and relaunch
  • No data appearing — ensure outbound HTTPS is not blocked by a firewall or VPN
  • Still stuck? Contact info@lavender-ts.com or ask in Discord

2. Try It in Your Browser

Once the gateway is running, paste this into any browser:

http://localhost:2112/l1/greeks?root=SPY&format=html

A full chain of Greeks rendered as an HTML table — no API key, no code, no setup. Change the symbol and refresh.

Every endpoint supports format=html

Append &format=html (or ?format=html) to any Lavender endpoint — including all vendor compatibility endpoints — and you get a rendered table in your browser. Great for quick inspection, spot-checking Greeks, or sharing a link with a colleague.


Already Using a Vendor?

If you have existing code that fetches option Greeks from one of these vendors, you can point it at the gateway by changing the host — no other code changes needed. Your existing API keys are accepted and ignored.

Paste one of these into your browser to see Greeks through your vendor's endpoint right now:

http://localhost:2112/v1beta1/options/snapshots/SPY?format=html

Alpaca compatibility guide

http://localhost:2112/query?function=realtime_options&symbol=SPY&require_greeks=true&format=html

AlphaVantage compatibility guide

http://localhost:2112/options/chain/SPY/2026-12-18/realtime?format=html

Intrinio compatibility guide

http://localhost:2112/allaccess/market/option-and-underlying-quotes?symbol=SPY&format=html

LiveVol compatibility guide

http://localhost:2112/datav2/strikes?ticker=SPY&dte=0,30&format=html

Orats compatibility guide

http://localhost:2112/v3/snapshot/options/SPY?format=html

Polygon.io compatibility guide

http://localhost:2112/v3/option/snapshot/greeks/all?symbol=SPY&expiration=*&max_dte=30&format=html

ThetaData compatibility guide

http://localhost:2112/v1/markets/options/chains?symbol=SPY&greeks=true&format=html

Tradier compatibility guide

Same data, same wire format your code already expects — just rendered as a table. When you're ready to integrate, swap the host in your existing code and the JSON/CSV response works unchanged.


Starting Fresh?

If you're not migrating from a vendor, start with the Lavender native API. All endpoints support four output formats: JSON, CSV, NDJSON, and HTML.

Fetch option Greeks

curl "http://localhost:2112/l1/greeks?root=SPY&format=json"
import pandas as pd

url = "http://localhost:2112/l1/greeks"
df = pd.read_csv(f"{url}?root=SPY&format=csv")
print(df[["expiry", "strike", "right", "delta", "vega", "theta", "decay", "lav_vol"]].head())
df <- read.csv(paste0(
  "http://localhost:2112/l1/greeks",
  "?root=SPY&format=csv"))
head(df[, c("expiry", "strike", "right", "delta", "vega", "theta", "decay", "lav_vol")])
using var client = new HttpClient();
var json = await client.GetStringAsync(
    "http://localhost:2112/l1/greeks?root=SPY&format=json");

using var doc = JsonDocument.Parse(json);
foreach (var row in doc.RootElement.EnumerateArray().Take(5))
{
    Console.WriteLine($"{row.GetProperty("expiry")} " +
        $"{row.GetProperty("strike")} {row.GetProperty("right")}: " +
        $"delta={row.GetProperty("delta")}");
}
#include <cpr/cpr.h>
#include <nlohmann/json.hpp>
using json = nlohmann::json;

auto r = cpr::Get(cpr::Url{
    "http://localhost:2112/l1/greeks?root=SPY&format=json"});
auto data = json::parse(r.text);

for (auto& row : data | std::views::take(5))
    std::cout << row["expiry"] << " " << row["strike"]
              << " delta=" << row["delta"] << "\n";
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
    .uri(URI.create(
        "http://localhost:2112/l1/greeks?root=SPY&format=json"))
    .build();

var response = client.send(request, HttpResponse.BodyHandlers.ofString());
var array = new JSONArray(response.body());
for (int i = 0; i < Math.min(5, array.length()); i++) {
    var row = array.getJSONObject(i);
    System.out.printf("%s %.0f %s: delta=%.3f%n",
        row.getString("expiry"), row.getDouble("strike"),
        row.getString("right"), row.getDouble("delta"));
}
const resp = await fetch(
  "http://localhost:2112/l1/greeks?root=SPY&format=json"
);
const greeks = await resp.json();
greeks.slice(0, 5).forEach(c =>
  console.log(`${c.expiry} ${c.strike} ${c.right}: delta=${c.delta}`)
);
using CSV, DataFrames, HTTP

resp = HTTP.get(
    "http://localhost:2112/l1/greeks?root=SPY&format=csv")
df = CSV.read(IOBuffer(resp.body), DataFrame)
first(df[:, [:expiry, :strike, :right, :delta, :vega, :theta, :decay, :lav_vol]], 5)

Want extended Greeks? Add greeks=all to include second and third-order Greeks (vanna, charm, volga, speed, color, and more). See the Lavender API reference for all field groups and Greek conventions for the full catalog.

Montage

The gateway includes a real-time visual montage for browsing option chains, Greeks, and volatility surfaces across the full OPRA universe.

Gateway Montage — NVDA option chain

Next steps

  • Greek conventions — sign conventions, units, and the full extended Greeks catalog
  • Lavender API — native endpoints with quality metadata and the Montage