Open the panel

Products PRO ​

A product is something your vendors sell. It usually points to an item in your hub.

List products ​

GET/products
Scope products:readLimit read (600 per minute)

Results are newest first. Gift cards and charges are products too: use kind=item to list only what your hubs deliver.

Query

NameTypeRequiredDescription
qstringNoSearch in the name and the item name.
activebooleanNotrue = selling · false = paused.
kindstringNoOnly this kind. One of item, giftcard, charge.
group_idstringNoOnly the products of this group.
cursorstringNoThe next_cursor of the previous page.
limitintegerNoPage size (default 50, max 200).

Example

bash
curl "https://api.fastyvendor.com/api/v1/products?q=Boots&limit=2" \
  -H "Authorization: Bearer $FASTY_KEY"
js
const res = await fetch('https://api.fastyvendor.com/api/v1/products?q=Boots&limit=2', {
  headers: {
    Authorization: `Bearer ${process.env.FASTY_KEY}`,
  },
})
const data = await res.json()
python
import os, requests

res = requests.get(
    "https://api.fastyvendor.com/api/v1/products?q=Boots&limit=2",
    headers={"Authorization": f"Bearer {os.environ['FASTY_KEY']}"},
)
data = res.json()
lsl
llHTTPRequest(API + "/products?q=Boots&limit=2",
    [HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + KEY,
     HTTP_BODY_MAXLENGTH, 16384],
    "");

Response: 200 OK

json
{
  "items": [
    {
      "id": "prd_mxbjm9xtpchmet",
      "name": "Riot Boots",
      "item": "Riot Boots (box)",
      "kind": "item",
      "price": 10,
      "price_now": 10,
      "promo": null,
      "group_discount": 15,
      "group_price": 9,
      "free": false,
      "category": "other",
      "description": "",
      "image": "a0bc3223-ab76-ff80-47b6-9030ef9ac84c",
      "image_url": "https://picture-service.secondlife.com/a0bc3223-ab76-ff80-47b6-9030ef9ac84c/256x192.jpg",
      "active": true,
      "group_id": null,
      "role": "item",
      "variant": "",
      "points": false,
      "stock": null,
      "created_at": "2026-10-05T17:19:30.810Z"
    }
  ],
  "next_cursor": null
}

Get a product ​

GET/products/{id}
Scope products:readLimit read (600 per minute)

Path

NameTypeRequiredDescription
idstringYesThe id.

Example

bash
curl "https://api.fastyvendor.com/api/v1/products/prd_mxbjm9xtpchmet" \
  -H "Authorization: Bearer $FASTY_KEY"
js
const res = await fetch('https://api.fastyvendor.com/api/v1/products/prd_mxbjm9xtpchmet', {
  headers: {
    Authorization: `Bearer ${process.env.FASTY_KEY}`,
  },
})
const data = await res.json()
python
import os, requests

res = requests.get(
    "https://api.fastyvendor.com/api/v1/products/prd_mxbjm9xtpchmet",
    headers={"Authorization": f"Bearer {os.environ['FASTY_KEY']}"},
)
data = res.json()
lsl
llHTTPRequest(API + "/products/prd_mxbjm9xtpchmet",
    [HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + KEY,
     HTTP_BODY_MAXLENGTH, 16384],
    "");

Response: 200 OK

json
{
  "id": "prd_mxbjm9xtpchmet",
  "name": "Riot Boots",
  "item": "Riot Boots (box)",
  "kind": "item",
  "price": 10,
  "price_now": 10,
  "promo": null,
  "group_discount": 15,
  "group_price": 9,
  "free": false,
  "category": "other",
  "description": "",
  "image": "a0bc3223-ab76-ff80-47b6-9030ef9ac84c",
  "image_url": "https://picture-service.secondlife.com/a0bc3223-ab76-ff80-47b6-9030ef9ac84c/256x192.jpg",
  "active": true,
  "group_id": null,
  "role": "item",
  "variant": "",
  "points": false,
  "stock": null,
  "created_at": "2026-10-05T17:19:30.810Z"
}

