> ## Documentation Index
> Fetch the complete documentation index at: https://developers.phrase.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Analysis Export Formats

Phrase TMS's [Download analysis](/en/api/tms/latest/analysis/download-analysis) (`GET /api2/v1/analyses/{analyseUid}/download?format=...`) returns a file in one of four formats — `CSV`, `CSV_EXTENDED`, `LOG`, or `JSON`. This page is the field-by-field reference for each. Note that the `JSON` format has its own shape, distinct from any other Analysis API response.

<Note>
  All four formats download as `application/octet-stream`, including `JSON` — expect an attachment, not an inline JSON response.
</Note>

## Shared concepts

Every format reports the same underlying counts, just laid out differently.

**Match bands** — how closely a segment matched something else, from best to worst:

| Band          | Meaning                                                                                                                                                                            |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Context Match | 101% — exact text match *and* matching surrounding context. TM only; no equivalent band for MT/internal-fuzzy/non-translatable.                                                    |
| Repetitions   | Segment duplicates another segment already counted elsewhere in the job. Only the *first* occurrence is counted in its match band; every later occurrence is counted here instead. |
| 100%          | Exact text match, context not considered                                                                                                                                           |
| 95%-99%       | High fuzzy match                                                                                                                                                                   |
| 85%-94%       | Fuzzy match                                                                                                                                                                        |
| 75%-84%       | Fuzzy match                                                                                                                                                                        |
| 50%-74%       | Low fuzzy match                                                                                                                                                                    |
| No Match (0%) | No usable match                                                                                                                                                                    |
| Total         | Sum of every band above                                                                                                                                                            |

**Source levels** — where a match came from: **TM** (translation memory), **IF** (internal fuzzy — matched against other segments in the same job, not the TM), **MT** (machine translation), **NT** (non-translatable). `CSV`/`CSV_EXTENDED`/`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/part total), Editing time.

**Weighted counts**: if the analysis has a net rate scheme (discount), every count in every format is the *discounted* value — raw units × discount% for that level/band/workflow step. `Percent` for the Total band is always `100`; for other bands it's recomputed as `band / total × 100` when a discount scheme is present.

<Warning>
  A few columns are reserved but not yet computed — they're always `0`: **Tagging Errors** and **Placeables** (CSV/CSV\_EXTENDED), **Translated** and **Format Change** (LOG). Don't rely on them.
</Warning>

## CSV and CSV\_EXTENDED

Same layout for both — `CSV_EXTENDED` (labeled "CSV with chars" in the UI) just adds a **Characters** column to every band. Two header rows, then one data row per analysed job. There's no per-language-pair or analysis-total row.

**Row 1** — band labels: 3 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` — except **Total**, which drops `Percent`.

**Data rows** — one per job:

| Column                                                               | Value                                                                            |
| -------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| File                                                                 | `"<job title> \| <sourceLocale>><targetLocale>"`                                 |
| Tagging Errors                                                       | `0` (placeholder)                                                                |
| Chars/Word                                                           | source characters-per-word ratio                                                 |
| *(per band)* Segments / Words / \[Characters] / Placeables / Percent | discount-weighted counts for that band; `Placeables` is always `0` (placeholder) |
| *(Total)* Segments / Words / Characters / Placeables                 | same, no Percent column                                                          |

Numbers are formatted with the `en_US` locale, up to 2 decimal places.

## LOG

Plain fixed-width text, not delimited. Repeats the same block first **per job**, then once more **per language part** as an aggregate (`Total: N files`):

```
File:               <job title>              (job block only)
Date:               <analysis creation date, UTC>
Project:            <project name>
Language direction: <sourceLocale> > <targetLocale>

Match Types       Segments        Words      Percent
Translated               0            0            0   (placeholder, always 0)
Context Match       <seg>        <words>      <pct>
Repetitions          <seg>        <words>      <pct>
Format Change             0            0            0   (placeholder, always 0)
100%                 <seg>        <words>      <pct>
95% - 99%            <seg>        <words>      <pct>
85% - 94%            <seg>        <words>      <pct>
75% - 84%            <seg>        <words>      <pct>
50% - 74%            <seg>        <words>      <pct>
No Match             <seg>        <words>      <pct>
Total                <seg>        <words>          100
Chars/word           <ratio>
```

Numbers use the `en_US` locale, right-padded to 12 characters — 2 decimals for percent/pages, 1 decimal otherwise.

## JSON

Structured, nested — the only format with a per-source-level breakdown. Shape (`AnalyseExportDto`):

```jsonc theme={null}
{
  "projectName": "string",
  "dateCreated": "string",          // ISO-8601, UTC
  "analyseLanguageParts": [
    {
      "sourceLang": "string",
      "targetLang": "string",
      "data": { /* DataExportDto — language-pair aggregate */ },
      "jobs": [
        { "fileName": "string", "data": { /* DataExportDto — per job */ } }
      ]
    }
  ]
}
```

`DataExportDto`:

```jsonc theme={null}
{
  "contextMatch": { /* CountsExportDto */ },
  "repetitions":  { /* CountsExportDto */ },
  "match100": { /* CountsWithCategoriesExportDto */ },
  "match95":  { /* CountsWithCategoriesExportDto */ },
  "match85":  { /* CountsWithCategoriesExportDto */ },
  "match75":  { /* CountsWithCategoriesExportDto */ },
  "match50":  { /* CountsWithCategoriesExportDto */ },
  "match0":   { /* CountsWithCategoriesExportDto */ },
  "total":    { /* CountsExportDto */ },
  "charsPerWords": 0.0
}
```

`CountsExportDto` — flat counts for one band:

```jsonc theme={null}
{ "segments": 0, "words": 0, "characters": 0, "normalizedPages": 0.0, "percent": 0.0, "editingTime": 0 }
```

`CountsWithCategoriesExportDto` — same 6 fields, but each value is broken down by source level instead of being a plain number:

```jsonc theme={null}
{ "segments": { "sum": 0, "tm": 0, "if": 0, "mt": 0, "nt": 0 }, "words": { ... }, ... }
```

`sum` is the total across levels; `tm`/`if`/`mt`/`nt` are the TM / internal-fuzzy / MT / non-translatable shares.

<Note>
  `contextMatch`, `repetitions`, and `total` are flat (`CountsExportDto`, no level breakdown) — only the match-percentage bands (`match100`…`match0`) carry the `tm`/`if`/`mt`/`nt` split. There's also no `discounted` or `estimate` field in this export; those are only available from [Get analysis](/en/api/tms/latest/analysis/get-analysis), which uses a different, richer JSON shape than this download.
</Note>

### Mapping to the live API

The [Get analysis](/en/api/tms/latest/analysis/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`/`match0` line up 1:1 with the same-named fields here. `repetitions` and `all`/`total` exist in both, similarly named.
