API referenceProjects

Read the project's grooves

A project's GROOVES are synthesized loops, one per scene, that play on the PROJECT's musical clock (its tempo map): bar n is bar n in every scene, so neighbouring grooves stay in phase across a join a

nd a seam sound (PUT /scenes/{sceneId}/transition) lands on it. Each scene plays its own pick, else the project default. Patterns carry no tempo or key — the project grid wins.

render=true also renders each playing scene's slice and returns its file, its hits (trains, every hit per voice in scene-local seconds) and named marks — what visuals sync to. Repeat scene_id to render only some scenes.

GET
/projects/{id}/groove

Authorization

bearerAuth
AuthorizationBearer <token>

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

In: header

Path Parameters

id*string
Formatuuid

Query Parameters

render?string
Value in"true" | "false"
scene_id?string

Response Body

application/json

application/json

application/json

curl -X GET "https://example.com/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08/groove"
{
  "data": {
    "groove": {
      "version": 1,
      "library": {
        "property1": {
          "name": "string",
          "pattern": {
            "bars": 1,
            "tracks": [
              {
                "voice": "kick",
                "steps": "x...x...x...x...",
                "notes": [
                  0
                ],
                "fill": "string",
                "octave": -2,
                "gain": 0,
                "pan": -1,
                "tone": 0,
                "duck": 0,
                "crush": {
                  "bits": 3,
                  "hold": 1
                }
              }
            ],
            "swing": 0,
            "res": 4,
            "seed": 0
          }
        },
        "property2": {
          "name": "string",
          "pattern": {
            "bars": 1,
            "tracks": [
              {
                "voice": "kick",
                "steps": "x...x...x...x...",
                "notes": [
                  0
                ],
                "fill": "string",
                "octave": -2,
                "gain": 0,
                "pan": -1,
                "tone": 0,
                "duck": 0,
                "crush": {
                  "bits": 3,
                  "hold": 1
                }
              }
            ],
            "swing": 0,
            "res": 4,
            "seed": 0
          }
        }
      },
      "defaultId": "string",
      "scenes": {
        "property1": {
          "patternId": "string",
          "fillIntoEnd": true
        },
        "property2": {
          "patternId": "string",
          "fillIntoEnd": true
        }
      },
      "gainDb": 0,
      "enabled": true
    },
    "grid": {
      "bpm": 0,
      "meter": 0,
      "key": "string",
      "originSec": 0
    },
    "scenes": [
      {
        "scene_id": "string",
        "chapter_id": "string",
        "start_sec": 0,
        "duration_sec": 0,
        "pattern_id": "string",
        "name": "string",
        "from": "scene",
        "fill_into_end": true,
        "render": {
          "src": "string",
          "duration": 0,
          "first_bar": 0,
          "trains": {
            "property1": [
              0
            ],
            "property2": [
              0
            ]
          },
          "marks": [
            {
              "name": "string",
              "t": 0
            }
          ]
        }
      }
    ],
    "presets": [
      {
        "id": "string",
        "name": "string",
        "note": "string"
      }
    ],
    "notes": [
      "string"
    ],
    "edit_version": 0
  }
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string"
  }
}
{
  "error": {
    "type": "string",
    "code": "string",
    "message": "string"
  }
}