On-Behalf-Of, no inter-account
transfers.
This is the right starting point if you operate one storefront, one
treasury, one consolidated ledger.
Mental model
When this fits
- One product, one storefront, one treasury.
- You don’t need per-customer balance isolation in SkinShark.
- All reconciliation can happen at one merchant level.
- Operations is a single team, not multi-tenant.
Endpoints you’ll use
All sub-user-context routes work without anOn-Behalf-Of header — they
run as the merchant. So you only ever need:
| Action | Endpoint |
|---|---|
| Read merchant profile + balances | GET /merchant |
| Read full ledger | GET /merchant/ledger |
| Search the catalog | GET /market/search |
| Bulk per-item price feed | GET /market/prices |
| Live listings for an item | GET /market/items/{itemId}/listings |
| Buy specific listings | POST /market/buy |
| Buy by item, server picks fills | POST /market/buy/quick |
| List trades | GET /market/transactions (or GET /merchant/trades) |
| Get trade detail | GET /market/transactions/{tradeId} |
| Stats (GMV, fees) | GET /merchant/stats |
| Deposit (Gate Pay / on-ramp / crypto) | POST /user/wallet/deposit/... |
Skip these (for now)
These endpoints are real, just not relevant in Core API mode:/merchant/users/*— sub-user CRUD and funding/merchant/users/{id}/wallet— sub-user wallet readsOn-Behalf-Ofheader — never needed
Daily operation
A typical day in Core API:User browses
Your frontend calls
GET /market/search and GET /market/items/{itemId}/listings
to render inventory.Server confirms
A
trade.completed webhook fires (or your WebSocket subscriber sees
trade.completed). Persist the trade against your own order table by
externalId.Reconcile
Nightly job calls
GET /merchant/ledger?type=spot and GET /merchant/stats
against yesterday’s window for accounting.Code template
What you give up
- No tenant isolation. All trades show up under one merchant. If a customer disputes, they’re not separable in SkinShark’s view.
- One ledger. Per-customer accounting is your job, not SkinShark’s.
- Migration cost later. If your business needs per-customer wallets,
you’ll move to Full Platform — usually a one-time refactor where you
swap one
api()call signature to take a sub-user ID.
When to graduate
Move to Full Platform when you need:- Per-customer balance isolation (chargeback containment, audit clarity).
- Multi-tenant reporting in the merchant dashboard.
- Per-customer fee overrides.
- Self-service crypto deposits per customer.
On-Behalf-Of, route customer-attributable calls there. The catalog
and trade primitives don’t change.