> ## 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.

# Export scrapes

> Download several scrapes' leads as one CSV file.

Serves the delivered leads of several scrapes as one CSV file, in the order the ids are given: List ID and List Name first, then every column any of the lists bought. A list that did not buy a column is blank under it. Every id must be one of the account's scrapes, or the whole call answers not_found naming the first that is not. On the HTTP API the answer is the file itself. On MCP it is a short-lived link to the file.

`POST https://api.leadity.io/v1/scrapes/export`

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

## Headers

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

## Body parameters

- `ids`, string[], required. One to 1,000 scrape ids, in the order the file holds them. Repeats count once. 1 to 1,000 items, each 1 to 64 characters, each matches ^[A-Za-z0-9]{1,64}$.

## Example request

```bash cURL
curl -X POST "https://api.leadity.io/v1/scrapes/export" \
  -H "Authorization: Bearer $LEADITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": [
      "Vb7nW3xQ9k",
      "Pq3xT8mK2n"
    ]
  }' \
  -o leads.csv
```

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

const response = await fetch("https://api.leadity.io/v1/scrapes/export", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.LEADITY_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "ids": [
      "Vb7nW3xQ9k",
      "Pq3xT8mK2n"
    ]
  }),
});

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

```python Python
import os

import requests

response = requests.post(
    "https://api.leadity.io/v1/scrapes/export",
    headers={
        "Authorization": f"Bearer {os.environ['LEADITY_API_KEY']}",
    },
    json={
        "ids": ["Vb7nW3xQ9k", "Pq3xT8mK2n"],
    },
)

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

## Response

On the HTTP API the answer is the CSV file itself (text/csv), served as leadity-<count>-lists.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="leadity-2-lists.csv"
```

```json MCP
{
  "url": "https://api.leadity.io/v1/downloads/dl_8Hq2mZ7xKp4Rt9Wb3Nc6Vy",
  "expiresAt": "2026-10-04T15:12:09.000Z",
  "filename": "leadity-2-lists.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. |
