Music Cue Sheets
This is the API documentation to our tool "Music Cue Sheet (Converter)" and "Music Cue Sheet Manager". The tool makes it easy to create and manage music cue sheets.
Quick Start (Convert file)
This Endpoint can be used to quickly convert a sequence file from an NLE into a music cue sheet document. It only converts the file and does not create a new project that can be edited later. It's a simple way to convert EDL, XML, or other sequence formats into tables like Excel or CSV. You can find more details about the tool here: Music Cue Sheet (Converter)
(i) This Endpoint will not add any metadata from Production Music Libraries.
Endpoint
This endpoint is used to convert a file.
POST https://api.editingtools.io/v2/cuesheet
Authentication
This API requires Basic Authentication. The "Authorization" header should be set with the Base64 encoded string of "apikey:YOUR_API_KEY".
Authorization: Basic <base64Encoded(apikey:YOUR_API_KEY)>
Headers
Content-Type: multipart/form-data
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential.
Request Body
The API supports file uploads using a multipart/form-data request. The request can contain the following parameters:
Parameter | Type | Required | Description |
---|---|---|---|
file |
File | Yes | The sequence file to upload and convert. Accepted formats are:
Max request size (including files): 100 MB (i) If the sequence file is larger than 10 MB (e.g. XML or FCPXML), it may contain unnecessary layers, such as video tracks, or it may be incorrect. Larger files might fail. It is recommended that you upload files that only contain relevant audio tracks. (i) .aaf is only supported in Cue Sheet Projects and is not accepted with this endpoint.(i) .fcpxmld (Directories) from newer Final Cut Pro projects need to be converted into .fcpxml first! |
framerate |
String | Yes | The framerate of the sequence file. If there is no value set, 25 will be used as default value.Allowed values:
|
format |
String | Yes | This defines the export format. The possible export format values are:
|
preset |
String | No | This can be used to select a predefined document style. (i) If a predefined document style is selected, the format needs to be set to xlsx .Available preset values:
|
mergeOverlappingClips |
Boolean | No | If set to true , any overlapping identical clips are merged and their total duration recalculated.Default value is true . Set to false to disable this feature.
|
deduplicateClips |
Boolean | No | If set to true , all identical clips (in the whole sequence) will be merged so that each appears only once. The clip duration will be summed. Timecode In and Out information might become useless. Only use if Timecode In and Out information is not so important.Default is false . Set to true to enable.
|
base64 |
Boolean | No | If set to true , the generated file will be returned as base64 string. |
cURL Examples
The following examples show how to use the API with cURL commands. If you are using a different language, we recommend using https://curlconverter.com to convert the commands for other languages like: PHP, JavaScript, Python, Ruby, Rust, Ansible, C , C#, ColdFusion, Clojure, Dart, Elixir, Go, HAR, HTTP, HTTPie, Java, JSON, Kotlin, MATLAB, Node.js, Objective-C, OCaml, PowerShell, R, Swift and more.
cURL Request Example 1
This is an example of how to convert a simple .edl with 25 fps file into a CSV document.
curl -X POST https://api.editingtools.io/v2/cuesheet \
-u "apikey:YOUR_API_KEY" \
-F file=@/Users/path/Demo_Sequence_25fps.edl \
-F framerate=25 \
-F format=csv \
-F mergeOverlappingClips=true
cURL Request Example 2
This is an example of how to convert a .edl sequence with 23.976 fps into an Excel spreadsheet in CISAC Standard.
curl -X POST https://api.editingtools.io/v2/cuesheet \
-u "apikey:YOUR_API_KEY" \
-F file=@/Users/path/Demo_Sequence_25fps.edl \
-F framerate=23.976 \
-F format=xlsx \
-F preset=cisac_preset \
-F mergeOverlappingClips=true
cURL Request Example 3
This is an example of how to convert a .edl sequence with 29.97 drop frame into an Excel spreadsheet and return the file as base64 string.
curl -X POST https://api.editingtools.io/v2/cuesheet \
-u "apikey:YOUR_API_KEY" \
-F file=@/Users/path/Demo_Sequence_25fps.edl \
-F framerate=29.97DF \
-F format=xlsx \
-F base64=true
cURL Request Example 4
We recommend that developers who want to process input directly from the response use the json
format. The following example shows how to convert a simple .edl file with a frame rate of 25 fps into JSON. The json will be part of the response (see JSON Response Example).
curl -X POST https://api.editingtools.io/v2/cuesheet \
-u "apikey:YOUR_API_KEY" \
-F file=@/Users/path/Demo_Sequence_25fps.edl \
-F framerate=25 \
-F format=json \
-F mergeOverlappingClips=true
Demo File
Demo sequence file (.edl) to test requests: Demo_Sequence_25fps.edl
Responses
Success (HTTP 200 OK)
If the file was successfully uploaded and the process started, the API will return a 200 OK
status code with a JSON object containing the file details.
Response Example
{
"code": 200,
"status": "The sequence was successfully converted into a music cue sheet document.",
"timestamp": "2025-05-01T10:00:00Z",
"data": {
"fileName": "Demo_Sequence_25fps.csv",
"fileUrl": "https://editingtools.io/download/demo/path/Demo_Sequence_25fps.csv",
"fileBase64": "Tm8uLFRpbWVjb2Rl...IsIiIK",
"fileSize": 1830,
"fileChecksum": "06abe8b0662afabe9ba8e1f0b0efe0b7"
}
}
JSON Response Example
If the file is converted to json
, as in Request Example 4, all basic cue sheet data will be included in the response. Please note that this will not include track metadata from production music libraries.
{
"code": 200,
"status": "The sequence was successfully converted into a music cue sheet document.",
"timestamp": "2025-05-01T10:00:00Z",
"data": {
"fileName": "Demo_Sequence_25fps.csv",
"fileJson": {
"name": "Music Cue Sheet - Demo Sequence 1",
"color": "blue",
"creationDate": "2025-06-12T12:15:05Z",
"framerate": "25",
"tool": "EditingTools.io - Music Cue Sheet Tool",
"entries": [
{
"number": 1,
"name": "PRTM009701_FORGOTTEN_CITY_SONOTON",
"fileName": "PRTM009701_FORGOTTEN_CITY_SONOTON.mp3",
"timecodeIn": "00:00:04:20",
"timecodeOut": "00:01:08:15",
"duration": "00:01:03:20",
"durationInSeconds": "64",
"sourceStart": "00:00:00:00",
"sourceEnd": "00:01:03:20",
"note": ""
},
{
"number": 2,
"name": "ANW3317_005_Why-Dont-We-Fall-In-Love",
"fileName": "ANW3317_005_Why-Dont-We-Fall-In-Love.mp3",
"timecodeIn": "00:02:09:20",
"timecodeOut": "00:03:24:20",
"duration": "00:01:15:00",
"durationInSeconds": "75",
"sourceStart": "00:00:00:00",
"sourceEnd": "00:01:15:00",
"note": ""
}
]
},
}
}
Field | Type | Description |
---|---|---|
code |
String | HTTP status code. |
status |
String | A descriptive message about the process. |
timestamp |
String | Server time of the request (ISO 8601). |
data |
Object | An object containing details about the file. |
data.fileName |
String | Name of generated file. |
data.fileUrl |
String | Download path of the generated file. |
data.fileJson |
String | Returns the uploaded sequence as json. (Only if format is json ) |
data.fileSize |
Int | Size of the generated file in bytes. |
data.fileChecksum |
String | MD5 hash of the generated file for validation. |
data.fileBase64 |
String | File encoded as Base64 string. |
Error Responses
Error responses typically include an appropriate HTTP status code and a JSON body containing an error message.
{
"code": "400",
"status": "The upload could not be completed.",
"timestamp": "2025-05-01T10:00:00Z"
}
Download File
After the conversion is successfully completed, the file can be downloaded using the values returned under fileUrl
and fileName
.
cURL Request Example (macOS or Linux)
Example to download the file to the Desktop. Uses -o
to specify the output file path.
curl -o ~/Desktop/{fileName} "{fileUrl}"
curl -o ~/Desktop/Demo_Sequence_25fps.csv "https://editingtools.io/download/demo/path/Demo_Sequence_25fps.csv"
cURL Request Example (Windows with PowerShell)
curl -o "$env:USERPROFILE\Desktop\{fileName}" "{fileUrl}"
curl -o $env:USERPROFILE\Desktop\Demo_Sequence_25fps.csv "https://editingtools.io/download/demo/path/Demo_Sequence_25fps.csv"
cURL Request Example (Windows Command Prompt with cURL installed)
curl -o "%USERPROFILE%\Desktop\{fileName}" "{fileUrl}"
curl -o %USERPROFILE%\Desktop\Demo_Sequence_25fps.csv "https://editingtools.io/download/demo/path/Demo_Sequence_25fps.csv"
Python3 Request Example
import os
import urllib.request
name = "Demo_Sequence_25fps.csv"
url = "https://editingtools.io/download/demo/path/Demo_Sequence_25fps.csv"
# Construct the path to the Desktop for example
local_path = os.path.join(os.path.expanduser("~"), "Desktop", name)
# Download the file
try:
urllib.request.urlretrieve(url, local_path)
print(f"File downloaded successfully and saved to: {local_path}")
except Exception as e:
print(f"Failed to download file: {e}")
wget Request Example (macOS or Linux)
Example to download the file to the Desktop. Uses -O
to specify the output file path.
wget -O ~/Desktop/{fileName} "{fileUrl}"
wget -O ~/Desktop/Demo_Sequence_25fps.csv "https://editingtools.io/download/demo/path/Demo_Sequence_25fps.csv"
wget Request Example (Windows with PowerShell)
wget -O "$env:USERPROFILE\Desktop\{fileName}" "{fileUrl}"
wget -O "$env:USERPROFILE\Desktop\Demo_Sequence_25fps.csv" "https://editingtools.io/download/demo/path/Demo_Sequence_25fps.csv"
wget Request Example (Windows Command Prompt with wget installed)
wget -O "%USERPROFILE%\Desktop\{fileName}" "{fileUrl}"
wget -O "%USERPROFILE%\Desktop\Demo_Sequence_25fps.csv" "https://editingtools.io/download/demo/path/Demo_Sequence_25fps.csv"
Best Practices (Find Metadata)
A common use case is to find metadata for files in a cue sheet via the API. If the "Search Metadata" endpoint is unavailable for your use case, we recommend the following workflow.
- Use the Create Project endpoint to create a new cue sheet that includes all tracks of your project. Make sure to add the attribute
scanLibraries
and set it toall
or another value. Once an entry is added to the project, the scanning process for metadata will automatically start. - Wait until the scan is finished. Depending on how many tracks are in a project, the scan can take several minutes. You can set up a webhook to receive a callback when the project scanning is finished, or you can check the project details. Use the "Get Project" endpoint to check the project details. The status of the scan process is indicated in the
metadataScan
attribute. - Use the "Get Entries" endpoint to retrieve the cue sheet entries including track metadata. Alternatively, export the cue sheet in another format using the "Export" endpoint.
- If you no longer need the project after this, delete it and all its entries from the EditingTools server using the "Delete Project" endpoint.
(!) If you provide a tool that processes cue sheets from various customers, we recommend replacing the project name value in the name
attribute with the project ID from your service.
Create Project
This endpoint is used to create a new cue sheet project for the Music Cue Sheet Manager on the server.
Endpoint
POST https://api.editingtools.io/v2/cuesheets/project
Authentication
This API requires Basic Authentication. The "Authorization" header should be set with the Base64 encoded string of "apikey:YOUR_API_KEY".
Authorization: Basic <base64Encoded(apikey:YOUR_API_KEY)>
Headers
Content-Type: application/json
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential (as described above).
Request Body (JSON)
The request body should be a UTF8 JSON object containing the following parameters:
Parameter | Type | Required | Description | |||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
name |
String | Yes | The name of the project or sequence (String 3-200 characters). | |||||||||||||||||||||||||||||||||||
color |
String | No | The color of the project. If there is no value set, "blue " will be used as default value.Allowed colors: blue, cyan, fuchsia, green, lavender, lemon, mint, orange, pink, purple, red, sky, yellow, white |
|||||||||||||||||||||||||||||||||||
framerate |
String | No | The framerate of the project. If there is no value set, "25 " will be used as default value.Allowed values:
|
|||||||||||||||||||||||||||||||||||
entries |
Object | No | Optional object with music track entries. | |||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
isArchived |
Boolean | No | Defines if a project is active or archived. Default value is false .false = Active, true = Archived
|
|||||||||||||||||||||||||||||||||||
scanLibraries |
String | No (Optional) | If you want the tool to automatically search for metadata, submit a list of libraries separated by commas. These libraries will be searched for metadata automatically once a track is added to the project. If you want to scan all libraries, use "all ". |
|||||||||||||||||||||||||||||||||||
productionType |
String | No (Optional) | Default: null F = Film (Standalone), S = Series
|
|||||||||||||||||||||||||||||||||||
productionCategory |
String | No (Optional) |
Default: null
|
|||||||||||||||||||||||||||||||||||
episodeTitle |
String | No (Optional) | Default: null (max. 100 characters) |
|||||||||||||||||||||||||||||||||||
episodeNumber |
String | No (Optional) | Default: null (max. 100 characters) |
|||||||||||||||||||||||||||||||||||
seasonNumber |
String | No (Optional) | Default: null (max. 100 characters) |
|||||||||||||||||||||||||||||||||||
yearOfProduction |
YEAR | No (Optional) | Default: null |
|||||||||||||||||||||||||||||||||||
country |
String | No (Optional) | Default: null Use two digit country code. |
Example Request Body 1 - only required parameters
Create a new music cue sheet project without any music track entries.
{
"name": "My New Cue Sheet Project"
}
Example Request Body 2 - with music tracks
Create a new music cue sheet project with music track entries.
{
"name": "My New Cue Sheet Project",
"color": "green",
"framerate": "23.976",
"entries" : [
{"filename" : "mysong.mp3", "timecodeIn" : "10:02:12:03", "timecodeOut" : "10:02:16:12" },
{"filename" : "song_2.mp3", "timecodeIn" : "10:03:20:01", "timecodeOut" : "10:04:23:21" }
]
}
Example Request Body 3 - with cues and scan for metadata
Create a new music cue sheet project with music track entries and set auto scan for all metadata libraries. This will automatically search for external metadata for each track.
{
"name": "My New Cue Sheet Project",
"color": "green",
"framerate": "23.976",
"scanLibraries": "all",
"entries" : [
{"filename" : "mysong.mp3", "timecodeIn" : "10:02:12:03", "timecodeOut" : "10:02:16:12" },
{"filename" : "song_2.mp3", "timecodeIn" : "10:03:20:01", "timecodeOut" : "10:04:23:21" }
]
}
cURL Examples
The following examples show how to use the API with cURL commands. If you are using a different language, we recommend using https://curlconverter.com to convert the commands for other languages like: PHP, JavaScript, Python, Ruby, Rust, Ansible, C , C#, ColdFusion, Clojure, Dart, Elixir, Go, HAR, HTTP, HTTPie, Java, JSON, Kotlin, MATLAB, Node.js, Objective-C, OCaml, PowerShell, R, Swift and more.
cURL Request Example 1 - only required parameters
curl -X POST https://api.editingtools.io/v2/cuesheets/project \
-u "apikey:YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My New Cue Sheet Project"
}'
cURL Request Example 2 - with cues
curl -X POST https://api.editingtools.io/v2/cuesheets/project \
-u "apikey:YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My New Cue Sheet Project",
"color": "green",
"framerate": "23.976",
"entries" : [
{"filename" : "mysong.mp3", "timecodeIn" : "10:02:12:03", "timecodeOut" : "10:02:16:12" },
{"filename" : "song_2.mp3", "timecodeIn" : "10:03:20:01", "timecodeOut" : "10:04:23:21" }
]
}'
cURL Request Example 3 - with cues and scan for metadata
curl -X POST https://api.editingtools.io/v2/cuesheets/project \
-u "apikey:YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My New Cue Sheet Project",
"color": "green",
"framerate": "23.976",
"scanLibraries": "all",
"entries" : [
{"filename" : "mysong.mp3", "timecodeIn" : "10:02:12:03", "timecodeOut" : "10:02:16:12" },
{"filename" : "song_2.mp3", "timecodeIn" : "10:03:20:01", "timecodeOut" : "10:04:23:21" }
]
}'
Responses
Success (HTTP 201 Created)
If the request is successful, the API will return a 201 Created
status code with a JSON object containing project details. The JSON will contain some informations.
Field | Type | Description |
---|---|---|
code |
String | HTTP status code. |
status |
String | Status message. |
timestamp |
String | Timestamp of server time (ISO 8601). |
data |
Object | An object containing details about the created project. |
data.projectId |
String | The unique identifier of the project. |
data.creationDate |
String | Timestamp of project creation (ISO 8601). |
Example
{
"code": "201",
"status": "The project was successfully created.",
"timestamp": "2025-01-01T19:10:00Z",
"data": {
"projectId": "rcwo9binm0xo8wt9vpfz16pt5pypju",
"creationDate": "2025-01-01T19:10:00Z"
}
}
Error Responses (Example)
Error responses will typically include an appropriate HTTP status code (e.g., 400 Bad Request, 401 Unauthorized) and a JSON body with an error message.
It's recommended that the content of the "status" field be shown to end users as it can contain useful information. For example, it could be shown in an error dialog.
{
"code": "400",
"status": "Missing required parameter: name",
"timestamp": "2025-01-01T19:10:00Z"
}
{
"code": "401",
"status": "Invalid API Key",
"timestamp": "2025-01-01T19:10:00Z"
}
Duplicate Project
This endpoint is used to duplicate an existing music cue sheet project on the server. The project is identified by its projectId
in the URL path.
Endpoint
POST https://api.editingtools.io/v2/cuesheets/project/{projectId}/copy
Replace {projectId}
with the project's unique ID.
Authentication
This API requires Basic Authentication. The "Authorization" header should be set with the Base64 encoded string of "apikey:YOUR_API_KEY".
Authorization: Basic <base64Encoded(apikey:YOUR_API_KEY)>
Headers
Content-Type: application/json
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential (as described above).
Path Parameters
Parameter | Type | Description |
---|---|---|
projectId |
String | The unique identifier of the project. |
Request Body (JSON)
The request body should be a UTF8 JSON object containing the following parameters:
Parameter | Type | Required | Description |
---|---|---|---|
name |
String | Yes | The name of the new project copy (String 3-200 characters). |
copyEntries |
Boolean | No | Defines if all music track entries should be copied as well into the new project. Default value is false .
false = No (Do not copy),true = Yes (Copy to new project) |
Example Request Body
Duplicate a project with all music track entries.
{
"name": "My New Cue Sheet Project (Copy)",
"copyEntries": true
}
cURL Request Example
Replace {projectId}
with the project id.
curl -X POST https://api.editingtools.io/v2/cuesheets/project/{projectId}/copy \
-u "apikey:YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My New Cue Sheet Project (Copy)",
"copyEntries": true
}'
Responses
Success (HTTP 201 Created)
If the request is successful, the API will return a 201 Created
status code with a JSON object containing project details. The JSON will contain some informations.
Field | Type | Description |
---|---|---|
code |
String | HTTP status code. |
status |
String | Status message. |
timestamp |
String | Timestamp of server time (ISO 8601). |
data |
Object | An object containing details about the created project. |
data.projectId |
String | The unique identifier of the project. |
data.creationDate |
String | Timestamp of project creation (ISO 8601). |
Example
{
"code": "201",
"status": "The music cue sheet has been duplicated successfully.",
"timestamp": "2025-01-01T19:10:00Z",
"data": {
"projectId": "rcwo9binm0xo8wt9vpfz16pt5pypju",
"creationDate": "2025-01-01T19:10:00Z"
}
}
Error Responses (Example)
Error responses will typically include an appropriate HTTP status code (e.g., 400 Bad Request, 401 Unauthorized, 404 Not found) and a JSON body with an error message.
It's recommended that the content of the "status" field be shown to end users as it can contain useful information. For example, it could be shown in an error dialog.
{
"code": "400",
"status": "Please enter a project name with at least 3 characters.",
"timestamp": "2025-01-01T19:10:00Z"
}
Get Projects (List)
This endpoint allows to get a list of all music cue sheet project connected to the API account on EditingTools.io.
Endpoint
GET https://api.editingtools.io/v2/cuesheets/projects
Headers
Content-Type: application/json
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential using your `YOUR_API_KEY`.
cURL Request Example 1
curl -X GET https://api.editingtools.io/v2/cuesheets/projects \
-u "apikey:YOUR_API_KEY"
Responses
Success (HTTP 200 OK)
If the projects were successfully loaded, the API will return a 200 OK
status code with a JSON object containing all existing projects.
Field | Type | Description | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code |
String | HTTP status code. | |||||||||||||||||
status |
String | Status message. | |||||||||||||||||
timestamp |
String | Timestamp of server time (ISO 8601). | |||||||||||||||||
data |
Object | An object containing details about the projects. | |||||||||||||||||
|
Example
{
"code": "200",
"status": "The projects were successfully loaded.",
"data": [
{
"projectId": "6u00p3lz1ycwixs3g2kq0nx3qkroskxiw8o578wx99dor8zn",
"name": "Late Night Show - Episode 38",
"color": "green",
"lastUpdate": "2025-05-17T09:17:52Z",
"createdDate": "2025-05-01T08:20:00Z"
},
{
"projectId": "nz1thfewx86pirs8etj51huxnfk6sbaytmlb62lghyt64kvs",
"name": "Late Night Show - Episode 37",
"color": "blue",
"lastUpdate": "2025-05-12T10:00:34Z",
"createdDate": "2025-05-02T10:20:52Z"
}
]
}
Error Responses
Error responses will typically include an appropriate HTTP status code and a JSON body with an error message.
{
"code": "400",
"status": "The projects could not be loaded.",
"timestamp": "2025-01-01T19:10:00Z"
}
Get Project (Details)
This endpoint allows to get details of a selected project. The projectId
have to be specify directly in the URL path.
Endpoint
GET https://api.editingtools.io/v2/cuesheets/project/{projectId}
Replace {projectId}
with the project's unique ID.
Headers
Content-Type: application/json
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential using your `YOUR_API_KEY`.
Path Parameters
Parameter | Type | Description |
---|---|---|
projectId |
String | The unique identifier of the project. |
cURL Request Example 1
curl -X GET https://api.editingtools.io/v2/cuesheets/project/{project_id} \
-u "apikey:YOUR_API_KEY"
Responses
Success (HTTP 200 OK)
If the project was successfully loaded, the API will return a 200 OK
status code with a JSON object.
Field | Type | Description | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code |
String | HTTP status code. | |||||||||||||||||||||||
status |
String | Status message. | |||||||||||||||||||||||
timestamp |
String | Timestamp of server time (ISO 8601). | |||||||||||||||||||||||
data |
Object | An object containing details about the project. | |||||||||||||||||||||||
|
Example
{
"code": "200",
"status": "The projects were successfully loaded.",
"data": {
"projectId": "6u00p3lz1ycwixs3g2kq0nx3qkroskxiw8o578wx99dor8zn",
"name": "Late Night Show - Episode 38",
"color": "green",
"lastUpdate": "2025-05-17T09:17:52Z",
"createdDate": "2025-05-01T08:20:00Z"
}
}
Error Responses
Error responses will typically include an appropriate HTTP status code and a JSON body with an error message.
{
"code": "404",
"status": "The project with the chosen ID could not be found.",
"timestamp": "2025-01-01T19:10:00Z"
}
Delete Project
This endpoint is used to delete a project from server. The project is identified by its projectId
in the URL path.
Endpoint
DELETE https://api.editingtools.io/v2/cuesheets/project/{projectId}
Replace {projectId}
with the project's unique ID.
Headers
Content-Type: application/json
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential using `YOUR_API_KEY`.
Path Parameters
Parameter | Type | Description |
---|---|---|
projectId |
String | The unique identifier of the project. |
cURL Request Example
curl -X DELETE https://api.editingtools.io/v2/cuesheets/project/{projectId} \
-u "apikey:YOUR_API_KEY"
Replace {projectId}
with the project id.
Responses
Success (HTTP 200 OK)
If the project was deleted successfully, the API will return a 200 OK
status code with a JSON object confirming the deletion.
{
"code": "200",
"status": "The music cue sheet project has been successfully deleted.",
"timestamp": "2025-01-01T19:10:00Z"
}
Error Responses
Error responses will typically include an appropriate HTTP status code and a JSON body with an error message.
{
"code": "404",
"status": "The project with the chosen projectId could not be found.",
"timestamp": "2025-01-01T19:10:00Z"
}
Add entries
This endpoint is used to add new music track entries to an existing music cue sheet project. Existing entries will not be changed or deleted.
(!) The current limit is 100 new track entries per call. You may need multiple calls if you have more files to add.
Endpoint
POST https://api.editingtools.io/v2/cuesheets/project/{projectId}/entries
Replace {projectId}
with the project's unique ID.
Authentication
This API requires Basic Authentication. The "Authorization" header should be set with the Base64 encoded string of "apikey:YOUR_API_KEY".
Authorization: Basic <base64Encoded(apikey:YOUR_API_KEY)>
Headers
Content-Type: application/json
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential (as described above).
Path Parameters
Parameter | Type | Description |
---|---|---|
projectId |
String | The unique identifier of the project. |
Request Body (JSON)
The request body should be a UTF8 JSON object containing the following parameters:
Parameter | Type | Required | Description |
---|---|---|---|
fileName |
String | Yes | Filename |
clipName |
String | No | Title of Track |
timecodeIn |
String | Yes | Timecode of cue in sequence in SMPTE format (HH:MM:SS:FF) |
timecodeOut |
String | Yes | Timecode of End of cue in sequence in SMPTE format (HH:MM:SS:FF) |
duration |
String | No | Cue duration in SMPTE format (HH:MM:SS:FF) |
sourceStart |
String | No | Source Timecode Start in SMPTE format (HH:MM:SS:FF) |
sourceEnd |
String | No | Source Timecode End in SMPTE format (HH:MM:SS:FF) |
Example Request Body 1 - only required parameters
Create one new entry.
{
"filename" : "mysong.mp3",
"timecodeIn" : "10:02:12:03",
"timecodeOut" : "10:02:16:12"
}
Example Request Body 2 - multiple entries
Create multiple new entry with different attributes.
[
{
"fileName": "intro_theme.mp3",
"clipName": "Intro Theme",
"timecodeIn": "00:00:00:00",
"timecodeOut": "00:00:30:12",
"duration": "00:00:30:12"
},
{
"fileName": "dialogue_1.mp3",
"clipName": "Opening Dialogue",
"timecodeIn": "00:00:31:00",
"timecodeOut": "00:01:15:00",
"sourceIn": "00:00:00:00",
"sourceOut": "00:00:44:00"
},
{
"fileName": "transition_fx.mp3",
"clipName": "Whoosh FX",
"timecodeIn": "00:01:15:01",
"timecodeOut": "00:01:16:10"
}
]
cURL Examples
cURL Request Example 1 - only required parameters
curl -X POST https://api.editingtools.io/v2/cuesheets/project/{projectId}/entries \
-u "apikey:YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"filename" : "mysong.mp3",
"timecodeIn" : "10:02:12:03",
"timecodeOut" : "10:02:16:12"
}'
cURL Request Example 2 - with cues
curl -X POST https://api.editingtools.io/v2/cuesheets/project/{projectId}/entries \
-u "apikey:YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"fileName": "intro_theme.mp3",
"clipName": "Intro Theme",
"timecodeIn": "00:00:00:00",
"timecodeOut": "00:00:30:12",
"duration": "00:00:30:12"
},
{
"fileName": "dialogue_1.mp3",
"clipName": "Opening Dialogue",
"timecodeIn": "00:00:31:00",
"timecodeOut": "00:01:15:00",
"sourceIn": "00:00:00:00",
"sourceOut": "00:00:44:00"
},
{
"fileName": "transition_fx.mp3",
"clipName": "Whoosh FX",
"timecodeIn": "00:01:15:01",
"timecodeOut": "00:01:16:10"
}
]'
Responses
Success (HTTP 201 Created)
If the request is successful, the API will return a 201 Created
status code with a JSON object containing project details. The JSON will contain some informations.
Field | Type | Description |
---|---|---|
code |
String | HTTP status code. |
status |
String | Status message. |
timestamp |
String | Timestamp of server time (ISO 8601). |
data |
Object | An object containing details about the project. |
data.projectId |
String | The unique identifier of the project. |
data.creationDate |
String | Timestamp of project creation (ISO 8601). |
Example
{
"code": "201",
"status": "The music track entries have been successfully added to the project. (3/3)",
"timestamp": "2025-01-05T10:08:00Z",
"data": {
"projectId": "rcwo9binm0xo8wt9vpfz16pt5pypju",
"creationDate": "2025-01-01T19:10:00Z"
}
}
Error Responses (Example)
Error responses will typically include an appropriate HTTP status code (e.g., 400 Bad Request, 401 Unauthorized) and a JSON body with an error message.
It's recommended that the content of the "status" field be shown to end users as it can contain useful information. For example, it could be shown in an error dialog.
{
"code": "404",
"status": "Project not found.",
"timestamp": "2025-01-01T19:10:00Z"
}
Get entries
We are currently reworking this endpoint to prepare it for the new API v2, and it will be back online shortly.
Export Music Cue Sheet
We are currently reworking this endpoint to prepare it for the new API v2, and it will be back online shortly.
Delete Project Entries
This endpoint is used to delete all music track entries in a project. The project itself will not be deleted. The project is identified by its projectId
in the URL path.
Endpoint
DELETE https://api.editingtools.io/v2/cuesheets/project/{projectId}/entries
Replace {projectId}
with the project's unique ID.
Headers
Content-Type: application/json
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential using `YOUR_API_KEY`.
Path Parameters
Parameter | Type | Description |
---|---|---|
projectId |
String | The unique identifier of the project. |
cURL Request Example
curl -X DELETE https://api.editingtools.io/v2/cuesheets/project/{projectId}/entries \
-u "apikey:YOUR_API_KEY"
Replace {projectId}
with the project id.
Responses
Success (HTTP 200 OK)
If the project entries were deleted successfully, the API will return a 200 OK
status code with a JSON object confirming the deletion..
{
"code": "200",
"status": "All music track entries in the project have been successfully deleted.",
"timestamp": "2025-01-01T19:10:00Z"
}
Error Responses
Error responses will typically include an appropriate HTTP status code and a JSON body with an error message.
{
"code": "404",
"status": "The project with the chosen projectId could not be found.",
"timestamp": "2025-01-01T19:10:00Z"
}
Music Cue Sheet Uploader
Plugin for Premiere Pro
Our free plugin "Music Cue Sheet Uploader" allows users to collect and summarize tracks within Premiere Pro. With one click, users can upload these tracks to the EditingTools.io cloud. The plugin is free for end users.
We offer other tools, companies or music cue sheet platforms to integrate their platform into the plugin. This enables users to seamlessly upload tracks to their platform directly with a single click, using our free plugin together with an API Key provided by their platform.

