Skip to main content

SteamMarketRunner API (0.1.0)

Download OpenAPI specification:Download

Public HTTP API of SteamMarketRunner — trading automation for the Steam Community Market. Every Steam account you connect gets its own tracked items, strategy settings, trading runner and background decision jobs.

Authentication

Two ways to authenticate; both resolve to your user (tenant) and only ever see your own resources:

  • Service API key — send x-api-key: <key>. Create keys in the cabinet (POST /auth/service-keys); the plaintext key is shown only once. Use this for scripts, agents and integrations.
  • Session cookiesteammarketrunner_session, set by POST /auth/login. Used by the web cabinet. State-changing cookie requests must come from an allowed Origin.

A request without valid credentials is rejected with 403 FORBIDDEN ("Forbidden resource"), not 401. 401 UNAUTHORIZED is returned only by endpoints that explicitly check a session, e.g. GET /auth/me.

Resources that exist but belong to another user are reported as 404, never 403, so ids of other tenants cannot be probed.

Errors

Every non-2xx response uses one envelope: { "requestId": "…", "error": { "code": "NOT_FOUND", "message": "…", "details": {} } }. Branch on error.code, not on message. Validation failures return 400 VALIDATION_FAILED with details.issues[]. The same requestId is sent in the x-request-id response header.

Money and units

Prices, balances and P&L values in responses are integer minor units (cents / kopecks) of the account's wallet currency unless a field says otherwise. Strategy settings that carry money (e.g. minProfit) are in major units, exactly as the cabinet shows them.

Background jobs

Trading work (buy/sell/maintenance analyses, Steam syncs) runs asynchronously. Mutations that schedule work return a job reference (jobQueueId); poll GET /steam-accounts/{steamAccountId}/decisions/jobs/{jobQueueId} for status and …/result for the outcome.

auth

Sign-up, login/logout, email verification, password reset and per-user service API keys.

Start Google sign-in

Browser redirect (302) to Google's consent screen. Not a JSON endpoint — open it in the browser.

query Parameters
returnTo
any

Cabinet path to return to after sign-in (must start with /).

Responses

Response samples

Content type
application/json
{
  • "requestId": "8f14e45f-ceea-467a-9575-6b3c5b2f1f0a",
  • "error": {
    }
}

Google sign-in callback

OAuth redirect target. Sets the session cookie and redirects (302) to the cabinet; on failure redirects to /login?error=oauth_failed. Called by Google, not by clients.

query Parameters
state
any
code
any

Responses

Response samples

Content type
application/json
{
  • "requestId": "8f14e45f-ceea-467a-9575-6b3c5b2f1f0a",
  • "error": {
    }
}

Create a user account

Registers a new user and emails a verification link. No session is created: the user signs in after POST /auth/email-verification/confirm. The response is the same whether or not the email is already registered.

Request Body schema: application/json
required
email
required
string
password
required
string >= 12 characters

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Resend the verification email

Request Body schema: application/json
required
email
required
string

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "ok": true
}

Confirm email address

Confirms the email with the token from the verification link and signs the user in (sets the session cookie).

Request Body schema: application/json
required
token
required
string

Responses

Request samples

Content type
application/json
{
  • "token": "opaque-token-string"
}

Response samples

Content type
application/json
{
  • "user": {
    }
}

Log in

Email + password login. On success sets the httpOnly session cookie steammarketrunner_session and returns the user.

Request Body schema: application/json
required
email
required
string
password
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "admin",
  • "password": "admin"
}

Response samples

Content type
application/json
{
  • "user": {
    }
}

Request a password reset email

Always answers the same way whether or not the email exists.

Request Body schema: application/json
required
email
required
string

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "ok": true,
  • "token": "string",
  • "expiresAt": { }
}

Set a new password

Sets a new password using the token from the reset email.

Request Body schema: application/json
required
token
required
string
password
required
string >= 12 characters

Responses

Request samples

Content type
application/json
{
  • "token": "opaque-token-string",
  • "password": "aNewStrongPassphrase"
}

Response samples

Content type
application/json
{
  • "ok": true
}

Get the signed-in user

Returns the user of the session cookie. Returns 401 without a valid session.

Responses

Response samples

Content type
application/json
{
  • "user": {
    }
}

Log out

Invalidates the current session and clears the cookie. Succeeds even without a session.

Responses

Response samples

Content type
application/json
{
  • "ok": true
}

Inspect the calling service key

Returns the actor resolved from the x-api-key header and the API capabilities it can rely on. Useful as a credentials check for integrations.

Authorizations:
serviceApiKey

Responses

Response samples

Content type
application/json
{
  • "actor": {
    },
  • "requestId": "openclaw-probe-1",
  • "capabilities": {
    }
}

List my service API keys

Metadata of the caller's service keys (never the key itself). Requires a session cookie.

Authorizations:
session

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a service API key

Creates a key for scripts and agents. The plaintext key is returned only in this response — store it; later only a hash is kept. Send it as x-api-key. Requires a session cookie (a service key cannot mint keys).

Authorizations:
session
Request Body schema: application/json
required
name
required
string

Responses

Request samples

Content type
application/json
{
  • "name": "OpenClaw"
}

Response samples

Content type
application/json
{
  • "key": "mops_plaintext_key",
  • "serviceKey": {
    }
}

Revoke a service API key

Revokes one of the caller's keys. Requires a session cookie.

