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.
- Free
- Stateless: nothing stored
- JSON in, JSON out
- REST and MCP
- OpenAPI 3.1
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
- Claude Code:
claude mcp add --transport http pixeltach https://api.pixeltach.com/mcp - Claude (web and desktop): add it as a custom connector and paste the URL.
- Other clients that take a server URL:
{"mcpServers":{"pixeltach":{"url":"https://api.pixeltach.com/mcp"}}}
| Tool | What it does |
|---|---|
| calculate_timing | Timing (active, front porch, sync, back porch, totals, polarity), pixel clock, line rate and bandwidth for one signal. |
| check_link | Everything 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.
| Field | Values | Notes |
|---|---|---|
| width, height | 64 to 16384 | Required. Whole pixels and lines of active picture. |
| refreshHz | 1 to 1000 | Required. Fractional rates are exact: send 59.94, not 60, for 59.94 Hz. |
| standard | cvt (default), cta | cta 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. |
| blanking | cvt (default), rb1, rb2, rb2opt | For cvt only: standard, reduced blanking v1, reduced blanking v2, or v2 video-optimized (clock x 1000/1001). |
| clockMode | exact (default), strict | exact keeps the porches and sets the clock for exactly the requested rate. strict rounds the clock to the CVT step. |
| bpc | 8 (default), 10, 12 | Bits per colour component. |
| format | rgb, 444, 422 (default), 420 | Colour 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. |
| connectors | list | /v1/link only. Connector ids (hdmi20, dp14, sdi, eth25 ...) or families (hdmi, dp, sdi, ip). Default: all. |
| id | string, up to 64 | Your own label, for example a cable number. Echoed back, so batch results are easy to match up. |
"standard":"cta". The default cvt is computer-style timing, which has more blanking and a higher pixel clock.Reading the verdicts
| Status | Meaning |
|---|---|
| fits | Within the connector's capacity. |
| tight | Over 95% of capacity. It fits on paper; leave no room for surprises. |
| exceeds | More than the connector can carry. suggestion gives the lowest-cost change (for example 8-bit 4:2:0) that would fit. |
| unsupported | The connector cannot carry this colour format at all. |
| check | SDI 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
| Status | When |
|---|---|
| 200 | Calculated. In a batch, check each entry's ok. |
| 400 | The body is not valid JSON or not an object, or signals is empty. |
| 413 | The body is over 32 KB, or a batch has more than 50 signals. |
| 415 | The Content-Type is not application/json. |
| 422 | A 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. |
| 429 | Too many requests from your address. Wait a few seconds and retry, and batch. |
What it does and doesn't model
- The figures come from the same engine as the calculator: VESA CVT 2.x, reduced blanking v1 and v2, CTA-861 timings, and the published connector limits.
engineVersionin every response identifies it. - Cable length and reach are not modelled. A verdict is about the signal's data rate against the connector, not about how far a particular cable will carry it. Fields such as
cableLengthMare refused so they can't be mistaken for an answer. - HDMI and DisplayPort verdicts are for uncompressed video. Display Stream Compression is not modelled.
- This is a calculator, not a certification. Check critical links against the equipment's datasheet and on the real gear.
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
- openapi.json: the OpenAPI 3.1 description, generated from the same schemas the API validates with.
- llms.txt: a short summary for language models.
- /v1/health: status and engine version.