EthoswarmEthoswarm
← Back to Bazaar

Vitra Translate Suite

Copied!
Verified

Vitra.ai media-localization + creative-generation suite. Bundles five skills under one app: (1) image CREATION (brand-kit-aware on-brand creatives — generate, edit, translate layout; synchronous, returns image URL + gallery URL); (2) image-text translation (translates visible text inside images; async submit→poll); (3) audio dubbing (async submit→poll); (4) video dubbing (async submit→poll); (5) audio/video transcription (speech-to-text; async submit→poll, reuses shared Vitra_GetDubbingStatus). Single-header auth via va-token from VITRA_AGENT_TOKEN across both api.translate.photo and api.translate.video. 15 tools total. Skills 2-5 async; Skill 1 synchronous with no poll.

Equipped By
14Minds
Comprised Of
15App Tools
App Tools
15
Vitra_CreateBrandKitPOST

Create a new brand kit by scraping a brand's homepage via POST https://api.translate.photo/v1/service/image-creator/brand-kit (Content-Type: application/json). JSON body: {url: '<homepage-url>'}. Returns the new brand kit including its brand_kit_id. Call this ONLY when Vitra_ListBrandKits surfaced no kit matching the Steward's brand/domain. The scrape, its output, and the resulting brand_kit_id are INTERNAL — never shown to the Steward; the only Steward-facing prompt is asking for the website URL when one is needed and absent from context. Runtime mapping (Mind passes snake_case; runtime constructs the API JSON body): url <- website_url. Hard reject any website_url whose scheme is not http(s). Errors arrive as standard non-2xx HTTP (401/403 = auth rejected; any other non-2xx = request/server error).

Vitra_DirectTranslatePOST

Submit an image for text translation via POST https://api.translate.photo/v1/image-translator/direct-translate. JSON body: {fileUrl: '<source-url>', sourceLanguage: '<value-from-Vitra_ListImageLanguages>', targetLanguage: '<value-from-Vitra_ListImageLanguages>'}. The vendor fetches the fileUrl server-side and enforces the 10MB cap — no client-side multipart upload, no client-side download. Async — returns {jobId, translationVersionId} immediately; you MUST call Vitra_GetTranslationStatus to retrieve the translatedImageUrl. NEVER pass ISO codes ('es', 'fr', 'hi') — pass the identifier the API returned in the 'value' field of Vitra_ListImageLanguages (e.g. 'spanish', 'french', 'hindi'). Auto-detect aliases ('auto-detect', 'Auto Detect', 'autodetect', 'detect') are normalized to the literal 'auto' before send. This endpoint's errors arrive as standard HTTP status (401/403 = auth rejected; any other non-2xx = request/server error — read the JSON body for the message). Runtime mapping: source_url ? fileUrl field; source_language ? sourceLanguage field; target_language ? targetLanguage field. Hard reject any source_url whose scheme is not http(s).

Vitra_EditImagePOST

Edit a previously generated creative via POST https://api.translate.photo/v1/service/image-creator/image/edit (Content-Type: application/json). JSON body: {assetId: '<asset_id>', instruction: '<plain-language edit>'}. SYNCHRONOUS — returns a fresh asset ({status: 'ok', data: {asset_id, asset_url, gallery_url}}) directly; no poll. asset_id MUST be one captured from a Vitra_GenerateImage (or a prior Vitra_EditImage / Vitra_TranslateImageLayout) response IN THE CURRENT SESSION — never Steward-supplied or fabricated. The returned asset_id SUPERSEDES the prior one for further follow-ups. Present ONLY the new asset_url + gallery_url; NEVER show asset_id. Runtime mapping (Mind passes snake_case; runtime constructs the API JSON body): assetId <- asset_id; instruction <- instruction. Errors arrive as standard non-2xx HTTP (401/403 = auth rejected; any other non-2xx = request/server error).

Vitra_GenerateImagePOST

Generate a structured, brand-kit-aware creative image via POST https://api.translate.photo/v1/service/image-creator/image/generate (Content-Type: application/json). JSON body: {brandKit: '<brand_kit_id>', channel: '<platform-format>', headline?: '<copy>', cta?: '<copy>', enrich?: <bool>}. SYNCHRONOUS — on an HTTP 2xx the response carries the finished asset (per the reference SKILL.md the success shape is {status: 'ok', data: {asset_id, asset_url, gallery_url}}); there is NO async job and NO poll tool. Capture asset_id as INTERNAL state (thread it into Vitra_EditImage / Vitra_TranslateImageLayout) and present ONLY asset_url (direct image link) and gallery_url to the Steward — NEVER asset_id, NEVER brand_kit_id. brand_kit_id must be a resolved id from Vitra_ListBrandKits or Vitra_CreateBrandKit (not Steward-supplied). channel is a platform-format identifier (e.g. 'instagram_post', 'facebook_cover'). Runtime mapping (Mind passes snake_case; runtime constructs the API JSON body): brandKit <- brand_kit_id; channel <- channel; headline <- headline; cta <- cta; enrich <- enrich. Errors arrive as standard non-2xx HTTP (401/403 = auth rejected; any other non-2xx = request/server error).