Authorizations:
session
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "OpenClaw",
  • "prefix": "mops_abc",
  • "lastFour": "wxyz",
  • "createdAt": { },
  • "updatedAt": { },
  • "lastUsedAt": "2019-08-24T14:15:22Z",
  • "revokedAt": "2019-08-24T14:15:22Z"
}

preferences

Per-user display preferences (display currency, etc.).

Get my preferences

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
{
  • "displayCurrency": "USD"
}

Update my preferences

Sets the display currency used for cross-account totals.

Authorizations:
serviceApiKeysession
Request Body schema: application/json
required
displayCurrency
required
string^[A-Za-z]{3}$

3-letter currency code; trimmed and upper-cased by the server.

Responses

Request samples

Content type
application/json
{
  • "displayCurrency": "RUB"
}

Response samples

Content type
application/json
{
  • "displayCurrency": "USD"
}

notifications

Alert delivery settings (Telegram / webhook) and the in-app alert and activity feeds.

Get alert delivery settings

Where alerts about your accounts are delivered. The webhook URL itself is never returned (hasWebhook).

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "minSeverity": "info",
  • "telegramChatId": "string",
  • "hasWebhook": true
}

Update alert delivery settings

Partial update: omitted fields are kept, null clears a channel.

Authorizations:
serviceApiKeysession
Request Body schema: application/json
required
enabled
boolean
minSeverity
string
Enum: "info" "warning" "error"

Lowest severity that is delivered. Critical runner events (auto-block, microban, emergency stop) are delivered regardless.

telegramChatId
string or null <= 64 characters

Telegram chat id for the platform bot; null clears it.

webhookUrl
string or null <uri> <= 2048 characters

HTTPS webhook receiving alert JSON; must be a public host. Stored encrypted and never returned. null clears it.

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "enabled": true,
  • "minSeverity": "info",
  • "telegramChatId": "string",
  • "hasWebhook": true
}

Alert feed

Recent warning/error events across the caller's accounts (the cabinet bell), newest first.

Authorizations:
serviceApiKeysession
query Parameters
limit
integer [ 1 .. 100 ]
Default: 25

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Activity feed

Curated business events across the caller's accounts ("Live activity"), newest first.

Authorizations:
serviceApiKeysession
query Parameters
limit
integer [ 1 .. 100 ]
Default: 30

Responses

Response samples

Content type
application/json
[
  • {
    }
]

announcements

Platform announcements shown in the cabinet.

Active announcements

Published, not expired announcements for the caller, with their dismissal state.

Authorizations:
serviceApiKeysession
query Parameters
locale
any
Example: locale=ru

Preferred translation (falls back to the default text).

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "serverTime": "string"
}

Dismiss an announcement

Authorizations:
serviceApiKeysession
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "dismissedAt": "2019-08-24T14:15:22Z"
}

steam-accounts

Connect and manage Steam accounts: CRUD, encrypted secrets (maFile / password), setup bootstrap and per-account audit events.

Connect a Steam account

Creates a Steam account owned by the caller. secrets (login, password, maFile) and proxy can be supplied here or later. A safe setup bootstrap job (Steam sign-in, wallet and inventory sync for setupBootstrapAppids) is queued right away; if it fails for missing secrets/proxy, retry it with POST …/setup-bootstrap.

Authorizations:
serviceApiKeysession
Request Body schema: application/json
required
displayName
required
string non-empty
steamId
string
setupBootstrapAppids
Array of integers [ 1 .. 4 ] items unique
Items Enum: 730 252490 570 440

Steam game appids to import/sync during safe setup bootstrap (730 CS2, 252490 Rust, 570 Dota 2, 440 TF2).

object (UpsertSteamAccountSecretsDto)
object (UpsertProxyProfileDto)

Responses

Request samples

