Перейти к основному содержимому

SteamMarketRunner API (0.1.0)

Download OpenAPI specification:Download

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

Authentication

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

  • Service API key — send x-api-key: <key> (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.
  • Session cookie — 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.

Errors

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

Money and units

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

Background jobs

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

auth

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

Start Google sign-in

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

query Parameters
returnTo
any

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

Responses

Response samples

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

Google sign-in callback

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

query Parameters
state
any
code
any

Responses

Response samples

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

Create a user account

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

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

Responses

Request samples

Content type
application/json
{
  • "email": "tenant@example.com",
  • "password": "aStrongPassphrase"
}

Response samples

Content type
application/json
{
  • "status": "verification_required",
  • "email": "tenant@example.com"
}

Resend the verification email

Request Body schema: application/json
required
email
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "tenant@example.com"
}

Response samples

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

Confirm email address

Confirms the email with the token from the verification link and signs the user in (sets the session cookie). 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.

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

The password chosen at signup. Required to confirm the email: without it the answer is 400 password_required, with a different one 400 password_mismatch (the link stays valid). An older, still unverified account is confirmed with its current password.

Responses

Request samples

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

Response samples

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

Log in

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

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

Responses

Request samples

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

Response samples

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

Request a password reset email

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

Request Body schema: application/json
required
email
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "tenant@example.com"
}

Response samples

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

Set a new password

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

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

Responses

Request samples

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

Response samples

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

Get the signed-in user

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

Responses

Response samples

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

Log out

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

Responses

Response samples

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

Inspect the calling service key

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

Authorizations:
serviceApiKey

Responses

Response samples

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

List my service API keys

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

Authorizations:
session

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a service API key

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

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

Responses

Request samples

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

Response samples

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

Revoke a service API key

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

Authorizations:
session
path Parameters
id
required
string

Responses

Response samples

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

preferences

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

Get my preferences

Authorizations:
serviceApiKeysession

Responses

Response samples

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

Update my preferences

Sets the display currency used for cross-account totals.

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

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

Responses

Request samples

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

Response samples

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

notifications

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

Get alert delivery settings

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

Authorizations:
serviceApiKeysession

Responses

Response samples

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

Update alert delivery settings

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

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

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

telegramChatId
string or null <= 64 characters

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

webhookUrl
string or null <uri> <= 2048 characters

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

Responses

Request samples

Content type
application/json
{}

Response samples

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

Alert feed

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

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

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Activity feed

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

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

Responses

Response samples

Content type
application/json
[
  • {
    }
]

announcements

Platform announcements shown in the cabinet.

Active announcements

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

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

Preferred translation (falls back to the default text).

Responses

Response samples

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

Dismiss an announcement

Authorizations:
serviceApiKeysession
path Parameters
id
required
string

Responses

Response samples

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

steam-accounts

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

Connect a Steam account

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

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

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

object (UpsertSteamAccountSecretsDto)
object (UpsertProxyProfileDto)

Responses

Request samples

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

Response samples

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

List my Steam accounts

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a Steam account

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

Rename or change status

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

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

Responses

Request samples

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

Response samples

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

Delete a Steam account

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

Retry account setup

Queues the safe setup bootstrap job again (Steam sign-in, wallet and inventory sync). Returns the queued job; poll it via the decisions endpoints. Repeated calls within the same minute return the same job. Send x-idempotency-key to decide what counts as the same request yourself.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
header Parameters
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 invalid_idempotency_key). Repeating a request with the same key for the same account returns the original job instead of enqueuing a duplicate.

Responses

Response samples

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

Save Steam credentials

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

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

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

Responses

Request samples

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

Response samples

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

Which credentials are stored

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

Account activity log

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

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

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

requestId
any
actorName
any
actorType
string
Enum: "owner" "service_api"
appid
integer >= 1

Only events of this game (multi-game accounts).

category
any

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

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

Responses

Response samples

Content type
application/json
[
  • {
    }
]

account-setup-status

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

Account setup checklist

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

proxy

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

Get the account proxy

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

Set the account proxy

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

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

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

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

Responses

Request samples

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

Response samples

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

Test the account proxy

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

market-state

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

