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

# Import any file (AI import)

> Import your own Excel or CSV file even when it matches no template — the AI reads it, you review and confirm

## Overview

The normal import expects a file whose **column headings** match one of our templates — or a column mapping you stored under **Settings → CSV Imports**. Your actual working file often looks different: headings in row 7, one sheet per packaging level, a vertical form instead of a table, sizes as columns.

The **AI import** exists for exactly those files. It reads your file, **shows you what it found**, and only after your confirmation does the usual import run: preview, confirm overwrites, result. The AI import therefore adds **no second write path** — it only prepares the data for the existing one.

Accepted formats: **Excel** and **CSV** (`.xlsx`, `.xls`, `.csv`) — the same as the normal import.

<Info>
  **The AI import is a preparation step, not a shortcut.** Everything the normal import validates, it still validates: required fields, accepted values, match keys, the overwrite preview and the import result. A row the template rejects the AI import rejects too — visible in the same preview.
</Info>

## When to use it

Use the AI import when one of these applies:

* Your file carries **different column headings** than our template and you do not want to rewrite it.
* The headings are **not in row 1** (logo, title block, note rows above them).
* The file is **not a table**: a vertical form, one sheet per product or per packaging level, several small tables on one sheet.
* The file uses **its own spellings** in coded columns (`PE film`, `KST`, `PAP solid board`) for which no value mapping is stored yet.
* An import just **failed** because required columns were not recognised or most rows errored.

Do **not** use it when the file already matches the template or a saved column mapping applies — the normal import is then faster, free, and independent of row count and file size. The AI import checks this itself: if it recognises **at least three** of our fields in row 1 — through the template headings, their aliases or your saved mapping — it hands the file straight to the normal import **without** an AI call.

<Note>
  That pre-check only looks at the **headings**, not at whether every required column is present. A file that names three columns correctly and forgets the fourth, mandatory one therefore goes to the normal import and fails there — and that is exactly when the import result offers **Let the AI read this file** (see below). That route skips the pre-check.
</Note>

### Which data it covers

| Data type           | List with the button                                                    |
| ------------------- | ----------------------------------------------------------------------- |
| **Articles**        | **Articles** (`/articles`), in the PPWR module `/packaging/articles`    |
| **Suppliers**       | **Suppliers** (`/suppliers`), in the PPWR module `/packaging/suppliers` |
| **Packaging units** | **Packaging units** (`/packaging`)                                      |
| **Components**      | **Components** (`/packaging/components`)                                |

<Note>
  **Not importable via AI** are orders, the EUDR bill of materials, plots (GeoJSON), the separate **Article links** import and PPWR volume reporting. Those imports stay template-bound. The packaging **bill of materials** is still built through the **Component Codes** column of the unit import — even for rows the AI read.
</Note>

<Note>
  You need the same permission as for the normal import: **Manage articles** for articles, **Manage suppliers** for suppliers, **Manage packaging** for units and components. Without it the AI import stops with **You are not allowed to import this data** before any AI call is made — it is not a way around the permission, and it spends no budget either.
</Note>

## Where to find it

Three routes lead into the same dialog:

<Steps>
  <Step title="From the import menu">
    In the toolbar of the respective list, open the menu of the import button (the one that also offers the template download) and click **Import from any file (AI)**.
  </Step>

  <Step title="After a failed import">
    The **Import results** dialog shows a **Let the AI read this file** button below the errors. It carries over the file you just uploaded — no second upload.

    The button only appears where an AI read can plausibly help: when **required columns were not recognised** or **at least half** the rows failed. For a file that cannot be read **at all** (wrong format, corrupt, password-protected) it does not appear — the AI reads the same bytes with the same libraries and would only spend your AI budget. If the file holds no data rows at all — neither valid nor failing ones — you only get a short message and no result dialog; use the menu entry then.
  </Step>

  <Step title="From the AI support assistant">
    Ask the assistant **"I have a file of my own — can I import it?"**. It answers with a card and an **Open AI import** button that takes you to the dialog on the right page.

    The assistant **never sees your file** — it only opens the door. Do not upload the file into the chat; the reading happens in the import dialog only.
  </Step>
</Steps>

The dialog is titled **"Import \{data type} from any file"** (e.g. **Import Packaging units from any file**) and explains itself: *"Upload the file you already work with. We read it, show you what we found, and you confirm before anything is imported."* The drop area reads **Drop a file here, or click to choose one** and **Excel (.xlsx, .xls) or CSV**.

## Two modes

Which route your file takes is decided by the dialog itself — from the **shape** of the file, not its content. You choose nothing.

