Beta
Not authenticated — log in first
VendorBulk Operations

Bulk Upload

POST /vendor/products/bulk-upload — Create multiple products via JSON feed (returns queue_id).

POST/vendor/products/bulk-uploadVendor bearer token required

Bulk Upload

Create multiple products at once via JSON feed.

What this means in plain English

Bulk upload allows you to create multiple products at once. The request is queued asynchronously and returns a queue_id you can poll via import job endpoints.

When to use this

  • Migrating a catalog from legacy G-Commerce products_feed.
  • Importing large product batches from an external system.

Request body

NameTypeRequiredDescription
items[].productstringYesProduct name.
items[].full_descriptionstringNoFull product description (HTML allowed).
items[].codestringYesSupplier code (SKU).
items[].vendor_pricenumberYesVendor/cost price (USD). The customer retail price is derived from it as `vendor_price × (1 + your commission %)`; there is no separate price field.
items[].amountintegerNoProduct amount in stock.
items[].min_qtyintegerNoMinimal order quantity.
items[].unit_of_measurestringNoUnit of measure.
items[].manufacturer_namestringNoManufacturer name.
items[].manufacturer_part_numberstringNoManufacturer part number.
items[].country_of_originstringNoCountry of origin.
items[].upcstring | numberNoUniversal Product Code (UPC).
items[].unspscstring | numberNoUNSPSC code.
items[].commodity_codestring | numberNoCommodity / HS-style code (max 28 characters). Rejected if longer.
items[].eccnstring | numberNoExport Control Classification Number (ECCN).
items[].category_idsstring | numberNoExisting category UUID(s), comma-separated. Use [List Categories](/docs/v1/vendor/categories/list) to look up valid IDs. Vendors cannot create categories.
items[].imagesstringNoPublic image URLs separated by ///. These are fetched server-side (not multipart uploads and not returned `/assets/…` paths).
items[].weightnumberNoWeight (stored as product metadata).
items[].free_shippingstringNoFree shipping: Y for Yes, N for No.
items[].brandstringNoBrand name.
items[].abilityonestringNoAbilityOne: Y for Yes, N for No.
items[].made_in_usastringNoMade in USA: Y for Yes, N for No.
items[].green_productstringNoGreen product: Y for Yes, N for No.

Request example

curl -X POST 'https://api.next.gcommerce.glass/api/v1/vendor/products/bulk-upload' \
  -H 'Content-Type: application/json' \
  -d '{
  "items": [
    {
      "product": "3D Printer",
      "code": "B1224059",
      "vendor_price": 132.33
    }
  ]
}'

Response examples

200Queued
{ "queue_id": "550e8400-e29b-41d4-a716-446655440050" }

Status codes

200

OK

Request succeeded.

401

Unauthorized

Missing or invalid bearer token.

403

Forbidden

Insufficient permissions for this action.

400

Bad Request

Validation failed or invalid parameters.

404

Not Found

Resource not found.

429

Too Many Requests

Global rate limit exceeded (10,000 requests per 10 minutes per IP).

500

Internal Server Error

Unexpected server error.

403

Forbidden

No vendor membership, or insufficient vendor role (requires OWNER, ADMIN, or EDITOR for write operations).

**Admin approval:** New products are created as `PENDING_APPROVAL` and are not visible on storefronts until a platform admin approves them.
**Live product edits:** On `PUBLISHED` or `HIDDEN` products, changes to `name`, `shortDescription`, `description`, or `images` are staged in `pendingRevision` — the product stays `PUBLISHED` and the storefront keeps showing the current live data until an admin approves.
**Immediate updates:** Vendor price (cost) and MSRP, stock, slug, categories, variants, SEO fields, bulk-update fields, and other non-moderated fields apply immediately on live products without re-approval. The customer retail price (derived from vendor price × commission) also updates immediately.
Do not send a `status` field — it is rejected on vendor REST create/update and managed by the platform.
Poll `GET /vendor/products/:id` and inspect `pendingRevision` (non-null with staged fields). List filters: `?status=PENDING_APPROVAL` (never published), `?hasPendingRevision=true` (live products with staged edits), or `?needsModeration=true` (either case).
Each created product is submitted as `PENDING_APPROVAL` and is not live on storefronts until a platform admin approves it.
`vendor_price` (cost) is required per item; the customer retail price is derived as `vendor_price × (1 + your commission %)`. There is no price field to send.
Only 10,000 items can be uploaded at a time.
`items[].images` are external public URLs the server fetches — not the multipart product-image endpoints and not `{API_ORIGIN}/assets/…` response paths.
Processing is asynchronous — use `GET /vendor/products/import/:id` with the returned queue_id to monitor progress.
Fields `min_qty`, `weight`, `free_shipping`, `abilityone`, `made_in_usa`, and `green_product` are stored as product metadata (metaobjects).
Categories are read-only for vendors. `category_ids` must be existing UUIDs from [List Categories](/docs/v1/vendor/categories/list); unknown IDs are skipped with a warning.
`commodity_code` longer than 28 characters fails the row with `INVALID_COMMODITY_CODE`.

Try it

Uses your saved session from login. Edit values and send a live request, or copy the cURL command.