List tracked items

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
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 none for items no strategy owns.

priceCondition
string
Enum: "attention" "missing" "stale"

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

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

Group UUID, or none for ungrouped items.

status
any

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

search
any

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

appid
integer >= 1

Only items of this Steam app id.

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

Responses

Response samples

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

Get account portfolio

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

Get item order book

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
itemId
required
string

Responses

Response samples

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

Move items to a group

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

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

Responses

Request samples

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

Response samples

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

Stop tracking items

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

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

Responses

Request samples

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

Response samples

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

Enable/disable buying or selling for many items

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

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

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

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

Responses

Request samples

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

Response samples

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

Enable/disable buying or selling for an item

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

Responses

Request samples

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

Response samples

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

Cancel the item's buy order on Steam

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
itemId
required
string

Responses

Response samples

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

Remove the item's sell listings on Steam

Synchronously removes every live Steam listing of this item and re-reads the inventory. Returns 400 (BAD_REQUEST) when the item has no live listings, 503 when Steam listings cannot be read (or the set is incomplete and lacks the item).

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
itemId
required
string

Responses

Response samples

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

Browse the market catalog

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
strategyId
string <uuid>

A strategy the account runs that the items are picked for: each item then says whether it already has it (inStrategy).

excludeCasesKeysToolsOther
boolean
excludeCharms
boolean
excludeGraffiti
boolean
excludeAgents
boolean
excludeSouvenirs
boolean
excludeStickersPatches
boolean
excludeWeapons
boolean
salesPerDayMax
number >= 0
salesPerDayMin
number >= 0
priceMax
number >= 0
priceMin
number >= 0
groupId
any

Evaluate eligibility with this group's strategy.

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

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "page": 1,
  • "pageSize": 100,
  • "pageCount": 18,
  • "total": 651,
  • "matched": 39330,
  • "truncated": true,
  • "scanLimit": 1000,
  • "currency": "USD"
}

List items under market hold

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

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

Group UUID, or ungrouped (or none) for ungrouped items.

appid
integer >= 1

Responses

Response samples

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

Track items from the Steam inventory

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

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

Responses

Request samples

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

Response samples

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

Track catalog items

Adds catalog items matching the filter (or catalogItemIds) to the account. Without catalogItemIds only the most liquid matches (the catalog listing's scanLimit) are considered, so "add all" adds exactly what GET …/catalog counted.

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

Same text filter as the catalog listing.

groupId
string

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

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

Responses

Request samples

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

Response samples

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

Create an item group

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

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

Responses

Request samples

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

Response samples

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

List item groups

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Update an item group

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

Responses

Request samples

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

Response samples

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

Delete an item group

Deletes the group and stops tracking the items in it; 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.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
groupId
required
string
query Parameters
keepItems
boolean

Keep the items tracked, without a group.

Responses

Response samples

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

Save trading settings

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

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

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

property name*
additional property
any

Responses

Request samples

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

Response samples

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

Get trading settings

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).

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

List positions across accounts

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.

Authorizations:
serviceApiKeysession
query Parameters
sortOrder
string
Enum: "asc" "desc"
sortBy
string
Enum: "name" "account" "inventory" "listings" "orders"
includeEmpty
boolean
strategyId
any

Owning strategy UUID, or none for items no strategy owns.

steamAccountId
string <uuid>
search
string
appid
number
pageSize
number
page
number

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 120,
  • "page": 1,
  • "pageSize": 50
}

Cancel buy orders by age

Cancels live buy orders placed more (older) or less (younger) than days ago, optionally restricted to the filtered item set. 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).

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
header Parameters
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 invalid_idempotency_key). Repeating a request with the same key for the same account returns the original job instead of enqueuing a duplicate.

Request Body schema: application/json
required
appid
number >= 1
status
string

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

search
string
groupId
string or null <uuid>

Group UUID; null = items without a group.

marketItemIds
Array of strings <uuid> [ 1 .. 500 ] items [ items <uuid > ]

Only these account items (rows selected in the item table). With comparator: older, days: 0 their buy orders are cancelled whatever their age.

comparator
required
string
Enum: "older" "younger"

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

