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.
Two ways to authenticate; both resolve to your user (tenant) and only ever see your own resources:
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.steammarketrunner_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.
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.
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.
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.
Browser redirect (302) to Google's consent screen. Not a JSON endpoint — open it in the browser.
| returnTo | any Cabinet path to return to after sign-in (must start with |
{- "requestId": "8f14e45f-ceea-467a-9575-6b3c5b2f1f0a",
- "error": {
- "code": "NOT_FOUND",
- "message": "Steam account not found",
- "details": {
- "issues": [
- {
- "path": [
- "days"
], - "message": "Invalid value: Expected <=365 but received 400",
- "expected": "<=365",
- "received": "400"
}
]
}
}
}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.
| state | any |
| code | any |
{- "requestId": "8f14e45f-ceea-467a-9575-6b3c5b2f1f0a",
- "error": {
- "code": "NOT_FOUND",
- "message": "Steam account not found",
- "details": {
- "issues": [
- {
- "path": [
- "days"
], - "message": "Invalid value: Expected <=365 but received 400",
- "expected": "<=365",
- "received": "400"
}
]
}
}
}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.
| email required | string |
| password required | string >= 12 characters |
{- "password": "aStrongPassphrase"
}{- "status": "verification_required",
- "email": "[email protected]"
}| email required | string |
{- "email": "[email protected]"
}{- "ok": true
}Confirms the email with the token from the verification link and signs the user in (sets the session cookie).
| token required | string |
{- "token": "opaque-token-string"
}{- "user": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "admin",
- "emailVerified": true,
- "emailVerifiedAt": "2019-08-24T14:15:22Z"
}
}Email + password login. On success sets the httpOnly session cookie steammarketrunner_session and returns the user.
| email required | string |
| password required | string |
{- "email": "admin",
- "password": "admin"
}{- "user": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "admin",
- "emailVerified": true,
- "emailVerifiedAt": "2019-08-24T14:15:22Z"
}
}Always answers the same way whether or not the email exists.
| email required | string |
{- "email": "[email protected]"
}{- "ok": true,
- "token": "string",
- "expiresAt": { }
}Sets a new password using the token from the reset email.
| token required | string |
| password required | string >= 12 characters |
{- "token": "opaque-token-string",
- "password": "aNewStrongPassphrase"
}{- "ok": true
}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.
{- "actor": {
- "type": "service_api",
- "name": "openclaw"
}, - "requestId": "openclaw-probe-1",
- "capabilities": {
- "auth": {
- "actorHeader": "x-steammarketrunner-actor",
- "requestIdHeader": "x-request-id"
}, - "idempotency": {
- "header": "x-idempotency-key",
- "decisionEnqueue": true,
- "runnerStaleJobRecovery": true,
- "runnerFailedJobRequeue": true
}, - "audit": {
- "actorAttribution": true
}
}
}Metadata of the caller's service keys (never the key itself). Requires a session cookie.
[- {
- "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"
}
]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).
| name required | string |
{- "name": "OpenClaw"
}{- "key": "mops_plaintext_key",
- "serviceKey": {
- "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"
}
}Revokes one of the caller's keys. Requires a session cookie.
| id required | string |
{- "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"
}Sets the display currency used for cross-account totals.
| displayCurrency required | string^[A-Za-z]{3}$ 3-letter currency code; trimmed and upper-cased by the server. |
{- "displayCurrency": "RUB"
}{- "displayCurrency": "USD"
}Where alerts about your accounts are delivered. The webhook URL itself is never returned (hasWebhook).
{- "enabled": true,
- "minSeverity": "info",
- "telegramChatId": "string",
- "hasWebhook": true
}Partial update: omitted fields are kept, null clears a channel.
| 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; |
| webhookUrl | string or null <uri> <= 2048 characters HTTPS webhook receiving alert JSON; must be a public host. Stored encrypted and never returned. |
{- "enabled": true,
- "minSeverity": "info",
- "telegramChatId": "123456789",
}{- "enabled": true,
- "minSeverity": "info",
- "telegramChatId": "string",
- "hasWebhook": true
}Recent warning/error events across the caller's accounts (the cabinet bell), newest first.
| limit | integer [ 1 .. 100 ] Default: 25 |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "appid": 252490,
- "category": "runner.started",
- "severity": "debug",
- "message": "Trading started",
- "actorType": "service_api",
- "actorName": "openclaw",
- "requestId": "frontend-request-1",
- "data": { },
- "createdAt": "2019-08-24T14:15:22Z"
}
]Curated business events across the caller's accounts ("Live activity"), newest first.
| limit | integer [ 1 .. 100 ] Default: 30 |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "appid": 252490,
- "category": "runner.started",
- "severity": "debug",
- "message": "Trading started",
- "actorType": "service_api",
- "actorName": "openclaw",
- "requestId": "frontend-request-1",
- "data": { },
- "createdAt": "2019-08-24T14:15:22Z"
}
]Published, not expired announcements for the caller, with their dismissal state.
| locale | any Example: locale=ru Preferred translation (falls back to the default text). |
{- "items": [
- {
- "id": "string",
- "severity": "info",
- "title": "string",
- "body": "string",
- "publishAt": "string",
- "expiresAt": "string",
- "dismissible": true,
- "actionUrl": "string",
- "dismissedAt": "string"
}
], - "serverTime": "string"
}Connect and manage Steam accounts: CRUD, encrypted secrets (maFile / password), setup bootstrap and per-account audit events.
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.
| 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) |
{- "displayName": "Main Steam",
- "steamId": "76561198000000000",
- "setupBootstrapAppids": [
- 730,
- 252490
], - "secrets": {
- "login": "steam-login",
- "password": "steam-password",
- "maFile": { }
}, - "proxy": {
- "protocol": "http",
- "host": "203.0.113.5",
- "port": 8080,
- "username": "proxy-user",
- "password": "proxy-password",
- "expectedIp": "203.0.113.10"
}
}{- "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": [
- 730,
- 252490
], - "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}[- {
- "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": [
- 730,
- 252490
], - "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]| steamAccountId required | string |
{- "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": [
- 730,
- 252490
], - "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Updates displayName and/or status. steamId cannot be changed — it is derived from the Steam session on first sign-in.
| steamAccountId required | string |
| displayName | string non-empty |
| status | string Enum: "draft" "ready" "blocked" "disabled" |
{- "displayName": "Main Steam",
- "status": "draft"
}{- "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": [
- 730,
- 252490
], - "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Deletes the account and everything tracked for it. Existing Steam orders and listings are not touched.
| steamAccountId required | string |
{- "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": [
- 730,
- 252490
], - "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}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.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "type": "account_setup_bootstrap",
- "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76",
- "bullJobId": "bull-job-1",
- "status": "queued"
}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.
| steamAccountId required | string |
| login | string non-empty |
| password | string non-empty |
object Steam Guard maFile (SDA format). Must contain |
{- "login": "steam-login",
- "password": "steam-password",
- "maFile": { }
}{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "hasLogin": true,
- "hasPassword": true,
- "hasMaFile": false,
- "updatedAt": "2019-08-24T14:15:22Z"
}Booleans telling which secrets are present. Never returns the secrets.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "hasLogin": true,
- "hasPassword": true,
- "hasMaFile": false,
- "updatedAt": "2019-08-24T14:15:22Z"
}Curated audit events of this account (trading actions, Steam problems, settings changes), newest first. Default limit 100.
| steamAccountId required | string |
| 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. |
| severity | string Enum: "debug" "info" "warning" "error" |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "appid": 252490,
- "category": "runner.started",
- "severity": "debug",
- "message": "Trading started",
- "actorType": "service_api",
- "actorName": "openclaw",
- "requestId": "frontend-request-1",
- "data": { },
- "createdAt": "2019-08-24T14:15:22Z"
}
]What is still missing before the account can trade: secrets, Steam session, proxy and runner safety verdict, with missingSteps, blockingReasons and readyForLiveRun.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "generatedAt": "2019-08-24T14:15:22Z",
- "account": {
- "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": [
- 730,
- 252490
], - "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}, - "secrets": {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "hasLogin": true,
- "hasPassword": true,
- "hasMaFile": false,
- "updatedAt": "2019-08-24T14:15:22Z"
}, - "sessionCredentials": {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "hasSessionId": true,
- "hasCookie": true,
- "updatedAt": "2019-08-24T14:15:22Z"
}, - "proxy": {
- "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"
}, - "runnerSafety": {
- "allowed": true,
- "reasons": [
- "string"
]
}, - "missingSteps": [
- "string"
], - "blockingReasons": [
- "string"
], - "setupComplete": false,
- "readyForLiveRun": false
}Per-account HTTP proxy. All Steam traffic of an account goes through its proxy; without a healthy proxy no Steam requests are made.
Proxy settings and last health status. Credentials are never returned (only hasUsername/hasPassword). The body is null when no proxy is configured.
| steamAccountId required | string |
{- "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"
}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.
| steamAccountId required | string |
| 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 |
| port required | number [ 1 .. 65535 ] |
| username | string |
| password | string |
| expectedIp | string or null |
{- "protocol": "http",
- "host": "203.0.113.5",
- "port": 8080,
- "username": "proxy-user",
- "password": "proxy-password",
- "expectedIp": "203.0.113.10"
}{- "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"
}Connects through the proxy to an IP-echo service (not Steam), records latency and the observed exit IP, and updates the proxy health status.
| steamAccountId required | string |
{- "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."
}Tracked items, groups, strategy profiles, runtime (trading) settings, catalog browsing, inventory import and manual listing / order actions.
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.
| steamAccountId required | string |
| appid required | number |
| contextid required | string |
| marketHashName required | string |
| itemNameid | string |
| displayName | string |
object | |
object | |
object (TradeStateDto) |
{- "appid": 252490,
- "contextid": "2",
- "marketHashName": "Metal Facemask",
- "itemNameid": "string",
- "displayName": "string",
- "gameMetadata": { },
- "legacyState": { },
- "tradeState": {
- "buyEnabled": false,
- "sellEnabled": false,
- "buyPrice": 1000,
- "sellNetPrice": 1200,
- "sellGrossPrice": 1400,
- "currency": "USD",
- "buyQuantity": 1,
- "activeBuyOrderId": "string",
- "activeBuyOrderCount": 0,
- "activeListingCount": 0,
- "inventoryCount": 1
}
}{- "item": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "catalogItemId": "29b1d1d1-e291-455b-a461-73ea206c4445",
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "appid": 252490,
- "contextid": "2",
- "marketHashName": "Metal Facemask",
- "itemNameid": "string",
- "displayName": "string",
- "gameMetadata": { },
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}, - "tradeState": {
- "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"
}
}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.
| steamAccountId required | string |
| 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 |
| status | any Item status: |
| 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 |
{- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "catalogItemId": "29b1d1d1-e291-455b-a461-73ea206c4445",
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "appid": 252490,
- "contextid": "2",
- "marketHashName": "Metal Facemask",
- "itemNameid": "string",
- "displayName": "string",
- "gameMetadata": { },
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "page": 1,
- "pageSize": 100,
- "pageCount": 18,
- "total": 1793
}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.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "items": [
- {
- "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
- "marketHashName": "Wall Divider Pack",
- "appid": 252490,
- "contextid": "2",
- "inventory": {
- "total": 3,
- "available": 2,
- "blocked": 1,
- "held": 1,
- "holdBreakdown": [
- { }
], - "nextUnlockAt": "2019-08-24T14:15:22Z",
- "assets": [
- {
- "assetId": "1234567890",
- "unitIndex": 1,
- "marketable": true,
- "holdUntil": "2019-08-24T14:15:22Z",
- "sellBlocked": true,
- "sellBlockedStatus": "failed_reconcile",
- "sellBlockedReason": "sell_listing_not_found_after_reconcile",
- "purchasePrice": 125,
- "purchaseAt": "2019-08-24T14:15:22Z"
}
], - "purchaseUnits": [
- {
- "unitPrice": 125,
- "occurredAt": "2019-08-24T14:15:22Z",
- "currency": "USD"
}
]
}, - "listing": {
- "count": 1,
- "priceMin": 124,
- "priceMax": 129,
- "targetGrossPrice": 120,
- "value": 626,
- "sellerNetValue": 0,
- "oldestListedAt": "2019-08-24T14:15:22Z",
- "listedAt": [
- "string"
]
}, - "buyOrder": {
- "count": 1,
- "quantity": 5,
- "price": 76,
- "exposure": 380,
- "orderDate": "2019-08-24T14:15:22Z"
}, - "orderDepth": {
- "topBuyPrice": 80,
- "centsBehindTop": 4,
- "pctOfTopBuy": 95,
- "quantityAhead": 37,
- "estimatedQueuePosition": 38,
- "checkedAt": "2019-08-24T14:15:22Z",
- "stale": false
}, - "valuation": {
- "currency": "USD",
- "unitPrice": 120,
- "sellerNetUnitPrice": 105,
- "inventoryValue": 360,
- "onSaleValue": 124,
- "onOrdersValueExcluded": 380
}
}
], - "total": 10,
- "inventoryItems": 5,
- "activeBuyOrders": 3,
- "activeListings": 2,
- "currency": "USD",
- "priceRefresh": { }
}Latest known buy/sell order book levels for one tracked item.
| steamAccountId required | string |
| itemId required | string |
{- "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": [
- {
- "price": 329,
- "quantity": 12,
- "cumulativeQuantity": 57,
- "isOurPrice": true
}
], - "sellLevels": [
- {
- "price": 329,
- "quantity": 12,
- "cumulativeQuantity": 57,
- "isOurPrice": true
}
], - "ok": true,
- "reason": "string",
- "checkedAt": "2019-08-24T14:15:22Z"
}Moves the given items into groupId (or out of any group when groupId is null). The group must belong to the same Steam account.
| steamAccountId required | string |
| itemIds required | Array of strings <uuid> [ items <uuid > ] |
| groupId | string or null <uuid> |
{- "itemIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55"
}{- "itemsMoved": 12,
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55"
}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.
| steamAccountId required | string |
| scope | string Enum: "selected" "query" |
| itemIds | Array of strings <uuid> [ items <uuid > ] |
| appid | number |
| groupId | string or null <uuid> |
| search | string |
| status | string |
{- "scope": "selected",
- "itemIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "appid": 252490,
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "search": "Abyss",
- "status": "eligible"
}{- "itemsDeleted": 12
}Applies the same patch (buyEnabled, sellEnabled, buyQuantity) to the selected items or to every item matching the filter.
| steamAccountId required | string |
| scope | string Enum: "selected" "query"
|
| itemIds | Array of strings <uuid> [ items <uuid > ] |
| appid | number >= 1 |
| groupId | string or null <uuid> |
| search | string |
| status | string |
required | object (PatchTradeStateDto) |
{- "scope": "selected",
- "itemIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "appid": 730,
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "search": "Case",
- "status": "eligible",
- "patch": {
- "buyEnabled": true,
- "sellEnabled": false,
- "buyQuantity": 4
}
}{- "itemsUpdated": 12
}| steamAccountId required | string |
| itemId required | string |
| buyEnabled | boolean |
| sellEnabled | boolean |
| buyQuantity | number or null |
{- "buyEnabled": true,
- "sellEnabled": false,
- "buyQuantity": 4
}{- "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"
}Synchronously cancels the live Steam buy order of one item. Returns 400 (BAD_REQUEST) when the item has no active buy order.
| steamAccountId required | string |
| itemId required | string |
{- "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
- "buyOrderId": "7071234567",
- "cancelled": true,
- "mutationBatchBlocked": false
}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.
| steamAccountId required | string |
| appid | number >= 1 |
| status | string Item status filter; omit (or |
| search | string |
| groupId | string or null |
| comparator required | string Enum: "older" "younger"
|
| days required | number >= 0 |
| dryRun | boolean Preview the matching orders without cancelling anything. |
{- "appid": 730,
- "status": "eligible",
- "search": "Case",
- "groupId": "string",
- "comparator": "older",
- "days": 7,
- "dryRun": true
}{- "dryRun": false,
- "comparator": "older",
- "days": 7,
- "matched": 5,
- "selected": 5,
- "cancelled": 4,
- "items": [
- {
- "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
- "marketHashName": "Revolution Case"
}
]
}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.
| steamAccountId required | string |
| appid | number >= 1 |
| status | string Item status filter; omit (or |
| search | string |
| groupId | string or null |
| dryRun | boolean Only count matching live listings, remove nothing. |
{- "appid": 730,
- "status": "eligible",
- "search": "Case",
- "groupId": "string",
- "dryRun": true
}{- "dryRun": true,
- "found": 12,
- "removed": 12
}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.
| steamAccountId required | string |
| itemId required | string |
{- "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
- "listingsFound": 3,
- "removed": 3,
- "reconciled": true
}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.
| steamAccountId required | string |
| 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" |
{- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "appid": 252490,
- "contextid": "2",
- "marketHashName": "Black Hoodie",
- "itemNameid": "string",
- "displayName": "string",
- "gameMetadata": { },
- "isInTradingBase": false,
- "status": "eligible",
- "reason": "filters_passed",
- "profitPercent": 8.62,
- "priceSnapshot": {
- "source": "steamwebapi",
- "currency": "USD",
- "minPrice": 196,
- "maxPrice": 229,
- "listingCount": 42,
- "salesCount": 310,
- "coefficient": 1650,
- "checkedAt": "2019-08-24T14:15:22Z"
}, - "buyPrice": 156,
- "sellNetPrice": 171,
- "sellGrossPrice": 196
}
], - "page": 1,
- "pageSize": 100,
- "pageCount": 18,
- "total": 1793,
- "currency": "USD"
}Inventory copies that are still under a Steam trade/market hold and when they unlock.
| steamAccountId required | string |
| unlockWindowDays | integer >= 1 |
| onHoldOnly | boolean |
| search | any |
| groupId | any Group UUID, or |
| appid | integer >= 1 |
{- "items": [
- {
- "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
- "marketHashName": "Metal Facemask",
- "displayName": "string",
- "appid": 252490,
- "contextid": "2",
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "groupName": "Main",
- "assetid": "1234567890",
- "quantity": 1,
- "marketable": false,
- "tradable": true,
- "holdUntil": "2019-08-24T14:15:22Z",
- "unlockBucket": "today",
- "unlocksInDays": 2,
- "currentPrice": 196,
- "buyPrice": 150,
- "sellNetPrice": 171,
- "profitPercent": 8.62,
- "buyEnabled": true,
- "sellEnabled": true,
- "listed": false,
- "activeBuyOrder": false
}
], - "total": 42,
- "onHold": 16,
- "unlocksToday": 4,
- "unlocksIn7Days": 12
}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.
| steamAccountId required | string |
| appid | number |
| contextid | string |
{- "appid": 252490,
- "contextid": "2"
}{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "appidsScanned": [
- 252490
], - "heldDistinct": 10,
- "matchedCatalogItems": 10,
- "itemsAdded": 6,
- "alreadyPresent": 4,
- "notInCatalog": [
- "string"
]
}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.
| steamAccountId required | string |
| 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. |
| 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 > ] |
{- "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": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "catalogItemsScanned": 128,
- "eligible": 83,
- "itemsAdded": 70,
- "alreadyPresent": 13,
- "rejected": 45,
- "skippedByLimit": 0,
- "reasons": { }
}Same as addCatalogItemsToAccount but changes nothing — returns the counts only.
| steamAccountId required | string |
| 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. |
| 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 > ] |
{- "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": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "catalogItemsScanned": 128,
- "eligible": 83,
- "itemsAdded": 70,
- "alreadyPresent": 13,
- "rejected": 45,
- "skippedByLimit": 0,
- "reasons": { }
}Imports a settings export of the legacy browser extension into runtime settings and a strategy profile of this account.
| steamAccountId required | string |
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 |
{- "profitPercent": 10,
- "algoritm": "AVG",
- "cntSalesMonth": 30
}{- "runtimeSettings": {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "settings": { },
- "legacySettings": { },
- "effectiveSettings": { },
- "updatedAt": "2019-08-24T14:15:22Z"
}, - "strategyProfile": {
- "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"
}, - "importedKeys": 82,
- "runtimeKeys": [
- "string"
], - "strategyKeys": [
- "string"
]
}Imports a Steam market listings export (legacy extension format) to seed tracked items, catalog entries and price snapshots.
| steamAccountId required | string |
object | |
| listings required | Array of objects |
{- "currency": { },
- "listings": [
- { }
]
}{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "listingsProcessed": 614,
- "uniqueItems": 200,
- "itemsUpserted": 200,
- "catalogItemsUpserted": 200,
- "priceSnapshotsCreated": 200
}Groups let a set of items share strategy overrides (metadata).
| steamAccountId required | string |
| appid required | number |
| name required | string |
| legacyGroupId | string |
| sortOrder | number |
object |
{- "appid": 252490,
- "name": "High volume skins",
- "legacyGroupId": "legacy-group-1",
- "sortOrder": 0,
- "metadata": { }
}{- "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"
}| steamAccountId required | string |
[- {
- "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"
}
]| steamAccountId required | string |
| groupId required | string |
| name | string |
| sortOrder | number |
object |
{- "name": "High volume skins",
- "sortOrder": 0,
- "metadata": { }
}{- "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"
}Deletes the group and stops tracking the items in it.
| steamAccountId required | string |
| groupId required | string |
{- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "itemsDeleted": 42,
- "groupDeleted": true
}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.
| steamAccountId required | string |
| name required | string |
| algorithm | string |
| algorithmBuy | string |
object | |
object |
{- "name": "Default sell strategy",
- "algorithm": "AVG",
- "algorithmBuy": "AVG",
- "settings": { },
- "legacyAliases": { }
}{- "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"
}| steamAccountId required | string |
[- {
- "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"
}
]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.
| steamAccountId required | string |
object Account-level overrides of the strategy settings (same keys as the cabinet's Trading settings). A key set to | |
object Raw settings in the legacy browser-extension format. |
{- "settings": {
- "algoritm": "HG",
- "algoritm_buy": "BG",
- "profitPercent": 12,
- "minProfit": 0.05,
- "cntSalesMonth": 30,
- "orderSizeMode": "percent",
- "orderQuantityPercent": 5,
- "maxItemsForOrders": 3,
- "removeFromSaleDays": null
}, - "legacySettings": { }
}{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "settings": { },
- "legacySettings": { },
- "effectiveSettings": { },
- "updatedAt": "2019-08-24T14:15:22Z"
}Returns the stored overrides (settings, legacySettings) and effectiveSettings — what the trading engine actually applies after merging the strategy profile.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "settings": { },
- "legacySettings": { },
- "effectiveSettings": { },
- "updatedAt": "2019-08-24T14:15:22Z"
}Runner state of the account (running, stopped, blocked, …), why it is blocked, Steam cooldown, safety verdict and which job types are due.
| steamAccountId required | string |
{- "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": {
- "appid": 252490,
- "runnerJobs": [
- "sell_analysis"
]
}, - "safety": {
- "allowed": true,
- "reasons": [
- "string"
]
}, - "jobs": {
- "due": [
- {
- "type": "sell_analysis",
- "cadenceMs": 300000,
- "lastScheduledAt": "2019-08-24T14:15:22Z"
}
], - "skipped": [
- {
- "type": "sell_analysis",
- "cadenceMs": 300000,
- "lastScheduledAt": "2019-08-24T14:15:22Z"
}
]
}
}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.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "queuedJobs": [
- {
- "type": "sell_analysis",
- "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76",
- "bullJobId": "bull-job-1"
}
], - "blockedReason": "account_not_ready",
- "status": "running",
- "currentJob": "cycle_dispatch"
}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.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "status": "stopped",
- "currentJob": null,
- "blockedReason": null
}Queues the currently due jobs immediately instead of waiting for the next scheduler tick. Poll the returned jobQueueIds via the decisions endpoints.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "queuedJobs": [
- {
- "type": "sell_analysis",
- "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76",
- "bullJobId": "bull-job-1"
}
], - "blockedReason": "account_not_ready"
}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.
| steamAccountId required | string |
| 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"
|
| dryRun | boolean Default: true Defaults to true — pass |
| appid | number >= 1 |
{- "assetids": [
- "37266183512"
], - "mode": "diagnostics_only",
- "dryRun": true,
- "appid": 730
}{ }Background decision jobs of an account (buy/sell/maintenance analyses, Steam syncs): list, inspect, retry, cancel.
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.
| steamAccountId required | string |
{- "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": [
- { }
]
}Background jobs of this account (analyses, syncs, maintenance), newest first. Default limit is 50.
| steamAccountId required | string |
| 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" |
[- {
- "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"
}
]The job plus its outcome: result (executor output) once it succeeded, error when it failed, and the matching audit summary.
| steamAccountId required | string |
| jobQueueId required | string |
{- "job": {
- "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"
}, - "audit": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "category": "decision.job_succeeded",
- "severity": "info",
- "createdAt": "2019-08-24T14:15:22Z"
}, - "result": { },
- "error": { }
}Re-queues a job in status failed. Returns the new queue reference.
| steamAccountId required | string |
| jobQueueId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "appid": 252490,
- "type": "buy_analysis",
- "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76",
- "bullJobId": "bull-job-1",
- "status": "queued"
}Cancels a queued or running job. A running job stops at its next safety check (between Steam calls).
| steamAccountId required | string |
| jobQueueId required | string |
{- "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"
}Current status of one background job. Poll this after any mutation that returned a jobQueueId.
| steamAccountId required | string |
| jobQueueId required | string |
{- "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"
}Summary of all of the caller's Steam accounts for the cabinet home page.
{- "generatedAt": "2019-08-24T14:15:22Z",
- "summary": {
- "totalAccounts": 5,
- "statuses": {
- "draft": 1,
- "ready": 3,
- "blocked": 1,
- "disabled": 0
}, - "needsAttention": 2,
- "totalBalanceByCurrency": {
- "USD": 12345
}, - "totalHeldByCurrency": {
- "USD": 82
}, - "totalInventoryValueByCurrency": {
- "USD": 6789
}, - "totalOnSaleValueByCurrency": {
- "USD": 4321
}, - "totalOnOrdersValueByCurrency": {
- "USD": 4321
}, - "totalNetWorthByCurrency": {
- "USD": 24316
}, - "totalTargetExitByCurrency": {
- "USD": 25316
}, - "totalProjectedUpsideByCurrency": {
- "USD": 1000
}, - "totalActiveBuyOrders": 12,
- "totalActiveBuyOrderQuantity": 24
}, - "accounts": [
- {
- "account": {
- "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": [
- 730,
- 252490
], - "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}, - "runnerStatus": "running",
- "proxyStatus": "healthy",
- "safety": {
- "allowed": true,
- "reasons": [
- "string"
]
}, - "jobsSummary": {
- "total": 16,
- "counts": {
- "queued": 3,
- "running": 1,
- "succeeded": 10,
- "failed": 2,
- "cancelled": 0
}
}, - "setupComplete": true,
- "missingSetupSteps": [
- "string"
], - "readyForLiveRun": false,
- "attentionReasons": [
- "string"
], - "inventory": {
- "count": 12,
- "valueMinor": 6789,
- "currency": "USD"
}, - "onSale": {
- "valueMinor": 4321,
- "currency": "USD",
- "count": 7
}, - "onOrders": {
- "valueMinor": 4321,
- "currency": "USD",
- "count": 5,
- "quantity": 10
}, - "valuation": {
- "id": "7f7b6f19-7d4e-4b0d-9891-851c18f8db5c",
- "capturedAt": "2019-08-24T14:15:22Z",
- "walletObservedAt": "2019-08-24T14:15:22Z",
- "marketStateSyncedAt": "2019-08-24T14:15:22Z",
- "oldestPriceCheckedAt": "2019-08-24T14:15:22Z",
- "newestPriceCheckedAt": "2019-08-24T14:15:22Z",
- "valuationMethod": "latest_floor_seller_net_inventory_live_listings",
- "netWorthEstimate": 196604,
- "walletBalance": 167970,
- "held": 0,
- "inventoryValue": 17072,
- "onSaleValue": 11562,
- "onOrdersValueExcluded": 812956,
- "onOrdersExcludedFromNetWorth": true,
- "targetExitValue": 211234,
- "projectedUpside": 15432,
- "targetCoveredQuantity": 42,
- "targetUncoveredQuantity": 0,
- "formula": "Net worth estimate = wallet + held + inventory value + on-sale value. Buy orders are excluded and shown separately as exposure.",
- "valuationStale": true,
- "mixedFreshness": true,
- "settlementGapPossible": false,
- "stalePriceRows": 87,
- "stalePriceValue": 19000,
- "stalePriceRatio": 0.76,
- "missingPriceRows": 0,
- "walletDelta": 0,
- "heldDelta": 0,
- "inventoryValueDelta": -4904,
- "onSaleValueDelta": 1868,
- "onOrdersDeltaExcluded": 0,
- "netWorthDelta": -3036,
- "sinceStartOfDay": {
- "walletDelta": 757,
- "heldDelta": 0,
- "inventoryValueDelta": -918,
- "onSaleValueDelta": 181,
- "onOrdersDeltaExcluded": -130,
- "netWorthDelta": 20
}
}, - "health": {
- "blockedReason": "session_expired",
- "microbanUntil": "2019-08-24T14:15:22Z",
- "isPausedByCooldown": true,
- "cooldownUntil": "2019-08-24T14:15:22Z",
- "autoResume": true,
- "runnerIntent": "running",
- "effectiveStatus": "paused_by_steam_cooldown",
- "buyPausedUntil": "2019-08-24T14:15:22Z",
- "lastContactAt": "2019-08-24T14:15:22Z",
- "lastSteamStatusCode": 429,
- "lastSteamResponseCategory": "rate_limited",
- "lastSteamRequestOk": false,
- "lastSteamSessionExpired": false,
- "lastSteamProxyUsed": true
}, - "checks": [
- {
- "key": "proxy",
- "status": "ok"
}
]
}
]
}One-call view of an account: account row, proxy, runner status, recent jobs and audit events.
| steamAccountId required | string |
{- "generatedAt": "2019-08-24T14:15:22Z",
- "account": {
- "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": [
- 730,
- 252490
], - "marketStateSnapshotStartedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}, - "proxy": {
- "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"
}, - "runner": {
- "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": {
- "appid": 252490,
- "runnerJobs": [
- "sell_analysis"
]
}, - "safety": {
- "allowed": true,
- "reasons": [
- "string"
]
}, - "jobs": {
- "due": [
- {
- "type": "sell_analysis",
- "cadenceMs": 300000,
- "lastScheduledAt": "2019-08-24T14:15:22Z"
}
], - "skipped": [
- {
- "type": "sell_analysis",
- "cadenceMs": 300000,
- "lastScheduledAt": "2019-08-24T14:15:22Z"
}
]
}
}, - "jobs": [
- {
- "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"
}
], - "auditEvents": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "appid": 252490,
- "category": "runner.started",
- "severity": "debug",
- "message": "Trading started",
- "actorType": "service_api",
- "actorName": "openclaw",
- "requestId": "frontend-request-1",
- "data": { },
- "createdAt": "2019-08-24T14:15:22Z"
}
]
}Realized P&L, daily statistics, trade ledger and cross-account portfolio statistics built from Steam market history.
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.
| steamAccountId required | string |
| 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. |
{- "currency": "USD",
- "period": {
- "from": "2026-02-01",
- "to": "2026-02-28",
- "timezone": "UTC"
}, - "unrealizedAsOf": "2019-08-24T14:15:22Z",
- "totals": {
- "buyCount": 19,
- "sellCount": 12,
- "totalSpent": 1240,
- "grossProceeds": 1500,
- "netProceeds": 1300,
- "feesPaid": 200,
- "realizedPnl": 60,
- "proceedsWithoutCostBasis": 0,
- "ambiguousCostBasisCount": 1,
- "ambiguousCostBasisProceeds": 99,
- "closedTrades": 12,
- "winRate": 0.66,
- "avgHoldDays": 2.4,
- "roi": 8.5,
- "openPositionCost": 1500,
- "openPositionValue": 1720,
- "unrealizedPnl": 220
}, - "freshness": {
- "ledgerRows": 1234,
- "firstTradeOccurredAt": "2019-08-24T14:15:22Z",
- "lastHistorySyncAt": "2019-08-24T14:15:22Z",
- "latestTradeOccurredAt": "2019-08-24T14:15:22Z",
- "historyLagHours": 4.5,
- "status": "fresh",
- "incompleteReasons": [
- "ambiguous_cost_basis"
]
}, - "items": [
- {
- "marketHashName": "Blue Hoodie",
- "appid": 252490,
- "buyQuantity": 4,
- "sellQuantity": 3,
- "totalSpent": 40,
- "totalProceeds": 33,
- "feesPaid": 5,
- "realizedPnl": 3,
- "pnlReason": "ambiguous_cost_basis",
- "ambiguousCostBasisProceeds": 99
}
]
}Daily snapshots of wallet, holdings, listings, orders and net worth. Minor units.
| steamAccountId required | string |
| days | integer >= 1 Default: 90 Trailing window in days, used when neither |
| 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. |
{- "currency": "USD",
- "period": {
- "from": "2026-02-01",
- "to": "2026-02-28",
- "timezone": "UTC"
}, - "rows": [
- {
- "date": "2026-01-21",
- "walletBalance": 23746,
- "held": 0,
- "onSaleValue": 82382,
- "inventoryValue": 0,
- "onOrdersValue": 0,
- "netWorth": 106128,
- "targetExitValue": 111234,
- "projectedUpside": 5106,
- "walletDelta": 0,
- "inventoryValueDelta": -4904,
- "onSaleValueDelta": 1868,
- "onOrdersDeltaExcluded": 0,
- "netWorthDelta": -3036,
- "capitalChange": -3036,
- "capitalChangePercent": -1.54,
- "realizedPnl": 785,
- "profit": -3036,
- "profitPercent": -1.54
}
]
}Realized P&L per day and its running total (cumulative). Minor units.
| steamAccountId required | string |
{- "currency": "USD",
- "points": [
- {
- "date": "2026-01-22",
- "realized": 785,
- "cumulative": 1240
}
]
}Held or listed items whose current value is below their purchase cost basis.
| steamAccountId required | string |
{- "items": [
- {
- "marketHashName": "Blue Hoodie",
- "appid": 252490,
- "quantity": 3,
- "costBasis": 360,
- "currentSellerNetValue": 300,
- "unrealizedLoss": 60,
- "currency": "USD",
- "sellerNetUnitValue": 100,
- "priceCheckedAt": "2019-08-24T14:15:22Z",
- "priceSource": "item_trade_state",
- "marketStateUpdatedAt": "2019-08-24T14:15:22Z",
- "location": {
- "inventoryQuantity": 2,
- "onSaleQuantity": 1
}
}
], - "excluded": {
- "ambiguousCostBasisLots": 0,
- "ambiguousCostBasisItems": 0,
- "unavailableCostBasisLots": 0,
- "unavailableCostBasisItems": 0,
- "unpricedOpenLots": 0
}
}Individual buys and sells ingested from Steam market history, newest first. For sells net is what the seller received.
| steamAccountId required | string |
| limit | integer [ 1 .. 500 ] Default: 50 Clamped to 1–500. |
[- {
- "id": "string",
- "marketHashName": "Blue Hoodie",
- "side": "buy",
- "quantity": 1,
- "unitPrice": 13,
- "fee": 0,
- "net": 13,
- "currency": "USD",
- "source": "myhistory",
- "occurredAt": "2019-08-24T14:15:22Z",
- "occurredAtPrecision": "date_only",
- "ingestedAt": "2019-08-24T14:15:22Z",
- "pnlAmount": 12,
- "pnlKind": "current_estimate",
- "pnlReason": "missing_current_sell_price",
- "costBasis": 16,
- "estimatedSellNet": 28,
- "matchedQuantity": 1
}
]Synchronously reads the latest pages of the account's Steam market history into the ledger (normally done hourly in the background). Makes Steam requests.
| steamAccountId required | string |
| pages | integer [ 1 .. 10 ] Default: 2 How many pages (100 entries each) of Steam market history to read; clamped to 1–10. |
{- "ok": true,
- "fetched": 200,
- "ingested": 37
}P&L, net worth and trade statistics across all of the caller's Steam accounts, grouped per wallet currency and per account. Minor units.
{- "accountCount": 4,
- "byCurrency": [
- {
- "currency": "USD",
- "accounts": 3,
- "realizedPnl": 0,
- "unrealizedPnl": 0,
- "totalPnl": 0,
- "netWorth": 0,
- "totalSpent": 0,
- "netProceeds": 0,
- "feesPaid": 0,
- "openPositionValue": 0,
- "openPositionCost": 0,
- "closedTrades": 0,
- "roi": 0,
- "winRate": 0,
- "avgHoldDays": 0
}
], - "accounts": [
- {
- "steamAccountId": "string",
- "displayName": "string",
- "currency": "USD",
- "netWorth": 0,
- "realizedPnl": 0,
- "unrealizedPnl": 0,
- "totalPnl": 0,
- "roi": 0
}
]
}Daily net-worth series summed across the caller's accounts, one series per currency.
| days | integer [ 1 .. 365 ] Default: 30 Window in days (clamped to 1–365, default 30). |
{- "byCurrency": [
- {
- "currency": "USD",
- "points": [
- {
- "date": "2026-01-21",
- "walletBalance": 23746,
- "held": 0,
- "onSaleValue": 82382,
- "inventoryValue": 0,
- "onOrdersValue": 0,
- "netWorth": 106128,
- "targetExitValue": 111234,
- "projectedUpside": 5106,
- "walletDelta": 0,
- "inventoryValueDelta": -4904,
- "onSaleValueDelta": 1868,
- "onOrdersDeltaExcluded": 0,
- "netWorthDelta": -3036,
- "capitalChange": -3036,
- "capitalChangePercent": -1.54,
- "realizedPnl": 785,
- "profit": -3036,
- "profitPercent": -1.54
}
]
}
]
}Steam games (app ids) the platform supports, with their default inventory context id.
[- {
- "appid": 252490,
- "name": "Rust",
- "defaultContextid": "2",
- "moduleKey": "rust",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]Generic error.code values with their HTTP status and whether retrying may help. Note: requests without valid credentials get 403 FORBIDDEN, not 401.
{- "errorCodes": [
- {
- "code": "VALIDATION_FAILED",
- "statusCode": 400,
- "retryable": false
}
]
}{- "headers": {
- "apiKey": "x-api-key",
- "actor": "x-steammarketrunner-actor",
- "requestId": "x-request-id",
- "idempotencyKey": "x-idempotency-key"
}, - "idempotency": {
- "requiredFor": [
- "string"
]
}, - "endpoints": {
- "read": [
- "string"
], - "mutate": [
- "string"
], - "dangerous": [
- "string"
]
}
}Ceilings the server enforces on per-account trading intensity settings (maxCandidates, requestDelayMs) for the caller's plan.
{- "maxCandidatesPerJob": 100,
- "minRequestDelayMs": 0
}Checks PostgreSQL and Redis. 200 when both are reachable, otherwise 503 with the same body.
{- "ok": true,
- "service": "steammarketrunner-api",
- "status": "ready",
- "signal": "SIGTERM",
- "dependencies": {
- "database": {
- "ok": true,
- "latencyMs": 2
}, - "redis": {
- "ok": true,
- "latencyMs": 2
}
}
}