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.
Base URL
https://api.hermite.dev/v1Authentication
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_xxxxxxxxxxxxxxxxRequests without a valid key return 401; keys over their plan limits return 429 with a Retry-After header.
Rate limits
| Plan | Requests / min | Transcription | Max upload |
|---|---|---|---|
| Team | 60 | 10 hrs audio / mo | 500 MB |
| Business | 300 | 100 hrs audio / mo | 2 GB |
| Enterprise | Custom | Custom | Custom |
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.