days
required
number >= 0
dryRun
boolean

Preview the matching orders without cancelling anything.

Responses

Request samples

Content type
application/json
{
  • "appid": 730,
  • "status": "eligible",
  • "search": "Case",
  • "groupId": "eb54e96e-21b8-4f54-9cd4-80fccbd06f55",
  • "marketItemIds": [
    ],
  • "comparator": "older",
  • "days": 7,
  • "dryRun": true
}

Response samples

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

Remove live sell listings

Panic action: removes the account's live Steam sell listings (including ones created outside SteamMarketRunner), optionally only those of the filtered item set. 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).

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
header Parameters
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 invalid_idempotency_key). Repeating a request with the same key for the same account returns the original job instead of enqueuing a duplicate.

Request Body schema: application/json
optional
appid
number >= 1
status
string

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

search
string
groupId
string or null <uuid>

Group UUID; null = items without a group.

marketItemIds
Array of strings <uuid> [ 1 .. 500 ] items [ items <uuid > ]

Only these account items (rows selected in the item table). With comparator: older, days: 0 their buy orders are cancelled whatever their age.

dryRun
boolean

Only count matching live listings, remove nothing.

Responses

Request samples

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

Response samples

Content type
application/json
Example
{
  • "dryRun": true,
  • "found": 12,
  • "selected": 12,
  • "removed": 12,
  • "failed": 0,
  • "complete": true,
  • "stoppedBy": "steam_blocker"
}

strategies

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.

Read recorded account holdings without strategy attribution (not live)

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
query Parameters
limit
number

1..100, default 50

offset
number

0..1000000, default 0

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "string",
  • "attributionModel": "position_provenance",
  • "observationModel": "stored_snapshot_not_live",
  • "limit": 0,
  • "offset": 0,
  • "hasMore": true,
  • "positions": [
    ]
}

Read recorded allocated lots and exact stored asset/listing observations (not live)

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
steamAccountId
required
string
query Parameters
limit
number

1..100, default 50

offset
number

0..1000000, default 0

Responses

Response samples

Content type
application/json
{
  • "strategyId": "string",
  • "steamAccountId": "string",
  • "attributionModel": "position_provenance",
  • "observationModel": "stored_snapshot_not_live",
  • "limit": 0,
  • "offset": 0,
  • "hasMore": true,
  • "positions": [
    ]
}

Preview additive separate-position memberships (backend opt-in)

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "protocol": "separate_positions_v1",
  • "expectedAccountEpoch": 0,
  • "expectedRevision": 1,
  • "cutoverReadiness": "ready",
  • "sharedMembershipsSupported": true,
  • "strategyId": "string",
  • "steamAccountId": "string",
  • "membershipCount": 0,
  • "memberships": [
    ],
  • "preservedMembershipIds": [
    ],
  • "retiredMembershipIds": [
    ],
  • "maintenanceSettingsScope": "account",
  • "attributionModel": "smr_internal_allocation"
}

Apply additive memberships (backend opt-in, default disabled)

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
steamAccountId
required
string
Request Body schema: application/json
required
protocol
required
string
Value: "separate_positions_v1"
expectedAccountEpoch
required
integer [ 0 .. 2147483647 ]
expectedRevision
required
integer [ 1 .. 2147483647 ]

Responses

Request samples

Content type
application/json
{
  • "protocol": "separate_positions_v1",
  • "expectedAccountEpoch": 0,
  • "expectedRevision": 1
}

Response samples

Content type
application/json
{
  • "protocol": "separate_positions_v1",
  • "expectedAccountEpoch": 0,
  • "expectedRevision": 1,
  • "cutoverReadiness": "ready",
  • "sharedMembershipsSupported": true,
  • "strategyId": "string",
  • "steamAccountId": "string",
  • "membershipCount": 0,
  • "memberships": [
    ],
  • "preservedMembershipIds": [
    ],
  • "retiredMembershipIds": [
    ],
  • "maintenanceSettingsScope": "account",
  • "attributionModel": "smr_internal_allocation",
  • "membershipIds": [
    ],
  • "accountEpoch": 0
}

