Open the panel

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/sales
Scope sales:readLimit read (600 per minute)

Newest 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=delivered only sales that reached the buyer
  • ?origin=marketplace only Marketplace sales
  • ?buyer_key=… everything one avatar bought
  • ?from=2026-11-01T00:00:00Z&to=2026-12-01T00:00:00Z one month

To keep your own copy, see Keep a copy of your sales.

Query

NameTypeRequiredDescription
statusstringNoOnly this status. One of received, pending, delivered, needs_attention, refunded.
originstringNoOnly this origin. One of vendor, gacha, tokens, points, giveaway, blog, sent, kit, giftcard, marketplace, partner, charge.
product_idstringNoOnly this product.
buyer_keystringNoAvatar UUID (key).
fromstringNoOnly sales from this moment on (ISO 8601).
tostringNoOnly sales before this moment (ISO 8601).
sortstringNoupdated_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.
orderstringNoOne of desc, asc. Default desc.
cursorstringNoThe next_cursor of the previous page.
limitintegerNoPage 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}
Scope sales:readLimit read (600 per minute)

Path

NameTypeRequiredDescription
idstringYesThe 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 ​

FieldTypeDescription
idstringThe id.
statusstringThe current state. One of received, pending, delivered, needs_attention, refunded.
originstringWhere 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.
sourcestringWhere it came from. One of inworld, marketplace.
amountintegerL$ paid. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
priceintegerProduct price at the time of the sale. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
currencystringAlways L$.
feeintegerMarketplace fee in L$. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
discountintegerCoupon discount in L$. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
gift_cardintegerPart paid with gift card balance, in L$. From -9,007,199,254,740,991 to 9,007,199,254,740,991.
couponstring or null
productobjectThe product.
product.idstringThe id.
product.namestringThe name.
product.itemstringName of the inventory item.
product.image_urlstring or nullPicture address, or null.
buyerobjectWho paid.
buyer.keystringAvatar UUID (key).
buyer.namestringUsername ("" when the store has never seen it).
recipientobject or nullWho received it as a gift, or null.
recipient.keystringAvatar UUID (key).
recipient.namestringUsername ("" when the store has never seen it).
placeobject or nullWhere it happened, or null.
place.regionstringThe region in Second Life.
place.parcelstringThe parcel.
place.positionstringWhere it is in the region.
place.slurlstring or nullA map link to the place.
vendorobject or nullThe vendor, or null.
vendor.idstringThe id.
vendor.namestringThe name.
marketplaceobject or nullThe Marketplace order, or null.
marketplace.order_idstringThe Marketplace order.
marketplace.listing_idstringThe Marketplace listing.
marketplace.listing_urlstringThe listing page.
receipt_urlstringThe public receipt.
partnerobject or nullThe partner, or null.
partner.idstringThe id.
created_atstringISO 8601 date and time (UTC).
updated_atstringISO 8601 date and time (UTC).
delivered_atstring or nullISO 8601 date and time (UTC), or null.