---
title: "Download the .txt of a language file"
method: GET
path: "/language-files/download"
tags: ["Language Files"]
---

# Download the .txt of a language file

`GET /language-files/download`

## Request

- Base URL: `https://api.reportingninja.com/v1`
- URL: `https://api.reportingninja.com/v1/language-files/download`
- Auth: one of:
  - none
  - HTTP bearer

Answers the .txt of a language file: `text/plain; charset=UTF-8` with a Content-Disposition of language_file.txt. One of the two routes of this API that are a GET, whose success is not a JSON envelope and that have no MCP tool of their own.

TWO WAYS IN, AND ONE OF THEM IS ENOUGH. `token` is the signed link /v1/language-files/get publishes as download_url: it carries the account and the file inside it, needs no Authorization header -- which is what lets an assistant hand it to a person -- and expires 900 seconds after it was minted, with no way to revoke it before that. `language_file_key` is the form a script uses, with the Bearer of the account. A request carrying both is served by the token.

THE FILE IS REBUILT, not stored: the English master of the platform, with its sections, its comments and its keys, carrying the literals of this file. That is what the download of the application answers and what /v1/language-files/create reads back, so the round trip is closed. The sixteen files of the platform are downloadable too.

Everything that is not the file comes back in the envelope of the rest of the API (401, 404, 429). A POST to this path is ENDPOINT_NOT_FOUND, and a HEAD is refused with 405.

## Query parameters

- `token` string
- `language_file_key` string

## Response `200`

The .txt of the language file.

## Other responses

- `400`: The request was refused before anything was written. INVALID_REQUEST covers the framework refusals of every endpoint (the Content-Type is not application/json, the body could not be read, the body is not valid JSON). The report endpoints add their own: VALIDATION_FAILED with details.problems, UNKNOWN_PARAM with the path of the field the endpoint does not read, and the single-field refusals MISSING_REQUIRED_FIELD, INVALID_VALUE and APPEND_NOT_ALLOWED. The description of each operation lists the ones it emits. Everything else a body can get wrong arrives as an entry of details.problems rather than as the code of the envelope.
- `401`: Invalid or missing Bearer token.
- `404`: A key of the request does not name anything this account owns. NOT_FOUND covers reports, sections, widgets, schedules, portal views, brand templates, email templates and language files; TEMPLATE_NOT_FOUND covers a catalog slug, version or section position that stopped being published between the validation and the write. An entity of another account is reported the same way as one that does not exist.
- `429`: A budget was spent. RATE_LIMITED is the per-key read budget (300/minute, 5000/day) or the per-account write budget (60/minute, 1000/day). EMAIL_QUOTA_REACHED is the separate budget of 50 calls per account per day that send email, and its Retry-After points at the next UTC midnight. The Retry-After header gives the seconds until the more restrictive window resets. The X-RateLimit-* headers report the read budget, except on the 429 of a write, where they report the write budget.
- `500`: Internal server error.

---

[API](https://skmtc.dev/reportingninja/apis/reporting-ninja-api.md) · [All operations](https://skmtc.dev/reportingninja/apis/reporting-ninja-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reportingninja/apis/reporting-ninja-api/revisions/13876c71be34?raw)