Retire memberships while preserving lot exits (gated)

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
steamAccountId
required
string
Request Body schema: application/json
required
protocol
required
string
Value: "separate_positions_v1"
expectedAccountEpoch
required
integer [ 0 .. 2147483647 ]

Responses

Request samples

Content type
application/json
{
  • "protocol": "separate_positions_v1",
  • "expectedAccountEpoch": 0
}

Response samples

Content type
application/json
{
  • "retiredMembershipIds": [
    ],
  • "accountEpoch": 0
}

Change membership assignment mode/minor-unit budget (gated)

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
steamAccountId
required
string
Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "protocol": "separate_positions_v1",
  • "expectedAccountEpoch": 0,
  • "mode": "active",
  • "buyBudgetMinor": 2000000000
}

Response samples

Content type
application/json
{
  • "assignmentId": "string",
  • "mode": "active",
  • "buyBudgetMinor": 0,
  • "accountEpoch": 0
}

List strategy-owned setting keys

Runtime-settings keys a strategy owns. Everything else (exposure limit, intensity, runner game, live Steam checks, CS2 sticker/float guards) stays per account.

Authorizations:
serviceApiKeysession

Responses

Response samples

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

Realized strategy profit over the last 30 days

Uses the item owner at the sale time and complete cost basis after Steam fees. Only recorded ownership intervals contribute; currencies remain separate.

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
{
  • "from": "2019-08-24T14:15:22Z",
  • "to": "2019-08-24T14:15:22Z",
  • "strategies": [
    ]
}

List strategies

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a strategy

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).

Authorizations:
serviceApiKeysession
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "name": "Rust — fast cheap",
  • "appid": 252490,
  • "source": {
    }
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "Rust — fast cheap",
  • "appid": 252490,
  • "revision": 3,
  • "settings": { },
  • "itemCount": 2116,
  • "buyEnabledCount": 60,
  • "sellEnabledCount": 120,
  • "groupCount": 0,
  • "accounts": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "inboxTradeSettings": {
    },
  • "groups": [
    ]
}

Get a strategy

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "Rust — fast cheap",
  • "appid": 252490,
  • "revision": 3,
  • "settings": { },
  • "itemCount": 2116,
  • "buyEnabledCount": 60,
  • "sellEnabledCount": 120,
  • "groupCount": 0,
  • "accounts": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "inboxTradeSettings": {
    },
  • "groups": [
    ]
}

Update a strategy

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.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
Request Body schema: application/json
required
name
string <= 120 characters
object

Strategy settings with the same canonical keys as account runtime settings (see GET /strategies/setting-keys). Numbers may be sent as numbers or numeric strings; null or "" removes a key. Money values are major units of each account's wallet currency. Partial: omitted keys are kept.

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 settings. On a strategy whose inboxTradeSettings is null any patch (even {}) makes it manage the Inbox.

Responses

Request samples

Content type
application/json
{
  • "name": "Rust — fast cheap",
  • "settings": {
    },
  • "inboxTradeSettings": {
    }
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "Rust — fast cheap",
  • "appid": 252490,
  • "revision": 3,
  • "settings": { },
  • "itemCount": 2116,
  • "buyEnabledCount": 60,
  • "sellEnabledCount": 120,
  • "groupCount": 0,
  • "accounts": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "inboxTradeSettings": {
    },
  • "groups": [
    ]
}

Delete a strategy

Refused (409) while any account uses the strategy.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string

Responses

Response samples

Content type
application/json
{
  • "strategyId": "c855e259-15d8-4385-a60f-bdf8f7695ef7",
  • "deleted": true
}

Make a strategy group a separate strategy

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.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
groupId
required
string
Request Body schema: application/json
required
name
required
string <= 120 characters

Name of the new strategy (unique among your strategies).

Responses

Request samples

Content type
application/json
{
  • "name": "Rust — fast cheap"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "name": "Rust — fast cheap",
  • "appid": 252490,
  • "revision": 3,
  • "settings": { },
  • "itemCount": 2116,
  • "buyEnabledCount": 60,
  • "sellEnabledCount": 120,
  • "groupCount": 0,
  • "accounts": [
    ],
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z",
  • "inboxTradeSettings": {
    },
  • "groups": [
    ]
}