Vitra_GetDubbingStatusGET

Poll the async dubbing result via GET https://api.translate.video/v1/service/status/{processId}. Shared between Vitra_SubmitAudioDub and Vitra_SubmitVideoDub (same processId namespace, same status endpoint). Returns {status, data: [...], ...}. DONE statuses (uppercase): 'DONE', 'COMPLETED', 'SUCCESS'. FAILED statuses (uppercase): 'FAILED', 'ERROR', 'CANCELLED'. On a completed status, the output URL is at data[0].url — extract that and present it to the Steward. Recommended polling cadence: every 10 seconds within a 600-second total budget (dubbing is slower than image translation). NEVER expose processId to the Steward as a result — it is an intermediate identifier. Error handling: callers branch on raw HTTP status — a non-200 response is an error, and 401/403 means the va-token was rejected. On a completed status with empty data or no data[0].url, treat it as an error (surface it and stop; do not loop). Runtime mapping: the JSON Schema parameter 'process_id' (snake_case for Mind ergonomics) is substituted into the URL path segment '{processId}' (camelCase per Vitra's API). No request body.

Vitra_GetTranslationStatusGET

Poll the async image-translation result via GET https://api.translate.photo/v1/image-translator/{jobId}/translations/{translationVersionId}. Returns {status, translatedImageUrl}. Status values include 'pending', 'translating', 'completed' (also 'complete', 'done', 'success', 'succeeded', 'finished' — case-insensitive), and failure states ('failed', 'error', 'errored', 'cancelled', 'canceled'). translatedImageUrl is the final cloud URL the Mind returns to the Steward — only present when status is in the completed family AND the URL starts with http(s). Recommended polling cadence: every 5 seconds within a 300-second total budget. NEVER expose jobId or translationVersionId to the Steward as a result — they are intermediate identifiers. This endpoint's errors arrive as standard HTTP status (401/403 = auth rejected). Runtime mapping: the JSON Schema parameter 'job_id' (snake_case for Mind ergonomics) is substituted into the URL path segment '{jobId}' (camelCase per Vitra's API); 'translation_version_id' is substituted into '{translationVersionId}'. No request body.

Vitra_ListAudioLanguagesGET

List languages supported by the vitra.ai audio dubbing service via GET https://api.translate.video/v1/service/audio/languages/list. Returns {data: [{value, label, ...}]} where 'value' is the locale-form identifier the dubbing endpoint accepts (e.g. 'hindi_india', 'spanish_spain', 'french_france') and 'label' is the human-readable name. Use this BEFORE Vitra_SubmitAudioDub whenever you are unsure of the exact target language locale or when the Steward gives a plain language name ('Spanish') that needs disambiguation to a locale ('spanish_spain' vs 'spanish_mexico'). Response is cacheable for ~1 hour. NOTE: this endpoint is called WITHOUT X-Client-Source: agent — errors arrive as standard non-2xx HTTP.

Vitra_ListBrandKitsGET

List the brand kits already configured for this Vitra account via GET https://api.translate.photo/v1/service/image-creator/brand-kits. Returns the brand kits, each with a brand_kit_id and brand/page/domain metadata. Use this BEFORE Vitra_GenerateImage to SILENTLY resolve which brand kit to use: match the Steward's requested brand / page / website domain to an existing kit and reuse its brand_kit_id. CRITICAL — the brand-kit list, kit details, and brand_kit_id are INTERNAL: never show them to the Steward. If no kit matches and a homepage URL is available, scrape a new one via Vitra_CreateBrandKit. Response is cacheable for ~1 hour (LTM 'vitra_brand_kit_list'). This endpoint is on the image-creator product line (api.translate.photo /v1/service/image-creator), distinct from the image-text-translation endpoints. Errors arrive as standard non-2xx HTTP (401/403 = auth rejected; any other non-2xx = request/server error with a JSON payload). No request body.

Vitra_ListImageLanguagesGET

List languages supported by the vitra.ai image translator via GET https://api.translate.photo/v1/language/list. Returns an array of language objects, each with a 'value' field (the identifier the submit endpoint accepts, e.g. 'spanish') and a 'name' (or 'label') field (human-readable). The script normalizer also accepts 'code'/'key'/'language'/'id' as fallback identifier fields. Use this BEFORE Vitra_DirectTranslate whenever you are unsure of the exact target/source language identifier or when the Steward gives an ISO code ('es', 'fr') that needs to be mapped. Response is cacheable for ~1 hour. NOTE: this endpoint is called WITHOUT X-Client-Source: agent — errors arrive as standard non-2xx HTTP (401/403/4xx with payload), not as HTTP 200 + success:false.

