Skip to content

Commit 0cc3020

Browse files
committed
sdk: release 0.9.4
1 parent 62e4c7e commit 0cc3020

20 files changed

Lines changed: 753 additions & 161 deletions

API_COVERAGE.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,24 +103,24 @@ These routes were confirmed live during the 2026-03-07 recon sweep:
103103
| `/listings?limit=5&min_ref_qty=20&type=buy_now&min_price=500` | `GET` | implemented | browser UI + live | current homepage-highlight feed shape; exposed via `listings.getListings(getHomepageFeedParams("top_deals"))` and `workflows.getPublicMarketFeeds()` |
104104
| `/listings?limit=5&sort_by=most_recent&min_ref_qty=20&type=buy_now&min_price=500` | `GET` | implemented | browser UI + live | current homepage `Newest Items` feed shape; exposed via `listings.getListings(getHomepageFeedParams("newest"))` and `workflows.getPublicMarketFeeds()` |
105105
| `/listings?limit=5&sort_by=most_recent&filter=unique&min_ref_qty=20&type=buy_now&min_price=500` | `GET` | implemented | browser UI + live | current homepage `Unique Items` feed shape; exposed via `listings.getListings(getHomepageFeedParams("unique"))` and `workflows.getPublicMarketFeeds()` |
106-
| `/listings?filter=sticker_combos` | `GET` | discovered | live + browser UI + auth API | UI label `Sticker Combos`; requires auth; current live probes return sticker-heavy rows |
107-
| `/listings?filter=unique` | `GET` | discovered | live + browser UI + auth API | UI label `Unique Items`; requires auth |
106+
| `/listings?filter=sticker_combos` | `GET` | implemented | live + browser UI + auth API | UI label `Sticker Combos`; requires auth; current SDK exposes this through the typed `filter` param on `listings.getListings()` |
107+
| `/listings?filter=unique` | `GET` | implemented | live + browser UI + auth API | UI label `Unique Items`; current SDK exposes this through the typed `filter` param on `listings.getListings()` |
108108
| `/listings/{auction_id}/bids` | `GET` | implemented | live | returns bid array for auction listings; empty array when no bids |
109109
| `/buy-orders/item` | `GET` | implemented | browser bundle + live | inspect-link oriented route using query params `{ url:<inspectLink>, limit }`; live happy-path returned an array like `[{ expression, qty, price }]` |
110110
| `/buy-orders/matching-items/floatdb` | `POST` | discovered | browser bundle + live invalid probe | route exists but currently demands float-expression semantics; plain `market_hash_name` returned `condition and rules are required for an expression` |
111-
| `/trades/{id}/cannot-deliver` | `POST` | discovered | browser bundle + live invalid probe | invalid `id=0` returned `500 record not found`; likely seller-side failure path, not executed happy-path due risk |
112-
| `/trades/{id}/dispute` | `POST` | discovered | browser bundle + live invalid probe | invalid `id=0` returned `500 record not found`; not exercised on a real trade |
113-
| `/trades/{id}/received` | `POST` | discovered | browser bundle + live | real pending buyer-side trade returned `400 missing steam offer ID`; route and state gating are clear, but no successful live sample yet |
111+
| `/trades/{id}/cannot-deliver` | `POST` | implemented | browser bundle + live invalid probe | frontend-confirmed no-body payload; SDK exposes `account.cannotDeliverTrade()` as a low-level, seller-side failure helper |
112+
| `/trades/{id}/dispute` | `POST` | implemented | browser bundle + live invalid probe | frontend-confirmed no-body payload; SDK exposes `account.disputeTrade()` conservatively as a low-level dispute helper |
113+
| `/trades/{id}/received` | `POST` | implemented | browser bundle + live | frontend-confirmed no-body payload; real pending buyer-side trade returned `400 missing steam offer ID`, so the SDK keeps `account.markTradeReceived()` intentionally low-level and state-gated |
114114
| `/trades/bulk/received` | `POST` | implemented | browser bundle + live | bundle-confirmed buyer flow using `{ trade_ids }`; invalid `trade_ids:["0"]` returned `400 invalid trade ids specified`, and a real pending buyer-side trade returned `400 missing steam offer ID` until a Steam offer exists |
115-
| `/trades/{id}/rollback` | `POST` | discovered | browser bundle + live invalid probe | invalid `id=0` returned `500 record not found`; semantics still unmapped |
116-
| `/trades/{id}/manual-verification` | `POST` | discovered | browser bundle + live invalid probe | invalid `id=0` returned `500 record not found`; semantics still unmapped |
117-
| `/trades/{id}/rollback-verify` | `POST` | discovered | browser bundle + live invalid probe | invalid `id=0` returned `500 record not found`; semantics still unmapped |
115+
| `/trades/{id}/rollback` | `POST` | implemented | browser bundle + live invalid probe | frontend-confirmed no-body payload; SDK exposes `account.rollbackTrade()` conservatively because the happy-path remains trade-state-specific |
116+
| `/trades/{id}/manual-verification` | `POST` | implemented | browser bundle + live invalid probe | frontend-confirmed no-body payload; SDK exposes `account.manualVerifyTrade()` as a low-level helper |
117+
| `/trades/{id}/rollback-verify` | `POST` | implemented | browser bundle + live invalid probe | frontend-confirmed no-body payload; SDK exposes `account.verifyTradeRollback()` as a low-level helper |
118118
| `/trades/{id}/report-error` | `POST` | discovered | browser bundle + live invalid probe | invalid `id=0` returned `500 record not found`; likely support/reporting path |
119119
| `/trades/notary` | `POST` | discovered | browser bundle + live invalid probe | empty payload returned `400 payload is required`; exact contract still unmapped |
120-
| `/me/verify-sms` | `POST` | discovered | live + public wrapper source | invalid phone number returned Twilio validation error |
121-
| `/trades/steam-status/new-offer` | `POST` | implemented | live + public wrapper source | low-level Steam sync route keyed by string-form `{ offer_id }`; safe live probes returned `200 {"message":"successfully updated offer state"}` even for `"0"`, but business side effects remain partially unmapped |
120+
| `/me/verify-email` | `POST` | implemented | browser bundle + live invalid probe | invalid `email=not-an-email` returned `400 invalid email format`; SDK exposes `account.verifyEmail()` as a low-level request/confirm helper |
121+
| `/me/verify-sms` | `POST` | implemented | browser bundle + live invalid probe | invalid `phone_number=abc` returned `400 twilio: Invalid phone number: abc`; SDK exposes `account.verifySms()` as a low-level request/confirm helper |
122+
| `/trades/steam-status/new-offer` | `POST` | implemented | live + browser bundle | low-level Steam sync route keyed by `{ offer_id }`, with the current frontend also sending optional `{ given_asset_ids, received_asset_ids }`; safe live probes returned `200 {"message":"successfully updated offer state"}` even for `"0"` |
122123
| `/trades/steam-status/offer` | `POST` | implemented | live + public wrapper source | low-level Steam sync route accepting `{ sent_offers }` and optional `{ trade_id }`; safe live probes returned `200 {"message":"successfully updated offer state"}`, while empty-array syncs produced no observed trade-state change |
123-
| `/me` with `trade_url` PATCH field | `PATCH` | discovered | live + public wrapper source | invalid payload returned `missing partner id or token in trade url`, confirming field-level validation for `trade_url` |
124124
## Likely Stale Or Wrapper-Only Routes
125125

