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> (Authorization: Bearer <key>
is accepted too) to https://api.steammarketrunner.com. Create keys in the
cabinet (Settings → Service API keys); the plaintext key is shown only once.
Use this for scripts, agents and integrations. GET /auth/service/me checks
a key. A service key never has admin scope and cannot manage keys.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 (missing, unknown or revoked key) is
rejected with 401 UNAUTHORIZED. 403 FORBIDDEN means the caller is
authenticated but not allowed: an admin-only route, a plan limit, or a
cross-origin cookie mutation.
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 |
{- "email": "tenant@example.com",
- "password": "aStrongPassphrase"
}{- "status": "verification_required",
- "email": "tenant@example.com"
}Confirms the email with the token from the verification link and signs the user in (sets the session cookie). The link alone is not enough: password must match the one chosen at signup (for a new signup and for an older, still unverified account alike); a wrong or missing password leaves the link valid.
| token required | string |
| password | string The password chosen at signup. Required to confirm the email: without it the answer is 400 |
{- "token": "opaque-token-string",
- "password": "correct-horse-battery"
}{- "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": "tenant@example.com"
}{- "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. Send x-idempotency-key to decide what counts as the same request yourself.
| steamAccountId required | string |
| x-idempotency-key | string <= 128 characters Client-generated key (1-128 visible ASCII characters, no spaces; surrounding whitespace is trimmed, anything else is a 400 |
{- "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" |
| appid | integer >= 1 Only events of this game (multi-game accounts). |
| 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.
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 |
| strategyDrift | boolean Only items whose buy/sell flags differ from what the account's strategies set (the next apply overwrites them). |
| strategyId | any Items the shared strategy owns on this account (their BUY owner), or |
| 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",
- "strategyAssignmentId": "14bdca50-0a2b-4624-b6ed-46fbcd5c950b",
- "appid": 252490,
- "contextid": "2",
- "marketHashName": "Metal Facemask",
- "itemNameid": "string",
- "displayName": "string",
- "gameMetadata": { },
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "buyEnabled": false,
- "sellEnabled": false,
- "buyPrice": 1000,
- "sellNetPrice": 1200,
- "sellGrossPrice": 1400,
- "currency": "USD",
- "inventoryCount": 3,
- "inventoryHeld": 1,
- "inventoryAvailable": 2,
- "inventoryHoldBreakdown": [
- { }
], - "activeBuyOrderId": "string",
- "activeBuyOrderCount": 0,
- "activeListingCount": 0,
- "orderQuantity": 0,
- "status": "eligible",
- "reason": "filters_passed",
- "profitPercent": 0,
- "coefficient": 0,
- "orderCoefficient": 0,
- "salesCount": 0,
- "listingCount": 0,
- "minListingPrice": 0,
- "maxListingPrice": 0,
- "priceCheckedAt": "2019-08-24T14:15:22Z",
- "priceSource": "steamwebapi",
- "lastAnalysis": "string",
- "analyzedAt": "2019-08-24T14:15:22Z",
- "membershipDrift": true
}
], - "page": 1,
- "pageSize": 100,
- "pageCount": 18,
- "total": 1793,
- "statusCounts": {
- "all": 1793,
- "eligible": 120,
- "rejected": 40,
- "candidate": 8,
- "trading": 25
}, - "strategyDriftCount": 12
}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": 0,
- "held": 1,
- "holdBreakdown": [
- { }
], - "nextUnlockAt": "2019-08-24T14:15:22Z",
- "assets": [
- {
- "assetId": "1234567890",
- "unitIndex": 1,
- "marketable": true,
- "holdUntil": "2019-08-24T14:15:22Z",
- "purchasePrice": 0,
- "purchaseCurrency": "string",
- "purchaseAt": "2019-08-24T14:15:22Z",
- "onSale": false,
- "activeListingId": "string",
- "activeListingNetPrice": 0
}
], - "purchaseUnits": [
- {
- "unitPrice": 125,
- "occurredAt": "2019-08-24T14:15:22Z",
- "currency": "USD"
}
]
}, - "listing": {
- "count": 1,
- "priceMin": 124,
- "priceMax": 129,
- "targetGrossPrice": 120,
- "targetSellerNetPrice": 104,
- "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",
- "priceCurrency": "USD",
- "priceCheckedAt": "2019-08-24T14:15:22Z",
- "priceStale": false,
- "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",
- "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
}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, 503 when Steam listings cannot be read (or the set is incomplete and lacks the item).
| steamAccountId required | string |
| itemId required | string |
{- "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
- "listingsFound": 3,
- "removed": 3,
- "reconciled": true,
- "stoppedBy": "steam_blocker"
}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. Results are ordered by daily sales, most liquid first. The strategy check needs each item's price history, so mode=eligible checks at most scanLimit matches (the most liquid) and sets truncated when more matched — narrow appid/search/price/sales filters to reach the rest.
| steamAccountId required | string |
| strategyId | string <uuid> A strategy the account runs that the items are picked for: each item then says whether it already has it ( |
| 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,
- "strategyMemberships": [
- {
- "strategyId": "c855e259-15d8-4385-a60f-bdf8f7695ef7",
- "name": "Rust — main"
}
], - "inStrategy": 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": 651,
- "matched": 39330,
- "truncated": true,
- "scanLimit": 1000,
- "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. Without catalogItemIds only the most liquid matches (the catalog listing's scanLimit) are considered, so "add all" adds exactly what GET …/catalog counted.
| 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,
- "truncated": false,
- "reasons": { },
- "pricesDeferredReason": "wallet_currency_unknown"
}Groups let a set of items share strategy overrides (metadata).
| steamAccountId required | string |
| appid required | number |
| name required | string |
| sortOrder | number |
object |
{- "appid": 252490,
- "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"
}| 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; with keepItems=true the items stay tracked without a group. A group a shared strategy manages answers 409 strategy_managed_group, the built-in Inbox 409 system_group.
| steamAccountId required | string |
| groupId required | string |
| keepItems | boolean Keep the items tracked, without a group. |
{- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "itemsDeleted": 42,
- "itemsMoved": 0,
- "groupDeleted": true
}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. On an account that uses a shared strategy, changing a strategy-owned key answers 409 STRATEGY_MANAGED_SETTINGS (see GET /strategies/setting-keys). 400 LEGACY_SETTINGS_READ_ONLY when the body carries legacySettings, 400 DRY_RUN_DEPRECATED for settings.dryRun: true.
| steamAccountId required | string |
object Account-level overrides of the strategy settings (same keys as the cabinet's Trading settings). A key set to | |||
| |||
{- "settings": {
- "algoritm": "HG",
- "algoritm_buy": "BG",
- "profitPercent": 12,
- "minProfit": 0.05,
- "cntSalesMonth": 30,
- "orderSizeMode": "percent",
- "orderQuantityPercent": 5,
- "maxItemsForOrders": 3,
- "removeFromSaleDays": null
}
}{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "settings": { },
- "legacySettings": { },
- "effectiveSettings": { },
- "strategy": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 4,
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true,
- "managedKeys": [
- "string"
], - "managesInbox": true
}, - "strategies": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 4,
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true,
- "managedKeys": [
- "string"
], - "managesInbox": true
}
], - "strategyLayout": "account",
- "updatedAt": "2019-08-24T14:15:22Z"
}Returns the stored overrides (settings, legacySettings), effectiveSettings — what the trading engine actually applies after merging the strategy profile — and strategy: the shared strategy the account uses, if any. Its managedKeys can only change by applying the strategy (PUT answers 409 STRATEGY_MANAGED_SETTINGS).
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "settings": { },
- "legacySettings": { },
- "effectiveSettings": { },
- "strategy": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 4,
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true,
- "managedKeys": [
- "string"
], - "managesInbox": true
}, - "strategies": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 4,
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true,
- "managedKeys": [
- "string"
], - "managesInbox": true
}
], - "strategyLayout": "account",
- "updatedAt": "2019-08-24T14:15:22Z"
}Items the user's accounts hold, list or bid for — one row per account (with includeEmpty=true also tracked items with nothing). Counts are units; prices are the account's strategy prices in minor units of its wallet currency (currency) and are never summed across accounts.
| sortOrder | string Enum: "asc" "desc" |
| sortBy | string Enum: "name" "account" "inventory" "listings" "orders" |
| includeEmpty | boolean |
| strategyId | any Owning strategy UUID, or |
| steamAccountId | string <uuid> |
| search | string |
| appid | number |
| pageSize | number |
| page | number |
{- "items": [
- {
- "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "accountName": "main",
- "catalogItemId": "29b1d1d1-e291-455b-a461-73ea206c4445",
- "appid": 252490,
- "marketHashName": "Blackout Hoodie",
- "displayName": "string",
- "iconUrl": "string",
- "strategies": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Rust — main",
- "remainingQuantity": 2
}
], - "unallocatedQuantity": 0,
- "quantityScope": "account_item",
- "buyEnabled": true,
- "sellEnabled": true,
- "inventoryCount": 3,
- "activeListingCount": 1,
- "buyOrderQuantity": 2,
- "status": "trading",
- "reason": "string",
- "buyPrice": 0,
- "sellNetPrice": 0,
- "currency": "USD"
}
], - "total": 120,
- "page": 1,
- "pageSize": 50
}Cancels live buy orders placed more (older) or less (younger) than days ago, optionally restricted to the filtered item set. dryRun: true previews the matching orders synchronously (database only). Otherwise the cancellation is queued as a runner job — serialized with the account's other Steam work, at most 100 cancels, sequential, stopped by a Steam rate limit/session error or a runner stop — with a market-state sync right behind it; the answer carries both job ids (…/decisions/jobs/{id}/result holds the outcome).
| steamAccountId required | string |
| x-idempotency-key | string <= 104 characters Client-generated key (1-104 visible ASCII characters, no spaces; surrounding whitespace is trimmed, anything else is a 400 |
| appid | number >= 1 |
| status | string Item status filter; omit (or |
| search | string |
| groupId | string or null <uuid> Group UUID; |
| marketItemIds | Array of strings <uuid> [ 1 .. 500 ] items [ items <uuid > ] Only these account items (rows selected in the item table). With |
| 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": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "marketItemIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "comparator": "older",
- "days": 7,
- "dryRun": true
}{- "dryRun": false,
- "comparator": "older",
- "days": 7,
- "matched": 5,
- "selected": 5,
- "cancelled": 4,
- "failed": 0,
- "stoppedBy": "steam_blocker",
- "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. dryRun: true counts them synchronously (503 when Steam listings cannot be read). Otherwise the removal is queued as a runner job — serialized with the account's other Steam work, at most 100 listings, sequential, stopped by a Steam rate limit/session error or a runner stop; unreadable listings remove nothing — with a market-state sync right behind it; the answer carries both job ids (…/decisions/jobs/{id}/result holds the outcome).
| steamAccountId required | string |
| x-idempotency-key | string <= 104 characters Client-generated key (1-104 visible ASCII characters, no spaces; surrounding whitespace is trimmed, anything else is a 400 |
| appid | number >= 1 |
| status | string Item status filter; omit (or |
| search | string |
| groupId | string or null <uuid> Group UUID; |
| marketItemIds | Array of strings <uuid> [ 1 .. 500 ] items [ items <uuid > ] Only these account items (rows selected in the item table). With |
| dryRun | boolean Only count matching live listings, remove nothing. |
{- "appid": 730,
- "status": "eligible",
- "search": "Case",
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "marketItemIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dryRun": true
}{- "dryRun": true,
- "found": 12,
- "selected": 12,
- "removed": 12,
- "failed": 0,
- "complete": true,
- "stoppedBy": "steam_blocker"
}Shared strategies: settings, groups and an item set you keep once and apply to several Steam accounts. Applying is explicit (preview, then apply a revision); an account never picks up a strategy change by itself.
| steamAccountId required | string |
| limit | number 1..100, default 50 |
| offset | number 0..1000000, default 0 |
{- "steamAccountId": "string",
- "attributionModel": "position_provenance",
- "observationModel": "stored_snapshot_not_live",
- "limit": 0,
- "offset": 0,
- "hasMore": true,
- "positions": [
- {
- "lotId": "string",
- "membershipId": "string",
- "attributionModel": "smr_internal_allocation",
- "totalCostMinor": 0,
- "acquiredAt": "2019-08-24T14:15:22Z",
- "membershipState": "active",
- "marketItemId": "string",
- "marketHashName": "string",
- "appid": 0,
- "contextid": "string",
- "assetId": "string",
- "currency": "string",
- "acquiredQuantity": 0,
- "disposedQuantity": 0,
- "openQuantity": 0,
- "evidenceState": "valid",
- "evidenceReason": "string",
- "inventory": [
- {
- "quantity": 0,
- "observedAt": "2019-08-24T14:15:22Z"
}
], - "listings": [
- {
- "quantity": 0,
- "observedAt": "2019-08-24T14:15:22Z",
- "listingId": "string"
}
]
}
]
}| strategyId required | string |
| steamAccountId required | string |
| limit | number 1..100, default 50 |
| offset | number 0..1000000, default 0 |
{- "strategyId": "string",
- "steamAccountId": "string",
- "attributionModel": "position_provenance",
- "observationModel": "stored_snapshot_not_live",
- "limit": 0,
- "offset": 0,
- "hasMore": true,
- "positions": [
- {
- "lotId": "string",
- "membershipId": "string",
- "attributionModel": "smr_internal_allocation",
- "totalCostMinor": 0,
- "acquiredAt": "2019-08-24T14:15:22Z",
- "membershipState": "active",
- "marketItemId": "string",
- "marketHashName": "string",
- "appid": 0,
- "contextid": "string",
- "assetId": "string",
- "currency": "string",
- "acquiredQuantity": 0,
- "disposedQuantity": 0,
- "openQuantity": 0,
- "evidenceState": "valid",
- "evidenceReason": "string",
- "inventory": [
- {
- "quantity": 0,
- "observedAt": "2019-08-24T14:15:22Z"
}
], - "listings": [
- {
- "quantity": 0,
- "observedAt": "2019-08-24T14:15:22Z",
- "listingId": "string"
}
]
}
]
}| strategyId required | string |
| steamAccountId required | string |
{- "protocol": "separate_positions_v1",
- "expectedAccountEpoch": 0,
- "expectedRevision": 1,
- "cutoverReadiness": "ready",
- "sharedMembershipsSupported": true,
- "strategyId": "string",
- "steamAccountId": "string",
- "membershipCount": 0,
- "memberships": [
- {
- "catalogItemId": "string",
- "marketItemId": "string",
- "membershipId": "string",
- "configGeneration": 0,
- "appliedRevision": 0,
- "buyEnabled": true,
- "sellEnabled": true,
- "effectiveSettings": { }
}
], - "preservedMembershipIds": [
- "string"
], - "retiredMembershipIds": [
- "string"
], - "maintenanceSettingsScope": "account",
- "attributionModel": "smr_internal_allocation"
}| strategyId required | string |
| steamAccountId required | string |
| protocol required | string Value: "separate_positions_v1" |
| expectedAccountEpoch required | integer [ 0 .. 2147483647 ] |
| expectedRevision required | integer [ 1 .. 2147483647 ] |
{- "protocol": "separate_positions_v1",
- "expectedAccountEpoch": 0,
- "expectedRevision": 1
}{- "protocol": "separate_positions_v1",
- "expectedAccountEpoch": 0,
- "expectedRevision": 1,
- "cutoverReadiness": "ready",
- "sharedMembershipsSupported": true,
- "strategyId": "string",
- "steamAccountId": "string",
- "membershipCount": 0,
- "memberships": [
- {
- "catalogItemId": "string",
- "marketItemId": "string",
- "membershipId": "string",
- "configGeneration": 0,
- "appliedRevision": 0,
- "buyEnabled": true,
- "sellEnabled": true,
- "effectiveSettings": { }
}
], - "preservedMembershipIds": [
- "string"
], - "retiredMembershipIds": [
- "string"
], - "maintenanceSettingsScope": "account",
- "attributionModel": "smr_internal_allocation",
- "membershipIds": [
- "string"
], - "accountEpoch": 0
}| strategyId required | string |
| steamAccountId required | string |
| protocol required | string Value: "separate_positions_v1" |
| expectedAccountEpoch required | integer [ 0 .. 2147483647 ] |
{- "protocol": "separate_positions_v1",
- "expectedAccountEpoch": 0
}{- "retiredMembershipIds": [
- "string"
], - "accountEpoch": 0
}| strategyId required | string |
| steamAccountId required | string |
| protocol required | string Value: "separate_positions_v1" |
| expectedAccountEpoch required | integer [ 0 .. 2147483647 ] |
| mode | string Enum: "active" "stop_buy" "sell_only" "stopped" |
| buyBudgetMinor | integer or null [ 0 .. 2000000000 ] Account wallet minor units. Null removes cap; omission preserves it. |
{- "protocol": "separate_positions_v1",
- "expectedAccountEpoch": 0,
- "mode": "active",
- "buyBudgetMinor": 2000000000
}{- "assignmentId": "string",
- "mode": "active",
- "buyBudgetMinor": 0,
- "accountEpoch": 0
}Runtime-settings keys a strategy owns. Everything else (exposure limit, intensity, runner game, live Steam checks, CS2 sticker/float guards) stays per account.
{- "keys": [
- "profitPercent",
- "minProfit",
- "sellAlgorithm"
]
}Uses the item owner at the sale time and complete cost basis after Steam fees. Only recorded ownership intervals contribute; currencies remain separate.
{- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z",
- "strategies": [
- {
- "strategyId": "c855e259-15d8-4385-a60f-bdf8f7695ef7",
- "trackingSince": "2019-08-24T14:15:22Z",
- "currencies": [
- {
- "currency": "string",
- "attributionModel": "legacy_sale_time_owner_fifo",
- "realizedPnl": 0,
- "netProceedsMinor": 0,
- "costBasis": 0,
- "roiPercent": 0,
- "salesCount": 0,
- "salesWithCostBasis": 0
}
], - "unknownCurrencySales": 0
}
]
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 3,
- "settings": { },
- "itemCount": 2116,
- "buyEnabledCount": 60,
- "sellEnabledCount": 120,
- "groupCount": 0,
- "accounts": [
- {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "buyBudget": 50,
- "displayName": "Main",
- "walletCurrency": "USD",
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true
}
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]From the platform template, as a copy of an account (its effective settings, groups and items of the game), or as an independent copy of another strategy. Nothing is assigned to accounts. A strategy is one rule set: copied groups are kept only so that the owner can make each one with its own rules a separate strategy (extract).
| name required | string <= 120 characters |
| appid | number Game of the strategy. Defaults to the source account's runner game (or its most tracked game), the source strategy's game, or Rust. |
object |
{- "name": "Rust — fast cheap",
- "appid": 252490,
- "source": {
- "type": "account",
- "steamAccountId": "11111111-1111-4111-8111-111111111111"
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 3,
- "settings": { },
- "itemCount": 2116,
- "buyEnabledCount": 60,
- "sellEnabledCount": 120,
- "groupCount": 0,
- "accounts": [
- {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "buyBudget": 50,
- "displayName": "Main",
- "walletCurrency": "USD",
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true
}
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "inboxTradeSettings": {
- "profitPercent": "10"
}, - "groups": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Fast Cheap",
- "sortOrder": 0,
- "tradeSettings": { },
- "itemCount": 60,
- "differences": [
- {
- "key": "profitPercent",
- "strategyValue": "6",
- "groupValue": "5"
}
]
}
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 3,
- "settings": { },
- "itemCount": 2116,
- "buyEnabledCount": 60,
- "sellEnabledCount": 120,
- "groupCount": 0,
- "accounts": [
- {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "buyBudget": 50,
- "displayName": "Main",
- "walletCurrency": "USD",
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true
}
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "inboxTradeSettings": {
- "profitPercent": "10"
}, - "groups": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Fast Cheap",
- "sortOrder": 0,
- "tradeSettings": { },
- "itemCount": 60,
- "differences": [
- {
- "key": "profitPercent",
- "strategyValue": "6",
- "groupValue": "5"
}
]
}
]
}Rename and/or patch settings (settings, and inboxTradeSettings for the account Inbox). A settings change bumps revision; accounts keep running the revision they applied until the change is applied to them.
| strategyId required | string |
| name | string <= 120 characters |
object Strategy settings with the same canonical keys as account runtime settings (see | |
object Partial patch of the overrides for the account Inbox (the system group of the strategy's game, items without a group), same semantics as |
{- "name": "Rust — fast cheap",
- "settings": {
- "profitPercent": "8",
- "monthTrend": null
}, - "inboxTradeSettings": {
- "profitPercent": "10"
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 3,
- "settings": { },
- "itemCount": 2116,
- "buyEnabledCount": 60,
- "sellEnabledCount": 120,
- "groupCount": 0,
- "accounts": [
- {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "buyBudget": 50,
- "displayName": "Main",
- "walletCurrency": "USD",
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true
}
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "inboxTradeSettings": {
- "profitPercent": "10"
}, - "groups": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Fast Cheap",
- "sortOrder": 0,
- "tradeSettings": { },
- "itemCount": 60,
- "differences": [
- {
- "key": "profitPercent",
- "strategyValue": "6",
- "groupValue": "5"
}
]
}
]
}A strategy is one rule set. The group becomes a new strategy: the strategy's settings with the group's overrides on top (account-wide keys stay the strategy's — the engine never read them from a group), and the group's items with their buy/sell flags. They leave this strategy, whose revision is bumped. Accounts do not change until the new strategy is assigned next to this one (taking its items over) and this one's new revision is applied.
| strategyId required | string |
| groupId required | string |
| name required | string <= 120 characters Name of the new strategy (unique among your strategies). |
{- "name": "Rust — fast cheap"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Rust — fast cheap",
- "appid": 252490,
- "revision": 3,
- "settings": { },
- "itemCount": 2116,
- "buyEnabledCount": 60,
- "sellEnabledCount": 120,
- "groupCount": 0,
- "accounts": [
- {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "mode": "active",
- "buyBudget": 50,
- "displayName": "Main",
- "walletCurrency": "USD",
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "upToDate": true
}
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "inboxTradeSettings": {
- "profitPercent": "10"
}, - "groups": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Fast Cheap",
- "sortOrder": 0,
- "tradeSettings": { },
- "itemCount": 60,
- "differences": [
- {
- "key": "profitPercent",
- "strategyValue": "6",
- "groupValue": "5"
}
]
}
]
}Its items stay in the strategy, ungrouped, and trade on the strategy's rules.
| strategyId required | string |
| groupId required | string |
{- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "deleted": true
}| strategyId required | string |
| drift | boolean Only items an assigned account does not hold as the strategy says: not tracked there yet, owned by another strategy, or other buy/sell. |
| accounts | boolean Also each item's state on the accounts the strategy is assigned to ( |
| groupId | string Strategy group id, or |
| search | string |
| pageSize | number |
| page | number |
{- "items": [
- {
- "analytics": {
- "currency": "string",
- "status": "eligible",
- "reason": "string",
- "buyPrice": 0,
- "sellPrice": 0,
- "profit": 0,
- "profitPercent": 0,
- "sales24h": 0,
- "sales7d": 0,
- "coefficient": 0,
- "marketFloor": 0,
- "checkedAt": "2019-08-24T14:15:22Z"
}, - "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "catalogItemId": "29b1d1d1-e291-455b-a461-73ea206c4445",
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "buyEnabled": true,
- "sellEnabled": true,
- "marketHashName": "Blackout Hoodie",
- "displayName": "string",
- "iconUrl": "string",
- "accounts": [
- {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "displayName": "main",
- "tracked": true,
- "owner": "this",
- "otherStrategyName": "string",
- "buyEnabled": true,
- "sellEnabled": true,
- "inventoryCount": 2,
- "activeListingCount": 1,
- "buyOrderQuantity": 3,
- "status": "trading",
- "reason": "string",
- "drift": {
- "buyEnabled": true
}
}
]
}
], - "total": 2116,
- "page": 1,
- "pageSize": 50,
- "accountsDriftCount": 3
}| strategyId required | string |
| catalogItemIds required | Array of strings <uuid> <= 1000 items [ items <uuid > ] Catalog item ids of the strategy's game. |
| buyEnabled | boolean |
| sellEnabled | boolean |
{- "catalogItemIds": [
- "22222222-2222-4222-8222-222222222222"
], - "buyEnabled": false,
- "sellEnabled": true
}{- "added": 10,
- "alreadyPresent": 2
}Adds the catalog items an account's catalog picks with these filters (prices, sales and eligibility in the account's wallet currency and settings) to the strategy, in the strategy's game. The account itself gets them only when the strategy is applied to it.
| strategyId required | string |
| steamAccountId required | string <uuid> The account whose catalog view (wallet currency, settings) picks the items. |
| mode | string Enum: "eligible" "all" |
| search | string <= 200 characters |
| groupId | string Account group UUID whose settings judge eligibility; none = the account settings. |
| 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 > ] Only these catalog items (still filtered as above). |
| buyEnabled | boolean |
| sellEnabled | boolean |
{- "steamAccountId": "11111111-1111-4111-8111-111111111111",
- "mode": "eligible",
- "search": "Hoodie",
- "groupId": "string",
- "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"
], - "buyEnabled": false,
- "sellEnabled": true
}{- "added": 10,
- "alreadyPresent": 2,
- "matched": 12,
- "truncated": false
}Adds the account's tracked items of the strategy's game that the strategy does not have yet, with their buy/sell flags.
| strategyId required | string |
| steamAccountId required | string <uuid> |
| onlyTrading | boolean Only items with buying or selling enabled on the account. |
{- "steamAccountId": "11111111-1111-4111-8111-111111111111",
- "onlyTrading": true
}{- "added": 10,
- "alreadyPresent": 2
}| strategyId required | string |
| itemIds | Array of strings <uuid> [ items <uuid > ] Strategy item ids. Either |
object Every item matching the filter ( | |
required | object |
{- "itemIds": [
- "33333333-3333-4333-8333-333333333333"
], - "filter": {
- "groupId": "none",
- "search": "Hoodie"
}, - "patch": {
- "buyEnabled": true
}
}{- "updated": 10
}On the next apply, accounts stop buying these items; selling is left as is.
| strategyId required | string |
| itemIds | Array of strings <uuid> [ items <uuid > ] |
object (StrategyItemFilterDto) |
{- "itemIds": [
- "33333333-3333-4333-8333-333333333333"
], - "filter": {
- "groupId": "none",
- "search": "Hoodie"
}
}{- "deleted": 10
}Name search; at least 2 characters are required.
| strategyId required | string |
| pageSize | number |
| page | number |
| search required | string |
{- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "marketHashName": "Blackout Hoodie",
- "displayName": "string",
- "iconUrl": "string",
- "inStrategy": true
}
], - "total": 12,
- "page": 1,
- "pageSize": 20
}Every change that bumps revision stores an immutable snapshot of the strategy (settings, Inbox settings, groups, items). Newest first, with the accounts that currently run each revision.
| strategyId required | string |
| pageSize | number |
| page | number |
{- "currentRevision": 4,
- "versions": [
- {
- "revision": 4,
- "name": "Rust — fast cheap",
- "current": true,
- "itemCount": 2116,
- "buyEnabledCount": 60,
- "sellEnabledCount": 120,
- "groupCount": 1,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": "25a02396-1048-48f9-bf93-102d2fb7895e",
- "accounts": [
- {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "displayName": "Main"
}
]
}
], - "unrecordedAccounts": [
- {
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "displayName": "Main",
- "appliedRevision": 2
}
], - "total": 4,
- "page": 1,
- "pageSize": 20
}Settings, Inbox settings, groups and item counts of the revision. 404 STRATEGY_VERSION_NOT_FOUND for a revision that was never stored (applied before versions existed).
| strategyId required | string |
| revision required | number |
{- "revision": 4,
- "current": true,
- "name": "Rust — fast cheap",
- "appid": 252490,
- "settings": { },
- "inboxTradeSettings": { },
- "groups": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Fast Cheap",
- "sortOrder": 0,
- "tradeSettings": { }
}
], - "itemCount": 2116,
- "buyEnabledCount": 60,
- "sellEnabledCount": 120,
- "groupCount": 1,
- "createdAt": "2019-08-24T14:15:22Z",
- "createdBy": "25a02396-1048-48f9-bf93-102d2fb7895e"
}Settings, Inbox, groups (by id) and items (by catalog item) between from and to. Defaults: to = the latest revision, from = the one before it.
| strategyId required | string |
| to | number |
| from | number |
{- "from": {
- "revision": 3,
- "name": "Rust — fast cheap"
}, - "to": {
- "revision": 3,
- "name": "Rust — fast cheap"
}, - "identical": true,
- "settings": [
- {
- "key": "profitPercent",
- "before": "8",
- "after": "6"
}
], - "inbox": {
- "managedBefore": true,
- "managedAfter": true,
- "changes": [
- {
- "key": "profitPercent",
- "before": "8",
- "after": "6"
}
]
}, - "groups": {
- "added": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Fast Cheap"
}
], - "removed": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Fast Cheap"
}
], - "changed": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Fast Cheap",
- "previousName": "Fast",
- "sortOrder": {
- "before": 0,
- "after": 2
}, - "settings": [
- {
- "key": "profitPercent",
- "before": "8",
- "after": "6"
}
]
}
]
}, - "items": {
- "added": 3,
- "removed": 1,
- "changed": 2,
- "entries": [
- {
- "catalogItemId": "29b1d1d1-e291-455b-a461-73ea206c4445",
- "marketHashName": "Blackout Hoodie",
- "displayName": "string",
- "change": "added",
- "before": {
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "groupName": "Fast Cheap",
- "buyEnabled": true,
- "sellEnabled": true
}, - "after": {
- "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
- "groupName": "Fast Cheap",
- "buyEnabled": true,
- "sellEnabled": true
}
}
], - "truncated": true
}
}Every assignment of the account with its mode, BUY budget, applied revision and owned items, the materialization layout and the buy orders waiting for a strategy cancellation.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "layout": "account",
- "strategyEpoch": 3,
- "pendingBuyOrderCancellations": {
- "cancellable": 3,
- "pendingSync": 0
}, - "assignments": [
- {
- "assignmentId": "dbf5135c-beb7-4185-80db-2e980c77381b",
- "strategyId": "c855e259-15d8-4385-a60f-bdf8f7695ef7",
- "strategyName": "Rust — fast cheap",
- "appliedRevision": 3,
- "appliedAt": "2019-08-24T14:15:22Z",
- "mode": "active",
- "upToDate": true,
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "modeChangedAt": "2019-08-24T14:15:22Z",
- "ownedItems": 120,
- "ownedBuyEnabled": 60,
- "openBuyOrders": 4,
- "buyBudget": 50,
- "buyCommitted": 12.4,
- "appid": 252490,
- "revision": 4
}
]
}Queues the cancellation of open buy orders of items whose strategy is in stop BUY / sell-only / stopped mode or released them. The runner tick does this by itself while the runner is running.
| steamAccountId required | string |
{- "cancellable": 3,
- "pendingSync": 0,
- "enqueued": true,
- "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76"
}Runner state of the account (running, stopped, blocked, …), why it is blocked, Steam cooldown and safety verdict.
| steamAccountId required | string |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "status": "running",
- "currentJob": null,
- "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
}, - "safety": {
- "allowed": true,
- "reasons": [
- "string"
]
}
}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 and have a shared strategy assigned. This places real buy orders and listings on Steam.
| steamAccountId required | string |
| x-idempotency-key | string <= 104 characters Client-generated key (1-104 visible ASCII characters, no spaces; surrounding whitespace is trimmed, anything else is a 400 |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "queuedJobs": [
- {
- "type": "sell_analysis",
- "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76",
- "bullJobId": "bull-job-1"
}
], - "blockedReason": "runner_queue_paused",
- "status": "running",
- "currentJob": null
}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 a manual cycle now (session health, market-state sync, buy and sell analysis; a type queued by a manual cycle less than a minute ago is skipped) instead of waiting for the next scheduler tick. Only for a running runner: on any other state press Start first. Poll the returned jobQueueIds via the decisions endpoints.
| steamAccountId required | string |
| x-idempotency-key | string <= 104 characters Client-generated key (1-104 visible ASCII characters, no spaces; surrounding whitespace is trimmed, anything else is a 400 |
{- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "queuedJobs": [
- {
- "type": "sell_analysis",
- "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76",
- "bullJobId": "bull-job-1"
}
], - "blockedReason": "runner_queue_paused"
}Operator tool for assets whose sell listing is stuck (e.g. pending a confirmation that does not exist). Defaults to dryRun: true and mode: diagnostics_only: a read-only preview answered synchronously with the cleanup report. With dryRun: false any other mode (it may cancel and relist on Steam) is queued as a runner job — serialized with the account's other Steam work and stopped by a runner stop — and the answer is its jobQueueId: follow it through the decisions job endpoints (…/result holds the report).
| steamAccountId required | string |
| x-idempotency-key | string <= 104 characters Client-generated key (1-104 visible ASCII characters, no spaces; surrounding whitespace is trimmed, anything else is a 400 |
| 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 (read-only preview, answered synchronously) — 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" "strategy_cancel_buy_orders" |
| 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": "string"
}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": null,
- "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
}, - "safety": {
- "allowed": true,
- "reasons": [
- "string"
]
}
}, - "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,
- "cost": 600,
- "trades": 3,
- "wins": 2
}
]
}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": "live_steam_listing",
- "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",
- "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
- "marketItemId": "c22ca94e-d32e-4075-bcba-f188e21855ae",
- "appid": 252490,
- "marketHashName": "Blue Hoodie",
- "side": "buy",
- "quantity": 1,
- "unitPrice": 13,
- "fee": 0,
- "net": 13,
- "currency": "USD",
- "source": "myhistory",
- "externalId": "string",
- "sourceAssetId": "string",
- "occurredAt": "2019-08-24T14:15:22Z",
- "occurredAtPrecision": "date_only",
- "ingestedAt": "2019-08-24T14:15:22Z",
- "createdAt": "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,
- "skipped": "wallet_currency_unknown"
}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. Requests without valid credentials get 401 UNAUTHORIZED; 403 FORBIDDEN means authenticated but not allowed.
{- "errorCodes": [
- {
- "code": "VALIDATION_FAILED",
- "statusCode": 400,
- "retryable": false
}
]
}Headers the API understands, its endpoints by kind, and the auth level of each — derived from the routes the running app registered.
{- "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"
]
}, - "auth": {
- "GET /health": "public",
- "GET /steam-accounts": "authenticated",
- "GET /jobs": "admin"
}
}Ceilings the server enforces on per-account trading intensity settings (maxCandidates, requestDelayMs). Platform-wide; the same for every tenant.
{- "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
}
}
}