Skip to main content
Analysis calculates word and character counts and match statistics for a translation job, so you can quote work, plan workload, and measure post-editing effort over the API. This guide covers creating an analysis, reading its results, and the four downloadable export formats. Analysis is a feature of Phrase TMS (Translation Management System). For a walkthrough of the Analysis screen in the product, see the Analysis (TMS) support article.

Quickstart

The simplest call fetches one analysis you already have and confirms your token works. Replace the base URL, token, and analysis UID with your own.
A 200 response returns the analysis and its per language pair results. If you get a 401, your access token is missing or expired; refresh it and try again. See Get analysis for the full response shape.

Prerequisites

How analysis works

Analysis splits a job’s segments into bands, such as translation memory (TM) matches, machine translation (MT) matches, internal fuzzy matches, non-translatables, and repetitions. Each band carries its own counts. A segment is one translatable unit of text, usually a sentence. Results are always per language pair, calculated against that pair’s own TM, even when several target languages share one TM.

Analysis types

The type you choose decides what gets measured. A linguist is a translator or reviewer working on the job.

Creating an analysis

Create analysis takes a job selection and a type. The job selection is either jobs (job UIDs from the same project) or jobFilter (a project plus optional filename, status, target languages, workflow step, provider, or due-date filters). The type picks what gets measured. Options common to every type:
  • includeTransMemory, includeMachineTranslationMatches, includeNonTranslatables decide which match sources count.
  • includeFuzzyRepetitions, separateFuzzyRepetitions fold internal fuzzy matches into the regular bands or break them out.
  • includeNumbers, includeConfirmedSegments, includeLockedSegments, includeNotConfirmedSegments decide which segments count at all.
  • name supports macros such as {projectName}, {sourceLang}, and {targetLang}.
  • netRateScheme applies a discount (see Net rate schemes and discounts).
  • useProjectAnalysisSettings falls back to the project’s default analyse settings instead of specifying everything inline.
To split the output instead of getting one combined analysis, either pass analyzeByLanguage or analyzeByProvider on the same request, or use the dedicated Create analyses by languages or Create analyses by providers endpoints for the same job selection. The by-providers endpoint also pre-applies a provider’s net rate scheme, if one is assigned.
A source file update marks its analyses outdated. Recalculating re-applies the original settings. Vendors cannot recalculate analyses created by the buyer.

Working with analysis over the API

Interpreting results

Each language pair’s result (analyseLanguageParts[].data) breaks counts into buckets. Every bucket carries segments, words, characters, normalizedPages, percent, and editingTime.
match95 means the 95 to 99 percent band, match85 means 85 to 94 percent, and so on. The label is the band’s lower bound, not an exact score. match101 exists only for TM matches, and marks in-context exact matches (the same source text and the same surrounding context, not just the same text).
Each language part also has a discountedData object with the same shape as data, reflecting the net rate scheme applied to that analysis, if any.

Net rate schemes and discounts

A net rate scheme applies a discount to words, characters, and pages in specific match buckets. For example, TM 100 percent matches can be billed at 20 percent of the normal rate. Applying one populates discountedData alongside the raw data. The product shows this as the analysis’s Net rate row. A scheme can also be applied automatically. Pass netRateScheme on Create analysis, or use analyzeByProvider or Create analyses by providers to inherit the provider’s assigned scheme.

Export formats

Download analysis (GET /api2/v1/analyses/{analyseUid}/download?format=...) returns a file in one of four formats: CSV, CSV_EXTENDED, LOG, or JSON. These are the same formats offered by the Download button in the product. This section is the field-by-field reference for each.
All four formats download as application/octet-stream, including JSON. Expect an attachment, not an inline JSON response.

Shared concepts

Every format reports the same underlying counts, laid out differently. Match bands, how closely a segment matched something else, from best to worst: Source levels, where a match came from: TM (translation memory), IF (internal fuzzy, matched against other segments in the same job rather than the TM), MT (machine translation), and NT (non-translatable). CSV, CSV_EXTENDED, and LOG sum all levels together per band. JSON breaks each band down by level (see below). Units per band: Segments, Words, Characters, Normalized pages, Percent (share of the job or part total), and Editing time. Weighted counts: if the analysis has a net rate scheme (a discount), every count in every format is the discounted value, that is, raw units multiplied by the discount percentage for that level, band, and workflow step. Percent for the Total band is always 100; for other bands it is recomputed as band divided by total, times 100, when a discount scheme is present.
A few columns are reserved but not yet computed, so they are always 0: Tagging Errors and Placeables (CSV and CSV_EXTENDED), and Translated and Format Change (LOG). Do not rely on them.

CSV and CSV_EXTENDED

The layout is the same for both. CSV_EXTENDED (labeled “CSV with chars” in the product) just adds a Characters column to every band. There are two header rows, then one data row per analyzed job. There is no per language pair or analysis-total row. Row 1, band labels: three blank leading cells, then one label per band, in order: Context Match, Repetitions, 100%, 95%-99%, 85%-94%, 75%-84%, 50%-74%, No Match, Total. Row 2, column headers: File, Tagging Errors, Chars/Word, then for each band above: Segments, Words, Characters (CSV_EXTENDED only), Placeables, Percent. The Total band drops Percent. Data rows, one per job: Numbers are formatted with the en_US locale, up to two decimal places.

LOG

Plain fixed-width text, not delimited. It repeats the same block first per job, then once more per language part as an aggregate (Total: N files):
Numbers use the en_US locale, right-padded to 12 characters: two decimals for percent and pages, one decimal otherwise.

JSON

Structured and nested, the only format with a per source level breakdown. Shape (AnalyseExportDto):
DataExportDto:
CountsExportDto, flat counts for one band:
CountsWithCategoriesExportDto, the same six fields, but each value is broken down by source level instead of being a plain number:
sum is the total across levels. tm, if, mt, and nt are the TM, internal-fuzzy, MT, and non-translatable shares.
contextMatch, repetitions, and total are flat (CountsExportDto, no level breakdown). Only the match-percentage bands (match100 through match0) carry the tm, if, mt, and nt split. This export has no discounted or estimate field; those are available only from Get analysis, which uses a different, richer JSON shape than this download.

Mapping to the live API

The Get analysis response uses different field names for the same bands. Its match101 is this export’s contextMatch, and its match100, match95, match85, match75, match50, and match0 line up one-to-one with the same-named fields here. repetitions and all or total exist in both, named similarly.

Troubleshooting

For product or account questions, contact Phrase support. For help writing integration code against these endpoints, use your own developer or AI coding tools.

Next steps

Create analysis

Run a new analysis over a job selection.

Get analysis

Read the full result shape for a language pair.

Download analysis

Export results as CSV, CSV_EXTENDED, LOG, or JSON.

Net rate schemes

Apply match-band discounts to an analysis.
Last reviewed: September 7, 2026. API changes are recorded in the changelog.