ZipToken

For developers & capital providers

Hedge From Inside Your Pro Forma

Price, size, and place a ZipToken hedge without leaving Excel — with an AI agent, the CLI, or a single-cell formula.

The problem

Your downside is a cell you can only stare at.

A development deal pencils on the development spread — your yield-on-cost (stabilized NOI ÷ total project cost) minus the exit cap rate — earned across an 18–36 month build and lease-up. You control the cost line. You do not control the two variables that decide whether the spread survives: the rents you actually achieve at delivery and the cap rate you exit at. Those two live in the Operations block (trended rents, lease-up and absorption, loss-to-lease, vacancy and credit loss → stabilized NOI) and the Reversion block (exit cap → reversion value) of your model.

So, following the modeling discipline you find in resources like Adventures in CRE, you stress them the classic way: a two-variable data table, exit cap rate across the top, rent growth down the side, reading out levered IRR and equity multiple. It is the right instinct. But it ends the same way every time — you land on the ugly corner cell, note the number, and move on. The interest reserve keeps burning, the takeout still assumes a stabilized asset, and peak equity is exposed the whole way. The table quantifies the pain. It does nothing about it.

DATA TABLE · LEVERED IRRrows: rent growth at deliveryEXIT / TERMINAL CAP RATE →5.00%5.25%5.50%5.75%6.00%+3.0%24.0%22.5%21.0%19.6%18.2%+1.5%21.0%19.5%18.0%BASE16.6%15.3%0.0%17.8%16.3%14.9%13.6%12.4%−1.5%14.2%12.7%11.3%10.0%8.8%−3.0%10.6%9.1%7.6%6.1%3.1%−$4.2M
The corner you can only stare at. Levered IRR by exit cap rate × rent growth. Your base case underwrites near the middle; the bottom-right cell — wider exit cap, rents that come in soft — prints a 3.1% IRR and a −$4.2M loss. Today that cell is a warning. It should be a line item you can act on.

The turn

Now that cell is something you can buy protection against.

ZipToken is an institutional exchange for parametric, index-settled downside protection on the exact variables that live in your model. Four settleable perils, each priced on a published index:

Home value → exit

Zillow ZHVI. Protects reversion value and the exit cap.

Lease rate → rents

Zillow ZORI. Protects realized rents at delivery.

Rental vacancy → lease-up

Apartment List. Protects absorption / the Leased % ramp.

Weather → construction delay

NOAA. Protects carry when weather stretches the schedule.

Each contract is index-settled: it pays on the published first print of its index, with no adjusters and no argument about what your building is worth. For home value and lease rate the default contract is now a graduated layer: you set a deductible (the index decline you absorb, with its dollar equivalent shown live), a coverage limit, and a term, and it pays proportionally above the deductible up to the limit — no all-or-nothing cliff. The binary trigger remains available under Advanced, and vacancy and weather contracts stay binary. You quantify the downside once, in your own model, and buy a defined payout against it.

Read this once. ZipToken is available to accredited and institutional participants only. This is risk transfer via index-settled derivatives — not insurance, and nothing here is an offer or solicitation. Every price shown is a reference / model price, not a firm executable quote until liquidity providers post against it. ZHVI and ZORI are Zillow data; index responses carry the required “Data from Zillow” attribution.

How it fits together

The loop.

The whole workflow is a short round trip that starts and ends in your workbook. Your model already holds the four inputs a quote needs. ZipToken turns them into a sized, priced hedge. That comes back as a premium line item and a protected IRR — and, when you are ready, executes.

YOUR PRO FORMA· exposure· geography· break-even· delivery dateZIPTOKENsearch_geo →get_index_value →get_quote →size_hedgeBACK INTO YOUR MODEL· premium as a line item· protected IRR· protected profit floorEXECUTE· accept on the platform· or place_order· trading-scope key
From the four values already in your pro forma, through ZipToken's tools, back into the model as a premium and a protected return, then out to execution. You never leave the sheet to run it.

Do it from Excel

Three ways to run it from Excel.

Same engine, three front doors — from zero code to a little. Start with the agent; drop to the CLI or a custom function when you want the numbers wired into the sheet permanently.

