Are Dealers Net Long or Short Premium? Reading Net Dealer Premium Flow | FlashAlpha

Are Dealers Net Long or Short Premium? Reading Net Dealer Premium Flow

One number tells you whether dealers are net long or short premium right now. The FlashAlpha net dealer premium endpoint sums each side of the customer-flow tape weighted by per-minute VWAP over a configurable window, dealers buy when customers hit the bid, write when customers lift the ask. The signed difference flags whether dealers are likely to dampen or chase the next move. Alpha plan.

T
Tomasz Dobrowolski Quant Engineer
Jun 13, 2026
27 min read
OptionsFlow DealerPositioning Premium VWAP API DeveloperGuide Python

If you are looking for a dealer premium API, a way to measure whether market makers are net long or short options premium, a VWAP-weighted options flow roll-up, or a single signal for dealer hedging appetite, this is the reference. The FlashAlpha GET /v1/flow/options/{symbol}/dealer-premium endpoint aggregates the full customer-flow tape over a configurable window, weighting each side by per-minute VWAP, and returns the signed net_dealer_premium, positive when dealers are net long premium, negative when they are net short. It is on the Alpha plan.

Read this first. This is a derived signal off the FlashAlpha customer-flow tape, not exchange-audited accounting. The buyer/seller side is an inference (dealer buys when the customer hits the bid; dealer writes when the customer lifts the ask), and premium is weighted by each minute bucket's VWAP, a minute-resolution approximation, not trade-by-trade exact premium. The JSON below is an illustrative shape with placeholder numbers. Use the sign and the trend for relative signal, not for reconciliation. For trade-by-trade exact premium, drive from /v1/flow/options/{symbol}/recent.


What "Net Dealer Premium" Actually Measures

Every options trade has a customer and a dealer on opposite sides. The endpoint classifies each print by who was the aggressor and tallies the premium accordingly:

When the customer...The dealer is the...Premium accrues to
hits the bid (sells)buyerdealer_buy_premium
lifts the ask (buys)writerdealer_write_premium

The headline number is the signed difference:

net_dealer_premium = dealer_buy_premium − dealer_write_premium

  • Positive → dealers are net long premium over the window. They are paying out theta and tend to be long gamma, a configuration that dampens price moves as they hedge against the trend.
  • Negative → dealers are net short premium. They collected theta but are exposed, a configuration that tends to make hedging chase the move and amplify it.

That single sign is a fast, standing read on whether the tape is set up to fade or to follow. It is distinct from /v1/flow/signals/{symbol}/summary, which only rolls up block-sized signal prints, the dealer premium endpoint aggregates the full tape, not just the unusual prints.

One signed number: are dealers net long or short premium right now?

Full-tape VWAP-weighted roll-up over a window you choose. Alpha plan.

Get API Access

Quick Start

Path is the underlying symbol; the optional windowMinutes (default 240, clamped 1-10080) sets the rolling lookback, and an optional expiry filter isolates a single expiration.

from flashalpha import FlashAlpha

fa = FlashAlpha("YOUR_API_KEY")

d = fa.flow_dealer_premium("SPY", window_minutes=240)

net = d["net_dealer_premium"]
bias = "LONG premium (dampening)" if net > 0 else "SHORT premium (chasing)"
print(f"SPY net dealer premium: {net:,.0f}  ->  dealers {bias}")
print(f"  buy {d['dealer_buy_premium']:,.0f}  write {d['dealer_write_premium']:,.0f}"
      f"  over {d['bucket_count']} buckets / {d['trade_count']:,} trades")
import { FlashAlpha } from 'flashalpha';

const fa = new FlashAlpha('YOUR_API_KEY');

const d = await fa.flowDealerPremium('SPY', { windowMinutes: 240 });

const net = d.net_dealer_premium;
const bias = net > 0 ? 'LONG premium (dampening)' : 'SHORT premium (chasing)';
console.log(`SPY net dealer premium: ${net.toLocaleString()}  ->  dealers ${bias}`);
using FlashAlpha;

var client = new FlashAlphaClient("YOUR_API_KEY");

var d = await client.FlowDealerPremiumAsync("SPY", windowMinutes: 240);