Content type
application/json
{
  • "displayName": "Main Steam",
  • "steamId": "76561198000000000",
  • "setupBootstrapAppids": [
    ],
  • "secrets": {
    },
  • "proxy": {
    }
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
  • "displayName": "Main Steam",
  • "steamId": "76561198000000000",
  • "status": "draft",
  • "sessionState": { },
  • "walletCurrency": "USD",
  • "walletBalance": "10000",
  • "walletDelayedBalance": "82",
  • "setupBootstrapAppids": [
    ],
  • "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

List my Steam accounts

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a Steam account

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
  • "displayName": "Main Steam",
  • "steamId": "76561198000000000",
  • "status": "draft",
  • "sessionState": { },
  • "walletCurrency": "USD",
  • "walletBalance": "10000",
  • "walletDelayedBalance": "82",
  • "setupBootstrapAppids": [
    ],
  • "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Rename or change status

Updates displayName and/or status. steamId cannot be changed — it is derived from the Steam session on first sign-in.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
displayName
string non-empty
status
string
Enum: "draft" "ready" "blocked" "disabled"

Responses

Request samples

Content type
application/json
{
  • "displayName": "Main Steam",
  • "status": "draft"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
  • "displayName": "Main Steam",
  • "steamId": "76561198000000000",
  • "status": "draft",
  • "sessionState": { },
  • "walletCurrency": "USD",
  • "walletBalance": "10000",
  • "walletDelayedBalance": "82",
  • "setupBootstrapAppids": [
    ],
  • "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete a Steam account

Deletes the account and everything tracked for it. Existing Steam orders and listings are not touched.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
  • "displayName": "Main Steam",
  • "steamId": "76561198000000000",
  • "status": "draft",
  • "sessionState": { },
  • "walletCurrency": "USD",
  • "walletBalance": "10000",
  • "walletDelayedBalance": "82",
  • "setupBootstrapAppids": [
    ],
  • "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Retry account setup

Queues the safe setup bootstrap job again (Steam sign-in, wallet and inventory sync). Returns the queued job; poll it via the decisions endpoints. Repeated calls within the same minute return the same job.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "type": "account_setup_bootstrap",
  • "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76",
  • "bullJobId": "bull-job-1",
  • "status": "queued"
}

Save Steam credentials

Stores login, password and/or the Steam Guard maFile, encrypted at rest. Only the provided fields are replaced. Secrets are never returned — see secrets/status.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
login
string non-empty
password
string non-empty
object

Steam Guard maFile (SDA format). Must contain shared_secret and identity_secret (camelCase variants accepted).

Responses

Request samples

Content type
application/json
{
  • "login": "steam-login",
  • "password": "steam-password",
  • "maFile": { }
}

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "hasLogin": true,
  • "hasPassword": true,
  • "hasMaFile": false,
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Which credentials are stored

Booleans telling which secrets are present. Never returns the secrets.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "hasLogin": true,
  • "hasPassword": true,
  • "hasMaFile": false,
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Account activity log

Curated audit events of this account (trading actions, Steam problems, settings changes), newest first. Default limit 100.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
limit
integer [ 1 .. 500 ]
Default: 100
before
string <date-time>

Only events created before this ISO timestamp (pagination cursor).

requestId
any
actorName
any
actorType
string
Enum: "owner" "service_api"
category
any

Exact event category, e.g. runner.start.

severity
string
Enum: "debug" "info" "warning" "error"

Responses

Response samples

Content type
application/json
[
  • {
    }
]

account-setup-status

Checklist of what an account still needs before it can trade.

Account setup checklist

What is still missing before the account can trade: secrets, Steam session, proxy and runner safety verdict, with missingSteps, blockingReasons and readyForLiveRun.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "generatedAt": "2019-08-24T14:15:22Z",
  • "account": {
    },
  • "secrets": {
    },
  • "sessionCredentials": {
    },
  • "proxy": {
    },
  • "runnerSafety": {
    },
  • "missingSteps": [
    ],
  • "blockingReasons": [
    ],
  • "setupComplete": false,
  • "readyForLiveRun": false
}

proxy

Per-account HTTP proxy. All Steam traffic of an account goes through its proxy; without a healthy proxy no Steam requests are made.

Get the account proxy

Proxy settings and last health status. Credentials are never returned (only hasUsername/hasPassword). The body is null when no proxy is configured.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "protocol": "http",
  • "host": "203.0.113.5",
  • "port": 8080,
  • "expectedIp": "203.0.113.10",
  • "lastStatus": "unknown",
  • "lastLatencyMs": 123,
  • "hasUsername": true,
  • "hasPassword": true,
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Set the account proxy

Creates or replaces the proxy used for all Steam traffic of this account. Credentials are encrypted at rest. Saving resets the health status so it is re-checked soon.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
protocol
required
string
Enum: "http" "https" "socks4" "socks5"
host
required
string non-empty

Public hostname or IP. Loopback, private, link-local and cloud-metadata addresses (and localhost) are rejected.

port
required
number [ 1 .. 65535 ]
username
string
password
string
expectedIp
string or null

Responses

Request samples

Content type
application/json
{
  • "protocol": "http",
  • "host": "203.0.113.5",
  • "port": 8080,
  • "username": "proxy-user",
  • "password": "proxy-password",
  • "expectedIp": "203.0.113.10"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "protocol": "http",
  • "host": "203.0.113.5",
  • "port": 8080,
  • "expectedIp": "203.0.113.10",
  • "lastStatus": "unknown",
  • "lastLatencyMs": 123,
  • "hasUsername": true,
  • "hasPassword": true,
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Test the account proxy

Connects through the proxy to an IP-echo service (not Steam), records latency and the observed exit IP, and updates the proxy health status.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "status": "missing_proxy",
  • "statusCode": 200,
  • "expectedIp": "203.0.113.10",
  • "observedIp": "203.0.113.10",
  • "latencyMs": 123,
  • "proxyUsed": true,
  • "message": "Proxy test succeeded."
}

market-state

Tracked items, groups, strategy profiles, runtime (trading) settings, catalog browsing, inventory import and manual listing / order actions.

Track a market item

Adds one Steam market item (by appid + marketHashName) to the account. New items start with buying and selling disabled unless tradeState says otherwise. Prefer POST …/catalog/add-to-account to add many catalog items at once.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
appid
required
number
contextid
required
string
marketHashName
required
string
itemNameid
string
displayName
string
object
object
object (TradeStateDto)

Responses

Request samples

Content type
application/json
{
  • "appid": 252490,
  • "contextid": "2",
  • "marketHashName": "Metal Facemask",
  • "itemNameid": "string",
  • "displayName": "string",
  • "gameMetadata": { },
  • "legacyState": { },
  • "tradeState": {
    }
}

Response samples

Content type
application/json
{
  • "item": {
    },
  • "tradeState": {
    }
}

List tracked items

Paginated list of the items tracked on this account with their trade state, strategy prices, inventory/listing/order counters and eligibility. Prices are in minor units of the account wallet currency.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
priceCondition
string
Enum: "attention" "missing" "stale"

Only items whose price data needs attention / is missing / is stale.

salesPerDayMax
number >= 0
salesPerDayMin
number >= 0
priceMax
number >= 0
priceMin
number >= 0
sortOrder
string
Enum: "asc" "desc"
sortBy
string
Enum: "marketHashName" "displayName" "status" "reason" "buyPrice" "sellNetPrice" "sellGrossPrice" "inventoryCount" "activeBuyOrderCount" "activeListingCount" "orderCoefficient" "profitPercent" "coefficient" "salesCount" "listingCount"
groupId
any

