Run QA
1 · Upload a package
Drop any XLIFF file · format is read from content, not the extension. Works for every account and language pair. Reports and this panel are in English; source and target text stay in their original languages.
How it works
Tags, numbers, placeholders, missing targets, brand/DNT protection, punctuation, spacing, length, consistency. Cheap, exact, instant. Findings here are facts.
Runs only on segments the rules flagged as suspicious · meaning shifts, omissions, additions, register. Produces suggestions you can copy; it never overwrites the master file. Runs for panel, Dropbox and Dispatch alike.
Add the browser extension and a Run What's Wrong button appears right inside the editor, it QAs the open job from your own session and gives you a report. No Dropbox export, no upload.
Profiles
New here? How profiles work
A profile is a saved set of checks for one kind of work, usually one account, division and language pair, for example Amazon · CCM · EN→DE. When a file comes in, the matching profile is picked automatically from the folder it lands in, so nobody has to choose checks by hand each time.
Most people start with one profile per language pair, and that is perfectly fine. As you grow you can add more specific ones (a whole account, or a single division inside it) and the most specific match wins.
To create one: click + New profile, set the account, division and language pair it covers, turn on the checks you want (glossary, numbers, locale format, spelling, AI review), and save. You can also copy an existing profile as a starting point.
The same profile is honoured everywhere: the panel, Dropbox auto-runs, and Dispatch. Set it once, it applies across all three.
Reports
Run history
| When (UTC) | File | Account · Division | Pair | Profile | Trigger | Findings | Crit | Warn | Info | AI | AI ✓ |
|---|
Settings
General
LQA
Eval
API documentation
Authentication
Machine endpoints use a Bearer token. Send it on every request.
Authorization: Bearer YOUR_TOKEN
X-WW-Signature: sha256=...), so you can verify that a callback genuinely came from us. The browser panel can also call these endpoints from a logged-in session, so the in-app LQA tab works without a token.QA adapter
A small REST contract for running deterministic plus AI QA on a single bilingual check. Dispatch and any compatible client use it. Enqueue a check, then poll until it is completed.
Enqueue a check. Returns a checkId right away.
curl -X POST https://qa.eltur.co/qa-adapter/v1/check \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"projectRef": "PRJ-1042",
"sourceLang": "en",
"targetLang": "tr",
"segments": [
{"id": "1", "source": "Add to cart", "target": "Sepete ekle"}
]
}'{ "checkId": "ww_8f3c2b1a..." }Poll the check. status is pending, completed or failed. The AI deep-review only re-checks rule-flagged segments, so a check can stay pending for a moment before it settles.
curl https://qa.eltur.co/qa-adapter/v1/check/ww_8f3c2b1a... \ -H "Authorization: Bearer YOUR_TOKEN"
{
"checkId": "ww_8f3c2b1a...",
"status": "completed",
"qualityScore": 96.5,
"errorsCount": 1,
"errors": [
{
"errorId": "e_4471",
"category": "Accuracy",
"subcategory": "Numbers",
"severity": "critical",
"segmentText": "Sepete 3 ekle",
"errorDescription": "Number mismatch: source has no digit",
"penaltyPoints": 5
}
]
}| Field | Notes |
|---|---|
category / subcategory | Accuracy, Terminology, Completeness, Style, Consistency, Client checklist. |
severity | critical, major, minor or preferential. |
penaltyPoints | critical 5, major 3, minor 1, preferential 0. |
errorId | Stable id, so you can track ignore or fixed status across polls. |
qualityScore | 0 to 100. 100 minus weighted penalties per 1000 words, clamped. |
LQA API
Scored human review on a configurable, template-driven scorecard. Create a job from a file or a segments array, the engine runs a QA pre-pass, a reviewer confirms findings in the panel, then the job is finalized and scored. Base path /lqa/v1.
Create and start a job. Send either a multipart file or a JSON segments array. Optional: template, mode (qa, lqa or blind), sample_words, the skip flags, and project_ref / translator for attribution.
curl -X POST https://qa.eltur.co/lqa/v1/jobs \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@job.xliff" \ -F "account=amazon" \ -F "target_lang=tr" \ -F "template=amazon_mqm" \ -F "mode=lqa" \ -F "sample_words=1500" \ -F "skip_locked=true" \ -F "project_ref=PRJ-1042" \ -F "translator=ada@vendor.com"
curl -X POST https://qa.eltur.co/lqa/v1/jobs \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: PRJ-1042-run-1" \
-d '{
"account": "amazon",
"target_lang": "tr",
"template": "amazon_mqm",
"mode": "lqa",
"sample_words": 1500,
"callback_url": "https://your.app/hooks/lqa",
"project_ref": "PRJ-1042",
"translator": "ada@vendor.com",
"segments": [
{"seg_id": "1", "source": "Add to cart", "target": "Sepete ekle"}
]
}'{
"jobId": "lqa_2a9f...",
"status": "queued",
"mode": "lqa",
"template": { "id": "amazon_mqm", "version": 3, "resolved_from": "explicit" }
}| Field | Notes |
|---|---|
file or segments | One is required. Files: xliff, sdlxliff, mxliff, txlf, xlz, wsxz and similar. |
template | A template id (see templates below). Omit to resolve by account, division and language. |
mode | qa, lqa (default) or blind. |
sample_words | Cap the reviewed sample so a large file is never fully scored. |
skip_exact, skip_context, skip_locked | Exclude exact, context (100 percent) or locked segments from the run. |
project_ref, translator | Free-text attribution carried through to the scorecard and callback. |
callback_url | Optional. We POST the signed result here on finalize (see below). |
Header Idempotency-Key | Safe retries: the same key returns the original job instead of creating a new one. |
Poll a job. Returns status, the live score and verdict, and the current findings. Once finalized, score and verdict are the frozen final values.
curl https://qa.eltur.co/lqa/v1/jobs/lqa_2a9f... \ -H "Authorization: Bearer YOUR_TOKEN"
{
"jobId": "lqa_2a9f...",
"status": "in_review",
"mode": "lqa",
"account": "amazon",
"targetLang": "tr",
"template": { "id": "amazon_mqm", "version": 3 },
"wordCount": 1500,
"score": 98.7,
"verdict": "pass",
"liveScore": { "score": 98.7, "verdict": "pass" },
"findings": [
{
"id": 88,
"seg_no": 12,
"category": "mistranslation",
"severity": "major",
"weight": 5,
"status": "suggested",
"comment": "Wrong tense",
"suggestion": "Sepete eklendi"
}
]
}List jobs. Optional status, limit and offset query params.
LQA templates
A template defines the scorecard: categories, severities, weights, the scoring formula, sampling and how engine rules map onto categories. Seed templates ship with the product (for example a 2-category El Turco template and a 9-category Amazon MQM template). Tenants can add their own.
curl https://qa.eltur.co/lqa/v1/templates \ -H "Authorization: Bearer YOUR_TOKEN"
Create or update a custom template (admin or Bearer). The body is validated against the template schema.
curl -X POST https://qa.eltur.co/lqa/v1/templates \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": "acme_mqm",
"name": "Acme MQM",
"categories": [
{"code": "mistranslation", "label": "Mistranslation"},
{"code": "terminology", "label": "Terminology"}
],
"severities": [
{"code": "minor", "weight": 1},
{"code": "major", "weight": 5},
{"code": "critical", "weight": 10}
],
"scoring": {"formula": "mqm", "pass_threshold": 0.97},
"sampling": {"mode": "stratified", "unit": "words", "size": 1500}
}'Delete a custom template. Built-in seed templates cannot be deleted.
Finalize callback
When a reviewer submits a job, we POST the final result to the job's callback_url. The request is signed and the destination is checked, so it cannot reach a private or loopback address.
Compute HMAC-SHA256 of the raw request body using your token, hex-encode it, prefix with sha256= and compare against the X-WW-Signature header.
import hmac, hashlib
def verify(raw_body: bytes, header_sig: str, token: str) -> bool:
expected = "sha256=" + hmac.new(
token.encode(), raw_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, header_sig)/lqa/v1/jobs/{id}/submit, which fires the same callback.What's new
Configurable, template-driven LQA
Run a scored human review on a per-account scorecard. A template defines the categories, severities and weights, the scoring formula and how engine findings map onto categories, so each client is graded the way they grade.
LQA right inside Run QA
One checkbox on Run QA turns a normal check into a scored LQA review. Findings open in a full-screen, Excel-style grid built for review.
- Note and Suggested-translation columns, edited inline.
- Accept, reject, recategorize or re-score each finding, with a live score.
- Add a missed error the engine did not catch.
Reports show what was actually checked
Every QA report now states how many segments were checked versus skipped (100 percent matches and locked segments), so a clean report no longer hides the segments that were never looked at.
Faster AI deep-review
The deep-review is quicker and the end-of-run progress is clearer, so you can see when a run is genuinely finished.
Set up profiles from Dropbox in one click
In Settings, Integrations, one button creates the account by language profiles, binds each one's newest checklist, and learns from every LQA scorecard and every past Xbench or LTB QA report. Profiles set up this way also auto-route Dropbox jobs by account and language. Everything learned stays a suggestion until a PM or Linguist approves it.
Learns from your past QA reports
Discover and learn now reads both LQA scorecards and your years of Xbench or LTB QA reports. Findings reviewers marked Ignore or false-positive become the brands and codes each account keeps untranslated, queued as do-not-translate terms in the right profile's Learn tab.
AI brief from your LQA history
In a profile's Learn tab, generate a house-style brief from that account's whole correction history: terminology, register, and whether brands are kept in English or localized. Edit it, then apply it to the profile's AI instructions.
One-click brand and not-translatable
See a brand, product name or code flagged as identical to source? Click Protect as brand or Not translatable right in the report. Anyone can suggest; a PM or Linguist approves, and it is remembered for every future run.
Richer notifications
Choose which severities and even which error types trigger an email, set a threshold, send to several people, name and pause rules, and send yourself a test email.
AI: two models must agree
Turn on require two models to agree, per profile or as the org default, so an AI finding is only kept when a second model also confirms it. Fewer false positives.
Accounts, roles and exports
Sign in with your own account; roles (Admin, PM, Linguist, Translator) each land on the right home. Spelling has its own report, and any report exports to Excel.
Help & docs
Build an integration
Talk to the QA engine from your own systems: the QA adapter for a single check, or the LQA API for a scored review.