POST /v3/vendor/products — create product
const url = 'https://api-ha-prod-p8.handbid.dev/v3/vendor/products';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"productCode":"WIN-1","name":"Napa Getaway","reservePrice":2000,"value":4500,"inventoryQuantity":3,"isPublic":0,"taxonomyId":12}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api-ha-prod-p8.handbid.dev/v3/vendor/products \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "productCode": "WIN-1", "name": "Napa Getaway", "reservePrice": 2000, "value": 4500, "inventoryQuantity": 3, "isPublic": 0, "taxonomyId": 12 }'Create a marketplace package in your vendor catalog.
Idempotent SKU replay: a repeat POST with a productCode already in your catalog does not create a duplicate — it returns 204 with the Location of the existing package. Safe to retry.
Body: productCode, name, reservePrice and value are required.
Responses:
204 No Content— created, or the existing package on an idempotent SKU replay. TheLocationheader points at the package.422 validation_error— a required field is missing or a field failed validation.503 unavailable— transient lock contention on the catalog; the envelope carries aretryAfter(seconds). Safe to retry.401 unauthorized/403 forbidden— as for the list endpoint.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”object
Vendor SKU. A repeat POST with the same code is an idempotent replay.
Vendor cost / floor, in dollars.
Retail (fair-market) value, in dollars.
0 = private (default), 1 = publicly listable.
Example
{ "productCode": "WIN-1", "name": "Napa Getaway", "reservePrice": 2000, "value": 4500, "inventoryQuantity": 3, "isPublic": 0, "taxonomyId": 12}Responses
Section titled “ Responses ”Created — or the existing package on an idempotent SKU replay.
Headers
Section titled “Headers ”URL of the created (or existing) package.
No or invalid Bearer token.
Unified error envelope. retryAfter is present only on transient (429 / 503) responses.
object
Stable machine-readable error code (e.g. unauthorized, forbidden, not_found, validation_error, unavailable).
Human-readable explanation.
Seconds to wait before retrying. Present on 429 and 503.
Example
{ "error": "unauthorized", "message": "A valid Bearer token is required."}The token’s organization is not a marketplace vendor.
Unified error envelope. retryAfter is present only on transient (429 / 503) responses.
object
Stable machine-readable error code (e.g. unauthorized, forbidden, not_found, validation_error, unavailable).
Human-readable explanation.
Seconds to wait before retrying. Present on 429 and 503.
Example
{ "error": "forbidden", "message": "Your organization is not a marketplace vendor."}Validation error.
Unified error envelope. retryAfter is present only on transient (429 / 503) responses.
object
Stable machine-readable error code (e.g. unauthorized, forbidden, not_found, validation_error, unavailable).
Human-readable explanation.
Seconds to wait before retrying. Present on 429 and 503.
Example
{ "error": "validation_error", "message": "productCode, name, reservePrice and value are required."}Transient lock contention on the catalog. Retry after the indicated delay.
Unified error envelope. retryAfter is present only on transient (429 / 503) responses.
object
Stable machine-readable error code (e.g. unauthorized, forbidden, not_found, validation_error, unavailable).
Human-readable explanation.
Seconds to wait before retrying. Present on 429 and 503.
Example
{ "error": "unavailable", "message": "The catalog is briefly locked; please retry.", "retryAfter": 2}