var net = d.GetProperty("net_dealer_premium").GetDouble();
Console.WriteLine($"SPY net dealer premium: {net:N0} -> dealers {(net > 0 ? "LONG" : "SHORT")} premium");
package main

import (
    "context"
    "fmt"

    flashalpha "github.com/FlashAlpha-lab/flashalpha-go"
)

func main() {
    fa := flashalpha.NewClient("YOUR_API_KEY")

    // Default window is 240 minutes
    d, err := fa.FlowDealerPremium(context.Background(), "SPY")
    if err != nil {
        panic(err)
    }

    net := d["net_dealer_premium"].(float64)
    bias := "SHORT premium (chasing)"
    if net > 0 {
        bias = "LONG premium (dampening)"
    }
    fmt.Printf("SPY net dealer premium: %.0f -> dealers %s\n", net, bias)
}
curl -H "X-Api-Key: YOUR_KEY" \
  "https://lab.flashalpha.com/v1/flow/options/SPY/dealer-premium?windowMinutes=240"

# Isolate a single expiry (e.g. around an earnings or OPEX print)
curl -H "X-Api-Key: YOUR_KEY" \
  "https://lab.flashalpha.com/v1/flow/options/SPY/dealer-premium?expiry=2026-06-19"
$ pip install flashalpha  |  npm install flashalpha  |  dotnet add package FlashAlpha  |  go get github.com/FlashAlpha-lab/flashalpha-go

Response Shape

An illustrative shape with placeholder numbers, snake_case fields, premium in dollars:

{
  "symbol": "SPY",
  "as_of": "2026-06-13T15:30:00Z",
  "window_minutes": 240,
  "expiry": null,
  "dealer_buy_premium": 12450000.0,
  "dealer_write_premium": 18200000.0,
  "net_dealer_premium": -5750000.0,
  "total_premium": 30650000.0,
  "trade_count": 18420,
  "bucket_count": 240
}
FieldWhat it means
dealer_buy_premiumΣ (sellVolume × vwap × 100) across minute buckets, premium where the dealer was the buyer (customer hit the bid).
dealer_write_premiumΣ (buyVolume × vwap × 100), premium where the dealer was the writer (customer lifted the ask).
net_dealer_premiumThe signed headline: buy − write. Positive ⇒ dealers net long premium; negative ⇒ net short.
total_premiumbuy + write, total directional premium traded (mid prints excluded). A magnitude/intensity gauge.
trade_count / bucket_countCoverage. Thin buckets mean a noisy aggregate, discount the read when these are low.

In the sample above the number is negative: write premium exceeds buy premium, so dealers are net short premium over the trailing four hours, the configuration where hedging tends to chase moves.

How To Read It

1. The sign: fade or follow

The first read is just the sign. Positive net dealer premium flags dealers net long (likely to dampen the next move, mean-reversion friendly). Negative flags dealers net short (likely to chase, momentum friendly). This pairs naturally with a gamma read: short-premium plus negative GEX is the cleanest "moves get amplified" setup.

2. The flip through zero: a regime change

Re-poll on a rolling windowMinutes and watch for net_dealer_premium crossing zero. A flip from positive to negative means the tape has shifted from dealers absorbing flow to dealers being pushed short, a regime change worth acting on, and one that often precedes a pickup in realised volatility.

3. The two sides: which flow dominates

Compare dealer_buy_premium against dealer_write_premium directly. A large, lopsided write number means customers are aggressively buying premium (lifting offers), the dealer is accumulating short-premium risk that has to be hedged into the underlying. The ratio, not just the net, tells you how one-sided the pressure is.

4. Isolate an expiry around an event

Pass expiry to study dealer positioning around a single date, an earnings print, an OPEX, a Fed day. Net dealer premium concentrated in one near-dated expiry is a very different risk than the same number spread across the term structure.

A Worked Example: Fade vs Follow Gate

A common use is a simple gate that decides whether a strategy should fade or follow intraday, combining the premium sign with a gamma read:

from flashalpha import FlashAlpha

fa = FlashAlpha("YOUR_API_KEY")