Change a product ​

PATCH/products/{id}
Scope products:writeLimit change (120 per minute)

Send only the fields you want to change. In a group of variations, changing price or name makes it custom (the group no longer overrides it). Vendors pick the change up by themselves.

To pause a product, send {"active": false}. To sell it again, send {"active": true}.

To stop limiting stock, send {"stock": {"total": null}}.

Path

NameTypeRequiredDescription
idstringYesThe id.

Body

NameTypeRequiredDescription
namestringNoThe name. Up to 63 characters.
priceintegerNoPrice in L$. From 0 to 1,000,000.
categorystringNoMarketplace-style category. One of apparel, gacha, home, accessories, avatar, builder, celebrations, animations, art, fun, buildings, animals, breedables, vehicles, furry, gadgets, avatars, scripts, business, weapons, audio, animesh, other.
activebooleanNofalse = paused.
descriptionstringNoThe text shown on the product page and on the vendor. Up to 250 characters.
rolestringNoitem = a single product · fatpack = all variations together · demo = a demo. One of item, fatpack, demo.
variantstringNoThe variation, such as a color or a size. Up to 40 characters.
pointsbooleanNoBuying it gives loyalty points.
freebooleanNoFree on purpose ("Get Free" on the vendor).
imagestringNoTexture UUID, or "" for none.
group_discountinteger or nullNoSL group discount in %; null = follow the group of variations. From 0 to 90.
stockobjectNoLimited quantity; null = unlimited.
stock.totalinteger or nullNonull = unlimited From 1 to 1,000,000.
stock.showbooleanNoThe vendor shows how many are left.

Example

bash
curl -X PATCH "https://api.fastyvendor.com/api/v1/products/prd_mxbjm9xtpchmet" \
  -H "Authorization: Bearer $FASTY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"description":"Comfortable boots for long walks."}'
js
const res = await fetch('https://api.fastyvendor.com/api/v1/products/prd_mxbjm9xtpchmet', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.FASTY_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"description":"Comfortable boots for long walks."}),
})
const data = await res.json()
python
import os, requests

res = requests.patch(
    "https://api.fastyvendor.com/api/v1/products/prd_mxbjm9xtpchmet",
    headers={"Authorization": f"Bearer {os.environ['FASTY_KEY']}"},
    json={"description":"Comfortable boots for long walks."},
)
data = res.json()
lsl
llHTTPRequest(API + "/products/prd_mxbjm9xtpchmet",
    [HTTP_METHOD, "PATCH",
     HTTP_MIMETYPE, "application/json",
     HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + KEY],
    "{\"description\":\"Comfortable boots for long walks.\"}");

Response: 200 OK

json
{
  "id": "prd_mxbjm9xtpchmet",
  "name": "Riot Boots",
  "item": "Riot Boots (box)",
  "kind": "item",
  "price": 10,
  "price_now": 10,
  "promo": null,
  "group_discount": 15,
  "group_price": 9,
  "free": false,
  "category": "other",
  "description": "Comfortable boots for long walks.",
  "image": "a0bc3223-ab76-ff80-47b6-9030ef9ac84c",
  "image_url": "https://picture-service.secondlife.com/a0bc3223-ab76-ff80-47b6-9030ef9ac84c/256x192.jpg",
  "active": true,
  "group_id": null,
  "role": "item",
  "variant": "",
  "points": false,
  "stock": null,
  "created_at": "2026-10-05T17:19:30.810Z"
}

Change many products ​

PATCH/products
Scope products:writeLimit change (120 per minute)

The same change for up to 500 products in one request.

Every product gets the same change. To give each product a different price, send one PATCH /products/{id} for each.

Body