Group UUID, or none for ungrouped items.

status
any

Item status: trading (has a live order/listing), eligible, rejected, candidate; all or omitted = any.

search
any

Case-insensitive substring of the market hash name or display name.

appid
integer >= 1

Only items of this Steam app id.

pageSize
integer >= 1
page
integer >= 1
Default: 1

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "page": 1,
  • "pageSize": 100,
  • "pageCount": 18,
  • "total": 1793
}

Get account portfolio

What the account holds right now: inventory (with market-hold breakdown), live sell listings and buy orders per item, with valuations. Built from the last Steam sync.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "items": [
    ],
  • "total": 10,
  • "inventoryItems": 5,
  • "activeBuyOrders": 3,
  • "activeListings": 2,
  • "currency": "USD",
  • "priceRefresh": { }
}

Get item order book

Latest known buy/sell order book levels for one tracked item.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
itemId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
  • "marketHashName": "Wall Divider Pack",
  • "appid": 252490,
  • "currency": "USD",
  • "ourBuyPrice": 329,
  • "ourSellGrossPrice": 598,
  • "ourBuyOrderCount": 1,
  • "ourBuyOrderQuantity": 5,
  • "ourBuyOrderDate": "2019-08-24T14:15:22Z",
  • "highestBuyOrder": 336,
  • "lowestSellOrder": 406,
  • "centsBehindTop": 7,
  • "pctOfTopBuy": 97.9,
  • "quantityAhead": 42,
  • "quantityAtOurPrice": 57,
  • "buyLevels": [
    ],
  • "sellLevels": [
    ],
  • "ok": true,
  • "reason": "string",
  • "checkedAt": "2019-08-24T14:15:22Z"
}

Move items to a group

Moves the given items into groupId (or out of any group when groupId is null). The group must belong to the same Steam account.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
itemIds
required
Array of strings <uuid> [ items <uuid > ]
groupId
string or null <uuid>

Responses

Request samples

Content type
application/json
{
  • "itemIds": [
    ],
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55"
}

Response samples

Content type
application/json
{
  • "itemsMoved": 12,
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55"
}

Stop tracking items

Removes items from the account — either the listed itemIds (scope: selected) or every item matching the filter (scope: query). Does not touch Steam listings or orders.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
scope
string
Enum: "selected" "query"
itemIds
Array of strings <uuid> [ items <uuid > ]
appid
number
groupId
string or null <uuid>
search
string
status
string

Responses

Request samples

Content type
application/json
{
  • "scope": "selected",
  • "itemIds": [
    ],
  • "appid": 252490,
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
  • "search": "Abyss",
  • "status": "eligible"
}

Response samples

Content type
application/json
{
  • "itemsDeleted": 12
}

Enable/disable buying or selling for many items

Applies the same patch (buyEnabled, sellEnabled, buyQuantity) to the selected items or to every item matching the filter.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
scope
string
Enum: "selected" "query"

selected applies the patch to itemIds; query applies it to every item matching the appid/groupId/search/status filter.

itemIds
Array of strings <uuid> [ items <uuid > ]
appid
number >= 1
groupId
string or null <uuid>
search
string
status
string
required
object (PatchTradeStateDto)

Responses

Request samples

Content type
application/json
{
  • "scope": "selected",
  • "itemIds": [
    ],
  • "appid": 730,
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
  • "search": "Case",
  • "status": "eligible",
  • "patch": {
    }
}

Response samples

Content type
application/json
{
  • "itemsUpdated": 12
}

Enable/disable buying or selling for an item

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
itemId
required
string
Request Body schema: application/json
optional
buyEnabled
boolean
sellEnabled
boolean
buyQuantity
number or null

Responses

Request samples

Content type
application/json
{
  • "buyEnabled": true,
  • "sellEnabled": false,
  • "buyQuantity": 4
}

Response samples

