Open the panel

Change Many Prices at Once PRO ​

Prices going up in the new year? Selling off a season? You don't need to open each product.

You'll need: a key with products:write, and discounts:write for timed sales.

Which tool to use ​

You want to…Use
Lower prices for a while, then go backA promotion: nothing to undo
Set the same new price on many productsPATCH /products
Give each product its own new priceOne PATCH each
Change every color of a productThe group

Run a sale ​

A promotion keeps your prices as they are. Vendors show the discount and go back by themselves when it ends:

bash
curl -X POST "https://api.fastyvendor.com/api/v1/discounts" \
  -H "Authorization: Bearer $FASTY_KEY" \
  -H "Idempotency-Key: black-friday-2026" \
  -H "Content-Type: application/json" \
  -d '{"name": "Black Friday", "percent": 30, "starts_at": "2026-11-27T00:00:00Z", "ends_at": "2026-11-30T08:00:00Z"}'

To limit it to some products, add "scope": {"mode": "only", "products": ["prd_…"], "groups": []}.

Same change for many products ​

Up to 500 products in one request, and it counts as one:

bash
curl -X PATCH "https://api.fastyvendor.com/api/v1/products" \
  -H "Authorization: Bearer $FASTY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids": ["prd_aaa", "prd_bbb", "prd_ccc"], "patch": {"price": 199}}'

It works for anything a product accepts, like pausing: {"patch": {"active": false}}.

A different price for each product ​

This raises every active product by 10%. The first run is a dry run: it only prints what would change. Set APPLY to true when it looks right.

js
const BASE = 'https://api.fastyvendor.com/api/v1'
const headers = { Authorization: `Bearer ${process.env.FASTY_KEY}`, 'Content-Type': 'application/json' }
const APPLY = false
const sleep = (ms) => new Promise((done) => setTimeout(done, ms))

let cursor = null
do {
  const url = new URL(`${BASE}/products`)
  url.search = new URLSearchParams({ active: 'true', kind: 'item', limit: 200, ...(cursor && { cursor }) })
  const page = await (await fetch(url, { headers })).json()

  for (const product of page.items) {
    if (product.price === 0) continue
    const price = Math.round(product.price * 1.1)
    console.log(`${product.name}: L$ ${product.price} → L$ ${price}`)
    if (!APPLY) continue
    await fetch(`${BASE}/products/${product.id}`, { method: 'PATCH', headers, body: JSON.stringify({ price }) })
    await sleep(600)    // stays under 120 changes per minute
  }
  cursor = page.next_cursor
} while (cursor)
python
import os, time, requests

BASE = "https://api.fastyvendor.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['FASTY_KEY']}"}
APPLY = False

cursor = None
while True:
    params = {"active": "true", "kind": "item", "limit": 200}
    if cursor:
        params["cursor"] = cursor
    page = requests.get(f"{BASE}/products", params=params, headers=HEADERS).json()

    for product in page["items"]:
        if product["price"] == 0:
            continue
        price = round(product["price"] * 1.1)
        print(f"{product['name']}: L$ {product['price']} -> L$ {price}")
        if not APPLY:
            continue
        requests.patch(f"{BASE}/products/{product['id']}", json={"price": price}, headers=HEADERS)
        time.sleep(0.6)    # stays under 120 changes per minute

    cursor = page["next_cursor"]
    if not cursor:
        break

Every color of a product ​

If your product is a group of variations, change the group. Its prices apply to every variation that doesn't have its own:

bash
curl -X PATCH "https://api.fastyvendor.com/api/v1/groups/grp_aqbf68b6nf4z9h" \
  -H "Authorization: Bearer $FASTY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"price_item": 299, "price_fatpack": 899}'

A price set on one variation stays

Changing the price of a single product in a group makes it custom, and the group stops overriding it.

Vendors pick up new prices by themselves, usually within seconds. Details: Products, Groups and Promotions.