126126
These routes appeared in public wrappers, but live probing on 2026-03-07 did not confirm them:

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,24 @@ The format is based on Keep a Changelog.
66

77
## [Unreleased]
88

9+
## [0.9.4] - 2026-03-11
10+
11+
### Added
12+
13+
1. low-level trade lifecycle helpers for the browser-confirmed single-trade routes: `account.cannotDeliverTrade()`, `account.disputeTrade()`, `account.markTradeReceived()`, `account.rollbackTrade()`, `account.manualVerifyTrade()`, and `account.verifyTradeRollback()`
14+
2. low-level account verification helpers `account.verifyEmail()` and `account.verifySms()` based on current frontend payload shapes plus live invalid-payload validation
15+
3. a public Vercel-ready docs site under `website/`, including the synced repository Markdown hub, search, sitemap, robots, and the refined dark-gold documentation shell
16+
17+
### Changed
18+
19+
1. widened `CsfloatTradeSteamStatusNewOfferRequest` and `account.syncSteamNewOffer()` to support the current frontend's optional `given_asset_ids` / `received_asset_ids` annotation payload
20+
2. reconciled stale coverage rows so `filter=sticker_combos`, `filter=unique`, and `PATCH /me` with `trade_url` are no longer left as discovered-only when the SDK already supports them
21+
3. promoted the browser-confirmed low-level trade lifecycle routes from discovered-only to implemented while keeping their docs explicitly conservative and state-gated
22+
4. widened response typing again after a slow live shape-audit pass: notifications now expose `latest_notification_id`, inspect-linked buy-order lookups can surface `market_hash_name`, and listing/trade keychain payloads can carry `highlight_reel`
23+
5. strengthened `audit:shapes` with slower default pacing, explicit skip support for state-driven routes, token-helper coverage, and better inspect-link selection for `buy-orders/item` / checker probes
24+
6. expanded the package docs and docs-site content so the runtime surface, write payloads, stability notes, and low-level account/trade helpers stay synchronized in one source of truth
25+
7. refined the docs-site UI with a calmer landing page, better sidebar collapse behavior, custom scrollbar styling, and a wide-screen max-width cap for large displays
26+
927
## [0.9.3] - 2026-03-10
1028