Content type
application/json
{
  • "buyEnabled": false,
  • "sellEnabled": false,
  • "buyPrice": 1000,
  • "sellNetPrice": 1200,
  • "sellGrossPrice": 1400,
  • "currency": "USD",
  • "buyQuantity": 1,
  • "activeBuyOrderId": "string",
  • "activeBuyOrderCount": 0,
  • "activeListingCount": 0,
  • "inventoryCount": 1,
  • "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
  • "legacyState": { },
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Cancel the item's buy order on Steam

Synchronously cancels the live Steam buy order of one item. Returns 400 (BAD_REQUEST) when the item has no active buy order.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
itemId
required
string

Responses

Response samples

Content type
application/json
{
  • "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
  • "buyOrderId": "7071234567",
  • "cancelled": true,
  • "mutationBatchBlocked": false
}

Cancel buy orders by age

Cancels live buy orders placed more (older) or less (younger) than days ago, optionally restricted to the filtered item set. Runs synchronously with throttling between Steam calls; use dryRun: true to preview.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
appid
number >= 1
status
string

Item status filter; omit (or all) for every status.

search
string
groupId
string or null
comparator
required
string
Enum: "older" "younger"

older cancels orders placed at least days ago, younger those placed less than days ago. Orders with unknown placement time are never cancelled.

days
required
number >= 0
dryRun
boolean

Preview the matching orders without cancelling anything.

Responses

Request samples

Content type
application/json
{
  • "appid": 730,
  • "status": "eligible",
  • "search": "Case",
  • "groupId": "string",
  • "comparator": "older",
  • "days": 7,
  • "dryRun": true
}

Response samples

Content type
application/json
{
  • "dryRun": false,
  • "comparator": "older",
  • "days": 7,
  • "matched": 5,
  • "selected": 5,
  • "cancelled": 4,
  • "items": [
    ]
}

Remove live sell listings

Panic action: removes the account's live Steam sell listings (including ones created outside SteamMarketRunner), optionally only those of the filtered item set. Runs synchronously with throttling; dryRun: true only counts them.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
optional
appid
number >= 1
status
string

Item status filter; omit (or all) for every status.

search
string
groupId
string or null
dryRun
boolean

Only count matching live listings, remove nothing.

Responses

Request samples

Content type
application/json
{
  • "appid": 730,
  • "status": "eligible",
  • "search": "Case",
  • "groupId": "string",
  • "dryRun": true
}

Response samples

Content type
application/json
{
  • "dryRun": true,
  • "found": 12,
  • "removed": 12
}

Remove the item's sell listings on Steam

Synchronously removes every live Steam listing of this item and re-reads the inventory. Returns 400 (BAD_REQUEST) when the item has no live listings.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
itemId
required
string

Responses

Response samples

Content type
application/json
{
  • "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
  • "listingsFound": 3,
  • "removed": 3,
  • "reconciled": true
}

Browse the market catalog

Paginated catalog of market items with the latest price snapshot, filtered for adding to this account. mode=eligible (default) shows only items that pass the account's strategy gates; mode=all shows everything.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
excludeCasesKeysToolsOther
boolean
excludeCharms
boolean
excludeGraffiti
boolean
excludeAgents
boolean
excludeSouvenirs
boolean
excludeStickersPatches
boolean
excludeWeapons
boolean
salesPerDayMax
number >= 0
salesPerDayMin
number >= 0
priceMax
number >= 0
priceMin
number >= 0
groupId
any

Evaluate eligibility with this group's strategy.

search
any
appid
integer >= 1
pageSize
integer >= 1
page
integer >= 1
Default: 1
mode
string
Enum: "eligible" "all"

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "page": 1,
  • "pageSize": 100,
  • "pageCount": 18,
  • "total": 1793,
  • "currency": "USD"
}

List items under market hold

Inventory copies that are still under a Steam trade/market hold and when they unlock.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
unlockWindowDays
integer >= 1
onHoldOnly
boolean
search
any
groupId
any

Group UUID, or ungrouped.

appid
integer >= 1

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 42,
  • "onHold": 16,
  • "unlocksToday": 4,
  • "unlocksIn7Days": 12
}

Track items from the Steam inventory

Reads the live Steam inventory and starts tracking every held item that exists in the catalog but is not tracked yet. Imported items are added with buying and selling disabled. Makes Steam requests through the account proxy.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
optional
appid
number
contextid
string

Responses

Request samples

Content type
application/json
{
  • "appid": 252490,
  • "contextid": "2"
}

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "appidsScanned": [
    ],
  • "heldDistinct": 10,
  • "matchedCatalogItems": 10,
  • "itemsAdded": 6,
  • "alreadyPresent": 4,
  • "notInCatalog": [
    ]
}

Track catalog items

Adds catalog items matching the filter (or catalogItemIds) to the account. Use preview-add-to-account with the same body to see the counts first.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
optional
mode
string
Enum: "eligible" "all"
appid
number
search
string <= 200 characters

Same text filter as the catalog listing.

groupId
string

Target group UUID for the added items. all, none, ungrouped or "" mean no group.

limit
number
offset
number
priceMin
number
priceMax
number
salesPerDayMin
number
salesPerDayMax
number
excludeWeapons
boolean
excludeStickersPatches
boolean
excludeSouvenirs
boolean
excludeAgents
boolean
excludeGraffiti
boolean
excludeCharms
boolean
excludeCasesKeysToolsOther
boolean
catalogItemIds
Array of strings <uuid> [ items <uuid > ]

Responses

Request samples

Content type
application/json
{
  • "mode": "eligible",
  • "appid": 252490,
  • "search": "Hoodie",
  • "groupId": "string",
  • "limit": 500,
  • "offset": 0,
  • "priceMin": 0.5,
  • "priceMax": 10,
  • "salesPerDayMin": 3,
  • "salesPerDayMax": 50,
  • "excludeWeapons": true,
  • "excludeStickersPatches": true,
  • "excludeSouvenirs": true,
  • "excludeAgents": true,
  • "excludeGraffiti": true,
  • "excludeCharms": true,
  • "excludeCasesKeysToolsOther": true,
  • "catalogItemIds": [
    ]
}

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "catalogItemsScanned": 128,
  • "eligible": 83,
  • "itemsAdded": 70,
  • "alreadyPresent": 13,
  • "rejected": 45,
  • "skippedByLimit": 0,
  • "reasons": { }
}

Preview tracking catalog items

Same as addCatalogItemsToAccount but changes nothing — returns the counts only.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
optional
mode
string
Enum: "eligible" "all"
appid
number
search
string <= 200 characters

Same text filter as the catalog listing.

groupId
string

Target group UUID for the added items. all, none, ungrouped or "" mean no group.

limit
number
offset
number
priceMin
number
priceMax
number
salesPerDayMin
number
salesPerDayMax
number
excludeWeapons
boolean
excludeStickersPatches
boolean
excludeSouvenirs
boolean
excludeAgents
boolean
excludeGraffiti
boolean
excludeCharms
boolean
excludeCasesKeysToolsOther
boolean
catalogItemIds
Array of strings <uuid> [ items <uuid > ]

