Build a video file naming convention
This video filename generator turns four production identifiers into one predictable media filename.
Run — free
Supply a project code, scene, take, and production date, and it returns a normalized MOV filename such as KTC_SC12A_T03_20260725.mov. The result is deterministic, easy to sort, and suitable for camera originals, editorial handoffs, review exports, or archive manifests. Every field is required, so incomplete naming data produces a clear input error instead of an ambiguous file that may be misplaced later.
Establish one readable production pattern
A useful naming convention lets a person identify a clip before opening it. This builder uses PROJECT_SCENE_TAKE_DATE.mov, with underscores separating the major pieces. The project code comes first so files from the same production group together in ordinary directory listings. The scene follows with an SC prefix, while the take follows with a T prefix and is padded to at least two digits. The date is placed last in compact YYYYMMDD form, which sorts chronologically without punctuation that can be awkward in downstream systems. For example, project KTC, scene 12A, take 3, and date 2026-07-25 become KTC_SC12A_T03_20260725.mov. The pattern is intentionally modest: it does not invent camera, reel, unit, version, or codec information that was not supplied. That restraint matters because an authoritative-looking placeholder is worse than an explicit omission. Use the returned filename as a dependable base convention, and add organization-specific fields only in a separately documented workflow where every participant understands their meaning.
Understand normalization and validation
Production notes are often entered with inconsistent capitalization, spaces, or prefixes. The builder normalizes the project code and scene to uppercase, removes diacritic marks, turns runs of unsupported punctuation into hyphens, and trims leading or trailing hyphens. A scene entered as 12A, sc12a, or SC-12A therefore resolves to SC12A. A take may be entered as 3, 03, T3, or T-03; it must ultimately represent a positive whole number, and the output becomes T03. Larger take numbers remain intact rather than being truncated. The date has a stricter contract: it must be written as YYYY-MM-DD and must be a real Gregorian calendar date. An impossible value such as 2026-02-30 is rejected rather than silently rolled into March. Empty strings, whitespace-only strings, missing properties, zero takes, negative takes, and take labels containing nonnumeric characters are also rejected. These rules make repeated calls stable and prevent superficially valid filenames from hiding incomplete or malformed slate information.
Use the filename across set, post, and archive workflows
The generator is most effective when it sits at the boundary where metadata becomes a file: a camera-card ingest form, a DIT checksum report, an editorial transcode job, a review-export tool, or an archive manifest. Call it before writing or renaming the media so validation happens while the operator can still correct the slate data. Store the four normalized fields returned alongside the filename if another system needs structured metadata for filtering or reports. Because the algorithm has no network calls, random values, or current-time lookup, the same input always produces the same result in a browser or through the API. That property supports idempotent automation: retrying an ingest does not create a differently named asset. The generated extension is MOV because the capability targets a common production video container, but it does not convert media or inspect the actual codec. Confirm that the asset is meant to use a .mov name before applying it, preserve the original file when policy requires it, and treat naming as one part of a broader media-integrity workflow that also includes checksums, backups, and documented ownership.
What you can do with it
Standardize camera-card ingest
Generate predictable filenames while an operator enters slate metadata during an on-set media ingest.
Name editorial transcodes
Apply the same project, scene, take, and date structure to proxies prepared for an editor.
Prepare archive manifests
Create sortable asset names and retain normalized identifiers for long-term catalog records.
FAQ
What does one request cost?
Each API request costs $0.002. The same deterministic logic can also run in the browser.
What filename pattern does it use?
It uses PROJECT_SCENE_TAKE_YYYYMMDD.mov, including SC and T prefixes, for example KTC_SC12A_T03_20260725.mov.
Can I omit a field?
No. Project code, scene, take, and date are all required, and an empty or missing value returns an invalid input error.
How should I format the date?
Enter a real calendar date in YYYY-MM-DD form. The filename contains the same date without hyphens.
Does this rename or convert my video?
No. It returns a standardized filename and normalized metadata; it does not access, rename, inspect, or convert a media file.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/video2/file-naming-convention-build \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"project_code":"KTC","scene":"12A","take":"3","date":"2026-07-25"}'const res = await fetch("https://api.kit.forhosting.com/video2/file-naming-convention-build", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"project_code": "KTC",
"scene": "12A",
"take": "3",
"date": "2026-07-25"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/video2/file-naming-convention-build",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"project_code": "KTC",
"scene": "12A",
"take": "3",
"date": "2026-07-25"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/video2/file-naming-convention-build", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"project_code":"KTC","scene":"12A","take":"3","date":"2026-07-25"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"project_code":"KTC","scene":"12A","take":"3","date":"2026-07-25"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/video2/file-naming-convention-build", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"project_code": "KTC",
"scene": "12A",
"take": "3",
"date": "2026-07-25"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video2.file_naming_convention_build",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |