curl --location 'https://api.myvocal.ai/sound_clone/api/v1/interpretation/uploads/iu_.../complete' \
--header 'accessKey: <your_api_key>' \
--header 'Content-Type: application/json' \
--data '{
"parts": [
{ "partNumber": 1, "etag": "<etag-1>" },
{ "partNumber": 2, "etag": "<etag-2>" }
]
}'
{
"code": 1,
"message": "success",
"data": {
"uploadId": "iu_...",
"projectId": "ip_...",
"state": "READY",
"errorCode": null,
"sourceAssetId": "ia_...",
"sourceVersion": 1,
"durationMs": "90000",
"media": { "inputFormat": "mov,mp4,m4a,3gp,3g2,mj2", "containerName": "mov,mp4,m4a,3gp,3g2,mj2", "audioStreamCount": 1, "video": true },
"requestId": "..."
}
}
Interpretation
Complete an upload
Assemble the uploaded parts, probe the media and commit the source version.
POST
/
sound_clone
/
api
/
v1
/
interpretation
/
uploads
/
{uploadId}
/
complete
curl --location 'https://api.myvocal.ai/sound_clone/api/v1/interpretation/uploads/iu_.../complete' \
--header 'accessKey: <your_api_key>' \
--header 'Content-Type: application/json' \
--data '{
"parts": [
{ "partNumber": 1, "etag": "<etag-1>" },
{ "partNumber": 2, "etag": "<etag-2>" }
]
}'
{
"code": 1,
"message": "success",
"data": {
"uploadId": "iu_...",
"projectId": "ip_...",
"state": "READY",
"errorCode": null,
"sourceAssetId": "ia_...",
"sourceVersion": 1,
"durationMs": "90000",
"media": { "inputFormat": "mov,mp4,m4a,3gp,3g2,mj2", "containerName": "mov,mp4,m4a,3gp,3g2,mj2", "audioStreamCount": 1, "video": true },
"requestId": "..."
}
}
Tells the service that all parts are uploaded. It assembles the object, probes the media, and publishes the source version.
Header
string
required
API key for authentication.
Path
string
required
The upload session identifier.
Body
array
required
All parts, in part-number order:
{ partNumber, etag }, using the exact ETag values returned by object storage. Missing, extra or mismatched entries are rejected with 47126.Response
string
The upload session.
string
Project identifier.
READY when the probe has already finished; otherwise COMPLETING or PROBING, so poll GET /uploads/{uploadId}.string | null
Set when the upload failed.
string | null
The created source asset, or
null when it has not been created yet.number
The committed source version.
string | null
Detected duration, as a string.
object | null
{ inputFormat, containerName, audioStreamCount, video, width, height, rotationDegrees }.curl --location 'https://api.myvocal.ai/sound_clone/api/v1/interpretation/uploads/iu_.../complete' \
--header 'accessKey: <your_api_key>' \
--header 'Content-Type: application/json' \
--data '{
"parts": [
{ "partNumber": 1, "etag": "<etag-1>" },
{ "partNumber": 2, "etag": "<etag-2>" }
]
}'
{
"code": 1,
"message": "success",
"data": {
"uploadId": "iu_...",
"projectId": "ip_...",
"state": "READY",
"errorCode": null,
"sourceAssetId": "ia_...",
"sourceVersion": 1,
"durationMs": "90000",
"media": { "inputFormat": "mov,mp4,m4a,3gp,3g2,mj2", "containerName": "mov,mp4,m4a,3gp,3g2,mj2", "audioStreamCount": 1, "video": true },
"requestId": "..."
}
}
Retrying completion is safe: the service tolerates a lost response by re-reading the object metadata. But always send the complete part list — not just the last part.
Common errors
code = 47126: the submitted part list does not match the session.code = 47124: the upload session does not exist or is not owned by your account.code = 47125: the file exceeded the size limit or had no content.code = 47104/47105: the source is invalid or has no audio track.code = 47127: object storage is unavailable — retry.