Responses

Request samples

Content type
application/json
{
  • "mode": "eligible",
  • "appid": 252490,
  • "search": "Hoodie",
  • "groupId": "string",
  • "limit": 500,
  • "offset": 0,
  • "priceMin": 0.5,
  • "priceMax": 10,
  • "salesPerDayMin": 3,
  • "salesPerDayMax": 50,
  • "excludeWeapons": true,
  • "excludeStickersPatches": true,
  • "excludeSouvenirs": true,
  • "excludeAgents": true,
  • "excludeGraffiti": true,
  • "excludeCharms": true,
  • "excludeCasesKeysToolsOther": true,
  • "catalogItemIds": [
    ]
}

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "catalogItemsScanned": 128,
  • "eligible": 83,
  • "itemsAdded": 70,
  • "alreadyPresent": 13,
  • "rejected": 45,
  • "skippedByLimit": 0,
  • "reasons": { }
}

Import legacy extension settings

Imports a settings export of the legacy browser extension into runtime settings and a strategy profile of this account.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required

Flat key/value settings object exported by the legacy browser extension. Keys are split into runtime settings and a strategy profile.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "profitPercent": 10,
  • "algoritm": "AVG",
  • "cntSalesMonth": 30
}

Response samples

Content type
application/json
{
  • "runtimeSettings": {
    },
  • "strategyProfile": {
    },
  • "importedKeys": 82,
  • "runtimeKeys": [
    ],
  • "strategyKeys": [
    ]
}

Import a listings snapshot

Imports a Steam market listings export (legacy extension format) to seed tracked items, catalog entries and price snapshots.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
object
listings
required
Array of objects

Responses

Request samples

Content type
application/json
{
  • "currency": { },
  • "listings": [
    ]
}

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "listingsProcessed": 614,
  • "uniqueItems": 200,
  • "itemsUpserted": 200,
  • "catalogItemsUpserted": 200,
  • "priceSnapshotsCreated": 200
}

Create an item group

Groups let a set of items share strategy overrides (metadata).

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
appid
required
number
name
required
string
legacyGroupId
string
sortOrder
number
object

Responses

Request samples

Content type
application/json
{
  • "appid": 252490,
  • "name": "High volume skins",
  • "legacyGroupId": "legacy-group-1",
  • "sortOrder": 0,
  • "metadata": { }
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "appid": 252490,
  • "name": "High volume skins",
  • "legacyGroupId": "legacy-group-1",
  • "sortOrder": 0,
  • "metadata": { },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

List item groups

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Update an item group

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
groupId
required
string
Request Body schema: application/json
optional
name
string
sortOrder
number
object

Responses

Request samples

Content type
application/json
{
  • "name": "High volume skins",
  • "sortOrder": 0,
  • "metadata": { }
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "appid": 252490,
  • "name": "High volume skins",
  • "legacyGroupId": "legacy-group-1",
  • "sortOrder": 0,
  • "metadata": { },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete an item group

Deletes the group and stops tracking the items in it.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
groupId
required
string

Responses

Response samples

Content type
application/json
{
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
  • "itemsDeleted": 42,
  • "groupDeleted": true
}

Create a strategy profile

A named set of pricing/eligibility settings (algorithm for selling, algorithmBuy for buying, settings for thresholds). Canonical algorithms: MS, HG, HSG, AVG, LG, BG, OG.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
name
required
string
algorithm
string
algorithmBuy
string
object
object

Responses

Request samples

Content type
application/json
{
  • "name": "Default sell strategy",
  • "algorithm": "AVG",
  • "algorithmBuy": "AVG",
  • "settings": { },
  • "legacyAliases": { }
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "name": "Default sell strategy",
  • "algorithm": "AVG",
  • "algorithmBuy": "AVG",
  • "settings": { },
  • "legacyAliases": { },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

List strategy profiles

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Save trading settings

Stores account-level overrides on top of the strategy profile. A key set to null or "" is removed, i.e. falls back to the strategy value. Numeric values may be sent as numbers or numeric strings. Money settings are in major units.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
object

Account-level overrides of the strategy settings (same keys as the cabinet's Trading settings). A key set to null or "" is removed and falls back to the strategy value. Numbers may be sent as numeric strings (a decimal comma is accepted). Money values are major units.

object

Raw settings in the legacy browser-extension format.

Responses

Request samples

Content type
application/json
{
  • "settings": {
    },
  • "legacySettings": { }
}

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "settings": { },
  • "legacySettings": { },
  • "effectiveSettings": { },
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Get trading settings

Returns the stored overrides (settings, legacySettings) and effectiveSettings — what the trading engine actually applies after merging the strategy profile.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "settings": { },
  • "legacySettings": { },
  • "effectiveSettings": { },
  • "updatedAt": "2019-08-24T14:15:22Z"
}

trading

The per-account trading runner: status, start/stop, manual tick and diagnostics.

Get trading runner status

Runner state of the account (running, stopped, blocked, …), why it is blocked, Steam cooldown, safety verdict and which job types are due.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "status": "running",
  • "currentJob": "cycle_dispatch",
  • "blockedReason": null,
  • "microbanUntil": "2019-08-24T14:15:22Z",
  • "runnerIntent": "running",
  • "effectiveStatus": "paused_by_steam_cooldown",
  • "isPausedByCooldown": true,
  • "cooldownUntil": "2019-08-24T14:15:22Z",
  • "autoResume": true,
  • "throttleState": { },
  • "settings": {
    },
  • "safety": {
    },
  • "jobs": {
    }
}

Trading diagnostics

Readiness, active and stale jobs of the account — for troubleshooting a runner that does not trade.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{ }

Start trading

Sets the runner to running and immediately queues the due jobs. From then on the scheduler runs a trading cycle every ~5 minutes. The account must be ready. This places real buy orders and listings on Steam.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "queuedJobs": [
    ],
  • "blockedReason": "account_not_ready",
  • "status": "running",
  • "currentJob": "cycle_dispatch"
}

Stop trading

Sets the runner to stopped and cancels the account's queued and running jobs. A Steam call already in flight is not aborted, but its job cannot overwrite the cancellation. Existing Steam orders and listings stay in place.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "status": "stopped",
  • "currentJob": null,
  • "blockedReason": null
}