1129
### Changed

README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ The project is intentionally conservative about claims. Anything called `impleme
1919

2020
> The goal is simple: be the SDK you reach for first if you want serious CSFloat automation instead of a thin wrapper.
2121
>
22-
> Install from npm: [`csfloat-node-sdk@0.9.3`](https://www.npmjs.com/package/csfloat-node-sdk)
22+
> Install from npm: [`csfloat-node-sdk@0.9.4`](https://www.npmjs.com/package/csfloat-node-sdk)
2323
2424
## Documentation
2525

@@ -81,8 +81,9 @@ This SDK is optimized for:
8181

8282
- live-confirmed offer flows: create, counter, cancel, decline, history, plus a low-level `acceptOffer()` helper for the browser-observed accept route
8383
- live-confirmed purchase flows: direct `buyNow`, buy-order create/update/delete, seller-side `acceptSale`
84-
- state-gated trade lifecycle helpers, including seller-side `acceptSale()` and buyer-side `markTradesReceived()`
85-
- low-level trade sync helpers for the browser-observed Steam status routes: `syncSteamNewOffer()` and `syncSteamOffers()`
84+
- state-gated trade lifecycle helpers, including seller-side `acceptSale()`, buyer-side `markTradesReceived()`, and low-level single-trade helpers such as `markTradeReceived()`, `cannotDeliverTrade()`, and `rollbackTrade()`
85+
- low-level trade sync helpers for the browser-observed Steam status routes: `syncSteamNewOffer()` and `syncSteamOffers()`, with optional asset-annotation payloads on the new-offer route
86+
- low-level account verification helpers for `verifyEmail()` and `verifySms()`
8687
- live-confirmed buy-order insight flows: inspect-based lookup and similar-order discovery
8788
- live-confirmed buy-order expression workflows via `account.createBuyOrder({ expression, ... })`, `account.getSimilarBuyOrders({ expression }, ...)`, and composable builder helpers
8889
- workflow-first helpers via `sdk.workflows` for public feed snapshots, account workspace snapshots, and single-skin buy-order insights
@@ -123,7 +124,7 @@ See [API_COVERAGE.md](./API_COVERAGE.md) for the endpoint-by-endpoint support ma
123124
| Area | Status | Methods |
124125
|---|---|---|
125126
| Meta | implemented | `meta.getSchema()`, `meta.getSchemaBrowse()`, `meta.getItemExampleScreenshot()`, `meta.inspectItem()`, `meta.getExchangeRates()`, `meta.getApp()`, `meta.getLocation()`, `meta.getNotary()` |
126-
| Account | implemented | `account.getMe()`, `account.getTrades()`, `account.getTrade()`, `account.getTradeBuyerDetails()`, `account.syncSteamNewOffer()`, `account.syncSteamOffers()`, `account.acceptTrades()`, `account.markTradesReceived()`, `account.acceptTrade()`, `account.acceptSale()`, `account.cancelTrades()`, `account.cancelTrade()`, `account.cancelSale()`, `account.getOffers()`, `account.createOffer()`, `account.getOffer()`, `account.acceptOffer()`, `account.getOfferHistory()`, `account.counterOffer()`, `account.cancelOffer()`, `account.declineOffer()`, `account.getWatchlist()`, `account.iterateWatchlist()`, `account.getOffersTimeline()`, `account.getNotifications()`, `account.getTransactions()`, `account.exportTransactions()`, `account.getAccountStanding()`, `account.getBuyOrders()`, `account.getBuyOrdersForInspect()`, `account.getSimilarBuyOrders()`, `account.createBuyOrder()`, `account.updateBuyOrder()`, `account.deleteBuyOrder()`, `account.getAutoBids()`, `account.deleteAutoBid()`, `account.createRecommenderToken()`, `account.createNotaryToken()`, `account.createGsInspectToken()`, `account.getMaxWithdrawable()`, `account.getPendingDeposits()`, `account.getPendingWithdrawals()`, `account.deletePendingWithdrawal()`, `account.getExtensionStatus()`, `account.getMobileStatus()`, `account.updateMe()`, `account.setOffersEnabled()`, `account.setStallPublic()`, `account.setAway()`, `account.setMaxOfferDiscount()`, `account.updateTradeUrl()`, `account.updateBackground()`, `account.updateUsername()`, `account.markNotificationsRead()`, `account.setMobileStatus()` |
127+
| Account | implemented | `account.getMe()`, `account.getTrades()`, `account.getTrade()`, `account.getTradeBuyerDetails()`, `account.cannotDeliverTrade()`, `account.disputeTrade()`, `account.syncSteamNewOffer()`, `account.syncSteamOffers()`, `account.acceptTrades()`, `account.markTradesReceived()`, `account.markTradeReceived()`, `account.acceptTrade()`, `account.acceptSale()`, `account.cancelTrades()`, `account.cancelTrade()`, `account.cancelSale()`, `account.rollbackTrade()`, `account.manualVerifyTrade()`, `account.verifyTradeRollback()`, `account.getOffers()`, `account.createOffer()`, `account.getOffer()`, `account.acceptOffer()`, `account.getOfferHistory()`, `account.counterOffer()`, `account.cancelOffer()`, `account.declineOffer()`, `account.getWatchlist()`, `account.iterateWatchlist()`, `account.getOffersTimeline()`, `account.getNotifications()`, `account.getTransactions()`, `account.exportTransactions()`, `account.getAccountStanding()`, `account.getBuyOrders()`, `account.getBuyOrdersForInspect()`, `account.getSimilarBuyOrders()`, `account.createBuyOrder()`, `account.updateBuyOrder()`, `account.deleteBuyOrder()`, `account.getAutoBids()`, `account.deleteAutoBid()`, `account.createRecommenderToken()`, `account.createNotaryToken()`, `account.createGsInspectToken()`, `account.getMaxWithdrawable()`, `account.getPendingDeposits()`, `account.getPendingWithdrawals()`, `account.deletePendingWithdrawal()`, `account.getExtensionStatus()`, `account.getMobileStatus()`, `account.verifyEmail()`, `account.verifySms()`, `account.updateMe()`, `account.setOffersEnabled()`, `account.setStallPublic()`, `account.setAway()`, `account.setMaxOfferDiscount()`, `account.updateTradeUrl()`, `account.updateBackground()`, `account.updateUsername()`, `account.markNotificationsRead()`, `account.setMobileStatus()` |
127128
| Inventory | implemented | `inventory.getInventory()` |
128129
| Public users | implemented | `users.getUser()` |
129130
| User stall | implemented | `stall.getStall()`, `stall.iterateStall()` |
@@ -839,6 +840,12 @@ Run the deeper response-shape audit when you want raw payload samples and unione
839840
ENV_FILE=/path/to/.env npm run audit:shapes
840841
```
841842

843+
The shape audit now defaults to conservative pacing and also supports:
844+
845+
- `SHAPE_AUDIT_DELAY_MS`
846+
- `SHAPE_AUDIT_RETRY_DELAY_MS`
847+
- `SHAPE_AUDIT_INCLUDE_TOKEN_HELPERS=0`
848+
842849
To let the shape audit create and remove a temporary low-price buy order so non-empty `buy_orders` fields can be observed:
843850

844851
```bash

0 commit comments

Comments
 (0)