---
title: "Upload ERP inventory XLSX"
method: POST
path: "/inventory/upload"
tags: ["inventory"]
---

# Upload ERP inventory XLSX

`POST /inventory/upload`

Uploads an XLSX file with inventory. Saves file to bucket, logs an import job and erp_inventory_file row.

## Response `201`

Created

- ModelsInventoryUploadResponse
  - `bucket_url` string
  - `column_mapping` ModelsInventoryUploadMapping
    - `attributes` ModelsERPAttributeMapping[] — Attributes carries every non-first-class column preserved from the upload (dynamic import). Empty for legacy uploads made before dynamic mapping.
      - `label` string — human-friendly display name (AI-suggested, user-editable)
      - `source_column` string — exact header text in the uploaded file == metadata key
      - `type` string — "string" | "number" (display/format hint)
    - `description_columns` string[]
    - `description_name` string
    - `primary_identifier_column` string
    - `primary_identifier_name` string — Name fields for human-friendly display and llm
    - `purchase_price_column` string
    - `purchase_price_name` string
    - `purchase_quantity_column` string
    - `purchase_quantity_name` string
    - `secondary_identifier_column` string
    - `secondary_identifier_name` string
    - `supplier_name_column` string
    - `supplier_name_name` string
    - `supplier_number_column` string
    - `supplier_number_name` string
  - `created_at` string
  - `id` string
  - `import_id` string
  - `ingested_count` integer
  - `item_count` integer

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `500` — Internal Server Error

---

[API](https://skmtc.net/resourcly/apis/resourcly-api.md) · [All operations](https://skmtc.net/resourcly/apis/resourcly-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/resourcly/resourcly-api/revisions/7f97d8cd0f1e/schema)
