---
title: "Create listing drafts"
method: POST
path: "/api/v1/sa/inventory/listings"
tags: ["Listings"]
---

# Create listing drafts

`POST /api/v1/sa/inventory/listings`

## Request

- Base URL: `https://app.sellerassistant.app` (the document declares no server; this is the origin it was published from)
- URL: `https://app.sellerassistant.app/api/v1/sa/inventory/listings`
- Auth: one of:
  - API key in query parameter `api_key`
  - API key in header `X-Api-Key`

The write takes one object or an array of them, so there is no bulk endpoint. One object answers 201 with the listing, and an array answers 200 with one result for each item, in the order they arrived.

## Request body

- union
  - ListingForm: One listing draft. The body of the create is one of them or an array of them, with no wrapper around it.
    - `channel` 'amazon' | 'walmart' | 'shopify' | 'ebay', required: Listings on the public API v1. This controller does not call the channel. It reads, creates the local draft row and deletes a row the channel never saw. Publishing to Amazon, and the delete of a published listing, need the channel and come in a later step.
    - `marketplace_id` string, required
    - `seller_id` string, required
    - `sku` string, required
    - `identifier` string, nullable
    - `price` number, required
    - `currency` string, required
    - `condition` 'new' | 'used_like_new' | 'used' | 'refurbished', nullable
    - `fulfillment_type` 'fba' | 'fbm' | 'wfs' | 'seller', nullable
    - `channel_data` object, nullable: Data of the channel that the draft keeps as it came.
  - ListingForm[]
    - `channel` 'amazon' | 'walmart' | 'shopify' | 'ebay', required: Listings on the public API v1. This controller does not call the channel. It reads, creates the local draft row and deletes a row the channel never saw. Publishing to Amazon, and the delete of a published listing, need the channel and come in a later step.
    - `marketplace_id` string, required
    - `seller_id` string, required
    - `sku` string, required
    - `identifier` string, nullable
    - `price` number, required
    - `currency` string, required
    - `condition` 'new' | 'used_like_new' | 'used' | 'refurbished', nullable
    - `fulfillment_type` 'fba' | 'fbm' | 'wfs' | 'seller', nullable
    - `channel_data` object, nullable: Data of the channel that the draft keeps as it came.

## Response `200`

One result for each item

- object
  - `data` object[]
  - `meta` ApiV1BatchMeta: The count of a write that took an array.
    - `succeeded` integer
    - `failed` integer
  - `errors` ApiV1BatchError[]
    - `code` string
    - `message` string

## Other responses

- `201`: One listing
- `400`: Bad request - validation failed or invalid parameters
- `403`: Access denied - insufficient permissions, invalid API key, or the API request limit is used up (`public_api_key_limit`)
- `429`: Too many requests - rate limit exceeded

---

[API](https://skmtc.dev/sellerassistant/apis/seller-assistant-public-api.md) · [All operations](https://skmtc.dev/sellerassistant/apis/seller-assistant-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sellerassistant/apis/seller-assistant-public-api/revisions/5b3ecdbcadb6?raw)
