Saltar a contenido

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-Key de cada petición.
  • Idiomas: códigos como en-us o es-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-pt y zh → 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.

import requests

BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}

usage = requests.get(f"{BASE}/usage", headers=HEADERS).json()
print(usage["total_source_chars_used"], "used ·", usage["chars_remaining"], "left")
curl "https://api.pangeanic.com/mtqe/v2/usage" \
  -H "X-API-Key: YOUR_API_KEY"
{
  "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.

import requests

BASE = "https://api.pangeanic.com/mtqe/v2"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}

languages = requests.get(f"{BASE}/languages", headers=HEADERS).json()["languages"]
for lang in languages:
    print(lang["code"], lang["name"])
curl "https://api.pangeanic.com/mtqe/v2/languages" \
  -H "X-API-Key: YOUR_API_KEY"
{
  "languages": [
    {
      "code": "am-et",
      "name": "Amharic"
    },
    {
      "code": "ar-001",
      "name": "Arabic"
    },
    {
      "code": "hy-am",
      "name": "Armenian"
    },
    {
      "code": "…",
      "name": "… (73 in all)"
    }
  ]
}

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)
# uploading two TM
curl -X POST "https://api.pangeanic.com/mtqe/v2/resource/add_new" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "files=@memory_1.tmx" \
  -F "files=@memory_2.tmx" \
  -F "resource_type=tm" \
  -F "source_language=en-us" \
  -F "target_language=es-es"
{
  "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)
curl "https://api.pangeanic.com/mtqe/v2/resource/status?id=tm-5c1f0a9e2b7d&id=tm-9a3e7c51d2f4" \
  -H "X-API-Key: YOUR_API_KEY"
{
  "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)
curl -X POST "https://api.pangeanic.com/mtqe/v2/jobs/upload-file-job" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@segments.xlsx" \
  -F "tm_id=tm-5c1f0a9e2b7d" \
  -F "tm_id=tm-9a3e7c51d2f4" \
  -F "ape=true"
{
  "job_id": "a1b2c3d4e5f64789a0b1c2d3e4f5a6b7",
  "status": "pending",
  "total": 1200,
  "source_chars": 79200,
  "ape": true,
  "ape_threshold": 90
}

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
}'
{
  "job_id": "a1b2c3d4e5f64789a0b1c2d3e4f5a6b7",
  "status": "pending",
  "total": 1200,
  "source_chars": 79200,
  "ape": true,
  "ape_threshold": 90
}

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.