API reference

The Hermite API exposes the engine behind the desktop plugin as stateless REST endpoints: easing-curve generation, motion-preset keyframe data, transcription, and AI caption cleanup. No running Resolve instance is involved — you send data, you get structured JSON back.

Draft — not live yet. This is the v1 design contract for Stage 4. Shapes may change before launch; the final reference will be generated from the API's OpenAPI spec.

Base URL

https://api.hermite.dev/v1

Authentication

Every request carries an API key in the Authorization header. Keys are issued per organization from the dashboard and scoped to a plan.

Authorization: Bearer hm_live_xxxxxxxxxxxxxxxx

Requests without a valid key return 401; keys over their plan limits return 429 with a Retry-After header.

Rate limits

PlanRequests / minTranscriptionMax upload
Team6010 hrs audio / mo500 MB
Business300100 hrs audio / mo2 GB
EnterpriseCustomCustomCustom

POST/curves/generate

Generate an interpolated easing curve from a named preset or explicit bezier control points. Returns per-frame values ready to map onto keyframes in any host app.

POST /v1/curves/generate
{
  "preset": "overshoot",        // or "bezier": [0.34, 1.56, 0.64, 1]
  "duration_frames": 24,
  "from": 0,
  "to": 1
}

200 OK
{
  "frames": [0, 0.021, 0.089, 0.204, ...],
  "preset": "overshoot",
  "duration_frames": 24
}

POST/presets/apply

Given clip metadata (dimensions, duration, anchor), returns the keyframe data for a named motion preset — the same math the desktop plugin uses.

POST /v1/presets/apply
{
  "preset": "slide-in-left",
  "clip": { "width": 1920, "height": 1080, "duration_frames": 120 },
  "easing": "ease-out"
}

200 OK
{
  "keyframes": [
    { "frame": 0,  "x": -1920, "y": 0 },
    { "frame": 18, "x": 0,     "y": 0 }
  ],
  "curve": "ease-out"
}

POST/transcribe

Upload audio (or video; audio is extracted server-side) and receive subtitle data with word-level timestamps. Async: submission returns a job, poll or use a webhook for the result.

POST /v1/transcribe          (multipart: file + options JSON)
{
  "model": "accurate",         // "fast" | "accurate"
  "diarization": true,
  "language": "auto"
}

202 Accepted
{ "job_id": "job_8f2k1", "status": "processing" }

GET /v1/transcribe/job_8f2k1
200 OK
{
  "status": "done",
  "segments": [
    {
      "start": 4.21, "end": 8.94, "speaker": "S1",
      "text": "Welcome back — today we're grading the opening scene."
    }
  ]
}

POST/captions/cleanup

Punctuation, casing, and filler cleanup on raw transcript text — the AI pass from Stage 3, hosted.

POST /v1/captions/cleanup
{
  "segments": ["so um basically what we wanna do is"],
  "style": "clean"             // "clean" | "verbatim"
}

200 OK
{
  "segments": ["So, basically, what we want to do is:"]
}

Errors

Errors are JSON with a stable code:

400 Bad Request
{ "code": "invalid_preset", "message": "Unknown preset 'wobble'." }

Data handling

Uploaded media is retained only for the duration of the job plus a short retrieval window, then deleted; it is never used for training. The full data-handling and retention policy will be published before the API accepts its first production customer — that's a launch blocker, not an afterthought.