A level and a title
The bare minimum.
https://chartmath.com/c?i=NVDA&h=hi:20:20d+high&t=NVDA+daily&by=example
A chart is one URL. Write it from memory, send it to anyone, and it renders live: no install, no account, no screenshot.
The grammar is plain query params. Nothing is base64, nothing is JSON, and a malformed item is skipped and counted rather than blanking the page.
A blank chart with the drawing tools on. What you draw is the URL, and the URL is what you send.
The whole grammar in one plain-text page, under two thousand tokens. Everything below is the same thing, for people.
Each one renders live. Read the URL, then open it.
The bare minimum.
https://chartmath.com/c?i=NVDA&h=hi:20:20d+high&t=NVDA+daily&by=example
Tier 0: the author computes nothing; the viewer does.
https://chartmath.com/c?i=NVDA&tf=D&h=hi:20:20d+high&h=ema:50&box=range:30&tl=swing:hi&ind=ema20&by=example
Tier 1: a base as a box, an authored plan, a note.
https://chartmath.com/c?i=NVDA&tf=D&at=2026-09-04&w=90,20&box=2026-08-11,2026-09-04,207.25,234.75:Range&plan=230.3,222.9,245.1:Swing+long&v=2026-09-04:Screen+fired&n=Range+is+18+bars+at+13%25+height.+Entry+on+a+close+above+it,+stop+under+the+Sep+1+swing+low.&by=example
NSE, a marker, anchored text.
https://chartmath.com/c?i=NSE-RELIANCE&tf=W&h=lo:50:50w+low&m=2026-07-20:Reversal+bar:below&txt=2026-06-08,1290:Volume+dried+up+here&by=example
Datetimes, a ray through swing lows, embed mode.
https://chartmath.com/c?i=BTCUSDT&tf=1h&at=2026-09-04T14:00&w=60,10&h=last&ray=swing:lo&theme=dark&e=1&by=example
What the chart is. One of each per URL.
| Param | What it means | Examples |
|---|---|---|
i= SYMBOL or EXCHANGE-SYMBOL | Instrument. A bare symbol resolves US, then India, then Crypto; first hit wins. EXCHANGE-SYMBOL is exact. Required. |
|
tf= D W M 1h 15m 5m 1m | Timeframe. Default D. |
|
at= TIME | Anchor bar. Named references are computed as of the anchor. Default last bar. |
|
w= before[,after] | Window in bars around the anchor (before ≤ 500, after ≤ 200). Drawings outside it may sit off-screen. Default 120,10. |
|
win= TIME,TIME | Visible window as two times (what a pan leaves on screen). Overrides w for the opening view; never moves the anchor. last may be the right edge. Default the w window. |
|
tz= exchange utc local | Display clock for the axis. Times you write stay exchange-local. local is the reader's zone. Default exchange. |
|
ind= ema<N> sma<N> bb<N> rsi<N> atr<N> macd vwap, comma-separated | Indicators, max 6. Volume is always shown. |
|
t= text ≤80 | Title. |
|
n= text ≤500 | Note under the chart. Plain text, no links. |
|
by= [a-z0-9_.-]{1,32} | Author, shown as "drawn by". |
|
theme= dark or light | Colour scheme. Default site theme. |
|
e= 1 | Embed: chart only, no header, note, or panel. |
|
What is on the chart. Every one of these repeats, and they draw in the order they appear in the URL.
| Param | What it means | Examples |
|---|---|---|
h= PRICE[@TIME][:LABEL[:COLOR]] | Horizontal level. @TIME starts it at that bar (ray). Default amber. |
|
h= PANE:VALUE[:LABEL[:COLOR]] where PANE is rsi atr macd vol | A level on an indicator pane, on its own scale (rsi matches rsi14 or rsi7). Volume takes k, M or B. Ignored when that pane is absent. |
|
v= TIME[:LABEL[:COLOR]] | Vertical marker at a bar. Default blue. |
|
box= TIME,TIME,PRICE,PRICE[:LABEL[:COLOR]] or range:N[:LABEL[:COLOR]] | Shaded rectangle: from, to, low, high. Chip shows bars and % height automatically. Default blue. |
|
tl= TIME,PRICE,TIME,PRICE[:LABEL[:COLOR]] or swing:hi / swing:lo | Two-point segment. Chip shows % and bars automatically. Default purple. |
|
ray= same as tl | The same line extended right to the chart edge. |
|
m= TIME:TEXT[:above|below] | Bar marker with text. below (default) is an up-arrow under the bar, above a down-arrow over it. |
|
txt= TIME,PRICE:TEXT[:COLOR] | Anchored text with a pointer to its bar and price. |
|
plan= PRICE,PRICE,PRICE[:LABEL[:COLOR]] | Trade plan: entry, stop, target (side from where the stop sits). Three lines, risk and reward zones, an R:R chip. |
|
A level can sit on an indicator pane as well as on price: h=rsi:70, h=macd:0, h=vol:50M. It is drawn on that pane, tagged on that pane's axis, and dragged there. If the indicator is not on the chart the item is ignored and the page says which pane was missing, rather than putting 70 somewhere in the share price.
An authored plan (plan=) is dashed and carries the author's label. It represents the author's analysis.
Eight, fixed. Write the name instead of the number and the viewer computes it from live data, as of the anchor bar. The read layer computes them with the same code, so what an agent reads is what the viewer draws.
hi:N | Highest high of the N bars ending at the anchor. | any PRICE |
lo:N | Lowest low of the N bars ending at the anchor. | any PRICE |
ema:N | EMA of closes, period N, at the anchor. | any PRICE |
sma:N | Simple mean of the N closes ending at the anchor. | any PRICE |
last | Close of the anchor bar (live last price when the anchor is the last bar). | any PRICE or TIME |
range:N | The box spanning the N bars ending at the anchor: lo:N to hi:N. | box only |
swing:hi | Line through the two most recent swing highs (a bar higher than the three bars on each side). | tl and ray only |
swing:lo | Line through the two most recent swing lows. | tl and ray only |
Names only, and every primitive has a default, so you rarely need one: amber · blue · red · green · gray · purple · orange · cyan
40 drawings per URL, title 80 characters, note 500, label and marker text 40, 6 indicators, window 500 bars before the anchor and 200 after. Over a cap is truncated, never rejected.
Three GET endpoints, compact text by default and JSON with fmt=json. An agent that can fetch a URL can look at the bars and the computed structure first, then write explicit numbers.
One instrument: N bars (date o h l c v), structure (hi/lo 10 20 50, ema 9 20 50 200, sma 50 200, atr14, last five swing highs and lows, base when one exists). Send it a whole chart query (the chart link with /read in the path) and it also prints each drawing resolved to prices and dates with its id (d1, m2), ignored items with reasons, and the ind= tokens' last values and recent series. n ≤ 500. Add fmt=json for JSON.
https://chartmath.com/c/read?i=NVDA&tf=D&n=120&h=hi:20&box=range:30&ind=ema20,rsi14Read prices and structure with /c/read?i=NVDA, then add your own drawings.
Add by= with your name to anything you write, so we can see it was you. The full grammar for an agent lives at https://chartmath.com/c/llms.txt.