Run a trading cycle now

Queues the currently due jobs immediately instead of waiting for the next scheduler tick. Poll the returned jobQueueIds via the decisions endpoints.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "queuedJobs": [
    ],
  • "blockedReason": "account_not_ready"
}

Inspect / repair stuck sell listings

Operator tool for assets whose sell listing is stuck (e.g. pending a confirmation that does not exist). Runs synchronously. Defaults to dryRun: true and mode: diagnostics_only; other modes may cancel and relist on Steam.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
Request Body schema: application/json
required
assetids
required
Array of strings non-empty

Steam asset ids whose sell-side state should be inspected.

mode
string
Default: "diagnostics_only"
Enum: "diagnostics_only" "release_legacy_blockers" "retry_confirmation_recovery" "relist_after_cleanup" "discover_and_cancel" "cancel_then_relist" "auto_cleanup"

diagnostics_only only reports. Other modes release stale local blockers and/or cancel and relist the asset on Steam.

dryRun
boolean
Default: true

Defaults to true — pass false explicitly to act on Steam.

appid
number >= 1

Responses

Request samples

Content type
application/json
{
  • "assetids": [
    ],
  • "mode": "diagnostics_only",
  • "dryRun": true,
  • "appid": 730
}

Response samples

Content type
application/json
{ }

decisions

Background decision jobs of an account (buy/sell/maintenance analyses, Steam syncs): list, inspect, retry, cancel.

Buy-order competitiveness diagnostics

How the account's live buy orders compare with the current top buy order of each item (underbid, stale price data, profitable reprice candidates). Read-only; never calls Steam.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "activeOrders": 42,
  • "belowTopBuyCount": 30,
  • "atOrAboveTopBuyCount": 12,
  • "p10PctOfTopBuy": 91.5,
  • "p50PctOfTopBuy": 97.2,
  • "p90PctOfTopBuy": 100,
  • "stalePriceRows": 3,
  • "freshPriceRows": 39,
  • "missingPriceRows": 0,
  • "oldestPriceCheckedAt": "2019-08-24T14:15:22Z",
  • "p50PriceAgeHours": 0,
  • "p90PriceAgeHours": 0,
  • "staleExposure": 1250,
  • "topUnderbidItems": [
    ],
  • "topStaleItems": [
    ],
  • "profitableToRepriceCount": 4,
  • "profitableToRepriceExposure": 820,
  • "topRepriceCandidates": [
    ]
}

List background jobs

Background jobs of this account (analyses, syncs, maintenance), newest first. Default limit is 50.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
limit
integer [ 1 .. 200 ]
Default: 50
before
string <date-time>

Only jobs scheduled before this ISO timestamp (pagination cursor).

appid
integer >= 1
type
string
Enum: "buy_analysis" "sell_analysis" "maintenance_low_profit" "maintenance_reprice" "maintenance_cancel_orders" "maintenance_remove_listings" "maintenance_competitor_removal" "steam_session_health" "steam_market_state_sync" "account_setup_bootstrap" "steam_confirm_pending" "sell_phantom_cleanup" "trading_stats_ingest"
status
string
Enum: "queued" "running" "succeeded" "failed" "cancelled"

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a job's result

The job plus its outcome: result (executor output) once it succeeded, error when it failed, and the matching audit summary.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
jobQueueId
required
string

Responses

Response samples

Content type
application/json
{
  • "job": {
    },
  • "audit": {
    },
  • "result": { },
  • "error": { }
}

Retry a failed job

Re-queues a job in status failed. Returns the new queue reference.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
jobQueueId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "appid": 252490,
  • "type": "buy_analysis",
  • "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76",
  • "bullJobId": "bull-job-1",
  • "status": "queued"
}

Cancel a job

Cancels a queued or running job. A running job stops at its next safety check (between Steam calls).

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
jobQueueId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "appid": 252490,
  • "type": "buy_analysis",
  • "status": "queued",
  • "priority": 0,
  • "payload": { },
  • "attempts": 0,
  • "lastError": "string",
  • "scheduledAt": "2019-08-24T14:15:22Z",
  • "startedAt": "2019-08-24T14:15:22Z",
  • "finishedAt": "2019-08-24T14:15:22Z"
}

Get a job

Current status of one background job. Poll this after any mutation that returned a jobQueueId.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
jobQueueId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "appid": 252490,
  • "type": "buy_analysis",
  • "status": "queued",
  • "priority": 0,
  • "payload": { },
  • "attempts": 0,
  • "lastError": "string",
  • "scheduledAt": "2019-08-24T14:15:22Z",
  • "startedAt": "2019-08-24T14:15:22Z",
  • "finishedAt": "2019-08-24T14:15:22Z"
}