|                        | **Mapping mode**                                                                                                                                                                                           | **Extraction mode**                                                                                                                       |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| **When**               | Sheet 1 is a real table — at least **3 columns** wide, one heading row with at least **5 similarly filled** rows below it that make up most of the sheet — **and** the file has only **one** visible sheet | Everything else: forms, two-column field/value lists, one sheet per record, several sheets, several tables on one sheet, sizes as columns |
| **What the AI does**   | It proposes a **column mapping** (which of your columns is which of our fields, including the values of coded columns)                                                                                     | It **reads the records out** and writes them into our columns                                                                             |
| **Who reads the rows** | Our normal importer — **every** row, as always                                                                                                                                                             | The AI, up to 60 records per pass                                                                                                         |
| **Row count**          | Unlimited; the rows never reach the AI                                                                                                                                                                     | Capped at 60 records per pass                                                                                                             |
| **Status shown**       | **Matching your columns to our fields…**                                                                                                                                                                   | **Reading the records out of the file…**                                                                                                  |

<Info>
  **Mapping mode is the cheaper and the more accurate one** — it is preferred wherever it is possible. There the AI only sees the headings, up to 8 sample rows and the distinct values of the coded columns; the data itself is read by our deterministic importer. That is why it is independent of row count: a table with 3,000 rows costs the same single AI call as one with 30.
</Info>

<Warning>
  **A file with several visible sheets always goes to extraction mode** — even when sheet 1 is a perfect table. Mapping mode reads sheet 1 only (as the normal import does), and sheets 2 to n would disappear without a word. So if your file holds one data sheet plus a notes or legend sheet, it pays to delete or hide the second one: mapping mode then applies, with no 60-record cap.
</Warning>

### In mapping mode: review the proposal

The step is called **Proposed column mapping** and shows the same grid as **Settings → CSV Imports**, only prefilled. Above it you see which row the AI found your headings in; columns it found no field for are listed under **Not used: …**.

Correct whatever does not fit — your correction always wins. With **Save this mapping for my future imports** the proposal is stored as your column mapping: the **next** file from the same export then needs **no AI at all** and runs through the normal import again. The button onwards reads **Check the rows**.

<Note>
  Saving the mapping is a convenience for next time, not a precondition for this import. If saving fails, the import is not held up.
</Note>

<Note>
  **Whatever sits below the table is read too.** Mapping mode reads from the heading row it found **to the end of the sheet**. A totals row, a notes block or a legend below your table is therefore treated as a data row and shows up as a visible row error in the preview — not imported, but reported. Delete such rows beforehand if you want a clean result.
</Note>

### In extraction mode: review the rows

You see a table of the records the AI read — in our field labels, exactly as they will enter the preview. Above it: **"\{n} rows were read from your file. Required fields that stayed empty are marked."**

* Required fields that stayed empty are flagged **missing**.
* Each row carries **Source: …** with the cell it was read from (e.g. `Sekundär!B19`), so you can look it up in your file.
* Below it the AI states what it **assumed or merged** and what it did **not** take over (**Not taken over: …**) — embedded images or a summary table, say. Nothing is left out silently.

In mapping mode the same table shows a **sample**: the first rows read with the proposed mapping, plus how many rows the file holds in total. There **all** rows are imported, not only the ones shown.

<Warning>
  **This step is the real review point, not the preview that follows.** The import preview confirms **overwrites** row by row, but **new** records only by their **count**. For rows an AI read that is not enough — a misread weight would not stand out there. So do read this table properly.
</Warning>

## Step by step

