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

# File exchange

> The servers this organisation swaps files with automatically — what arrives from each, what leaves for it, and what every run did.

An import you run by hand still needs somebody to remember to run it. File exchange is the same
kind of interchange running unattended, against a server this organisation controls.

## Connecting a server

One connection is one SFTP server: host, port, username and how it authenticates. The host key
field gets easier by being left blank first — the initial connection reports the fingerprint the
server presents, and you compare that against what the other side says separately before trusting
it. Nothing is trusted on first use just because a value appeared.

## What comes in

A **feed** watches a folder on that server for files matching a pattern, and imports each one
through a saved [import mapping](/config/import) you choose. Two things you set per feed:

| Setting | Decides |
| - | - |
| **Runs as** | Whose permissions the import runs with — the same as if that person had uploaded the file by hand, and whose name lands on every row created |
| **After it's read** | Wait for review, or commit automatically |

<Warning>
  A feed can't be anonymous — an import writes somebody's name onto every row it creates. If the
  person a feed runs as leaves or loses access, the whole connection stops rather than silently
  importing as nobody, and the screen says why.
</Warning>

A file that lands but can't be processed says why rather than vanishing: too large to take in one
piece, still being written when it was read (left for the next pass), unreadable, or matched to a
feed whose saved mapping no longer exists.

## What goes out

An **extract** is an interface, not a report: a file another system reads on a schedule, not
something a person opens to look at. That difference shapes it —

* It's named and versioned. Within one version, columns may be added but never reordered or removed,
  so the other system's own column positions never move under it.
* Every file ships with a manifest carrying the row count and a checksum, so the system reading it
  can tell a truncated transfer from a complete one instead of silently loading half a night's rows.
* An extract can be **incremental** — it remembers a watermark (typically the last row's timestamp)
  and each run sends only what changed since, rather than the whole table every time.

## Runs

Every connection keeps a history of what it attempted: when, what it found, what landed, what it
skipped, and the checksum that went into each extract's manifest — the record for "did this file
actually arrive" three weeks after the fact.

<Card title="Import" icon="upload" href="/config/import">
  The mapping a feed imports through, and the same screen for a one-off file uploaded by hand.
</Card>
