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 back | A promotion: nothing to undo |
| Set the same new price on many products | PATCH /products |
| Give each product its own new price | One PATCH each |
| Change every color of a product | The group |
Run a sale
A promotion keeps your prices as they are. Vendors show the discount and go back by themselves when it ends:
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:
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.
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)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:
breakEvery 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:
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.