API de MTQE (Estimación de Calidad en Traducción Automática)
La API de MTQE puntúa la calidad de las traducciones de 0 a 100, sin necesidad de una referencia humana, y explica el principal problema encontrado en cada segmento. Puede evaluarlas frente a tus propias memorias de traducción y glosarios, y poseditar automáticamente los segmentos que no alcanzan la calidad. Consulta la introducción para saber qué hace el servicio.
Para usar la API se necesita una clave de API proporcionada por Pangeanic en el momento de la venta. Para obtenerla, contacta con nuestro equipo comercial en clients@pangeanic.com. Todos los ejemplos pueden copiarse y ejecutarse tal cual: sustituye YOUR_API_KEY por tu clave.
- URL base:
https://api.pangeanic.com/mtqe/v2 - Autenticación: envía tu clave en la cabecera
X-API-Keyde cada petición. - Idiomas: códigos como
en-usoes-es. Consulta los idiomas soportados. - Dos formas de trabajar: hasta 50 segmentos por petición, con respuesta inmediata; o un trabajo (job) de hasta 2.000.
- Referencia interactiva: https://api.pangeanic.com/mtqe/v2/docs
| Qué | Endpoint |
|---|---|
| Tu consumo | GET /usage |
| Idiomas soportados | GET /languages |
| Puntuar hasta 50 segmentos, con respuesta inmediata | POST /score-with-id-resources · POST /score-with-text-resources |
| Subir memorias y glosarios | POST /resource/add_new · GET /resource/status · GET /resource/list |
| Puntuar hasta 2.000 segmentos como trabajo | POST /jobs/upload-file-job · POST /jobs/score-with-id-resources · POST /jobs/score-with-text-resources |
| Seguir un trabajo y obtener su resultado | GET /jobs/status-job · GET /jobs/get-job · GET /jobs/get-job-results · GET /jobs/list-jobs |
Idiomas Soportados
Los idiomas se envían como códigos idioma-REGIÓN (p. ej. en-us, es-es). Cualquier par de idiomas soportados puede combinarse.
Notas:
- Los códigos no distinguen mayúsculas; la API los devuelve en minúsculas.
- También se acepta el código de idioma solo, que equivale a su variante por defecto: por ejemplo
en→en-us,es→es-es,pt→pt-ptyzh→zh-cn. GET /languages(paso 2) devuelve la misma lista.
Idiomas disponibles (haz clic para desplegar)
| Idioma | Código |
|---|---|
| Amárico | am-et |
| Árabe | ar-001 |
| Armenio | hy-am |
| Azerí | az-az |
| Euskera | eu-es |
| Bengalí | bn-bd |
| Búlgaro | bg-bg |
| Birmano | my-mm |
| Catalán | ca-es |
| Chino (simplificado) | zh-cn |
| Chino (tradicional) | zh-tw |
| Croata | hr-hr |
| Checo | cs-cz |
| Danés | da-dk |
| Neerlandés | nl-nl |
| Árabe egipcio | ar-eg |
| Inglés | en-us |
| Inglés | en-gb |
| Estonio | et-ee |
| Filipino | fil-ph |
| Finés | fi-fi |
| Francés | fr-fr |
| Francés | fr-ca |
| Gallego | gl-es |
| Georgiano | ka-ge |
| Alemán | de-de |
| Alemán | de-at |
| Griego | el-gr |
| Guyaratí | gu-in |
| Hausa | ha-ng |
| Hebreo | he-il |
| Hindi | hi-in |
| Húngaro | hu-hu |
| Islandés | is-is |
| Indonesio | id-id |
| Italiano | it-it |
| Japonés | ja-jp |
| Canarés | kn-in |
| Coreano | ko-kr |
| Letón | lv-lv |
| Lituano | lt-lt |
| Macedonio | mk-mk |
| Malayo | ms-my |
| Malayalam | ml-in |
| Maratí | mr-in |
| Español de México | es-mx |
| Noruego | nb-no |
| Noruego nynorsk | nn-no |
| Occitano | oc-fr |
| Persa | fa-ir |
| Polaco | pl-pl |
| Portugués | pt-pt |
| Portugués | pt-br |
| Panyabí | pa-in |
| Quechua | qu-pe |
| Rumano | ro-ro |
| Ruso | ru-ru |
| Árabe saudí | ar-sa |
| Serbio | sr-rs |
| Eslovaco | sk-sk |
| Esloveno | sl-si |
| Español | es-es |
| Suajili (Kenia) | sw-ke |
| Suajili (Tanzania) | sw-tz |
| Sueco | sv-se |
| Tamil | ta-in |
| Telugu | te-in |
| Tailandés | th-th |
| Turco | tr-tr |
| Ucraniano | uk-ua |
| Urdu | ur-pk |
| Vietnamita | vi-vn |
| Zulú | zu-za |
Primeros pasos
1. Comprueba tu clave y tu consumo
GET /usage
URL: https://api.pangeanic.com/mtqe/v2/usage
Confirma que tu clave funciona y muestra lo que has consumido: caracteres de puntuación, caracteres de posedición automática, tu límite y lo que te queda, por endpoint, y los ficheros de memoria y glosario que has usado en el periodo (files_used, files). No tiene coste.
{
"client": "acme",
"client_id": 7,
"is_admin": false,
"expires_at": null,
"char_quota": 1000000,
"source_chars_used": 24105,
"ape_source_chars_used": 770,
"total_source_chars_used": 24875,
"chars_remaining": 975125,
"files_used": 3,
"files": [
{
"id": "tm-5c1f0a9e2b7d",
"resource_type": "tm",
"filename": "memory_1.tmx",
"source_language": "en-us",
"target_language": "es-es",
"first_used_at": 1792050000.0,
"last_used_at": 1792310000.0,
"requests": 14
},
{
"id": "tm-9a3e7c51d2f4",
"resource_type": "tm",
"filename": "memory_2.tmx",
"source_language": "en-us",
"target_language": "es-es",
"first_used_at": 1792050000.0,
"last_used_at": 1792310000.0,
"requests": 14
},
{
"id": "gl-3b7e1d0c5a92",
"resource_type": "glossary",
"filename": "terms.tbx",
"source_language": "en-us",
"target_language": "es-es",
"first_used_at": 1792220000.0,
"last_used_at": 1792220000.0,
"requests": 1
}
],
"by_endpoint": [
{
"endpoint": "jobs/upload-file-job",
"requests": 2,
"segments": 300,
"source_chars": 19900,
"ape_segments": 12,
"ape_source_chars": 770
},
{
"endpoint": "score-with-id-resources",
"requests": 41,
"segments": 82,
"source_chars": 4205,
"ape_segments": 0,
"ape_source_chars": 0
}
]
}
Nota
char_quota y chars_remaining son null cuando tu clave no tiene límite.
2. Lista los idiomas soportados
GET /languages
URL: https://api.pangeanic.com/mtqe/v2/languages
Los códigos de idioma que puedes usar como source_language y target_language, con sus nombres.
Puntuación con respuesta inmediata
3. Puntuación básica: sin memorias, sin glosario, sin posedición
POST /score-with-id-resources
URL: https://api.pangeanic.com/mtqe/v2/score-with-id-resources
Envía los segmentos con su par de idiomas. Cada uno vuelve con su puntuación y el principal problema encontrado.
Parámetros de la petición
| Parámetro | Tipo | Ubicación | Descripción |
|---|---|---|---|
X-API-Key |
string |
Header | Tu clave de acceso a la API. |
segments |
array |
Body | De 1 a 50 objetos con source y target. |
source_language |
string |
Body | Idioma de cada source (p. ej. en-us). Consulta los idiomas soportados. |
target_language |
string |
Body | Idioma de cada target (p. ej. es-es). Consulta los idiomas soportados. |
tm_id |
array |
Body | Opcional. Ids de tus memorias de traducción (paso 4). |
glossary_id |
array |
Body | Opcional. Ids de tus glosarios (paso 4). |
ape |
boolean |
Body | Opcional. true para poseditar automáticamente los segmentos que no alcanzan la calidad (paso 7). Por defecto false. |
ape_threshold |
integer |
Body | Opcional. 0-100. Se poseditan los segmentos por debajo de este valor. Por defecto 90. |
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
segments = [
{"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación."},
{"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo."},
]
body = {"segments": segments, "source_language": "en-us", "target_language": "es-es"}
r = requests.post(f"{BASE}/score-with-id-resources", headers=HEADERS, json=body)
r.raise_for_status()
for seg in r.json()["results"]:
print(seg["score"], seg["explanation"])
curl -X POST "https://api.pangeanic.com/mtqe/v2/score-with-id-resources" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"segments": [
{"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación."},
{"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo."}
],
"source_language": "en-us",
"target_language": "es-es"
}'
{
"request_id": "5b2e9f7c1d3a4b6e8f0a2c4d6e8f1a3b",
"source_language": "en-us",
"target_language": "es-es",
"results": [
{
"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación.",
"source_chars": 53,
"score": 96.0,
"explanation": "",
"references": {
"tm": [],
"glossary": []
},
"error": null
},
{
"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo.",
"source_chars": 35,
"score": 22.5,
"explanation": "The negation was dropped: the target says the opposite of the source.",
"references": {
"tm": [],
"glossary": []
},
"error": null
}
]
}
4. Sube memorias de traducción o glosarios
POST /resource/add_new
URL: https://api.pangeanic.com/mtqe/v2/resource/add_new
Sube tus memorias una vez y reutilízalas en todas las peticiones. Cada fichero recibe un id; guárdalo. Un glosario se sube igual, con resource_type glossary.
Parámetros de la petición
| Parámetro | Tipo | Ubicación | Descripción |
|---|---|---|---|
X-API-Key |
string |
Header | Tu clave de acceso a la API. |
files |
file |
Form | Uno o varios ficheros, de hasta 20 MB cada uno. Memorias: .tmx, .csv, .tsv. Glosarios: .tbx, .csv, .tsv. |
resource_type |
string |
Form | tm o glossary. |
source_language |
string |
Form | Idioma de origen de los ficheros (p. ej. en-us). |
target_language |
string |
Form | Idioma de destino de los ficheros (p. ej. es-es). |
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
# uploading two TM
files = [("files", open("memory_1.tmx", "rb")),
("files", open("memory_2.tmx", "rb"))]
data = {"resource_type": "tm", "source_language": "en-us", "target_language": "es-es"}
r = requests.post(f"{BASE}/resource/add_new", headers=HEADERS, files=files, data=data)
r.raise_for_status()
ids = [res["id"] for res in r.json()["resources"]]
print(ids)
{
"resources": [
{
"id": "tm-5c1f0a9e2b7d",
"resource_type": "tm",
"filename": "memory_1.tmx",
"source_language": "en-us",
"target_language": "es-es",
"status": "SCHEDULED",
"error_code": null,
"error_message": null,
"failed_entries": 0,
"created_at": 1792735200.0,
"shared": null
},
{
"id": "tm-9a3e7c51d2f4",
"resource_type": "tm",
"filename": "memory_2.tmx",
"source_language": "en-us",
"target_language": "es-es",
"status": "SCHEDULED",
"error_code": null,
"error_message": null,
"failed_entries": 0,
"created_at": 1792735200.0,
"shared": null
}
]
}
Nota
Una memoria solo sirve para segmentos de su par de idiomas. Sube cada par por separado.
5. Espera a que las memorias estén listas
GET /resource/status
URL: https://api.pangeanic.com/mtqe/v2/resource/status
Tras la subida, la memoria se indexa en segundo plano. Consulta su estado hasta que sea SUCCESS; entonces ya puede usarse. FAILED indica que no ha podido usarse (consulta error_message).
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
import time
ids = ["tm-5c1f0a9e2b7d", "tm-9a3e7c51d2f4"] # the ids from the upload
while True:
r = requests.get(f"{BASE}/resource/status", headers=HEADERS, params={"id": ids})
status = {res["id"]: res["status"] for res in r.json()["resources"]}
print(status)
if all(s in ("SUCCESS", "FAILED", "REJECTED") for s in status.values()):
break
time.sleep(10)
{
"resources": [
{
"id": "tm-5c1f0a9e2b7d",
"resource_type": "tm",
"filename": "memory_1.tmx",
"source_language": "en-us",
"target_language": "es-es",
"status": "SUCCESS",
"error_code": null,
"error_message": null,
"failed_entries": 0,
"created_at": 1792735200.0,
"shared": null
},
{
"id": "tm-9a3e7c51d2f4",
"resource_type": "tm",
"filename": "memory_2.tmx",
"source_language": "en-us",
"target_language": "es-es",
"status": "SUCCESS",
"error_code": null,
"error_message": null,
"failed_entries": 0,
"created_at": 1792735200.0,
"shared": null
}
]
}
6. Puntúa con las dos memorias
POST /score-with-id-resources
URL: https://api.pangeanic.com/mtqe/v2/score-with-id-resources
La misma petición que la puntuación básica, con los ids de las memorias en tm_id (siempre una lista). Cada segmento se evalúa frente a las entradas más relevantes de tus memorias, que se devuelven en references. Los glosarios van en glossary_id de la misma forma.
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
segments = [
{"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación."},
{"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo."},
]
body = {
"segments": segments,
"source_language": "en-us",
"target_language": "es-es",
"tm_id": ["tm-5c1f0a9e2b7d", "tm-9a3e7c51d2f4"],
}
r = requests.post(f"{BASE}/score-with-id-resources", headers=HEADERS, json=body)
r.raise_for_status()
for seg in r.json()["results"]:
print(seg["score"], seg["explanation"], len(seg["references"]["tm"]), "memory matches")
curl -X POST "https://api.pangeanic.com/mtqe/v2/score-with-id-resources" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"segments": [
{"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación."},
{"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo."}
],
"source_language": "en-us",
"target_language": "es-es",
"tm_id": ["tm-5c1f0a9e2b7d", "tm-9a3e7c51d2f4"]
}'
{
"request_id": "8d1e4c2a9b7f4e3d8c6a5b4f3e2d1c0b",
"source_language": "en-us",
"target_language": "es-es",
"results": [
{
"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación.",
"source_chars": 53,
"score": 97.5,
"explanation": "",
"references": {
"tm": [
{
"source": "Please save your changes before closing the window.",
"target": "Guarde los cambios antes de cerrar la ventana.",
"score": 0.86
}
],
"glossary": []
},
"error": null
},
{
"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo.",
"source_chars": 35,
"score": 24.0,
"explanation": "The negation was dropped: the target says the opposite of the source.",
"references": {
"tm": [
{
"source": "He did not finish the report on time.",
"target": "No terminó el informe a tiempo.",
"score": 0.91
}
],
"glossary": []
},
"error": null
}
]
}
7. Puntúa con las dos memorias y posedición automática
POST /score-with-id-resources
URL: https://api.pangeanic.com/mtqe/v2/score-with-id-resources
Añade "ape": true. Cada segmento por debajo de ape_threshold (90 por defecto) o con algún problema se posedita automáticamente y se puntúa la posedición. hpe_needed indica si aún debe revisarlo una persona. La posedición solo se cobra cuando corrige el segmento.
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
segments = [
{"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación."},
{"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo."},
]
body = {
"segments": segments,
"source_language": "en-us",
"target_language": "es-es",
"tm_id": ["tm-5c1f0a9e2b7d", "tm-9a3e7c51d2f4"],
"ape": True,
"ape_threshold": 90, # optional, 0-100
}
r = requests.post(f"{BASE}/score-with-id-resources", headers=HEADERS, json=body)
r.raise_for_status()
for seg in r.json()["results"]:
if seg["ape_needed"]:
print(seg["score"], "→", seg["APE"]["score_ape"], seg["APE"]["target_ape"],
"· human review" if seg["hpe_needed"] else "")
curl -X POST "https://api.pangeanic.com/mtqe/v2/score-with-id-resources" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"segments": [
{"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación."},
{"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo."}
],
"source_language": "en-us",
"target_language": "es-es",
"tm_id": ["tm-5c1f0a9e2b7d", "tm-9a3e7c51d2f4"],
"ape": true,
"ape_threshold": 90
}'
{
"request_id": "0f1e2d3c4b5a49687766554433221100",
"source_language": "en-us",
"target_language": "es-es",
"results": [
{
"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación.",
"source_chars": 53,
"score": 97.5,
"explanation": "",
"references": {
"tm": [
{
"source": "Please save your changes before closing the window.",
"target": "Guarde los cambios antes de cerrar la ventana.",
"score": 0.86
}
],
"glossary": []
},
"error": null,
"ape_needed": false,
"APE": {
"target_ape": "",
"score_ape": null,
"explanation_ape": ""
},
"hpe_needed": false,
"ape_source_chars": 0
},
{
"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo.",
"source_chars": 35,
"score": 24.0,
"explanation": "The negation was dropped: the target says the opposite of the source.",
"references": {
"tm": [
{
"source": "He did not finish the report on time.",
"target": "No terminó el informe a tiempo.",
"score": 0.91
}
],
"glossary": []
},
"error": null,
"ape_needed": true,
"APE": {
"target_ape": "Él no terminó el trabajo a tiempo.",
"score_ape": 98,
"explanation_ape": ""
},
"hpe_needed": false,
"ape_source_chars": 35
}
]
}
8. Puntúa con referencias enviadas en la petición
POST /score-with-text-resources
URL: https://api.pangeanic.com/mtqe/v2/score-with-text-resources
Sin subir nada: cada segmento lleva sus propias entradas de memoria (tm) y términos de glosario (glossary), como pares origen/destino, hasta 20 de cada tipo. Útil cuando las referencias están en tu propio sistema. No se cobran y la respuesta no las repite. Admite ape como en los pasos anteriores.
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
body = {
"segments": [{
"source": "Hold the start key for four seconds to restart the scanner.",
"target": "Mantenga la tecla de inicio cuatro segundos para reiniciar el escaner.",
"tm": [{"source": "Hold the start key for two seconds.",
"target": "Mantenga pulsada la tecla de inicio dos segundos."}],
"glossary": [{"source": "scanner", "target": "escáner"}],
}],
"source_language": "en-us",
"target_language": "es-es",
}
r = requests.post(f"{BASE}/score-with-text-resources", headers=HEADERS, json=body)
r.raise_for_status()
print(r.json()["results"][0])
curl -X POST "https://api.pangeanic.com/mtqe/v2/score-with-text-resources" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"segments": [{
"source": "Hold the start key for four seconds to restart the scanner.",
"target": "Mantenga la tecla de inicio cuatro segundos para reiniciar el escaner.",
"tm": [{"source": "Hold the start key for two seconds.",
"target": "Mantenga pulsada la tecla de inicio dos segundos."}],
"glossary": [{"source": "scanner", "target": "escáner"}]
}],
"source_language": "en-us",
"target_language": "es-es"
}'
{
"request_id": "3f9c2b7e1a4d4e0c9b8a7f6e5d4c3b2a",
"source_language": "en-us",
"target_language": "es-es",
"results": [
{
"source": "Hold the start key for four seconds to restart the scanner.",
"target": "Mantenga la tecla de inicio cuatro segundos para reiniciar el escaner.",
"source_chars": 59,
"score": 74.0,
"explanation": "«escaner» does not follow the glossary: «escáner».",
"error": null
}
]
}
Muchos segmentos: trabajos
9. Puntúa un fichero completo
POST /jobs/upload-file-job
URL: https://api.pangeanic.com/mtqe/v2/jobs/upload-file-job
Sube un .xlsx o .csv con las columnas source_language, target_language, source, target (un segmento por fila; puede mezclar pares). El trabajo se ejecuta en segundo plano y recibes un job_id al momento. Los ids de memorias y glosarios van en un campo por id; ape funciona como antes. GET /jobs/template descarga un fichero de ejemplo.
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
files = {"file": open("segments.xlsx", "rb")}
data = [("tm_id", "tm-5c1f0a9e2b7d"), ("tm_id", "tm-9a3e7c51d2f4"), ("ape", "true")]
r = requests.post(f"{BASE}/jobs/upload-file-job", headers=HEADERS, files=files, data=data)
r.raise_for_status()
job_id = r.json()["job_id"]
print(job_id)
Nota
El fichero se valida antes de crear el trabajo: si hay algún error, la respuesta es un 422 con todos los problemas, y no se cobra nada.
10. Puntúa muchos segmentos enviados como JSON
POST /jobs/score-with-id-resources · POST /jobs/score-with-text-resources
URL: https://api.pangeanic.com/mtqe/v2/jobs/score-with-id-resources · https://api.pangeanic.com/mtqe/v2/jobs/score-with-text-resources
El mismo cuerpo que las peticiones con respuesta inmediata, con hasta 2.000 segmentos. Usa /jobs/score-with-id-resources con los ids de tus memorias y glosarios, o /jobs/score-with-text-resources con las referencias en cada segmento.
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
segments = [
{"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación."},
{"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo."},
] # up to 2,000
body = {
"segments": segments,
"source_language": "en-us",
"target_language": "es-es",
"tm_id": ["tm-5c1f0a9e2b7d", "tm-9a3e7c51d2f4"],
"ape": True,
}
r = requests.post(f"{BASE}/jobs/score-with-id-resources", headers=HEADERS, json=body)
r.raise_for_status()
job_id = r.json()["job_id"]
print(job_id)
curl -X POST "https://api.pangeanic.com/mtqe/v2/jobs/score-with-id-resources" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"segments": [
{"source": "Please save your work before closing the application.",
"target": "Guarde su trabajo antes de cerrar la aplicación."},
{"source": "He did not finish the work on time.",
"target": "Él terminó el trabajo a tiempo."}
],
"source_language": "en-us",
"target_language": "es-es",
"tm_id": ["tm-5c1f0a9e2b7d", "tm-9a3e7c51d2f4"],
"ape": true
}'
11. Sigue un trabajo y obtén su resultado
GET /jobs/status-job · GET /jobs/get-job · GET /jobs/get-job-results
URL: https://api.pangeanic.com/mtqe/v2/jobs/status-job · https://api.pangeanic.com/mtqe/v2/jobs/get-job · https://api.pangeanic.com/mtqe/v2/jobs/get-job-results
Consulta el estado hasta que sea done (o failed). Después descarga el resultado: un .xlsx para cualquier trabajo y, para los enviados como JSON, también el JSON, igual que en las peticiones con respuesta inmediata.
import requests
BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
import time
job_id = "a1b2c3d4e5f64789a0b1c2d3e4f5a6b7"
while True:
job = requests.get(f"{BASE}/jobs/status-job", headers=HEADERS,
params={"job_id": job_id}).json()
print(job["status"], job["processed"], "/", job["total"])
if job["status"] in ("done", "failed"):
break
time.sleep(5)
# The result as .xlsx (every job)
r = requests.get(f"{BASE}/jobs/get-job", headers=HEADERS, params={"job_id": job_id})
open("result.xlsx", "wb").write(r.content)
# The result as JSON (jobs sent as JSON)
result = requests.get(f"{BASE}/jobs/get-job-results", headers=HEADERS,
params={"job_id": job_id}).json()
# status
curl "https://api.pangeanic.com/mtqe/v2/jobs/status-job?job_id=a1b2c3d4e5f64789a0b1c2d3e4f5a6b7" \
-H "X-API-Key: YOUR_API_KEY"
# result as .xlsx (every job)
curl "https://api.pangeanic.com/mtqe/v2/jobs/get-job?job_id=a1b2c3d4e5f64789a0b1c2d3e4f5a6b7" \
-H "X-API-Key: YOUR_API_KEY" -o result.xlsx
# result as JSON (jobs sent as JSON)
curl "https://api.pangeanic.com/mtqe/v2/jobs/get-job-results?job_id=a1b2c3d4e5f64789a0b1c2d3e4f5a6b7" \
-H "X-API-Key: YOUR_API_KEY"
{
"job_id": "a1b2c3d4e5f64789a0b1c2d3e4f5a6b7",
"status": "done",
"kind": "file",
"filename": "segments.xlsx",
"total": 1200,
"processed": 1200,
"progress": 1.0,
"tm_ids": [
"tm-5c1f0a9e2b7d",
"tm-9a3e7c51d2f4"
],
"glossary_ids": [],
"error": null,
"created_at": 1792735200.0,
"updated_at": 1792735450.0,
"for_client_id": 7,
"ape": true,
"ape_threshold": 90,
"ape_segments": 95,
"ape_source_chars": 5910
}
Nota
La salida de ejemplo es el estado. El .xlsx tiene una fila por segmento con la puntuación, la explicación y las referencias usadas, más las columnas de posedición cuando ape estaba activado.
Interpretación de la Puntuación
| Rango | Calidad estimada | Acción recomendada |
|---|---|---|
| 90 - 100 | Excelente | Publicación directa o revisión mínima. |
| 70 - 89 | Buena | Revisión humana ligera (light MTPE). Consulta la explanation. |
| 40 - 69 | Media / Baja | Requiere posedición profunda obligatoria, o usar ape. |
| < 40 | Muy baja | Traducción no válida o contenido incoherente. |
Aviso
Esta interpretación es solo una sugerencia. La decisión final sobre la calidad dependerá siempre del grado de exigencia y de los requisitos de calidad (KPI) de cada proyecto de traducción.
Referencia
El resultado de cada segmento
| Campo | Significado |
|---|---|
score |
Calidad de 0 a 100. null si no se ha podido calcular (ver error). |
explanation |
El principal problema encontrado, en una frase. Vacío cuando no hay ninguno. |
references |
Las coincidencias de memoria de traducción (tm) y los términos de glosario (glossary) frente a los que se ha evaluado el segmento. Su score indica la relevancia de la entrada para el segmento (0–1), no una puntuación de calidad. No se devuelve cuando envías tú las referencias (paso 8). |
source_chars |
Lo que se ha cobrado por el segmento: los caracteres de su origen. |
error |
Por qué score es null, si lo es. |
Con posedición automática ("ape": true)
| Campo | Significado |
|---|---|
ape_needed |
El segmento ha puntuado por debajo de ape_threshold (90 por defecto) o tenía algún problema, así que se ha poseditado. |
APE.target_ape |
La traducción poseditada. Vacío cuando no ha hecho falta. |
APE.score_ape, APE.explanation_ape |
La puntuación de la traducción poseditada y el problema que quede en ella. |
hpe_needed |
La posedición sigue sin alcanzar la calidad: una persona debe revisar el segmento. |
ape_source_chars |
Lo que se ha cobrado por la posedición: de nuevo los caracteres del origen, solo cuando ha corregido el segmento (hpe_needed: false). Si no, 0. |
Qué se cobra
| Qué se cuenta | Cuándo | |
|---|---|---|
| Puntuación | El origen de cada segmento | Cuando se acepta la petición (o el trabajo) |
| Posedición automática | De nuevo el origen, solo de los segmentos que ha corregido | Cuando termina la petición (o el trabajo) |
| Ficheros | Cada memoria o glosario (tm_id / glossary_id) usado en el periodo, contado una vez aunque lo usen muchas peticiones: 3 ficheros y luego los mismos 3 = 3; esos 3 más un 4.º = 4 |
Cuando se acepta la petición (o el trabajo) |
| Gratis | Subir memorias y glosarios, las referencias enviadas como texto con un segmento y todas las consultas: consumo, idiomas, estado, resultados. |
Nota
Tu límite de caracteres cubre la puntuación y la posedición juntas; los ficheros se cuentan aparte. El paso 1 muestra cuánto has consumido y cuánto te queda. Los resultados no se guardan en caché: si envías de nuevo el mismo segmento, se vuelve a puntuar y a cobrar.
Límites y formatos de fichero
| Segmentos por petición | De 1 a 50 (más: usa un trabajo) |
| Segmentos por trabajo | Hasta 2.000 |
| Ficheros | Hasta 20 MB cada uno |
| Memorias de traducción | .tmx, .csv, .tsv |
| Glosarios | .tbx, .csv, .tsv |
| Ficheros de trabajo | .xlsx o .csv; primera fila exactamente source_language, target_language, source, target; un segmento por fila. GET /jobs/template descarga un ejemplo. |
| Referencias enviadas con un segmento | Hasta 20 entradas de memoria y 20 términos de glosario por segmento |
Otros endpoints
| Endpoint | Qué hace |
|---|---|
GET /resource/list |
Tus memorias y glosarios, con sus ids y estado. |
GET /jobs/list-jobs |
Tus trabajos recientes. |
GET /jobs/template |
Un fichero de trabajo de ejemplo (.xlsx) para rellenar. |
POST /jobs/validate-job |
Valida un fichero de trabajo sin crear el trabajo ni cobrar nada. |
GET /healthcheck |
Si el servicio está activo. No requiere clave. |
GET /docs |
La referencia interactiva de la API. |
Errores Comunes
El cuerpo de un error es {"detail": "…"} con el motivo.
- 401 (Unauthorized): Clave de API ausente, incorrecta, desactivada o caducada.
- 404 (Not Found): Una memoria, glosario o trabajo que no existe para tu clave.
- 409 (Conflict): Se ha pedido el resultado de un trabajo antes de que esté
done. - 413 (Payload Too Large): Un fichero supera el límite de tamaño.
- 422 (Unprocessable Entity): Algo de la petición no es válido: un idioma no soportado, una memoria de otro par de idiomas, demasiados segmentos, un fichero mal formado… La respuesta indica qué.
- 429 (Too Many Requests): Se ha alcanzado el límite de caracteres. No se ha cobrado nada.
- 502, 503, 504: El servicio está ocupado o no disponible temporalmente. Inténtalo de nuevo en un momento.