curl --location 'https://api.myvocal.ai/sound_clone/api/v1/interpretation/projects/ip_.../generations' \
--header 'accessKey: <your_api_key>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: 5ad0f3c7b21e4896' \
--data '{ "quoteId": "iq_..." }'
{
"code": 1,
"message": "success",
"data": {
"acceptanceId": "ia_...",
"generationId": "ia_...",
"projectId": "ip_...",
"quoteId": "iq_...",
"state": "ACCEPTED",
"targets": [
{ "targetId": "it_...", "language": "es", "generationId": "ia_...", "state": "QUEUED", "jobId": "ij_...", "reservationCycle": 1, "reservedCharacters": "6000" },
{ "targetId": "it_...", "language": "fr", "generationId": "ia_...", "state": "QUEUED", "jobId": "ij_...", "reservationCycle": 1, "reservedCharacters": "6000" }
],
"existingTargets": [],
"newTargets": [ { "language": "es", "characters": "6000" }, { "language": "fr", "characters": "6000" } ],
"reservedCharacters": "12000",
"reservationCycle": 1,
"requestId": "..."
}
}
Interpretation
Accept an interpretation quote
Accept a quote and start generating the translated target languages.
POST
/
sound_clone
/
api
/
v1
/
interpretation
/
projects
/
{projectId}
/
generations
curl --location 'https://api.myvocal.ai/sound_clone/api/v1/interpretation/projects/ip_.../generations' \
--header 'accessKey: <your_api_key>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: 5ad0f3c7b21e4896' \
--data '{ "quoteId": "iq_..." }'
{
"code": 1,
"message": "success",
"data": {
"acceptanceId": "ia_...",
"generationId": "ia_...",
"projectId": "ip_...",
"quoteId": "iq_...",
"state": "ACCEPTED",
"targets": [
{ "targetId": "it_...", "language": "es", "generationId": "ia_...", "state": "QUEUED", "jobId": "ij_...", "reservationCycle": 1, "reservedCharacters": "6000" },
{ "targetId": "it_...", "language": "fr", "generationId": "ia_...", "state": "QUEUED", "jobId": "ij_...", "reservationCycle": 1, "reservedCharacters": "6000" }
],
"existingTargets": [],
"newTargets": [ { "language": "es", "characters": "6000" }, { "language": "fr", "characters": "6000" } ],
"reservedCharacters": "12000",
"reservationCycle": 1,
"requestId": "..."
}
}
Accepts the quote, reserves its Characters per language and queues the work. The call returns immediately; poll the project or the jobs for progress.
Header
string
required
API key for authentication.
string
required
Unique per operation: 16–64 printable ASCII characters. Same key with a different body is rejected with
47111.Path
string
required
The project identifier.
Body
string
required
The quote to accept. Must not be
null — see ALL_TARGETS_EXIST in the quote endpoint.Response
string | null
Stable identifier of the accepted generation. Use it (or the target/job IDs) to recover.
string | null
Alias of
acceptanceId.string
Project identifier.
string
The accepted quote.
string
Acceptance state, for example
ACCEPTED.array
{ targetId, language, generationId, state, jobId, reservationCycle, reservedCharacters }. reservedCharacters is a string.array
Languages that already existed and were not charged again.
array
Languages newly created by this acceptance.
string
Total reserved Characters, as a string.
number
Reservation cycle for this acceptance.
curl --location 'https://api.myvocal.ai/sound_clone/api/v1/interpretation/projects/ip_.../generations' \
--header 'accessKey: <your_api_key>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: 5ad0f3c7b21e4896' \
--data '{ "quoteId": "iq_..." }'
{
"code": 1,
"message": "success",
"data": {
"acceptanceId": "ia_...",
"generationId": "ia_...",
"projectId": "ip_...",
"quoteId": "iq_...",
"state": "ACCEPTED",
"targets": [
{ "targetId": "it_...", "language": "es", "generationId": "ia_...", "state": "QUEUED", "jobId": "ij_...", "reservationCycle": 1, "reservedCharacters": "6000" },
{ "targetId": "it_...", "language": "fr", "generationId": "ia_...", "state": "QUEUED", "jobId": "ij_...", "reservationCycle": 1, "reservedCharacters": "6000" }
],
"existingTargets": [],
"newTargets": [ { "language": "es", "characters": "6000" }, { "language": "fr", "characters": "6000" } ],
"reservedCharacters": "12000",
"reservationCycle": 1,
"requestId": "..."
}
}
Replays are not byte-for-byte copies of the first response, and there are two distinct behaviours:
- Same key, same body: the existing acceptance is returned, re-read from the current state, so the target and job states may already have advanced.
- Same quote, a different key: if the quote was already accepted, the existing acceptance is returned again before any price re-check and without charging twice. This is deliberate and differs from the Text-to-Music rule, where a consumed quote is rejected with
47007.
47111): re-read the project to discover what already happened instead of silently switching to a new key.Common errors
code = 47111: theIdempotency-Keywas reused with a different body.code = 47110: not enough Characters available.code = 47108/47109: the quote expired or is no longer valid.code = 47103: the source is not ready.code = 47119: an ENTERPRISE account has no configured contract rate.code = 47128: the plan is not entitled to generate.code = 47102: the project does not exist or is not owned by your account.
