> ## Documentation index
> Fetch the complete documentation index at: https://docs.leadity.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Download validation

> Download a validation run's answers as one CSV file.

Serves every item of a validation run with its verdict and its detail (the carrier and rate centre of a number, the verifier's own fields for an address) as one CSV file. An item not answered yet has an empty verdict. The file is named after the run's title, in lowercase with every run of other characters as one hyphen: Phone validation | Oct 4, 2:12 PM is phone-validation-oct-4-2-12-pm.csv. On the HTTP API the answer is the file itself. On MCP it is a short-lived link to the file.

`GET https://api.leadity.io/v1/validations/{id}.csv`

- Scope: `read`
- Spends credits: no
- MCP tool: `download_validation`

## Headers

- `Authorization`, string, required. Bearer, a space, then an API key: Bearer lk_api_... An MCP key is refused here with wrong_key_kind.

## Path parameters

- `id`, string, required. The validation run's id, as create_validation and list_validations answer it. 1 to 64 characters, matches ^[A-Za-z0-9]{1,64}$.

## Example request

```bash cURL
curl "https://api.leadity.io/v1/validations/Wq5nB8kT3m.csv" \
  -H "Authorization: Bearer $LEADITY_API_KEY" \
  -o validation.csv
```

```javascript Node.js
import { writeFile } from "node:fs/promises";

const response = await fetch("https://api.leadity.io/v1/validations/Wq5nB8kT3m.csv", {
  headers: {
    Authorization: `Bearer ${process.env.LEADITY_API_KEY}`,
  },
});

await writeFile("validation.csv", await response.text());
```

```python Python
import os

import requests

response = requests.get(
    "https://api.leadity.io/v1/validations/Wq5nB8kT3m.csv",
    headers={
        "Authorization": f"Bearer {os.environ['LEADITY_API_KEY']}",
    },
)

with open("validation.csv", "wb") as f:
    f.write(response.content)
```

## Response

On the HTTP API the answer is the CSV file itself (text/csv), served as <title>.csv. The MCP tool answers a short-lived download link instead, with url, expiresAt and filename: fetch the url before expiresAt. It needs no key.

## Example response

```http HTTP
HTTP/1.1 200 OK
Content-Type: text/csv; charset=utf-8
Content-Disposition: attachment; filename="phone-validation-oct-4-2-12-pm.csv"
```

```json MCP
{
  "url": "https://api.leadity.io/v1/downloads/dl_3Kx9mQ2pR7tW4bN8cV6yZ1",
  "expiresAt": "2026-10-04T15:12:09.000Z",
  "filename": "phone-validation-oct-4-2-12-pm.csv"
}
```

## Errors

Every refusal answers `{ error, message }` with the status below. The full list is on the [Errors](https://docs.leadity.io/errors) page.

| Code | Status | Meaning | Extra fields |
| --- | --- | --- | --- |
| `unauthorized` | 401 | The API key is missing, malformed, revoked or expired. | - |
| `wrong_key_kind` | 401 | This key opens the other surface: an API key works on the HTTP API, an MCP key on the MCP server. | - |
| `account_suspended` | 403 | The account is suspended. | - |
| `email_not_verified` | 403 | The account's email address is not verified yet. | - |
| `invalid_body` | 400 | The request does not match the operation's schema. | `issues`: The problems found, each with path (the field as a dotted path, led by the part of the request it travels in: path, query or body, such as body.items.1) and message (what is wrong there). |
| `not_found` | 404 | No such resource on this account. | `id`: On export_scrapes: the first id that is not one of the account's scrapes. |
| `rate_limited` | 429 | Too many requests. Wait for the Retry-After seconds and try again. | `retryAfterSeconds`: The seconds to wait, the same number as the Retry-After header. |
| `try_again` | 503 | Leadity could not answer just now. Retry in a moment, with the same Idempotency-Key on a spending call. | `retryAfterSeconds`: When a request with this Idempotency-Key is still being processed: the seconds to wait before retrying with the same key, as the Retry-After header says. |
| `internal_error` | 500 | Something failed on our side. Nothing was charged twice. | `body`: On the MCP server, when Leadity answered in a shape the tool does not publish: that answer as it came. |
