Reference

Intake contract & limits

Everything the intake lane enforces, and where each limit is checked.

Clip limits

ConstraintValueChecked
ContainerMP4 (video/mp4)Browser, then server
Duration1–30 secondsBrowser via metadata, then server
Size≤ 8 MBBrowser, then server
SpeakersOne English speakerTranscript quality gate
Protected termClip must say “Toluva”Transcript quality gate

Browser checks are a courtesy

Duration and size are read locally so you get an answer immediately instead of after a failed upload. They are not the enforcement point — the server re-checks everything.

Required confirmations

Both are mandatory. The submit button stays disabled until both are ticked, and the server rejects a request that arrives without them.

  1. Source rights — you have the right to upload this clip and create a localized edition from it.
  2. Synthetic-voice disclosure — you understand the German track uses a disclosed ElevenLabs stock synthetic voice and needs human approval before publishing.

These travel with the job request as sourceRightsConfirmed and syntheticVoiceDisclosureAcknowledged.

Locked job contract

Public intake does not let you choose these. They are fixed so the authorization record and the run always agree.

FieldValue
Target languageGerman · de-DE
PurposeInternal training
VoiceDisclosed stock synthetic
Protected termToluva

Bounded public capacity

BoundValueConstant
Speech calls per job4MAX_TTS_CALLS_PER_JOB
Generated characters per job400MAX_TTS_CHARACTERS_PER_JOB
Admission slots per UTC day3 (configurable 1–25)TOLUVA_PUBLIC_DAILY_JOB_LIMIT

The worker validates the exact admission slot before any provider call, so these hold regardless of what the interface does.

Error codes

CodeStatusMeaning
source_file_required400No file in the request
source_must_be_mp4415Wrong container
source_size_out_of_range413Over 8 MB
clip_duration_out_of_range400Outside 1–30s
authorization_wrong_language403Outside the authorization scope
authorization_wrong_purpose403Outside the authorization scope
live_intake_unavailable403Intake window is closed

Failing closed

Every one of these refuses before a provider call and before B2 is mutated. A rejected intake costs nothing and leaves no partial state.