PixelTach API and MCP server

The video timing and link maths from the PixelTach calculator, for scripts and AI agents. Exact timings, pixel clocks and bandwidth, and whether a signal fits HDMI, DisplayPort, SDI or ST 2110.

Quick start

Does 1080p at 60 Hz, 10-bit 4:2:2, fit HDMI 1.4 and SDI? Only the width, height and refresh rate are required.

curl https://api.pixeltach.com/v1/link \
  -H 'Content-Type: application/json' \
  -d '{"width":1920,"height":1080,"refreshHz":60,"standard":"cta",
       "bpc":10,"format":"422","connectors":["hdmi14","sdi"]}'

The response (shortened) carries the horizontal and vertical timing with sync and polarity, the pixel clock, the bandwidth, and a verdict per connector:

{
  "engineVersion": "0.1.0",
  "results": [{
    "ok": true,
    "timing": {
      "standard": "CTA-861 VIC 16", "vic": 16,
      "horizontal": { "active": 1920, "frontPorch": 88, "syncWidth": 44, "backPorch": 148, "total": 2200, "polarity": "+" },
      "vertical":   { "active": 1080, "frontPorch": 4,  "syncWidth": 5,  "backPorch": 36,  "total": 1125, "polarity": "+" },
      "pixelClockHz": 148500000, "refreshHz": 60
    },
    "bandwidth": { "bitsPerPixel": 20, "linkDataRateGbps": 2.97 },
    "summary": { "fits": ["hdmi14", "sdi"], "tight": [], "exceeds": [], "unsupported": [], "check": [] },
    ...
  }]
}

Use POST /v1/timing when you only need the timing and bandwidth; POST /v1/link adds the connector verdicts.

Connect an AI agent (MCP)

The same calculations are available as a remote Model Context Protocol server, so an assistant can calculate instead of guessing. One URL, no sign-up, no key:

https://api.pixeltach.com/mcp
ToolWhat it does
calculate_timingTiming (active, front porch, sync, back porch, totals, polarity), pixel clock, line rate and bandwidth for one signal.
check_linkEverything above plus a verdict for each connector, with percent used, headroom, the limiting factor and the lowest-cost change that would make it fit.

Both tools are read-only and take the same fields as the REST endpoints for one signal. The server is stateless: there is no session and nothing is remembered between calls.

Request fields

Send one signal as a JSON object, or several as {"signals":[ ... ]}. Fields you leave out take the defaults below, and every response lists which ones were defaulted.

FieldValuesNotes
width, height64 to 16384Required. Whole pixels and lines of active picture.
refreshHz1 to 1000Required. Fractional rates are exact: send 59.94, not 60, for 59.94 Hz.
standardcvt (default), ctacta is the fixed CTA-861 timing for a standard broadcast format such as 1920x1080 or 3840x2160. cvt builds a timing with the VESA CVT formulas.
blankingcvt (default), rb1, rb2, rb2optFor cvt only: standard, reduced blanking v1, reduced blanking v2, or v2 video-optimized (clock x 1000/1001).
clockModeexact (default), strictexact keeps the porches and sets the clock for exactly the requested rate. strict rounds the clock to the CVT step.
bpc8 (default), 10, 12Bits per colour component.
formatrgb, 444, 422 (default), 420Colour format.
audio{ channels, rateHz }channels 0, 2 or 8; rateHz 48000, 96000 or 192000. Adds the HDMI blanking-room check and the SDI and ST 2110 audio notes.
connectorslist/v1/link only. Connector ids (hdmi20, dp14, sdi, eth25 ...) or families (hdmi, dp, sdi, ip). Default: all.
idstring, up to 64Your own label, for example a cable number. Echoed back, so batch results are easy to match up.
For broadcast formats (1080p, UHD) use "standard":"cta". The default cvt is computer-style timing, which has more blanking and a higher pixel clock.

Reading the verdicts

StatusMeaning
fitsWithin the connector's capacity.
tightOver 95% of capacity. It fits on paper; leave no room for surprises.
exceedsMore than the connector can carry. suggestion gives the lowest-cost change (for example 8-bit 4:2:0) that would fit.
unsupportedThe connector cannot carry this colour format at all.
checkSDI only: the format is not in the SMPTE mapping tables used here. Check the equipment's datasheet.

Each verdict has usagePct and headroomPct (negative when it doesn't fit), a limitingFactor saying what runs out first, and a plain-language detail. SDI has no percentage; its sdi block shows the lowest single link that carries the format and the alternatives.

Batches

Send up to 50 signals in one request. Each is calculated on its own: a bad signal comes back as {"ok":false,"error":"..."} in its place and the rest still succeed. Batching is also the way to stay inside the rate limit.

curl https://api.pixeltach.com/v1/timing -H 'Content-Type: application/json' -d '{"signals":[
  {"id":"cam-1","width":1920,"height":1080,"refreshHz":59.94,"standard":"cta"},
  {"id":"led-wall","width":3840,"height":2160,"refreshHz":59.94,"blanking":"rb2opt","bpc":10}
]}'

Errors

StatusWhen
200Calculated. In a batch, check each entry's ok.
400The body is not valid JSON or not an object, or signals is empty.
413The body is over 32 KB, or a batch has more than 50 signals.
415The Content-Type is not application/json.
422A single signal could not be calculated. results[0].error names the field: unknown fields are refused rather than ignored, so a misspelt name never silently becomes a default.
429Too many requests from your address. Wait a few seconds and retry, and batch.

What it does and doesn't model

Privacy

The API is stateless. PixelTach does not store or log what you send; there are no accounts, cookies or API keys. The service runs on Cloudflare, which sees ordinary request metadata such as your IP address.

Support PixelTach

PixelTach is built and paid for by one developer, and this API costs real money to run. It is free to use. If it saves you time, the best way to keep it running is the annual Supporter subscription at pixeltach.com. A yearly subscription is what covers the hosting, and it unlocks the calculator's Supporter features.

Please also be considerate with volume: batch your signals, and cache answers that don't change.

For tools and agents