Delete a strategy group

Its items stay in the strategy, ungrouped, and trade on the strategy's rules.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
groupId
required
string

Responses

Response samples

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

List strategy items

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
query Parameters
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 (items[].accounts, accountsDriftCount).

groupId
string

Strategy group id, or none for ungrouped items.

search
string
pageSize
number
page
number

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 2116,
  • "page": 1,
  • "pageSize": 50,
  • "accountsDriftCount": 3
}

Add catalog items

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
Request Body schema: application/json
required
catalogItemIds
required
Array of strings <uuid> <= 1000 items [ items <uuid > ]

Catalog item ids of the strategy's game.

buyEnabled
boolean
sellEnabled
boolean

Responses

Request samples

Content type
application/json
{
  • "catalogItemIds": [
    ],
  • "buyEnabled": false,
  • "sellEnabled": true
}

Response samples

Content type
application/json
{
  • "added": 10,
  • "alreadyPresent": 2
}

Add items picked in an account catalog

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.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "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": [
    ],
  • "buyEnabled": false,
  • "sellEnabled": true
}

Response samples

Content type
application/json
{
  • "added": 10,
  • "alreadyPresent": 2,
  • "matched": 12,
  • "truncated": false
}

Import items from an account

Adds the account's tracked items of the strategy's game that the strategy does not have yet, with their buy/sell flags.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
Request Body schema: application/json
required
steamAccountId
required
string <uuid>
onlyTrading
boolean

Only items with buying or selling enabled on the account.

Responses

Request samples

Content type
application/json
{
  • "steamAccountId": "11111111-1111-4111-8111-111111111111",
  • "onlyTrading": true
}

Response samples

Content type
application/json
{
  • "added": 10,
  • "alreadyPresent": 2
}

Update strategy items in bulk

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

Strategy item ids. Either itemIds or filter.

object

Every item matching the filter ({} = all items).

required
object

Responses

Request samples

Content type
application/json
{
  • "itemIds": [
    ],
  • "filter": {
    },
  • "patch": {
    }
}

Response samples

Content type
application/json
{
  • "updated": 10
}

Remove strategy items in bulk

On the next apply, accounts stop buying these items; selling is left as is.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
Request Body schema: application/json
required
itemIds
Array of strings <uuid> [ items <uuid > ]
object (StrategyItemFilterDto)

Responses

Request samples

Content type
application/json
{
  • "itemIds": [
    ],
  • "filter": {
    }
}

Response samples

Content type
application/json
{
  • "deleted": 10
}

Search the catalog of the strategy's game

Name search; at least 2 characters are required.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
query Parameters
pageSize
number
page
number
search
required
string

Responses

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": 12,
  • "page": 1,
  • "pageSize": 20
}

List stored revisions of a strategy

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.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
query Parameters
pageSize
number
page
number

Responses

Response samples

Content type
application/json
{
  • "currentRevision": 4,
  • "versions": [
    ],
  • "unrecordedAccounts": [
    ],
  • "total": 4,
  • "page": 1,
  • "pageSize": 20
}

Get a stored revision of a strategy

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).

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
revision
required
number

Responses

Response samples

Content type
application/json
{
  • "revision": 4,
  • "current": true,
  • "name": "Rust — fast cheap",
  • "appid": 252490,
  • "settings": { },
  • "inboxTradeSettings": { },
  • "groups": [
    ],
  • "itemCount": 2116,
  • "buyEnabledCount": 60,
  • "sellEnabledCount": 120,
  • "groupCount": 1,
  • "createdAt": "2019-08-24T14:15:22Z",
  • "createdBy": "25a02396-1048-48f9-bf93-102d2fb7895e"
}

Diff two revisions of a strategy

Settings, Inbox, groups (by id) and items (by catalog item) between from and to. Defaults: to = the latest revision, from = the one before it.

Authorizations:
serviceApiKeysession
path Parameters
strategyId
required
string
query Parameters
to
number
from
number

Responses

Response samples

Content type
application/json
{
  • "from": {
    },
  • "to": {
    },
  • "identical": true,
  • "settings": [
    ],
  • "inbox": {
    },
  • "groups": {
    },
  • "items": {
    }
}

