---
title: "Create suppliers"
method: POST
path: "/api/v1/sa/inventory/suppliers"
tags: ["Suppliers"]
---

# Create suppliers

`POST /api/v1/sa/inventory/suppliers`

## 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/suppliers`
- Auth: one of:
  - API key in query parameter `api_key`
  - API key in header `X-Api-Key`

The body is one supplier or an array of them. The website is unique inside the team.

## Request body

- union
  - CreateSupplierForm: Payload to create a supplier. The name and the website are the two the call cannot leave out, and the website must be one no other supplier of the team holds.
    - `name` string, required
    - `website` string, required
    - `payment_terms` 'Not selected' | 'Net 15' | 'Net 30' | 'Net 45' | 'Net 60' | 'COD' | 'Prepaid', nullable: The label the read answers.
    - `contacts` string, nullable
    - `status` 'New' | 'Contacted' | 'No response' | 'Negotiation' | 'Approved' | 'Active' | 'On hold' | 'Rejected': The label the read answers.
    - `warehouse_id` integer, nullable
    - `responsible_user_id` integer, nullable
    - `type` 'Not selected' | 'Distributor' | 'Manufacturer' | 'Brand' | 'Wholesaler', nullable: The label the read answers.
    - `address` string, nullable
    - `currency` string, nullable
    - `phone` string, nullable
    - `country` string, nullable: The country of the supplier. The call does not store it: it picks the currency when `currency` is left out. The name of the country reads best, for example `Germany`; an unknown one gives USD.
    - `source` string, nullable: The screen or the tool the create came from, for the analytics. The call does not store it.
  - CreateSupplierForm[]
    - `name` string, required
    - `website` string, required
    - `payment_terms` 'Not selected' | 'Net 15' | 'Net 30' | 'Net 45' | 'Net 60' | 'COD' | 'Prepaid', nullable: The label the read answers.
    - `contacts` string, nullable
    - `status` 'New' | 'Contacted' | 'No response' | 'Negotiation' | 'Approved' | 'Active' | 'On hold' | 'Rejected': The label the read answers.
    - `warehouse_id` integer, nullable
    - `responsible_user_id` integer, nullable
    - `type` 'Not selected' | 'Distributor' | 'Manufacturer' | 'Brand' | 'Wholesaler', nullable: The label the read answers.
    - `address` string, nullable
    - `currency` string, nullable
    - `phone` string, nullable
    - `country` string, nullable: The country of the supplier. The call does not store it: it picks the currency when `currency` is left out. The name of the country reads best, for example `Germany`; an unknown one gives USD.
    - `source` string, nullable: The screen or the tool the create came from, for the analytics. The call does not store it.

## Response `200`

One result for each element. An array answers this shape.

- object
  - `data` Supplier[]
    - `id` integer: Unique supplier identifier
    - `team_id` integer: Team ID that owns this supplier
    - `user_id` integer: Responsible user ID
    - `name` string, nullable: Supplier name
    - `website` string, nullable: Supplier website
    - `status` string, nullable: Supplier status: New, Contacted, Approved, Rejected, Negotiation, No response, Active, On hold
    - `type` string, nullable: Supplier type: Distributor, Manufacturer, Brand, Wholesaler
    - `payment_method` string[]: Payment methods: Credit card, ACH, Wire transfer
    - `payment_terms` string, nullable: Payment terms: Net 15, Net 30, Net 45, Net 60, COD, Prepaid
    - `currency` string, nullable: Currency code (USD, EUR, GBP, etc.)
    - `contacts` string, nullable: Contact information
    - `contact_name` string, nullable: Contact person name
    - `phone` string, nullable: Phone number
    - `address` string, nullable: Address
    - `default_prep_center_id` integer, nullable: Default warehouse/prep center ID
    - `note` string, nullable: Additional notes
    - `mov` number, nullable: Minimum order value
    - `free_shipping_ov` number, nullable: Order value that makes the shipping free
    - `sold_by_case` boolean: The supplier sells by the case
    - `lead_time_min` integer, nullable: Minimum lead time in days
    - `lead_time_max` integer, nullable: Maximum lead time in days
    - `created_at` string, date-time: Creation timestamp
    - `updated_at` string, date-time: Last update timestamp
  - `meta` ApiV1BatchMeta: The count of a write that took an array.
    - `succeeded` integer
    - `failed` integer
  - `errors` ApiV1BatchError[]
    - `code` string
    - `message` string

## Other responses

- `201`: Successful response
- `402`: Payment Required - subscription expired or payment method required
- `403`: Access denied - insufficient permissions, invalid API key, or the API request limit is used up (`public_api_key_limit`)
- `404`: Resource not found
- `422`: Business logic error - operation cannot be completed due to business rules
- `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)