NameTypeRequiredDescription
idsarray of stringsYesProduct ids (up to 500).
patchobjectYesThe same change for all of them.
patch.namestringNoThe name. Up to 63 characters.
patch.priceintegerNoPrice in L$. From 0 to 1,000,000.
patch.categorystringNoMarketplace-style category. One of apparel, gacha, home, accessories, avatar, builder, celebrations, animations, art, fun, buildings, animals, breedables, vehicles, furry, gadgets, avatars, scripts, business, weapons, audio, animesh, other.
patch.activebooleanNofalse = paused.
patch.descriptionstringNoThe text shown on the product page and on the vendor. Up to 250 characters.
patch.rolestringNoitem = a single product · fatpack = all variations together · demo = a demo. One of item, fatpack, demo.
patch.variantstringNoThe variation, such as a color or a size. Up to 40 characters.
patch.pointsbooleanNoBuying it gives loyalty points.
patch.freebooleanNoFree on purpose ("Get Free" on the vendor).
patch.imagestringNoTexture UUID, or "" for none.
patch.group_discountinteger or nullNoSL group discount in %; null = follow the group of variations. From 0 to 90.
patch.stockobjectNoLimited quantity; null = unlimited.
patch.stock.totalinteger or nullNonull = unlimited From 1 to 1,000,000.
patch.stock.showbooleanNoThe vendor shows how many are left.

Example

bash
curl -X PATCH "https://api.fastyvendor.com/api/v1/products" \
  -H "Authorization: Bearer $FASTY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["prd_mxbjm9xtpchmet"],"patch":{"points":true}}'
js
const res = await fetch('https://api.fastyvendor.com/api/v1/products', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.FASTY_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"ids":["prd_mxbjm9xtpchmet"],"patch":{"points":true}}),
})
const data = await res.json()
python
import os, requests

res = requests.patch(
    "https://api.fastyvendor.com/api/v1/products",
    headers={"Authorization": f"Bearer {os.environ['FASTY_KEY']}"},
    json={"ids":["prd_mxbjm9xtpchmet"],"patch":{"points":True}},
)
data = res.json()
lsl
llHTTPRequest(API + "/products",
    [HTTP_METHOD, "PATCH",
     HTTP_MIMETYPE, "application/json",
     HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + KEY],
    "{\"ids\":[\"prd_mxbjm9xtpchmet\"],\"patch\":{\"points\":true}}");

Response: 200 OK

json
{
  "updated": 1
}

The product object ​

FieldTypeDescription
idstringThe id.
namestringThe name.
itemstringName of the inventory item the hub delivers.
kindstringWhat kind it is. One of item, giftcard, charge.
priceintegerPrice in L$. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
price_nowintegerWhat a buyer pays right now (after a running promotion). From -9,007,199,254,740,991 to 9,007,199,254,740,991.
promoobject or nullPromotion running now, or null.
promo.idstringThe id.
promo.namestringThe name.
promo.percentintegerPercent off. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
group_discountintegerSL group discount in % (0 = none). From -9,007,199,254,740,991 to 9,007,199,254,740,991.
group_priceintegerPrice for members of the store SL group (0 = no discount). From -9,007,199,254,740,991 to 9,007,199,254,740,991.
freebooleanFree on purpose.
categorystringMarketplace-style category. One of apparel, gacha, home, accessories, avatar, builder, celebrations, animations, art, fun, buildings, animals, breedables, vehicles, furry, gadgets, avatars, scripts, business, weapons, audio, animesh, other.
descriptionstringThe text shown on the product page and on the vendor.
imagestringOwn texture UUID ("" = uses the group cover).
image_urlstring or nullPicture address, or null.
activebooleanfalse = paused: vendors do not sell it.
group_idstring or nullThe group of variations, or null.
rolestringitem = a single product · fatpack = all variations together · demo = a demo. One of item, fatpack, demo.
variantstringThe variation, such as a color or a size.
pointsbooleanBuying it gives loyalty points.
stockobject or nullLimited quantity; null = unlimited.
stock.totalintegerHow many exist in total. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
stock.soldintegerHow many were sold. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
stock.leftintegerHow many are left. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
stock.showbooleanThe vendor shows how many are left.
stock.scopestringproduct = its own number · each = every variation of the group has this number · shared = one stock for the whole group. One of product, each, shared.
created_atstringISO 8601 date and time (UTC).