Still Needs a Human BETA
Checking integrations…

Run QA

What’s Wrong? · two layers · strict rules first, the model only where it earns its keep

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.

Drop file(s) here or click to browse
One or many files, or a zip/wsxz package · all go into one report.

How it works

Layer 1Rule engine · deterministic

Tags, numbers, placeholders, missing targets, brand/DNT protection, punctuation, spacing, length, consistency. Cheap, exact, instant. Findings here are facts.

Layer 2AI deep-review · only the exceptions

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.

In your editorWorking in ATMS, WorldServer, fbCAT, Smartling or XTM? Run QA without exporting.

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

one profile per account · division · language pair · edited here, honoured by panel, Dropbox and Dispatch alike
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.

Pick a profile to edit
Profiles are grouped by account.

Reports

every run kept · reopen a report whenever you need it

Run history

When (UTC)FileAccount · DivisionPairProfileTriggerFindingsCritWarnInfoAIAI ✓

Settings

org-wide defaults and connectivity · most values are set in the server environment and shown here read-only

General

Fallback profile
Used when no account · division · language-pair matches a job.

LQA

scorecard review · MQM/DQF templates · live scoring

Eval

MT / LLM bake-off · score the same source across engines · rank by quality and value
QA finds issues automatically. LQA is a human MQM review of one delivery. Eval compares several engines on the same source with the same scoring. Open any candidate in LQA to verify it by hand.

API documentation

two integrations, one engine: the QA adapter and the LQA API

Authentication

Machine endpoints use a Bearer token. Send it on every request.

Authorization: Bearer YOUR_TOKEN
The same token signs the LQA finalize callback (header 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.

POST /qa-adapter/v1/check

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..." }
GET /qa-adapter/v1/check/{checkId}

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
    }
  ]
}
Error shape
FieldNotes
category / subcategoryAccuracy, Terminology, Completeness, Style, Consistency, Client checklist.
severitycritical, major, minor or preferential.
penaltyPointscritical 5, major 3, minor 1, preferential 0.
errorIdStable id, so you can track ignore or fixed status across polls.
qualityScore0 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.

POST /lqa/v1/jobs

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.

With a file (multipart)
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"
With segments (JSON)
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" }
}
FieldNotes
file or segmentsOne is required. Files: xliff, sdlxliff, mxliff, txlf, xlz, wsxz and similar.
templateA template id (see templates below). Omit to resolve by account, division and language.
modeqa, lqa (default) or blind.
sample_wordsCap the reviewed sample so a large file is never fully scored.
skip_exact, skip_context, skip_lockedExclude exact, context (100 percent) or locked segments from the run.
project_ref, translatorFree-text attribution carried through to the scorecard and callback.
callback_urlOptional. We POST the signed result here on finalize (see below).
Header Idempotency-KeySafe retries: the same key returns the original job instead of creating a new one.
GET /lqa/v1/jobs/{id}

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"
    }
  ]
}
GET /lqa/v1/jobs

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.

GET /lqa/v1/templates
curl https://qa.eltur.co/lqa/v1/templates \
  -H "Authorization: Bearer YOUR_TOKEN"
POST /lqa/v1/templates

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 /lqa/v1/templates/{id}

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.

Verify the signature

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)
Manual finalize. You can also finalize a job over the API with POST/lqa/v1/jobs/{id}/submit, which fires the same callback.

What's new

changelog, newest first
Jun 2026new

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.

Jun 2026new

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.
Jun 2026new

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.

Jun 2026

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.

Jun 2026

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.

Jun 2026

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.

Jun 2026

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.

2026

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.

2026

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.

2026

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.

2026

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

a quick orientation to the tabs across the top
Run QA
Drop a bilingual file (XLIFF, SDLXLIFF, mxliff, txlf, xlz, wsxz). Deterministic rules run first; AI review only re-checks rule-flagged segments, so it stays cheap. Tick LQA to turn a check into a scored review.
Profiles
A profile is a per-client, per-language-pair rule set. The How profiles work panel on the Profiles tab walks through creating one.
Reports
Every run is saved here. Open one to see findings side by side with the source, filter by category, and export to Excel.
LQA
Scored human review on per-account scorecards. Review findings in a full-screen grid with Note and Suggested-translation columns, then finalize for a score and verdict.
Settings
AI engine, integrations (Dropbox watcher, Dispatch adapter), auto-profile rules and branding. Admin and PM only.

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.