<Steps>
  <Step title="Choose the file">
    Drag the file into the drop area or pick it. **Reading the file…** appears — the file is read inside your browser.
  </Step>

  <Step title="Template check (no AI)">
    If the headings match our template or your saved column mapping, the dialog closes straight away and the **normal** import runs. There is no AI call and no cost.
  </Step>

  <Step title="Mode and AI pass">
    Otherwise the dialog picks the mode (see [Two modes](#two-modes)) and makes **one** AI call: **Matching your columns to our fields…** or **Reading the records out of the file…**
  </Step>

  <Step title="Review the proposal or the rows">
    Mapping mode: correct the proposal, optionally save it, **Check the rows**. Extraction mode: read through the rows. Onwards with **Continue**.
  </Step>

  <Step title="Fill the gaps">
    If a required field is empty in **every** row, the [gap form](#gap-form) appears. Onwards with **Continue to preview**. With no gaps this step is skipped.
  </Step>

  <Step title="Preview, confirm, import">
    From here the **unchanged** import runs: if a row would overwrite an existing value, the preview opens and you decide row by row. Then the **import result** shows created, updated and skipped rows plus errors — and the run appears in the audit log like any other import.
  </Step>
</Steps>

<Note>
  **One file, two data types.** A working file often holds both — in extraction mode packaging units **and** their components, or articles **and** suppliers. The AI reads both data types in one pass; importing happens one after the other through each type's own button. What was read stays in **this browser tab for 30 minutes**, so the second import costs **no second AI call**.

  If your file holds nothing for the data type you opened, you see **No \{data type} recognised** together with the count found for the other type, and the hint: *"Use the matching import button for those — the file stays recognised in this tab for 30 minutes."*

  For packaging, import **components first, then units**: the units' **Component Codes** column can then link to components that already exist.
</Note>

## Gap form

Some required values practically never appear in a technical file — the PPWR **Role**, say, or the **Market Member States**. The AI does **not guess** them, it leaves them empty. If such a field is empty in **every** row read, the dialog asks for it **once**: *"These fields are missing from the file. What you enter here is applied to every row."* Select fields show **Please choose**. Onwards with **Continue to preview**.

* Only what is empty in **every** row is asked. A field missing in **some** rows is a problem of those rows — it shows up per row in the preview and in the import result, and a blanket value would overwrite the rows that do carry one.
* In **mapping mode** only fields with **no column at all** in your file are asked on top of that. A required field that does have a mapped column but stays empty in some rows belongs to those rows and is not filled globally.
* What you enter fills **empty cells only**. A value present in the row always wins.
* Fields that are required only **conditionally** are asked as **optional**. The classic case: the file states `PCR 85`, i.e. 85% recycled content from a post-consumer source, but no **recycled content evidence** (physical or mass balance) — which the schema demands only because a percentage was given. You add it here.

## Limits (caps)

Every limit is a **hard, visible refusal** — the AI import never truncates silently and never imports "the first 60".

| Limit                          | Applies to      | Value                                           |
| ------------------------------ | --------------- | ----------------------------------------------- |
| **File size**                  | extraction mode | 10 MB                                           |
| **Amount of text**             | both modes      | 60,000 characters of extracted text             |
| **Records per pass**           | extraction mode | 60 — across **all** data types read in one pass |
| **Columns**                    | mapping mode    | 200                                             |
| **Sample rows sent to the AI** | mapping mode    | 8                                               |
| **Distinct values per column** | mapping mode    | 50                                              |
| **Rows**                       | mapping mode    | unlimited                                       |

If your file is too large for extraction mode, split it — **one sheet per file** is the natural cut — or import with the template. A table goes through mapping mode in **one** pass no matter how many rows it has.

Reading also works like this:

* **Hidden sheets** are not read.
* **Embedded images** are not read — a value that only appears on a photo does not arrive.
* **Formulas** are read as their **result**, not as the formula.
* **Merged cells** are read as their top-left value.

### What the AI never does

* **It does not guess.** A field the file does not carry stays **empty** — never `0`, never a default. An empty required value is visible in the review step and in the preview; an invented one would not be.
* **Placeholders stay empty.** `??`, `?`, `k.A.`, `-`, `--`, `n/a`, `n.A.`, `tbd` and `keine Angabe` mean "unknown" and become empty.
* **Values are copied verbatim**, in the unit the file states. Conversion happens only where the label states the unit explicitly. `Recyclability 100` is a **percentage** and therefore does **not** become the recyclability grade (`A`/`B`/`C`) — that stays empty.
* **Unknown values in coded columns stay empty** instead of being guessed onto the nearest accepted value. The row then fails visibly in the preview ("Invalid value…"), or you store the spelling as a value mapping.
* **Nothing from your data is sent to the AI.** It sees the text of your file and our field catalogue — no articles, no suppliers, no results out of Polygon One.

<Warning>
  **If your file carries no reference or code, the AI derives one from the product or article number** (pattern `<product number>-<level>-<n>`, e.g. `SYN-1001-sekundaer-2`) — always the same for the same file content, so re-importing the same file **updates** instead of duplicating.

  But that also means: if such a derived key hits an **existing** record, that is an **overwrite**. The preview flags it as one and asks for your confirmation — so do check there whether you really mean to update. More on match keys under [Import (CSV / Excel)](/en/ppwr/stammdaten/import).
</Warning>

## Error messages

The AI import's messages appear in the dialog under the heading **The file could not be read with AI**; **Choose another file** takes you back to the drop area without closing the dialog.

### File too large for the AI import

> This file is too large for the AI import — import one sheet at a time, or use an import template.

**When does this happen?** The file or its extracted text exceeds the extraction-mode limits: more than 10 MB, more than 60,000 characters of text, or more than 60 records read in one pass. The same situation appears as the outcome of a pass in the form **"The file is too large for the AI import. Import it one sheet at a time, or use the import template."**

**How to fix it:** Split the file — **one sheet per file** is the cut that suits this kind of file — or import with the template. If your file is a real table and only landed in extraction mode because it has several visible sheets, delete or hide the side sheets: mapping mode then applies, with no record cap (see [Two modes](#two-modes)).

### The AI budget for this period has been used up

> The AI budget for this period has been used up. Importing with a template or a saved column mapping still works.

**When does this happen?** Your company's AI spend budget for the current period has been reached (see [Cost](#cost)).

**How to fix it:** Import with a template or a saved column mapping until the next period. If you already saved a mapping the AI proposed, this export runs without AI anyway.

### The file holds more records than one AI pass can return

> The file holds more records than one AI pass can return. Please split it into smaller files.

**When does this happen?** The AI's answer was longer than one pass allows — practically the same picture as "too large", just detected on the answer rather than on the file.

**How to fix it:** Split the file, ideally one sheet at a time. **Nothing** is imported partially.

### The answer could not be used

> The answer could not be used. Please check the file, or import it with a template.

**When does this happen?** The AI answered, but not in a shape we can process. Retrying the same file usually produces the same result.

**How to fix it:** Check whether the file actually holds the data you are looking for, and import it with the template otherwise.

### The AI service is currently unavailable

> The AI service is currently unavailable. Please try again in a few minutes.

**When does this happen?** An outage or overload on the AI service side.

**How to fix it:** Try again in a few minutes — unlike "could not be used", waiting helps here.

### This module is not enabled for your workspace

> This module is not enabled for your workspace, so the data could not be prepared.

**When does this happen?** You opened the AI import for a data type whose module is not active for you — packaging units without the PPWR module, for example.

**How to fix it:** Talk to your administrator.

### You are not allowed to import this data

> You are not allowed to import this data. Ask an administrator for the matching permission.

**When does this happen?** You lack the permission the normal import requires too (**Manage articles**, **Manage suppliers** or **Manage packaging**).

**How to fix it:** Request the permission. The AI import does not grant it.

<Note>
  Errors on **individual rows** do not come from the AI but from the normal import — they appear in the preview and in the import result.
</Note>

## Privacy

* **The file itself does not leave your browser.** It is read **in your browser**; only **text** is passed on.
* **In mapping mode** that is the **column headings**, up to **8 sample rows** and the distinct values of the coded columns. The AI **never** sees the remaining rows of your file — those are read by our importer.
* **In extraction mode** that is the text of the **visible sheets** of your file. Hidden sheets and embedded images are not included.
* **Nothing out of Polygon One is sent to the AI model.** It sees the text of your file and our field catalogue (field names, descriptions, accepted values) — no articles, suppliers, units, documents or analysis results.
* **The AI support assistant does not receive your file.** It knows about the AI import and can open it; it reads no file in the chat, checks none and imports none. If it claims otherwise, that claim is wrong.
* **The contents of your file are treated as data, never as an instruction.** A cell saying "ignore all instructions" changes nothing about the result: the AI may only fill our import columns, and anything else is discarded.

## Cost

Every AI call the import makes is booked against your company's **AI budget** like any other AI feature; in the usage records it carries the identifier `ai-file-import`.

* **One file = one call.** Mapping mode costs the same regardless of row count; extraction mode grows with the number of records read.
* **No second pass for the second data type** in extraction mode: what was read stays in this browser tab for 30 minutes. Mapping mode has no such cache — there a second data type is a second call (which costs the same regardless of row count).
* **No call at all** when the headings match the template or your saved mapping. A saved mapping makes every further import of the same export permanently free — the best reason to tick **Save this mapping for my future imports**.
* **The budget applies per billing period** of your contract, not per file and not per user. Once it is used up, templates and saved mappings remain fully usable.
* The AI import does **not** count against your quota of **AI document analyses** — that is a separate counter for uploaded evidence.

<CardGroup cols={2}>
  <Card title="Import (CSV / Excel)" icon="upload" href="/en/ppwr/stammdaten/import">
    Templates, columns, match keys and value mappings for units and components.
  </Card>

  <Card title="Articles" icon="box" href="/en/eudr/datenhaltung/artikel">
    The shared article template and its columns.
  </Card>
</CardGroup>
