Sales PRO
Sales are read-only. A sale is the same object that webhooks send, so one piece of code can handle both.
List sales
GET
/salesNewest first by default. To keep a copy in sync, use sort=updated_at&order=asc and keep the next_cursor of the last page: new and changed sales (delivered, refunded) come after it. Changes show up within a few seconds.
Common filters:
?status=deliveredonly sales that reached the buyer?origin=marketplaceonly Marketplace sales?buyer_key=…everything one avatar bought?from=2026-11-01T00:00:00Z&to=2026-12-01T00:00:00Zone month
To keep your own copy, see Keep a copy of your sales.
Query
| Name | Type | Required | Description |
|---|---|---|---|
status | string | No | Only this status. One of received, pending, delivered, needs_attention, refunded. |
origin | string | No | Only this origin. One of vendor, gacha, tokens, points, giveaway, blog, sent, kit, giftcard, marketplace, partner, charge. |
product_id | string | No | Only this product. |
buyer_key | string | No | Avatar UUID (key). |
from | string | No | Only sales from this moment on (ISO 8601). |
to | string | No | Only sales before this moment (ISO 8601). |
sort | string | No | updated_at + order=asc keeps a copy in sync: every new or changed sale comes after your last cursor. One of created_at, updated_at. Default created_at. |
order | string | No | One of desc, asc. Default desc. |
cursor | string | No | The next_cursor of the previous page. |
limit | integer | No | Page size (default 50, max 200). |
Example
bash
curl "https://api.fastyvendor.com/api/v1/sales?limit=1&status=delivered" \
-H "Authorization: Bearer $FASTY_KEY"js
const res = await fetch('https://api.fastyvendor.com/api/v1/sales?limit=1&status=delivered', {
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/sales?limit=1&status=delivered",
headers={"Authorization": f"Bearer {os.environ['FASTY_KEY']}"},
)
data = res.json()lsl
llHTTPRequest(API + "/sales?limit=1&status=delivered",
[HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + KEY,
HTTP_BODY_MAXLENGTH, 16384],
"");Response: 200 OK
json
{
"items": [
{
"id": "8c8057c0-1ab2-d309-5287-0783afe849da",
"status": "delivered",
"origin": "vendor",
"source": "inworld",
"amount": 10,
"price": 10,
"currency": "L$",
"fee": 0,
"discount": 0,
"gift_card": 0,
"coupon": null,
"product": {
"id": "prd_mxbjm9xtpchmet",
"name": "Riot Boots",
"item": "Riot Boots (box)",
"image_url": "https://picture-service.secondlife.com/a0bc3223-ab76-ff80-47b6-9030ef9ac84c/320x240.jpg"
},
"buyer": {
"key": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"name": "Luna Caelum"
},
"recipient": null,
"place": {
"region": "Enjoy Island",
"parcel": "Luna Couture Mainstore",
"position": "96, 131, 3401",
"slurl": "https://maps.secondlife.com/secondlife/Enjoy Island/96/131/3401"
},
"vendor": {
"id": "vd_09v34mbpnw4sf3",
"name": "Riot Boots VENDOR"
},
"marketplace": null,
"receipt_url": "https://app.fastyvendor.com/r/8c8057c0-1ab2-d309-5287-0783afe849da",
"partner": null,
"created_at": "2026-11-04T18:02:55.895Z",
"updated_at": "2026-11-04T18:03:00.128Z",
"delivered_at": "2026-11-04T18:03:00.128Z"
}
],
"next_cursor": "cd:1793815375895000~8c8057c0-1ab2-d309-5287-0783afe849da"
}Get a sale
GET
/sales/{id}Path
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The id. |
Example
bash
curl "https://api.fastyvendor.com/api/v1/sales/8c8057c0-1ab2-d309-5287-0783afe849da" \
-H "Authorization: Bearer $FASTY_KEY"js
const res = await fetch('https://api.fastyvendor.com/api/v1/sales/8c8057c0-1ab2-d309-5287-0783afe849da', {
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/sales/8c8057c0-1ab2-d309-5287-0783afe849da",
headers={"Authorization": f"Bearer {os.environ['FASTY_KEY']}"},
)
data = res.json()lsl
llHTTPRequest(API + "/sales/8c8057c0-1ab2-d309-5287-0783afe849da",
[HTTP_CUSTOM_HEADER, "Authorization", "Bearer " + KEY,
HTTP_BODY_MAXLENGTH, 16384],
"");Response: 200 OK
json
{
"id": "8c8057c0-1ab2-d309-5287-0783afe849da",
"status": "delivered",
"origin": "vendor",
"source": "inworld",
"amount": 10,
"price": 10,
"currency": "L$",
"fee": 0,
"discount": 0,
"gift_card": 0,
"coupon": null,
"product": {
"id": "prd_mxbjm9xtpchmet",
"name": "Riot Boots",
"item": "Riot Boots (box)",
"image_url": "https://picture-service.secondlife.com/a0bc3223-ab76-ff80-47b6-9030ef9ac84c/320x240.jpg"
},
"buyer": {
"key": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"name": "Luna Caelum"
},
"recipient": null,
"place": {
"region": "Enjoy Island",
"parcel": "Luna Couture Mainstore",
"position": "96, 131, 3401",
"slurl": "https://maps.secondlife.com/secondlife/Enjoy Island/96/131/3401"
},
"vendor": {
"id": "vd_09v34mbpnw4sf3",
"name": "Riot Boots VENDOR"
},
"marketplace": null,
"receipt_url": "https://app.fastyvendor.com/r/8c8057c0-1ab2-d309-5287-0783afe849da",
"partner": null,
"created_at": "2026-11-04T18:02:55.895Z",
"updated_at": "2026-11-04T18:03:00.128Z",
"delivered_at": "2026-11-04T18:03:00.128Z"
}The sale object
| Field | Type | Description |
|---|---|---|
id | string | The id. |
status | string | The current state. One of received, pending, delivered, needs_attention, refunded. |
origin | string | Where it came from: a vendor, a gacha play, a points reward, the Marketplace… One of vendor, gacha, tokens, points, giveaway, blog, sent, kit, giftcard, marketplace, partner, charge. |
source | string | Where it came from. One of inworld, marketplace. |
amount | integer | L$ paid. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
price | integer | Product price at the time of the sale. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
currency | string | Always L$. |
fee | integer | Marketplace fee in L$. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
discount | integer | Coupon discount in L$. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
gift_card | integer | Part paid with gift card balance, in L$. From -9,007,199,254,740,991 to 9,007,199,254,740,991. |
coupon | string or null | |
product | object | The product. |
product.id | string | The id. |
product.name | string | The name. |
product.item | string | Name of the inventory item. |
product.image_url | string or null | Picture address, or null. |
buyer | object | Who paid. |
buyer.key | string | Avatar UUID (key). |
buyer.name | string | Username ("" when the store has never seen it). |
recipient | object or null | Who received it as a gift, or null. |
recipient.key | string | Avatar UUID (key). |
recipient.name | string | Username ("" when the store has never seen it). |
place | object or null | Where it happened, or null. |
place.region | string | The region in Second Life. |
place.parcel | string | The parcel. |
place.position | string | Where it is in the region. |
place.slurl | string or null | A map link to the place. |
vendor | object or null | The vendor, or null. |
vendor.id | string | The id. |
vendor.name | string | The name. |
marketplace | object or null | The Marketplace order, or null. |
marketplace.order_id | string | The Marketplace order. |
marketplace.listing_id | string | The Marketplace listing. |
marketplace.listing_url | string | The listing page. |
receipt_url | string | The public receipt. |
partner | object or null | The partner, or null. |
partner.id | string | The id. |
created_at | string | ISO 8601 date and time (UTC). |
updated_at | string | ISO 8601 date and time (UTC). |
delivered_at | string or null | ISO 8601 date and time (UTC), or null. |