Products PRO
A product is something your vendors sell. It usually points to an item in your hub.
List products
/productsResults are newest first. Gift cards and charges are products too: use kind=item to list only what your hubs deliver.
Query
| Name | Type | Required | Description |
|---|---|---|---|
q | string | No | Search in the name and the item name. |
active | boolean | No | true = selling · false = paused. |
kind | string | No | Only this kind. One of item, giftcard, charge. |
group_id | string | No | Only the products of this group. |
cursor | string | No | The next_cursor of the previous page. |
limit | integer | No | Page size (default 50, max 200). |
Example
curl "https://api.fastyvendor.com/api/v1/products?q=Boots&limit=2" \
-H "Authorization: Bearer $FASTY_KEY"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()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()llHTTPRequest(API + "/products?q=Boots&limit=2",
[HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + KEY,
HTTP_BODY_MAXLENGTH, 16384],
"");Response: 200 OK
{
"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
/products/{id}Path
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The id. |
Example
curl "https://api.fastyvendor.com/api/v1/products/prd_mxbjm9xtpchmet" \
-H "Authorization: Bearer $FASTY_KEY"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()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()llHTTPRequest(API + "/products/prd_mxbjm9xtpchmet",
[HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + KEY,
HTTP_BODY_MAXLENGTH, 16384],
"");Response: 200 OK
{
"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
/products/{id}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
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The id. |
Body
| Name | Type | Required | Description |
|---|---|---|---|
name | string | No | The name. Up to 63 characters. |
price | integer | No | Price in L$. From 0 to 1,000,000. |
category | string | No | Marketplace-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. |
active | boolean | No | false = paused. |
description | string | No | The text shown on the product page and on the vendor. Up to 250 characters. |
role | string | No | item = a single product · fatpack = all variations together · demo = a demo. One of item, fatpack, demo. |
variant | string | No | The variation, such as a color or a size. Up to 40 characters. |
points | boolean | No | Buying it gives loyalty points. |
free | boolean | No | Free on purpose ("Get Free" on the vendor). |
image | string | No | Texture UUID, or "" for none. |
group_discount | integer or null | No | SL group discount in %; null = follow the group of variations. From 0 to 90. |
stock | object | No | Limited quantity; null = unlimited. |
stock.total | integer or null | No | null = unlimited From 1 to 1,000,000. |
stock.show | boolean | No | The vendor shows how many are left. |
Example
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."}'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()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()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
{
"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
/productsThe 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
| Name | Type | Required | Description |
|---|---|---|---|
ids | array of strings | Yes | Product ids (up to 500). |
patch | object | Yes | The same change for all of them. |
patch.name | string | No | The name. Up to 63 characters. |
patch.price | integer | No | Price in L$. From 0 to 1,000,000. |
patch.category | string | No | Marketplace-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.active | boolean | No | false = paused. |
patch.description | string | No | The text shown on the product page and on the vendor. Up to 250 characters. |
patch.role | string | No | item = a single product · fatpack = all variations together · demo = a demo. One of item, fatpack, demo. |
patch.variant | string | No | The variation, such as a color or a size. Up to 40 characters. |
patch.points | boolean | No | Buying it gives loyalty points. |
patch.free | boolean | No | Free on purpose ("Get Free" on the vendor). |
patch.image | string | No | Texture UUID, or "" for none. |
patch.group_discount | integer or null | No | SL group discount in %; null = follow the group of variations. From 0 to 90. |
patch.stock | object | No | Limited quantity; null = unlimited. |
patch.stock.total | integer or null | No | null = unlimited From 1 to 1,000,000. |
patch.stock.show | boolean | No | The vendor shows how many are left. |
Example
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}}'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()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()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
{
"updated": 1
}The product object
| Field | Type | Description |
|---|---|---|
id | string | The id. |
name | string | The name. |
item | string | Name of the inventory item the hub delivers. |
kind | string | What kind it is. One of item, giftcard, charge. |
price | integer | Price in L$. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
price_now | integer | What a buyer pays right now (after a running promotion). From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
promo | object or null | Promotion running now, or null. |
promo.id | string | The id. |
promo.name | string | The name. |
promo.percent | integer | Percent off. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
group_discount | integer | SL group discount in % (0 = none). From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
group_price | integer | Price for members of the store SL group (0 = no discount). From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
free | boolean | Free on purpose. |
category | string | Marketplace-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. |
description | string | The text shown on the product page and on the vendor. |
image | string | Own texture UUID ("" = uses the group cover). |
image_url | string or null | Picture address, or null. |
active | boolean | false = paused: vendors do not sell it. |
group_id | string or null | The group of variations, or null. |
role | string | item = a single product · fatpack = all variations together · demo = a demo. One of item, fatpack, demo. |
variant | string | The variation, such as a color or a size. |
points | boolean | Buying it gives loyalty points. |
stock | object or null | Limited quantity; null = unlimited. |
stock.total | integer | How many exist in total. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
stock.sold | integer | How many were sold. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
stock.left | integer | How many are left. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
stock.show | boolean | The vendor shows how many are left. |
stock.scope | string | product = 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_at | string | ISO 8601 date and time (UTC). |