List the strategies an account runs

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.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "steamAccountId": "48aaee53-8302-4970-b717-8faa8713330a",
  • "layout": "account",
  • "strategyEpoch": 3,
  • "pendingBuyOrderCancellations": {
    },
  • "assignments": [
    ]
}

Cancel the buy orders strategies stopped buying, now

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.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "cancellable": 3,
  • "pendingSync": 0,
  • "enqueued": true,
  • "jobQueueId": "4e8df10a-ec05-4672-82ee-3a1100dc2c76"
}

trading

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

Get trading runner status

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{
  • "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": {
    },
  • "safety": {
    }
}

Trading diagnostics

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{ }

Start trading

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
header Parameters
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 invalid_idempotency_key). Repeating a request with the same key for the same account returns the original job instead of enqueuing a duplicate.

Responses

Response samples

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

Stop trading

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

Run a trading cycle now

Queues 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.

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
header Parameters
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 invalid_idempotency_key). Repeating a request with the same key for the same account returns the original job instead of enqueuing a duplicate.

Responses

Response samples

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

Inspect / repair stuck sell listings

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).

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
header Parameters
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 invalid_idempotency_key). Repeating a request with the same key for the same account returns the original job instead of enqueuing a duplicate.

Request Body schema: application/json
required
assetids
required
Array of strings non-empty

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

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

diagnostics_only only reports (always a preview). Other modes release stale local blockers and/or cancel and relist the asset on Steam.

dryRun
boolean
Default: true

Defaults to true (read-only preview, answered synchronously) — pass false explicitly to act on Steam: the repair is then queued as a runner job.

appid
number >= 1

Responses

Request samples

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

Response samples

Content type
application/json
Example
{ }

decisions

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

Buy-order competitiveness diagnostics

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

List background jobs

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

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

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

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

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get a job's result

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
jobQueueId
required
string

Responses

Response samples

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

Retry a failed job

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
jobQueueId
required
string

Responses

Response samples

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

Cancel a job

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
jobQueueId
required
string

Responses

Response samples

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

Get a job

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string
jobQueueId
required
string

Responses

Response samples

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

account-dashboard

Aggregated dashboard data across accounts and per account.

Dashboard overview

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

Authorizations:
serviceApiKeysession

Responses

Response samples

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

Account dashboard

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

trading-stats

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

Realized P&L

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

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

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

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

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

Responses

Response samples

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

Daily net-worth series

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

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

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

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

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

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

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

Responses

Response samples

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

P&L timeline

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

Open positions below cost

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

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

Trade ledger

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

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

Clamped to 1–500.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Cost-basis repair diagnostics

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

Authorizations:
serviceApiKeysession
path Parameters
steamAccountId
required
string

Responses

Response samples

Content type
application/json
{ }

Import Steam market history now

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

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

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

Responses

Response samples

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

Portfolio statistics

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

Authorizations:
serviceApiKeysession

Responses

Response samples

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

Portfolio daily series

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

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

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

Responses

Response samples

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

currency

Exchange rates used for display-currency conversion.

Exchange rates

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

Authorizations:
serviceApiKeysession

Responses

Response samples

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

games

Supported games (Steam app ids).

Supported games

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

Authorizations:
serviceApiKeysession

Responses

Response samples

Content type
application/json
[
  • {
    }
]

meta

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

Error codes

Generic error.code values with their HTTP status and whether retrying may help. Requests without valid credentials get 401 UNAUTHORIZED; 403 FORBIDDEN means authenticated but not allowed.

Responses

Response samples

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

API capabilities

Headers the API understands, its endpoints by kind, and the auth level of each — derived from the routes the running app registered.

Responses

Response samples

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

Trading intensity limits

Ceilings the server enforces on per-account trading intensity settings (maxCandidates, requestDelayMs). Platform-wide; the same for every tenant.

Authorizations:
serviceApiKeysession

Responses

Response samples

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

API version and build

Responses

Response samples

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

health

Liveness and readiness probes.

Liveness probe

Always 200 while the process serves HTTP.

Responses

Response samples

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

Readiness probe

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

Responses

Response samples

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