sym = "SPY"
prem = fa.flow_dealer_premium(sym, window_minutes=120)
gex  = fa.gex(sym)                              # settled gamma exposure

net_prem = prem["net_dealer_premium"]
net_gex  = gex["net_gex"]
coverage = prem["bucket_count"]

if coverage < 20:
    stance = "stand aside - thin coverage, premium read unreliable"
elif net_prem < 0 and net_gex < 0:
    stance = "FOLLOW - dealers short premium AND short gamma, moves amplify"
elif net_prem > 0 and net_gex > 0:
    stance = "FADE - dealers long premium AND long gamma, moves dampen"
else:
    stance = "mixed - premium and gamma disagree, reduce conviction"

print(f"{sym}: net_prem={net_prem:,.0f}  net_gex={net_gex:,.0f}  ->  {stance}")

The premium sign and the gamma sign agreeing is the high-conviction case; disagreeing is the signal to size down. The coverage guard matters, a premium read off a handful of thin minute buckets is noise, and bucket_count is how you catch that.

How It Differs From the Rest of the Flow Stack

  • vs. flow signals summary (/v1/flow/signals/{symbol}/summary), that only rolls up block-sized signal prints. Dealer premium aggregates the full tape, so it captures the broad base of flow, not just the unusual standouts.
  • vs. dealer risk (/v1/flow/dealer-risk), that measures the dealer's net Greek exposure shift from flow. Dealer premium measures the cash premium each side paid. They are complementary: premium is the money, dealer risk is the resulting hedging obligation.
  • vs. recent trades (/v1/flow/options/{symbol}/recent), that is the raw print-by-print tape. Use it when you need trade-by-trade exact premium; dealer premium is the pre-aggregated, VWAP-weighted summary built on top.

API Access and Pricing

The net dealer premium endpoint is on the Alpha plan, alongside the rest of the raw and full-tape flow surface.

PlanPriceDealer premiumRate Limit
Free$0No5 req/day
Basicfrom $63/moNo100 req/day
Growthfrom $239/moNo2,500 req/day
Alphafrom $1,199/moYesUnlimited

Try the shape in the browser via the dealer premium endpoint docs (live "Try It" widget) or the interactive API playground. SDKs cover Python, JavaScript, C#, Go, and Java.

Know whether dealers are long or short premium, in one call

Full-tape, VWAP-weighted, windowed. Alpha plan. Pairs with GEX for a fade-or-follow gate.

Get API Access

Frequently Asked Questions

Call GET /v1/flow/options/{symbol}/dealer-premium and read the sign of net_dealer_premium. Positive means dealers are net long premium over the window (they tend to dampen moves); negative means net short (hedging tends to chase moves). The number is the full customer-flow tape summed by side and weighted by per-minute VWAP, on the Alpha plan.
dealer_buy_premium accrues when the customer hits the bid, making the dealer the buyer; dealer_write_premium accrues when the customer lifts the ask, making the dealer the writer. Each is VWAP-weighted per minute bucket. A large, lopsided write number means customers are aggressively buying premium and the dealer is accumulating short-premium risk to hedge.
No, it is a derived signal, not exchange-audited accounting. Side is inferred (dealer buys when the customer hits the bid, writes when the customer lifts the ask) and premium is weighted by each minute bucket's VWAP, a minute-resolution approximation. Use the sign and the trend for relative signal. For trade-by-trade exact premium, drive from /v1/flow/options/{symbol}/recent.
Flow signals (and its summary) roll up only block-sized, unusual prints. Net dealer premium aggregates the full customer-flow tape, so it captures the broad base of flow rather than just the standout trades. It is also distinct from dealer risk, which measures the dealer's net Greek exposure shift; premium measures the cash each side paid, dealer risk measures the resulting hedging obligation.
The net dealer premium endpoint is on the Alpha plan (from $1,199/mo, unlimited rate), alongside the rest of the full-tape and raw flow surface. It is not available on Free, Basic, or Growth.

Live Market Pulse

Get tick-by-tick visibility into market shifts with full-chain analytics streaming in real time.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Execution-Ready

Instantly send structured orders to Interactive Brokers right from your scan results.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!