---
title: "Preview an import"
description: "Check CSV text (csv) before importing it, as the bulk import page's preview and column mapping steps do: the headers, the first rows per column, a suggested column_mapping for POST /imports, and the same row checks the i"
url: https://docs.filemonk.io/v2/api-reference/imports/preview-an-import/
api: "API v2 reference"
method: POST
path: "/imports/preview"
---

# Preview an import

`POST https://app.filemonk.io/api/v2/external/imports/preview`

Check CSV text (csv) before importing it, as the bulk import page's preview and column mapping steps do: the headers, the first rows per column, a suggested column_mapping for [`POST /imports`](https://docs.filemonk.io/v2/api-reference/imports/create-an-import/), and the same row checks the import runs (unknown files, SKUs or urls), without importing anything.

**Note:** Read-only. Send the column_mapping you intend to import with to check those columns; without it the template order (sku, filename, external_url, data_type, link_to_product, custom_product) is checked.

## Request body

- `csv` (string, required): e.g. `sku,filename,external_url,data_type,link_to_product,custo…`
- `filename` (any)
- `column_mapping` (any)

## Returns

- `headers` (array of strings, required)
- `sample_columns` (object, required)
  - `sku` (array of strings, required)
  - `filename` (array of strings, required)
  - `external_url` (array of strings, required)
  - `data_type` (array of strings, required)
  - `link_to_product` (array of strings, required)
  - `custom_product` (array of strings, required)
- `suggested_column_mapping` (object, required)
  - `sku` (integer, nullable, required): e.g. `0`
  - `filename` (integer, nullable, required): e.g. `1`
  - `external_url` (integer, nullable, required): e.g. `2`
  - `data_type` (integer, nullable, required): e.g. `3`
  - `link_to_product` (integer, nullable, required): e.g. `4`
  - `custom_product` (integer, nullable, required): e.g. `5`
- `validation` (object, required)
  - `total_rows` (integer, nullable, required): e.g. `1`
  - `valid_rows` (integer, nullable, required): e.g. `1`
  - `has_warnings` (boolean, nullable, required): e.g. `false`
  - `filename_errors` (array of anys, required)
  - `variant_errors` (array of anys, required)
  - `url_errors` (array of anys, required)
  - `reference_summary` (object, required)

Rate limit: this call costs 2 points ([rate limits](https://docs.filemonk.io/v2/errors-and-rate-limits/)).

## Example request

```sh
curl -X POST "https://app.filemonk.io/api/v2/external/imports/preview" \
  -H "X-Auth-Token: $FILEMONK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "csv": "sku,filename,external_url,data_type,link_to_product,custom_product\nWATERCOLOUR-1,guide.pdf,,sku,yes,no\n"
  }'
```

## 200

Success: the write completed; the body is the updated resource.

```json
{
  "headers": [
    "sku",
    "filename",
    "external_url",
    "data_type",
    "link_to_product",
    "custom_product"
  ],
  "sample_columns": {
    "sku": [
      "WATERCOLOUR-1"
    ],
    "filename": [
      "guide.pdf"
    ],
    "external_url": [
      ""
    ],
    "data_type": [
      "sku"
    ],
    "link_to_product": [
      "yes"
    ],
    "custom_product": [
      "no"
    ]
  },
  "suggested_column_mapping": {
    "sku": 0,
    "filename": 1,
    "external_url": 2,
    "data_type": 3,
    "link_to_product": 4,
    "custom_product": 5
  },
  "validation": {
    "total_rows": 1,
    "valid_rows": 1,
    "has_warnings": false,
    "filename_errors": [],
    "variant_errors": [],
    "url_errors": [],
    "reference_summary": {}
  }
}
```

## 401

Missing or invalid API key.

```json
{
  "errors": [
    "Invalid API key"
  ]
}
```

## 422

The request failed validation, or sent a key the action does not take (`code: &quot;unknown_parameters&quot;` with `unknown` and `accepted`). Nothing was saved.

```json
{
  "errors": [
    "access.download_limit_count must be an integer of at least 0"
  ],
  "field_errors": {
    "access.download_limit_count": [
      "must be an integer of at least 0"
    ]
  }
}
```

## 429

Rate limited. Cost-weighted per API key, shared with API v1: a read costs 1 point, a write 2, 40 points per fixed 60-second window. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (Unix time the window ends); a 429 adds `Retry-After` (seconds), `retry_after`, `retryable: true` and a `next_step` in the body. A 429 did nothing: wait `retry_after` seconds, then send the same request again. The budget is per key, so every tool or script using the key shares it; prefer one list call with `per_page` over many single reads.

```json
{
  "errors": [
    "You have exceeded the rate limit of 40 points per 60 seconds. Read requests cost 1 point(s) and write requests cost 2 point(s). Please retry after 12 second(s)."
  ],
  "code": "rate_limited",
  "retry_after": 12,
  "error": "Rate limit exceeded",
  "message": "You have exceeded the rate limit of 40 points per 60 seconds. Read requests cost 1 point(s) and write requests cost 2 point(s). Please retry after 12 second(s)."
}
```