How the plugin works
The native plugin lets Premiere Pro users make lists with audio clips and individual filters inside Premiere Pro. The interface is simple and offers many options. You can combine clips that are cut or overlap into a single clip. You can also filter the list to show only selected tracks or to show only filenames that contain special words. You can see the cue sheet before you upload it in Premiere Pro. The plugin is a more simplified version of our Listify plugin.
Upload to your platform
In addition to uploading tracks directly to EditingTools.io for further processing, your platform can be integrated as well. The plugin can send a REST API request directly from Premiere Pro to a predefined server. The endpoint should requires an API key, which your platform provides to the user and which can be entered into the plugin. Once the user clicks "Upload", the plugin will send a request to the defined server including the music cue data in JSON format.
Begin the integration process
Please contact our team and provide the following details about your platform:
- Platform and product name.
- Website URL.
- A short description of your platform.
- Icon or logo for your product (EPS, SVG or PNG + Alpha).
We will assess the possibilities of integration and arrange a call with our team.
The following legal and technical requirements must be met for integration.
Technical Requirements- An SSL API endpoint (e.g.,
POST https://yourWebsite.com/yourApiEndpoint
) that acceptsapplication/json
and can process submitted cue sheets. Check our Example code. - Customer Authorization method (e.g. Authentication credential such as an API Key in header).
- Implement proper error handling.
- Demo Login for our team to test the integration with your server.
- Signed development order/contract.
- Payed development fee.
- Active Pro Subscription or Support Contract.
Receive API calls
The plugin can submit the following sequence details from Adobe Premiere Pro for processing in your Endpoint. See our example php code.
Field | Type | Description | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
name |
String | Sequence name | ||||||||||||||||||||||||||
framerate |
String | Framerate of the sequence. | ||||||||||||||||||||||||||
entries |
Object | Object with music track entries. | ||||||||||||||||||||||||||
|
Example Request
The plugin will call your endpoint with a request similar to the one below.
Headers- Content-Type:
application/json
- Authorization:
Authentication credentials
{
"name": "My Film",
"framerate": "25",
"entries" : [
{
"fileName" : "mysong.mp3",
"clipName": "My Song",
"timecodeIn" : "10:02:12:03",
"timecodeOut" : "10:02:16:12",
"duration": "",
"sourceStart": "",
"sourceEnd": "",
"audioTrack": ""
},
{
"fileName" : "song_2.mp3",
"clipName": "Song 2",
"timecodeIn" : "10:03:20:01",
"timecodeOut" : "10:04:23:21",
"duration": "",
"sourceStart": "",
"sourceEnd": "",
"audioTrack": ""
}
]
}
Return Success
Your API endpoint should return code 201
when the call was successfull. We use the 201 Created code when a cue sheet is successfully created on the server. The response body should be a UTF8 JSON object containing the following parameters:
Parameter | Type | Required | Description |
---|---|---|---|
code |
Int | Yes | Code 201 for success. |
status |
String | Yes | Description. |
Success Responses Example
{
"code": "201",
"status": "The Project was created."
}
Handling Special Characters in Filenames
Please ensure that your API can correctly handle file names containing special characters, emojis, and other non-ASCII characters. Premiere Pro does not limit file names, and users tend to import files without renaming them. Make sure an API call is processed even if only one file name is invalid.
- Make sure to shorten long file names that exceed your database limit. For example, be aware that file names can be longer than 256 and 512 characters.
- Make sure to handle filenames containing emoticons, as they tend to cause problems.
- Make sure to handle special chars and invalid characters that can not be stored in your database. Remove them first if they can not be stored in your database.
The example file name below is technically importable in Premiere Pro and can therefore could be reported to your API endpoint. Ensure that your endpoint can handle it.
Ain’t#2✔B"ы'о";,.Üéß👍が.mp3
Handling Framerates above 100
Be aware that SMPTE timecode and duration can be up to 12 characters long for frame rates above 100 fps e.g. "10:02:12:030". Make sure your endpoint can handle them.
Error Handling
Your API endpoint should handle errors and respond accordingly, for example, if the API key is invalid or project creation fails. Use only error codes supported by our API.
The response body should be a UTF8 JSON object containing the following parameters:
Parameter | Type | Required | Description |
---|---|---|---|
code |
Int | Yes | Error code. For example code 400 . |
status |
String | Yes | Description of error. |
Error Responses Example
{
"code": "400",
"status": "The Project creation failed."
}
Endpoint Demo Code (PHP)
The following code example can be used by the endpoint to receive calls from the plugin.
header('Content-Type: application/json');
// --- Configuration ---
define('MAX_FILENAME_LENGTH', 255); // Example max length for database field
// --- Helper function for sending JSON responses ---
function sendJsonResponse($code, $status, $httpStatusCode = 200) {
http_response_code($httpStatusCode);
echo json_encode([
'code' => $code,
'status' => $status
]);
exit(); // Terminate script execution after sending response
}
// --- Main Endpoint Logic ---
// 1. Check for POST request method
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
sendJsonResponse(405, 'Method Not Allowed. Only POST requests are accepted.', 405);
}
// 2. Validate Authorization header (API Key)
$headers = getallheaders();
$authorizationHeader = $headers['Authorization'] ?? $headers['authorization'] ?? ''; // Case-insensitive check
if (empty($authorizationHeader)) {
sendJsonResponse(401, 'Authorization header missing.', 401);
}
// Expecting "apikey:API_KEY" format
if (strpos($authorizationHeader, 'apikey:') === 0) {
$apiKey = substr($authorizationHeader, strlen('apikey:'));
//Add API KEY validation
define('VALID_API_KEY', 'test-key');
if ($apiKey !== VALID_API_KEY) {
sendJsonResponse(403, 'Invalid API Key.', 403);
}
} else {
// Also check for Basic Auth style for simplicity if Premiere Pro sends it that way for '-u "apikey:API_KEY"'
// This is a common interpretation of the curl example, adjust as needed.
if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] !== 'apikey' || $_SERVER['PHP_AUTH_PW'] !== VALID_API_KEY) {
sendJsonResponse(403, 'Invalid or missing API Key credentials in Authorization header.', 403);
}
}
// 3. Read and parse JSON input
$input = file_get_contents('php://input');
if ($input === false) {
sendJsonResponse(400, 'Failed to read request body.', 400);
}
$data = json_decode($input, true); // true to get associative array
if (json_last_error() !== JSON_ERROR_NONE) {
sendJsonResponse(400, 'Invalid JSON format: ' . json_last_error_msg(), 400);
}
// 4. Process entries and handle special characters/long filenames
$processedEntries = [];
foreach ($data['entries'] as $index => $entry) {
// --- Filename sanitization and truncation ---
$originalFileName = $entry['fileName'];
$processedFileName = $originalFileName;
// Convert to UTF-8 if not already (important for handling various characters)
// This assumes the incoming data is UTF-8, but can be a safeguard.
if (!mb_check_encoding($processedFileName, 'UTF-8')) {
$processedFileName = mb_convert_encoding($processedFileName, 'UTF-8', mb_detect_encoding($processedFileName, 'UTF-8, ISO-8859-1', true));
}
// Handle problematic characters by replacing them or removing them
// Example: remove characters that might cause issues with file paths or database queries
// Remove emojis/specific unicode chars if they absolutely cannot be stored
// Truncate long filenames
if (mb_strlen($processedFileName, 'UTF-8') > MAX_FILENAME_LENGTH) {
$fileExtension = pathinfo($processedFileName, PATHINFO_EXTENSION);
$fileNameWithoutExt = pathinfo($processedFileName, PATHINFO_FILENAME);
$truncatedFileName = mb_substr($fileNameWithoutExt, 0, MAX_FILENAME_LENGTH - mb_strlen($fileExtension, 'UTF-8') - 1, 'UTF-8') . '.' . $fileExtension;
$processedFileName = $truncatedFileName;
error_log("Filename truncated for entry $index: '$originalFileName' to '$processedFileName'");
}
$entry['fileName'] = $processedFileName; // Update the entry with the processed filename
$processedEntries[] = $entry;
// Example: Log or store the data
// Connect to a database (e.g., MySQL, PostgreSQL)
// and store this information, handling potential errors from database operations.
// Example:
// try {
// $stmt = $pdo->prepare("INSERT INTO cuesheet_entries (sequence_name, filename, clipname, ...) VALUES (?, ?, ?, ...)");
// $stmt->execute([$data['name'], $entry['fileName'], $entry['clipName'], ...]);
// } catch (PDOException $e) {
// sendJsonResponse(500, 'Database error: ' . $e->getMessage(), 500);
// }
}
// Simulating success
error_log("Successfully received cue sheet for sequence: " . $data['name'] . " with " . count($processedEntries) . " entries.");
error_log("Processed Data: " . json_encode([
'name' => $data['name'],
'framerate' => $data['framerate'],
'entries' => $processedEntries
]));
// If all processing is successful, send a success response
sendJsonResponse(201, 'Cue sheet received and processed successfully.', 201);
Test your endpoint - cURL Request Example
Test your endpoint with a simple cURL call.
curl -X POST https://yourWebsite.com/yourApiEndpoint \
-u "apikey:API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My Film",
"framerate": "25",
"entries" : [
{
"fileName" : "mysong.mp3",
"clipName": "My Song",
"timecodeIn" : "10:02:12:03",
"timecodeOut" : "10:02:16:12",
"duration": "",
"sourceStart": "",
"sourceEnd": "",
"audioTrack": ""
},
{
"fileName" : "Ain’t#2✔B"ы'о";,.Üéß👍が.mp3",
"clipName": "Ain’t#2✔B"ы'о";,.Üéß👍が",
"timecodeIn" : "10:03:20:01",
"timecodeOut" : "10:04:23:21",
"duration": "",
"sourceStart": "",
"sourceEnd": "",
"audioTrack": ""
}
]
}'
Next steps and release
Once your endpoint is up and running, we will implement it, test it and release a new version of the plugin that can be shared with your users.
Search Metadata
This endpoint can be used to search for metadata from production music libraries using the file name.
- As a production music library, you are already providing metadata to EditingTools. This endpoint can then be unlocked to enable searches within your own database. For example, you could use it to check if the metadata is indexed and found correctly. Your search is limited to your own database.
- The production libraries that you want to search have agreed to your software accessing their metadata directly via our API.
Endpoint
This endpoint is used to search for metadata.
POST https://api.editingtools.io/v2/metadata/search
Authentication
This API requires Basic Authentication. The "Authorization" header should be set with the Base64 encoded string of "apikey:YOUR_API_KEY".
Authorization: Basic <base64Encoded(apikey:YOUR_API_KEY)>
Headers
Content-Type: application/json
Specifies the format of the request body.
Authorization: Basic <base64EncodedString>
Authentication credential.
Request Body
The request can contain the following parameters:
Parameter | Type | Required | Description |
---|---|---|---|
fileName |
String | Yes | |
libraries |
String | Yes | A list of libraries to search, separated by commas. |
Request Example
curl -X POST https://api.editingtools.io/v2/metadata/search \
-u "apikey:API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fileName": "audiofile.mp3",
"libraries": "abcmusic, xyzmusic"
}'
For more details please contact our team.
Endpoint URL
Endpoint URL to convert a sequence into a music cue sheet document in one step.
https://api.editingtools.io/v2/cuesheet
Endpoint URL to create and manage a music cue sheet project.
https://api.editingtools.io/v2/cuesheets
Authentication
This API requires Basic Authentication. The "Authorization" header should be set with the Base64 encoded string of "apikey:YOUR_API_KEY".
Authorization: Basic <base64Encoded(apikey:YOUR_API_KEY)>
Data Handling
Request parameters must be UTF-8 encoded. Results are returned as UTF-8-encoded JSON. By default, datasets will be inside the data tag.
Error Handling
This API service uses standard HTTP response codes to indicate whether a method was completed successfully. HTTP response codes in the 2XX range indicate success. Responses in the 4XX range indicate some sort of failure, while responses in the 5XX range indicate an internal system error that cannot be resolved by the user. The following error codes are used by the API:
Code | Description |
---|---|
200 | OK. The request was successful. |
201 | Created. The entity was created. |
202 | Accepted. The request was accepted. |
400 | Bad request. Please check error message. |
401 | Unauthorized: Username or Api Key is not valid. |
402 | Upgrade Required: This feature requires an active Pro subscription. |
403 | Forbidden: The request is understood, but it has been refused or access is not allowed. |
404 | Not found: The URI requested is invalid or the resource does not exist. |
422 | Unprocessable Entity. A process failed. |
429 | Too Many Requests. Try again in some seconds. |
500 | Internal Server Error. Something is broken. |
502 | Bad Gateway. API is down. |
503 | Service Unavailable. API is up but overloaded with requests. |
504 | Gateway Timeout: API is up but requests reached timout. |
Rate Limits
To prevent abuse and spam, the API has limits at various levels. If you receive error code 429 (Too Many Requests)
, it means you have reached a rate limit.
If you receive a rate limit error, you should stop making requests temporarily. If the retry-after
response header is present, you should not retry your request until after that many seconds has elapsed. To prevent rate-errors, we recommend to wait 300 ms
to 800 ms
between requests to the same endpoint.
Also there is a general limit to the api and all requests made:
Limit | Requests |
---|---|
General limit per minute | 50 |
General limit per hour | 1000 |
Recommended wait time between requests | > 200 ms |
Recommended wait time between requests to one endpoint | > 600 ms |
The general limits per minute and per hour can be changed upon request.
Upload Limits
The maximum upload size for any single request — including file uploads — is 100 MB
. This is a hard limit and applies regardless of your API plan or usage level.
If your request exceeds this size, it will be rejected before reaching our servers. To ensure successful uploads:
- Make sure uploaded files are under 100 MB.
- For larger media, consider splitting files before upload.
- Requests close to the limit may still fail due to encoding or header overhead.
Timezone
This API endpoint returns the time as an ISO 8601 timestamp
in the UTC time zone. These timestamps look like 2025-01-10T15:05:06Z
.
Localization and Languages
This API supports multiple languages. For instance, it can display the text of a status message in a different language.
Accept-Language: LANGUAGE
Example
To set the preferred response language to Spanish, add this header:
Accept-Language: es
cURL Example
To apply the language in a cURL request, add the following header:
-H "Accept-Language: es"
Available Languages
The following list contains all the currently available languages. Note that setting a language header does not guarantee a translated response, as not all texts are translated. If no language is set or a translation is unavailable, the default response will be in English.
Code | Language |
---|---|
en | English |
de | German |
fr | French |
es | Spanish |
ru | Russian |
it | Italian |
el | Greek |
pl | Polish |
pt | Portuguese |
lt | Lithuanian |
ko | Korean |
ja | Japanese |
zh | Chinese |
id | Indonesian |
tr | Turkish |
nl | Dutch |
ro | Romanian |
fi | Finnish |
cs | Czech |
hu | Hungarian |
ar | Arabic |
nb | Norwegian Bokmål |
sk | Slovak |
sl | Slovenian |
sv | Swedish |
lv | Latvian |
et | Estonian |
bg | Bulgarian |
uk | Ukrainian |
da | Danish |