One methodology, three surfaces. The sizing here — proxy hedge ratio, the strike-ladder weighting, and the digital-contract count — is the same sizeHedge engine (@ziptoken/shared) behind the size_hedge agent tool and the ziptoken hedge size CLI command. It is also exactly what the Developer Hedging Workbook computes in-sheet — the workbook in Excel, size_hedge for agents, and ziptoken hedge size on the CLI — so numbers reconcile across all three.

a. With an AI agentrecommended

Connect Claude or Copilot to @ziptoken/mcp — the same MCP server documented on the SDK & Agent Tools page. Add one entry to your MCP config:

json
{
  "mcpServers": {
    "ziptoken": {
      "command": "node",
      "args": ["/absolute/path/to/zip_token/packages/mcp/dist/index.js"],
      "env": {
        "ZIPTOKEN_API_URL": "https://zip-token-production.up.railway.app",
        "ZIPTOKEN_API_KEY": ""
      }
    }
  }
}

Then open your model and ask in plain English. The agent reads the cells you point it at, walks search_geo get_index_value → a quote — the graduated layer via GET /api/quotes?kind=layered (the platform default), or the binary get_quote tool — → size_hedge as the ladder cross-check, and writes the premium and terms back into the sheet. With a trading-scope ZIPTOKEN_API_KEY and your explicit confirmation, it can place_order (BUY outcome 0 = accept a quote = downside protection) to execute.

You, in the chat panel next to Excel

Open my model. Price a 50% hedge on the rent downside for the
Charlotte deal in row 42, using the ZORI lease-rate index for
Mecklenburg County. Put the reference premium in AC42 and the
sizing in AD42:AF42. Don't place anything — just quote and size.

Agent

Read B42 (Charlotte, 220 units), G42 (exposure $6.0M rent NPV),
H42 (break-even −3% rents), K42 (delivery 2027-12).

  search_geo "Charlotte NC"        → county:37119 (Mecklenburg)
  get_index_value county:37119     → ZORI $1,624, YoY +2.1%  (Data from Zillow)
  quotes API node=county:37119  kind=layered  index=zori
             attachBps=300 (−3% deductible = your break-even)
             exhaustBps=800 (full limit at −8%)
             expiry=2027-12
             notional=6,000,000    → reference premium  $300,000  (5.0¢ / $1)
                                      coverage limit    $6,000,000
                                      chance of any payout 10.0% · full limit 1.5%
                                      deductible ≈ $3.6M of decline you absorb
  size_hedge cross-check (the manual 3-strike ladder ≈ this one layer)
             downside=0.08 fraction=0.5 → ladder premium ≈ $300k

Wrote AC42 = $300,000  ·  AD42:AF42 = deductible −3% / limit $6.0M / term 2027-12.
Reference / model pricing — not firm until liquidity providers post.
Say "place it" (needs a trading-scope key) and I'll execute; the binary
strike ladder via get_quote + place_order still works if you prefer it.

b. With the CLI

The @ziptoken/cli (ziptoken) runs the same math locally. ziptoken hedge size is a pure local calculation — you supply live strike prices; it sizes the ladder:

bash
$ ziptoken hedge size --exposure 6000000 --class multifamily-noi \
    --downside 0.08 --fraction 0.5 --attach 0.03 \
    --strikes 0.02,0.05,0.08 --price 0.06,0.09,0.13
text
Asset class: multifamily_noi  (beta_class=0.5, beta_geo=1, h_total=0.5000)
Hedge fraction: requested 50.0% -> capped 50.0%
Coverage target (C): $120,000

#  STRIKE  PRICE    PRICE(EFF)  WEIGHT  COVERAGE  CONTRACTS  PREMIUM
-  ------  -------  ----------  ------  --------  ---------  --------
1  -2.0%   $0.0600  $0.0606     40.0%   $48,000     51,096   $3,096
2  -5.0%   $0.0900  $0.0909     35.0%   $42,000     46,200   $4,200
3  -8.0%   $0.1300  $0.1313     25.0%   $30,000     34,534   $4,534

