Skip to content

Quickstart

Prerequisites

  • OS: Windows 10+, macOS 12+, or Linux (x64)
  • RAM: ~1 GB
  • Disk: ~100 MB
  • Network: outbound HTTPS (for subscription validation and runtime data)

Where this runs

Gateway runs on your machine and listens on localhost:2112. Specific contracts, strikes, and position sizes never leave your machine -- only the underlying tickers you query (plus a handful of reference tickers like SPX/QQQ used for calibration) are sent to the Lavender cloud. See Network requirements for the outbound host and binding details.

1. Start Gateway

  1. Subscribe at gateway.lavender-ts.com -- 7-day free trial available (credit card required).
  2. Download the Gateway binary for your OS:
    • Gateway.exe (Windows)
    • Gateway (macOS)
    • Gateway (Linux x64)
  3. Run it:

    Double-click Gateway.exe. Windows SmartScreen may flag the binary on first launch — click More infoRun anyway.

    Open Terminal, cd to the download folder, then run chmod +x ./Gateway && ./Gateway. If macOS reports "cannot verify the developer", run xattr -d com.apple.quarantine ./Gateway once and try again.

    Open a terminal, cd to the download folder, then run chmod +x ./Gateway && ./Gateway.

    On first launch you'll be prompted for the email associated with your subscription. To skip the prompt -- e.g. for service installs or scheduled tasks -- pass it on the command line:

    Gateway.exe -id=me@example.com   # Windows
    ./Gateway    -id=me@example.com  # macOS / Linux
    
    4. Gateway listens on localhost:2112.

For the full set of runtime flags, console output, and the housekeeping window, see Running Gateway.

Didn't receive the download?

Contact info@lavender-ts.com or visit gateway access for next steps.

What you should see

Gateway running

Troubleshooting

  • "Email not recognized" — verify you're using the exact email from your subscription confirmation
  • Port 2112 already in use — Gateway exits with a clear port 2112 is already in use message; relaunch with -port=<n> or stop the other process
  • 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 Gateway is running, paste this into any browser:

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

The at-the-forward call and put for every SPY expiry, rendered as an HTML table — no API key, no code, no setup. Change the symbol or drop the center=atf filter to widen the view.

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 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/v1/options/chain/SPY?dte=30&format=html

MarketData.app 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&center=atf&format=json"
import pandas as pd

url = "http://localhost:2112/l1/greeks"
df = pd.read_csv(f"{url}?root=SPY&center=atf&format=csv")
print(df[["expiry", "strike", "right", "delta", "vega", "theta", "decay", "vol"]].head())
df <- read.csv(paste0(
  "http://localhost:2112/l1/greeks",
  "?root=SPY&center=atf&format=csv"))
head(df[, c("expiry", "strike", "right", "delta", "vega", "theta", "decay", "vol")])
using var client = new HttpClient();
var json = await client.GetStringAsync(
    "http://localhost:2112/l1/greeks?root=SPY&center=atf&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&center=atf&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&center=atf&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&center=atf&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&center=atf&format=csv")
df = CSV.read(IOBuffer(resp.body), DataFrame)
first(df[:, [:expiry, :strike, :right, :delta, :vega, :theta, :decay, :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.

Next steps

  • Lavender API — native REST endpoints, field groups, term structure, filtering
  • Field Reference — every L1 field, units, and the worked example
  • Verify the Greeks — match Lavender to a reference Black-76 in Python, R, or Excel
  • Greek conventions — sign conventions, units, and the full extended Greeks catalog