Vitra_ListTranscriptionLanguagesGET

List source languages supported by the vitra.ai transcription (speech-to-text) service via GET https://api.translate.video/v1/service/transcription/languages. Returns {data: [{value, label}]} where 'value' is the locale-form identifier the transcription submit endpoint accepts (e.g. 'english_united_states', 'english_united_kingdom', 'hindi_india', 'spanish_spain') and 'label' is the human-readable name. Use this BEFORE Vitra_SubmitTranscription whenever you are unsure of the exact source locale or when the Steward gives a plain language name ('English') that needs disambiguation between locales ('english_united_states' vs 'english_united_kingdom'). Response is cacheable for ~1 hour. NOTE: this endpoint is called WITHOUT X-Client-Source: agent — errors arrive as standard non-2xx HTTP.

Vitra_ListVideoLanguagesGET

List languages supported by the vitra.ai video dubbing service via GET https://api.translate.video/v1/service/video/languages/list. Returns {data: [{value, label, ...}]} where 'value' is the locale-form identifier the dubbing endpoint accepts (e.g. 'hindi_india', 'spanish_spain') and 'label' is the human-readable name. Use this BEFORE Vitra_SubmitVideoDub whenever you are unsure of the exact target language locale. Audio and video share the same locale convention but are listed under different endpoints — call this for video, Vitra_ListAudioLanguages for audio. Response is cacheable for ~1 hour. NOTE: this endpoint is called WITHOUT X-Client-Source: agent — errors arrive as standard non-2xx HTTP.

Vitra_SubmitAudioDubPOST

Submit an audio file for dubbing via POST https://api.translate.video/v1/service/dubbing (Content-Type: application/json). JSON body: {processName: 'Audio Dubbing: <filename>', sourceLanguage: 'auto' | identifier, targetLanguages: [{language: '<value-from-Vitra_ListAudioLanguages>'}], url: '<source-url>'}. Async — returns {processId, ...}; you MUST call Vitra_GetDubbingStatus to retrieve the dubbed audio URL. The vitra.ai source-language default is 'auto'; do NOT ask the Steward for source language unless they volunteer it. target_language MUST be the 'value' field of a Vitra_ListAudioLanguages entry (locale-form: 'hindi_india', not 'hindi'). http(s) cloud URLs only (https strongly preferred). This endpoint's errors arrive as standard non-2xx HTTP: 401/403 = auth rejected, any other non-2xx = request/server error (read the JSON body for the message). Runtime mapping (Mind passes snake_case params; runtime constructs the API JSON body): url ? source_url; sourceLanguage ? source_language; targetLanguages ? [{language: target_language}] (wrap the single target into a one-element array of objects); processName ? 'Audio Dubbing: ' + the source URL's filename (the basename of the source URL, matching the reference script's Path(url).name). Hard reject any source_url whose scheme is not http(s).

Vitra_SubmitTranscriptionPOST

Submit an audio or video file for transcription (speech-to-text) via POST https://api.translate.video/v1/service/transcription (Content-Type: application/json). JSON body: {processName: 'Transcription: <filename>', sourceLanguage: '<value-from-Vitra_ListTranscriptionLanguages>', url: '<source-url>'}. Async — returns {processId} (HTTP 200 OR 201 are both success); you MUST call Vitra_GetDubbingStatus to retrieve the transcripts (the shared status endpoint /v1/service/status/{processId} also serves audio + video dubbing; the response's `data` field is the transcript array [{st, et, text}, ...] for transcription, NOT a single dubbed-output URL like dubbing's data[0].url). NOTE: source_language is REQUIRED — transcription does NOT accept 'auto' (unlike audio/video dubbing). Pass a locale-form 'value' from Vitra_ListTranscriptionLanguages (e.g. 'english_united_states', 'hindi_india'); plain names ('english', 'hindi') and ISO codes ('en', 'hi') are rejected. http(s) cloud URLs only (https strongly preferred). This endpoint's errors arrive as standard non-2xx HTTP: 401/403 = auth rejected, any other non-2xx = request/server error (read the JSON body for the message). Runtime mapping (Mind passes snake_case params; runtime constructs the API JSON body): url ? source_url; sourceLanguage ? source_language; processName ? 'Transcription: ' + the source URL's filename (the basename, matching the reference script's Path(url).name). Hard reject any source_url whose scheme is not http(s).

Vitra_SubmitVideoDubPOST