Total contracts:  131,830
Total premium:    $11,830  (0.20% of exposure)
Expected variance removed: ~35.0% (HE_mid=0.70 x F_capped=0.50)

Pull the output into Excel with Power Query or a paste, and use the read commands for live context: ziptoken index county:37119 for the current index value and YoY, ziptoken markets list --level county --state NC for listed markets and their prices, ziptoken geo search charlotte for the canonical node id, and ziptoken quote county:37119 --strike 800 --expiry 2027-12 --notional 6000000 for a reference RFQ price (the binary-trigger path; the graduated layer quotes via GET /api/quotes?kind=layered as in the single-cell function below).

c. With a single cell

For a number that refreshes with the model, wrap the public quotes endpoint in a custom function. The platform's default contract is now a graduated layer — deductible → limit — so the primary formula prices one: pick the deductible your pro forma tolerates (here the −3% break-even), the decline at which the full limit should pay (the −8% downside case), and the coverage limit. Then the reference premium is one formula:

excel
=ZIPTOKEN.QUOTE("county:37119", 300, 800, "2027-12", 6000000)
→ 300000     ' reference premium (USD) for a −3% → −8% layer, straight into the cell

Back it with an Office Scripts / custom-function snippet (or the equivalent in Python-in-Excel) that calls GET /api/quotes and returns premiumUsd into the cell:

typescript
/**
 * ZIPTOKEN.QUOTE — reference premium (USD) for graduated (layered)
 * downside protection, pulled live from GET /api/quotes into a single cell.
 * You absorb index decline up to the deductible; it pays proportionally
 * above it, reaching the full coverage limit at the exhaustion point.
 * @customfunction
 * @param node       geo node, e.g. "county:37119" (Mecklenburg / Charlotte)
 * @param attachBps  deductible — the index decline you absorb, e.g. 300 = −3%
 * @param exhaustBps decline at which the full limit pays, e.g. 800 = −8%
 * @param expiry     quarter-end expiry "YYYY-MM", e.g. "2027-12"
 * @param coverage   coverage limit (max payout) in USD
 */
async function QUOTE(node, attachBps, exhaustBps, expiry, coverage) {
  const base = "https://zip-token-production.up.railway.app";
  const url =
    base + "/api/quotes?node=" + encodeURIComponent(node) +
    "&kind=layered&attachBps=" + attachBps + "&exhaustBps=" + exhaustBps +
    "&index=zori&expiry=" + expiry + "&notional=" + coverage;
  const res = await fetch(url, { headers: { "x-api-key": "" } });
  if (!res.ok) throw new Error("ZipToken " + res.status); // 422 = invalid layer
  const q = await res.json();
  return q.premiumUsd;  // reference model price — not a firm executable quote
  // Binary trigger instead? Omit kind/attach/exhaust and pass &strikeBps= —
  // the API default stays binary, so existing strike-ladder cells keep working.
}

GET /api/quotes?node=&kind=layered&attachBps=&exhaustBps=&expiry=&notional= is public (an API key is optional and only raises your rate limit). It returns the reference quote — premium, the chance of any payout / of the full limit, and the deductible's dollar equivalent deductibleUsd = C·a/(x−a). Standard layers are 2→10 · 5→15 · 8→20 (%); a custom pair like the 3→8 above prices as a bespoke, indicative reference. exhaustBps ≤ attachBps is rejected (422). Omit kind and pass &strikeBps= for the legacy binary trigger — unchanged, so existing ladder cells keep working. Execution is a separate, authenticated step: POST /api/trading/orders from a KYC'd trading account.

The Developer Hedging Workbook is where you size the whole program in one sheet — and the binary variant of this same =ZIPTOKEN.QUOTE() function (pass strikeBps, omit the layer params) fills its one manual step, auto-filling the reference YES prices you would otherwise copy from the market pages into the strike ladder. The workbook's 3-strike ladder is the manual approximation of the graduated layer priced above — its guide now covers both.

Put it together

Worked example — a 220-unit multifamily in Charlotte.

