Crear una traducción
Crea una traducción usando exactamente una fuente: contenido JSON para texto UTF-8 literal, JSON file_url para una descarga HTTPS sin redirecciones, JSON upload_id para una carga temporal completada con estas mismas credenciales, o multipart/form-data con un campo file para bytes binarios locales. Omite filename con upload_id: la sesión ya tiene asignado el nombre. Si repites un upload_id, se devuelve el lote existente sin cambiar sus instrucciones. Envía una cabecera Idempotency-Key (de 1 a 255 caracteres imprimibles; puede ser un UUID) con las demás fuentes para que sea seguro reintentar si se pierde la respuesta: al repetir la solicitud, se devuelve el lote creado en el primer intento, sin volver a descargar ni almacenar el archivo ni planificarlo de nuevo. Si la misma clave se usa con contenido distinto, se rechaza con 409 idempotency_key_reused. En los demás casos, filename es opcional y se deduce si se omite. Incluye instruction para recibir el plan verificado, el recuento medido, el coste en créditos y una vista previa de la extracción. Si lo omites, recibirás suggested_instructions. Comprueba plan.not_included antes de aprobar. Crear y planificar no cuesta créditos. Consulta los límites por formato en GET /v1/account. La traducción aparece en la aplicación web.
POST/v1/batches
Requiere batches:create. Crear una traducción no cuesta nada: los créditos solo se reservan al aprobar un plan.
Cómo enviar el archivo
Elige el método de envío que mejor se adapte a dónde está el documento y a las capacidades de tu cliente.
| Método | Cuándo usarlo | Notas |
|---|---|---|
JSON con upload_id | Para un archivo local enviado mediante una sesión de carga temporal | Usa las mismas credenciales con las que creaste la sesión. Omite filename. Si repites la solicitud, se devuelve la traducción existente sin cambiar sus instrucciones. |
JSON con content | Para cualquier formato de texto | El archivo como texto UTF-8. Es la opción más sencilla para un agente que ya tiene el contenido en memoria. |
JSON con file_url | Para un archivo alojado | Solo HTTPS; se obtiene desde el servidor. No se siguen las redirecciones, así que proporciona la URL final. |
multipart/form-data | Para archivos binarios locales, incluidos XLSX, DOCX, PPTX, PDF, IDML y ZIP | Envía los bytes originales en el campo file. Es el método que usa la CLI para enviar archivos locales. |
filename es opcional, pero conviene incluirlo. La extensión permite identificar el formato, así que strings.xml y export.csv se procesan con analizadores distintos aunque contengan los mismos bytes.
Cómo repetir una solicitud de forma segura
Envía una cabecera Idempotency-Key (de 1 a 255 caracteres imprimibles; un UUID es una buena opción) para que, si repites la solicitud tras perderse la respuesta, se devuelva la traducción creada en el primer intento en vez de crear otra. La solicitud repetida se responde antes de obtener o almacenar el archivo y no vuelve a generar un plan, por lo que no cuesta nada. La clave queda asociada a lo que enviaste: si usas la misma clave con otro archivo, nombre o instrucción, la solicitud se rechaza con idempotency_key_reused. Usa una clave nueva para cada nuevo trabajo. Si no puedes enviar cabeceras (herramientas MCP, Code Mode), incluye idempotency_key en el cuerpo. Si creas la traducción con una instruction, la respuesta incluye plan_revision junto con el plan. Envíalo como expected_plan_revision al aprobarlo.
Qué ocurre a continuación
La respuesta incluye un id, que se utiliza como batch_id en las rutas posteriores. A partir de ahí, la secuencia es siempre la misma:
POST /v1/batches/{batch_id}/plan: describe con tus propias palabras qué quieres traducir.POST /v1/batches/{batch_id}/approve: consume créditos e inicia el proceso.GET /v1/batches/{batch_id}: consulta el estado hasta que termine.GET /v1/batches/{batch_id}/result: descarga el resultado. Devuelve un enlace firmado, no el archivo.
Respuesta
Crear una traducción a partir de un archivo
dataobjectrequiredrequest_idstringrequiredCódigos posibles: invalid_request, unknown_field, invalid_parameter, invalid_cursor
errorobjectrequiredrequest_idstringrequiredCódigos posibles: authentication_required, invalid_api_key, api_key_expired, api_key_revoked
errorobjectrequiredrequest_idstringrequiredCódigos posibles: insufficient_credits
errorobjectrequiredrequest_idstringrequiredCódigos posibles: insufficient_scope, feature_not_available, admin_required, file_retention_expired
errorobjectrequiredrequest_idstringrequiredCódigos posibles: batch_not_found, glossary_not_found, resource_not_found
errorobjectrequiredrequest_idstringrequiredCódigos posibles: glossary_already_exists, result_not_ready, batch_not_editable, idempotency_key_reused, no_plan_yet, plan_changed, batch_not_awaiting_approval
errorobjectrequiredrequest_idstringrequiredCódigos posibles: file_expired
errorobjectrequiredrequest_idstringrequiredCódigos posibles: request_too_large, file_too_large, result_too_large
errorobjectrequiredrequest_idstringrequiredCódigos posibles: language_not_supported, invalid_language_pair, glossary_term_limit_reached, glossary_limit_reached, invalid_glossary_terms, unsupported_format, file_fetch_failed, plan_invalid
errorobjectrequiredrequest_idstringrequiredCódigos posibles: rate_limited
errorobjectrequiredrequest_idstringrequiredCódigos posibles: internal_error
errorobjectrequiredrequest_idstringrequiredCódigos posibles: service_unavailable
errorobjectrequiredrequest_idstringrequired