API referenceCompositions

Would the pipeline accept this composition?

Check a composition against the REAL gates before landing it.

Free — no hosting, no writes, no credits.

Runs the actual chain at its live configuration: the same normalisation every generated candidate receives, the hard structural gates (exactly one closed <template>, a composition id, a registered timeline, and the seek-law bans on <canvas>, requestAnimationFrame, appends to document.body and getElementsBy*), the configurable gate stack, and the vocabulary checks from GET /authoring-contract. A refusal is reported in the gate's own words, with per-stage results.

The most common refusal is driving animation from requestAnimationFrame or a wall clock: the renderer seeks a paused timeline and screenshots, so it never runs a frame loop and such a composition renders blank in the video while looking correct in a browser.

Reports whether the composition is CONFORMANT, never whether it is any good. To SEE it, pass check: true: the response gains check with the rendered findings and a contact_sheet image of the whole scene over time.

POST
/compositions/validate

Authorization

bearerAuth
AuthorizationBearer <token>

Typecut API key. Generate one in app.typecut.ai → Settings → API keys. Send as Authorization: Bearer tc_live_….

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/compositions/validate" \  -H "Content-Type: application/json" \  -d '{    "html": "string"  }'
{
  "data": {
    "property1": null,
    "property2": null
  }
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string"
  }
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string"
  }
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string"
  }
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string"
  }
}