An $80M ground-up multifamily deal in Mecklenburg County, delivering into a 2027 lease-up. The base case pencils; the downside — softer rents at delivery and a wider exit cap — is the corner cell from the top of this page. The hedge is sized to that corner: one graduated ZORI lease-rate layer — a −3% deductible (the pro forma's break-even) running to the full limit at −8% — plus a vacancy contract, settling on the same indices your Operations block already trends.

LineBase caseDownsideHedged
Total project cost$80.0M$80.0M$80.0M
Stabilized NOI$5.20M$4.30M$4.30M
Yield-on-cost6.50%5.38%5.38%
Exit / terminal cap5.50%6.00%6.00%
Development spread+100 bps−62 bps−62 bps
Levered IRR18.0%3.1%≈ 11.0%
Profit+$14.0M−$4.2M+$1.5M (floor)

The hedge line

Underlying: ZORI lease rate + Apartment List vacancy

Node: county:37119 (Mecklenburg)

Deductible / limit / term: −3% → full at −8% · 2027-12

Coverage limit (max payout): $6.0M

Reference premium: $300,000

Premium as % of cost: 0.38%

Protected IRR floor: ≈ 11.0%

Protected profit floor: +$1.5M

The $300k premium is a sunk soft cost of 0.38% of project cost. You absorb the first 3% of rent decline; above it the layer pays in proportion — a −5.5% print pays $3.0M, and −8% or worse pays the full $6.0M. In the corner-cell downside that payout, net of premium, turns the −$4.2M loss into a positive +$1.5M and lifts the protected IRR off the floor — with no cliff if rents land at −7.9% instead of −8%. The base case is barely touched — you gave up ~0.4% of cost to delete the tail.

Illustrative — reference model pricing, not a firm quote. Figures are round and internally consistent for teaching, not live market data. Actual pricing is set by liquidity providers at execution.

When the premium lands

Three ways the premium hits your pro forma.

The $300k above assumes you write the check at close. That is one of three payment structures you choose at quote time on the platform — the sizing, coverage, and protection are identical across all three; only when the premium hits your pro forma changes. For a pre-development budget with little cash to spare, the third is usually the one that matters.

Pay in full at close

The full $300k upfront — a sunk soft cost booked at close, exactly the line item in the example above. Simplest, and no financing charge.

Installments

A small down payment now (say 20%$60k) then level monthly payments at an APR; a financing charge accrues to the capital provider. Protection is active at close, same as paying in full.

Pay at funding / completion cash-light

$0 out of today's pre-development budget. The full premium plus a carry charge (illustratively ~$315k) is due at construction-loan funding or completion — on or before the contract expiry — and paid out of loan proceeds like other soft costs. Protection is still active at close.

Why the capital provider is fine waiting. On the deferred structure they collect the full premium for certain — the same spread as upfront — plus a carry charge for the wait, so there is no expected loss. The premium is owed regardless of whether the index breaches: it is a certain soft cost you have chosen to roll to funding, not a contingent, pay-only-if-it-triggers fee. You pick the structure when you accept the quote.

The case for the line item

Why it belongs in the model.

Underwritten as what it is — a small, sized, sunk premium — the hedge is a risk-budget soft cost that sits next to the interest reserve and the contingency. It converts an un-financeable tail into a known number, which changes three conversations. It strengthens the equity story with LPs: peak equity now carries a defined floor instead of an open-ended corner cell. It gives construction lenders lease-up and completion comfort, because absorption and delay risk have a named backstop. And it lets you defend the development spread you underwrote — the whole reason the deal exists — across the 18–36 month window when you cannot control rents or exit cap. A premium you can size beats a downside you can only stare at.

Next

Get started.

Price a hedge from your model

Accredited & institutional participants only.

ZipToken is a technology platform. ZipToken is not an insurance company, insurance producer, or broker, and does not currently offer, sell, or solicit insurance. Quotes shown are non-binding reference estimates generated from published index data for demand-assessment purposes only. Any future coverage products are expected to be underwritten and issued by licensed insurance or reinsurance partners. Nothing on this site is an offer of insurance, an insurance contract, or financial advice. Full legal & disclosures

© 2026 ZipToken — research preview. Balances and money surfaces are SIMULATED.Index data: Zillow ZHVI/ZORI · Apartment List · NOAA/NCEI