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.
The Redis feed carries raw supplier prices and requires separately provisioned credentials. If you only need your own priced view of the market (the same items
/secure/market?source=internal returns, with your fee applied), the WebSocket Market Updates event covers that with just your API key.Connection
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
Your ACL user determines which keys you can read at all - anything outside your scope returnsNOPERM.
Most integrations get a per-market user named after their market. Your username is your scope - the credentials AssetPay issues you already point at the right stream.
Streams & keys
Per-market streams exist for
white_market, waxpeer, ecosteam, cs2dt and igxe. Only markets that are actually priced emit data - today white_market, waxpeer and ecosteam. cs2dt and igxe are reserved: their streams exist and stay empty until they get a price source, so a consumer can connect ahead of launch and simply receive nothing.
Event format
Each stream entry has two fields:type and data (a JSON string).
string
item.add, item.remove, or price.update.JSON string
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
1
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.2
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.3
Tail the stream
XREAD BLOCK 0 STREAMS <stream> <lastId> in a loop, applying each event and advancing lastId to each entry’s id.4
Resync on disconnect
On reconnect, re-run from step 1. The snapshot is always current, so re-seeding reconciles any missed events.
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. - The snapshot is the source of truth. Membership is reconciled against it continuously, so an item present there is live even if you missed its
item.add. - Credentials and the CA are issued per integration - contact AssetPay to provision feed access.