API
Use the data
The dataset is free to use under CC BY 4.0. Fetch it at build time or at startup and size your requests to fit.
Endpoints
/v1/capabilities.json— every pair, every limit, with evidence./v1/capabilities.csv— one row per pair, for spreadsheets./v1/changes.json— every recorded change, by date.
All endpoints are static files with CORS enabled. The schema is versioned; breaking changes get a new /v2 path.
Shape
Each entry is one model on one provider. Each limit has a status:
measured—valueis the largest passing request,fails_atthe first failure.stated— the provider's error states the limit (value).at_least— no failure up to our probe's cap; the limit is higher thanvalue.inconclusive— the search stopped early;at_least, if present, passed.unsupported/not_tested.
Bytes are in bytes; counts are counts. An excerpt:
{
"id": "fireworks/kimi-k3",
"provider": {
"id": "fireworks",
"name": "Fireworks",
"via": null
},
"model": {
"id": "moonshotai/kimi-k3",
"name": "Kimi K3",
"vendor": "MoonshotAI",
"api_id": "accounts/fireworks/models/kimi-k3",
"input_modalities": [
"text",
"image",
"video"
]
},
"measured_at": "2026-10-31",
"limits": {
"images_per_request": {
"status": "measured",
"value": 120,
"fails_at": 121,
"failure": "image_count",
"stated": 120,
"evidence": "Too many images were provided, we currently limit the number of images per conversation to 120"
},
"video_file_bytes": {
"status": "measured",
"value": 96000000,
"fails_at": 128000000,
"failure": "other",
"evidence": "Video <url> download size exceeded maximum size limit of 100.0 MB"
}
},
"accepts": {
"image_inline": true,
"image_url": true,
"video": "yes",
"request_fields": {
"stream_options": true,
"usage": false,
"reasoning": false,
"response_format": true,
"tools": true
}
},
"behaviour": {
"strict_tool_message_order": false
},
"notes": [
"Fireworks counts every image in the messages array (\"per conversation\"), not per message."
],
"featured": true
} Example: fit frames to a provider
const data = await fetch("https://vlm.fyi/v1/capabilities.json").then((r) => r.json());
const entry = data.entries.find((e) => e.id === "fireworks/kimi-k3");
const cap = entry.limits.frames_768x432;
// Leave headroom: limits change, and other messages use context too.
const maxFrames = Math.floor((cap.value ?? 0) * 0.85);