Submit a video file for dubbing via POST https://api.translate.video/v1/service/dubbing (Content-Type: application/json). JSON body: {processName: 'Dubbing: <filename>', sourceLanguage: 'auto' | identifier, targetLanguages: [{language: '<value-from-Vitra_ListVideoLanguages>'}], url: '<source-url>'}. Async — returns {processId, ...}; you MUST call Vitra_GetDubbingStatus to retrieve the dubbed video URL. The vitra.ai source-language default is 'auto'; do NOT ask the Steward for source language unless they volunteer it. target_language MUST be the 'value' field of a Vitra_ListVideoLanguages entry (locale-form). http(s) cloud URLs only (https strongly preferred). This endpoint's errors arrive as standard non-2xx HTTP: 401/403 = auth rejected, any other non-2xx = request/server error (read the JSON body for the message). Runtime mapping (Mind passes snake_case params; runtime constructs the API JSON body): url ? source_url; sourceLanguage ? source_language; targetLanguages ? [{language: target_language}] (wrap the single target into a one-element array of objects); processName ? 'Dubbing: ' + the source URL's filename (the basename of the source URL, matching the reference script's Path(url).name). Hard reject any source_url whose scheme is not http(s).

Vitra_TranslateImageLayoutPOST

Re-render the copy of a previously generated creative in another language via POST https://api.translate.photo/v1/service/image-creator/image/translate (Content-Type: application/json). JSON body: {assetId: '<asset_id>', locale: '<bcp47-iso-code>'}. SYNCHRONOUS — returns a fresh asset ({status: 'ok', data: {asset_id, asset_url, gallery_url}}) directly; no poll. CRITICAL DISTINCTION: `locale` here is a BCP47 ISO code ('es', 'fr', 'hi', 'de', 'ja', 'pt-br') — the OPPOSITE of Vitra_DirectTranslate, which rejects ISO codes and requires a Vitra_ListImageLanguages identifier ('spanish'). This tool needs an asset_id (a layout generated in THIS skill) and NO source URL; Vitra_DirectTranslate needs a standalone image URL and NO asset_id. asset_id MUST be captured from a generate/edit/translate response in the current session. The returned asset_id supersedes the prior one. Present ONLY the new asset_url + gallery_url; NEVER show asset_id. Runtime mapping (Mind passes snake_case; runtime constructs the API JSON body): assetId <- asset_id; locale <- locale. Errors arrive as standard non-2xx HTTP (401/403 = auth rejected; any other non-2xx = request/server error).

Overview

Vitra.ai media-localization + creative-generation suite. Bundles five skills under one app: (1) image CREATION (brand-kit-aware on-brand creatives — generate, edit, translate layout; synchronous, returns image URL + gallery URL); (2) image-text translation (translates visible text inside images; async submit→poll); (3) audio dubbing (async submit→poll); (4) video dubbing (async submit→poll); (5) audio/video transcription (speech-to-text; async submit→poll, reuses shared Vitra_GetDubbingStatus). Single-header auth via va-token from VITRA_AGENT_TOKEN across both api.translate.photo and api.translate.video. 15 tools total. Skills 2-5 async; Skill 1 synchronous with no poll. It gives your AI agent 15 built-in tools, including vitra create brand kit, vitra direct translate and vitra edit image. Apps are free to equip, and once equipped your AI Mind can use Vitra Translate Suite automatically while it works. Vitra Translate Suite is currently equipped on 14 Minds.

Frequently asked questions

What is Vitra Translate Suite?

Vitra.ai media-localization + creative-generation suite. Bundles five skills under one app: (1) image CREATION (brand-kit-aware on-brand creatives — generate, edit, translate layout; synchronous, returns image URL + gallery URL); (2) image-text translation (translates visible text inside images; async submit→poll); (3) audio dubbing (async submit→poll); (4) video dubbing (async submit→poll); (5) audio/video transcription (speech-to-text; async submit→poll, reuses shared Vitra_GetDubbingStatus). Single-header auth via va-token from VITRA_AGENT_TOKEN across both api.translate.photo and api.translate.video. 15 tools total. Skills 2-5 async; Skill 1 synchronous with no poll. It bundles 15 tools your AI agent can call on your behalf.

What can Vitra Translate Suite do for my AI agent?

Once equipped, your AI Mind can use Vitra Translate Suite to vitra create brand kit, vitra direct translate, vitra edit image, vitra generate image and vitra get dubbing status, and more — without you having to do any of it manually.

How do I connect Vitra Translate Suite to my AI Mind?

Open Vitra Translate Suite in the Ethoswarm Bazaar and select Equip to add it to one of your AI Minds. Your Mind can then use it automatically. Some apps ask you to authorize access the first time they run.

Is Vitra Translate Suite free?

Yes — Vitra Translate Suite is free to equip on your AI Mind in the Ethoswarm Bazaar.