Validate and submit a complete source
Assemble a portable project, validate it before saving and render it through the focused V2 API.
The API validates every project version before persistence. Invalid markup, unsafe code, incompatible media, broken bindings or impossible timing never replace the latest valid source.
Agent review loop
A complete multi-scene project that can be saved, patched, reviewed in Studio and rendered headlessly.
Complete compact source
{
"format": "jsoncut-html",
"version": 1,
"id": "launch-loop",
"name": "Launch loop",
"compositionKind": "video",
"canvasBackground": "#090a0dff",
"width": 1920,
"height": 1080,
"fps": 30,
"duration": 6,
"html": "<section id=\"intro\" data-jc-clip data-jc-kind=\"scene\" data-jc-start=\"0\" data-jc-duration=\"6\" data-jc-track=\"0\"><h1 id=\"headline\" data-jc-clip data-jc-kind=\"text\" data-jc-start=\"0.25\" data-jc-duration=\"5.5\" data-jc-track=\"2\" data-jc-bind-text=\"headline\">See the result</h1></section>",
"css": "#intro{position:absolute;inset:0;background:radial-gradient(circle at 70% 30%,#3a1f0d,#090a0d 52%)}#headline{position:absolute;left:120px;top:360px;width:1200px;height:300px;display:flex;align-items:center;margin:0;color:white;font:850 132px/.9 Inter,sans-serif}",
"variables": [
{ "id": "headline", "label": "Headline", "type": "string", "default": "See the result" }
],
"values": { "headline": "Build once. Ship everywhere." },
"customBlocks": []
}Create the project
curl -X POST "$JSONCUT_API/api/v2/projects" \
-H "X-API-Key: $JSONCUT_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @project.jsonValidate before a write
Check these invariants in a client or Agent before submission:
- stable, unique IDs on every editable layer;
- explicit non-negative start, positive duration and integer track;
- image projects contain no timed video, audio, captions or keyframes;
- child intervals stay inside the owning scene or group;
- every media reference belongs to the workspace and matches its layer kind;
- every binding targets a declared compatible variable;
- every custom layer has one matching
customBlocksentry; - transition endpoints and keyframe values are valid.
Validation errors are returned as actionable client errors rather than generic server failures. For request and response schemas, open the V2 API reference.
Standard render-safe limits
| Resource | Limit |
|---|---|
| Active canvas | 3840 × 2160 |
| Frame rate | 60 FPS |
| Duration | 1200 seconds |
| Editable clips | 800 |
| Variables | 250 |
| Combined HTML, CSS and custom-block source | 5 MiB |
These are source safety limits, not plan quotas. Plan-specific concurrency, bulk-row and storage entitlements are returned by the live product and API contract.
Common invalid sources
| Finding | Corrective action |
|---|---|
| Duplicate or missing clip ID | Give every editable layer one stable unique ID |
| Unknown binding | Declare the variable or correct the binding name and type |
| Image contains animation or audio | Remove video-only timing and keep every image layer at 0..1 |
| Transition source is not adjacent | Use the preceding overlapping clip or remove the explicit source |
| Unsafe HTML or CSS | Remove executable tags, handlers, imports and JavaScript URLs |
| Custom block has no custom layer | Add one matching data-jc-kind="custom" layer, or remove the block |
Review before spending render credits
Studio and MCP provide preflight and visual review for a committed project before a final export. Public API submissions validate the source, version, inputs and output combination before queueing; invalid submissions return 422 Validation Failed. Review one representative output before starting a large template batch.