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

# Upload keys

> Deliver the keys for a purchase order by typing them in, pasting them, or uploading a CSV or text file.

You deliver a purchase order (PO) by uploading its keys. The upload opens as its own page, **Upload inventory**, from the PO.

## Open the upload

Open the PO from **Purchase Orders**, then select **Upload keys**, or **Upload manually** if no keys have been received yet. Both are available while the PO is not Closed and keys are still outstanding. See [Fulfil purchase orders](/vendor-portal/fulfil-purchase-orders).

The panel beside the keys tracks your progress: how many keys you have entered against how many the PO still needs, how many are already received, and whether you are ready to upload, still short, or have entered too many.

## Add keys by hand

The **Manual** tab is a grid with one key per row.

* Type each key under **Key**, and pick an optional date under **Expiry date**.
* For account products, each row also has an optional **Note**. Other product types take only the key and expiry.
* Typing in the last row adds a new one. You can also select **Add row**, remove a row with its delete icon, or select **Clear all** to start again.
* Pasting several lines into a row fills one row per line.

To give every row the same expiry, pick a date under **Batch expiry** and select **Apply to all rows**. You can still change a single row afterwards.

## Upload a file

On the **Bulk** tab, drag in a `.csv` or `.txt` file, or select **Browse files**. Select **Download sample CSV** to see the expected columns: the key, then an optional expiry and note.

* Commas, tabs, and semicolons are all recognised as separators, and a header row is skipped.
* Expiry dates can be written as `YYYY-MM-DD`, `DD/MM/YYYY`, or `DD-MM-YYYY`. A row with a date that is not recognised is still added, with a blank expiry.

Once the file is read, you can upload it as it is, or select **Review in grid** to move the keys into the **Manual** tab and check them first. Select **Clear** to pick a different file.

## Account products

For account products, enter each key as `email | password`, for example `user@example.com | password123`. If any entry is missing the `|` separator, the upload stops and tells you how many entries need fixing.

## Duplicates and limits

* If you enter the same key twice, the page warns you before you upload and marks the repeated rows. Matching ignores case.
* Keys that repeat within the upload, or that are already in the store's stock for the product, are skipped. The confirmation tells you how many were added and how many duplicates were skipped.
* You cannot upload more keys than the PO still needs. The upload button stays disabled until you remove the extra rows.

## Upload

Select **Upload** (the button shows how many items you are adding). You return to the PO, where the received count and the **Inventory Received** bar update.

<Tip>
  You can deliver a PO over several uploads. The PO shows how many keys remain until it is complete.
</Tip>

## Start over with Reset keys

If you uploaded the wrong keys, select **Reset keys** on the PO and confirm. This removes the still-available keys you submitted that the store has not approved yet, and you can upload again.

**Reset keys** is offered only when all of these are true:

* Keys have been received on the PO.
* The store has not approved the keys yet.
* The PO is not Closed.

## What the store sees

Your keys are added to the store's stock for the product and appear on the store's copy of the PO, with the received count updated.

The store then reviews and approves the keys. Once it approves them, they are locked: you can no longer reset them or edit their expiry.

## Next

<CardGroup cols={2}>
  <Card title="Fulfil purchase orders" icon="file-invoice" href="/vendor-portal/fulfil-purchase-orders">
    Review the keys you sent and follow the PO's timeline.
  </Card>

  <Card title="Your inventory" icon="boxes-stacked" href="/vendor-portal/inventory">
    See your stock across every product you supply.
  </Card>
</CardGroup>
