Overview
The AssetPay price feed is a low-latency firehose of item and price changes, delivered over Redis Streams atfeed.assetpay.gg. Instead of polling the REST API, you tail a stream and react to each change as it happens - items entering the pool, items leaving, and price updates per marketplace.
Each consumer reads a snapshot of current state once, then tails the stream for incremental changes. If you fall behind or reconnect, you re-read the snapshot and resume - no events are lost.
Connection
endpoint
rediss://feed.assetpay.gg:6382 - TLS only; plaintext connections are rejected.- The CA certificate (
ca.crt) - AssetPay provides this; your client must trust it. - An ACL username + password - AssetPay issues these per integration.
- SNI / servername set to
feed.assetpay.ggwhen validating the certificate.
The feed is a raw Redis (TCP) endpoint, so
feed.assetpay.gg resolves directly to the origin - it is not proxied like the HTTP API.Access tiers
| ACL user | Sees | Use case |
|---|---|---|
market | Your own per-market stream only (autoseller:items:feed:<marketplace>) | A single-marketplace tenant - you never see another market’s prices |
partner | The consolidated stream, all marketplaces in one block | A first-party consumer aggregating every market |
Streams & keys
| Key | Type | Contents |
|---|---|---|
autoseller:items:feed | Stream | Consolidated - every item with all marketplace prices |
autoseller:items:feed:snapshot | Hash | Current state for the consolidated stream (itemId → block) |
autoseller:items:feed:<marketplace> | Stream | Per-marketplace stream |
autoseller:items:feed:<marketplace>:snapshot | Hash | Current state for that marketplace |
white_market, waxpeer, shadowpay, csgoempire, market_csgo, assetpay. Only priced markets emit data (today that is white_market).
Event format
Each stream entry has two fields:type and data (a JSON string).
item.add, item.remove, or price.update.The event payload - see below.
item.add
A new item entered the pool (or its block was refreshed). On a per-market stream the payload is flattened to that market’s price:
price.update
An existing item’s price changed on one marketplace:
item.remove
An item left the pool (sold or pulled):
Consuming the feed
Capture the stream position
Record the latest stream id (
XREVRANGE <stream> + - COUNT 1) before seeding, so anything added during seeding replays from the stream - no gap.Seed from the snapshot
HGETALL the snapshot hash to load current state in one round trip. Each field is an item id; each value is the JSON block.Tail the stream
XREAD BLOCK 0 STREAMS <stream> <lastId> in a loop, applying each event and advancing lastId to each entry’s id.Example (Node.js / ioredis)
Notes
- Prices are decimal-dollar strings (e.g.
"12.43"), not cents - parse carefully to avoid float rounding. - Streams are length-capped (~100k entries, trimmed automatically) - always seed from the snapshot rather than reading the stream from
0. - Credentials and the CA are issued per integration - contact AssetPay to provision feed access.