account-dashboard

Aggregated dashboard data across accounts and per account.

Dashboard overview

Summary of all of the caller's Steam accounts for the cabinet home page.

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
{
  • "generatedAt": "2019-08-24T14:15:22Z",
  • "summary": {
    },
  • "accounts": [
    ]
}

Account dashboard

One-call view of an account: account row, proxy, runner status, recent jobs and audit events.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "generatedAt": "2019-08-24T14:15:22Z",
  • "account": {
    },
  • "proxy": {
    },
  • "runner": {
    },
  • "jobs": [
    ],
  • "auditEvents": [
    ]
}

trading-stats

Realized P&L, daily statistics, trade ledger and cross-account portfolio statistics built from Steam market history.

Realized P&L

Realized profit and loss from matched buy→sell trades in the Steam market history, per item and in total, optionally limited to a UTC date range. Minor units.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
from
string <date> ^\d{4}-\d{2}-\d{2}$

Inclusive UTC calendar-date lower bound; maximum range is 366 days.

to
string <date> ^\d{4}-\d{2}-\d{2}$

Inclusive UTC calendar-date upper bound; maximum range is 366 days.

Responses

Response samples

Content type
application/json
{
  • "currency": "USD",
  • "period": {
    },
  • "unrealizedAsOf": "2019-08-24T14:15:22Z",
  • "totals": {
    },
  • "freshness": {
    },
  • "items": [
    ]
}

Daily net-worth series

Daily snapshots of wallet, holdings, listings, orders and net worth. Minor units.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
days
integer >= 1
Default: 90

Trailing window in days, used when neither from nor to is given.

from
string <date> ^\d{4}-\d{2}-\d{2}$

Inclusive UTC calendar-date lower bound; takes precedence over days when either date bound is supplied. Maximum date range is 366 days.

to
string <date> ^\d{4}-\d{2}-\d{2}$

Inclusive UTC calendar-date upper bound; takes precedence over days when either date bound is supplied. Maximum date range is 366 days.

Responses

Response samples

Content type
application/json
{
  • "currency": "USD",
  • "period": {
    },
  • "rows": [
    ]
}

P&L timeline

Realized P&L per day and its running total (cumulative). Minor units.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "currency": "USD",
  • "points": [
    ]
}

Open positions below cost

Held or listed items whose current value is below their purchase cost basis.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "excluded": {
    }
}

Trade ledger

Individual buys and sells ingested from Steam market history, newest first. For sells net is what the seller received.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
limit
integer [ 1 .. 500 ]
Default: 50

Clamped to 1–500.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Cost-basis repair diagnostics

Dry run of the ledger cost-basis repair: what would be re-matched. Changes nothing.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{ }

Import Steam market history now

Synchronously reads the latest pages of the account's Steam market history into the ledger (normally done hourly in the background). Makes Steam requests.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
pages
integer [ 1 .. 10 ]
Default: 2

How many pages (100 entries each) of Steam market history to read; clamped to 1–10.

Responses

Response samples

Content type
application/json
{
  • "ok": true,
  • "fetched": 200,
  • "ingested": 37
}

Portfolio statistics

P&L, net worth and trade statistics across all of the caller's Steam accounts, grouped per wallet currency and per account. Minor units.

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
{
  • "accountCount": 4,
  • "byCurrency": [
    ],
  • "accounts": [
    ]
}

Portfolio daily series

Daily net-worth series summed across the caller's accounts, one series per currency.

Authorizations:
serviceApiKeysession
query Parameters
days
integer [ 1 .. 365 ]
Default: 30

Window in days (clamped to 1–365, default 30).

Responses

Response samples

Content type
application/json
{
  • "byCurrency": [
    ]
}

currency

Exchange rates used for display-currency conversion.

Exchange rates

Units of each currency per 1 USD, for converting totals into the display currency on the client.

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
{
  • "rates": {
    },
  • "fetchedAt": "string"
}

games

Supported games (Steam app ids).

Supported games

Steam games (app ids) the platform supports, with their default inventory context id.

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
[
  • {
    }
]

meta

API metadata: error codes, capabilities, version and trading limits.

Error codes

Generic error.code values with their HTTP status and whether retrying may help. Note: requests without valid credentials get 403 FORBIDDEN, not 401.

Responses

Response samples

Content type
application/json
{
  • "errorCodes": [
    ]
}

API capabilities

Headers the API understands and a coarse list of endpoints by kind.

Responses

Response samples

Content type
application/json
{
  • "headers": {
    },
  • "idempotency": {
    },
  • "endpoints": {
    }
}

Trading intensity limits

Ceilings the server enforces on per-account trading intensity settings (maxCandidates, requestDelayMs) for the caller's plan.

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
{
  • "maxCandidatesPerJob": 100,
  • "minRequestDelayMs": 0
}

API version and build

Responses

Response samples

Content type
application/json
{
  • "service": "steammarketrunner-api",
  • "version": "0.0.1",
  • "build": {
    }
}

health

Liveness and readiness probes.

Liveness probe

Always 200 while the process serves HTTP.

Responses

Response samples

Content type
application/json
{
  • "ok": true,
  • "service": "steammarketrunner-api"
}

Readiness probe

Checks PostgreSQL and Redis. 200 when both are reachable, otherwise 503 with the same body.

Responses

Response samples

Content type
application/json
{
  • "ok": true,
  • "service": "steammarketrunner-api",
  • "status": "ready",
  • "signal": "SIGTERM",
  • "dependencies": {
    }
}