DMarket trading API (v2.0.0)

Download OpenAPI specification:

Welcome to the DMarket Trading API section. Our JSON-based API enables you to manage your DMarket inventory through the methods featured below. In order to use the API, please generate your personal API keys in the account settings.

Request signature instructions

A valid HTTP request to the trading API must include 3 request headers:

  1. X-Api-Key: public key (must be a hex string in lowercase) To get you your own public key, use https://dmarket.com/ (details : https://dmarket.com/faq#tradingAPI)

  2. X-Sign-Date: timestamp or current time Example: 1605619994. Must not be older than 2 minutes from the request time.

  3. X-Request-Sign: signature

The Ed25519 signature scheme is used for signing requests and proving items’ origin and ownership through public-private key pairs. Private and public keys diversification is aimed to provide secure back-to-back communication and the ability to rotate keys in case of security breaches on any side of the integration.

To make a signature, take the following steps:

  1. Build non-signed string formula (HTTP Method) + (Route path + HTTP query params) + (body string) + (timestamp) ). Example: POST/get-item?Amount=%220.25%22&Limit=%22100%22&Offset=%22150%22&Order=%22desc%22&1605619994)

Path parameters must appear DECODED in the non-signed string (the literal value, e.g. AK-47 | Redline (Field-Tested)), while query string parameters must appear exactly as they are transmitted, i.e. percent-encoded. The URL you actually send is percent-encoded in both cases. This applies to any method that takes a free-text value in the route path.

  1. After you’ve created a non-signed string with a default concatenation method, sign it with Ed25519 (NaCl https://en.wikipedia.org/wiki/NaCl_(software) "sign" is Ed25519) using your secret key.
  2. Hex-encode the 64-byte Ed25519 signature
  3. Add your signature string to HTTP request headers X-Request-Sign (dmar ed25519 signature)

You can check out examples on https://github.com/dmarket/dm-trading-tools.

DMarket uses rate limiting to control the rate of API requests. Please read FAQ for details https://dmarket.com/faq#startUsingTradingAPI.

Account

User profile and balance.

Get user profile

Getting general user profile information.

Authorizations:
(ApiKeySignDateRequestSign)

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl 'https://api.dmarket.com/account/v1/user' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "agreementsInfo": {
    },
  • "countryCode": "string",
  • "countryCodeFromIP": "string",
  • "email": "string",
  • "features": [
    ],
  • "ga_client_id": "string",
  • "hasActiveSubscriptions": true,
  • "hasHistoryEvents": true,
  • "id": "string",
  • "imageUrl": "string",
  • "isEmailVerified": true,
  • "isPasswordSet": true,
  • "level": 0,
  • "linkedGames": [
    ],
  • "migrated": true,
  • "publicKey": "string",
  • "regType": "steam",
  • "restrictions": [
    ],
  • "settings": {
    },
  • "steamAccount": {
    },
  • "twitchAccount": {
    },
  • "username": "string"
}

Get account balance

Getting the current USD & DMC balance that is available for trading items / buying subscriptions. The response format is in coins (cents for USD, dimoshi for DMC).

Authorizations:
(ApiKeySignDateRequestSign)

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl 'https://api.dmarket.com/account/v1/balance' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "dmc": "string",
  • "dmcAvailableToWithdraw": "string",
  • "usd": "string",
  • "usdAvailableToWithdraw": "string"
}

Buy items

Browse marketplace offers and buy orders (targets), and purchase items.

Find buy orders (targets) by item title

Returns aggregated buy orders (targets) for a specific game and item title. Use this endpoint to see current demand: how many buy orders exist and at what prices.

Path parameters:

  • game_id: Game identifier. One of: a8db (CS2), 9a92 (Dota 2), tf2, rust.
  • title: Exact in-game item title.

Response contains a list of orders with fields: amount (number of items requested), price (best price for that title and attributes), title, and attributes (quality/rarity/skin parameters, depending on the game).

Authorizations:
(ApiKeySignDateRequestSign)
path Parameters
game_id
required
string

Game identifier. One of: a8db (CS2), 9a92 (Dota 2), tf2, rust.

title
required
string

Exact in-game item title, e.g. AK-47 | Redline (Field-Tested). Percent-encode it in the request URL, but use the decoded value when building the request signature — see the signing instructions in the introduction.

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
# The path parameter is signed DECODED, so the non-signed string here is
#   GET/marketplace-api/v1/targets-by-title/a8db/AK-47 | Redline (Field-Tested)$TIMESTAMP
# The URL below is percent-encoded. Any encoding that decodes back to that path works —
# HTTP clients differ in which characters they escape, so the samples below are both valid.
curl 'https://api.dmarket.com/marketplace-api/v1/targets-by-title/a8db/AK-47%20%7C%20Redline%20%28Field-Tested%29' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

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

Get aggregated market prices for item titles

Returns aggregated pricing for specified item titles, including best buy (order) and best sell (offer) prices and the total number of orders/offers per title. Use this to quickly assess market depth and price levels.

Request body:

  • filter.game: Game identifier.
  • filter.titles[]: List of exact item titles to aggregate.
  • limit, cursor: Pagination controls.

Response:

  • aggregatedPrices[]: For each title: orderBestPrice, orderCount, offerBestPrice, offerCount.
  • nextCursor: Use to fetch the next page.
Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
cursor
string
limit
string <int64>
object (ListAggregatedPricesRequestFilter)

Responses

Request samples

Content type
application/json
{
  • "filter": {
    },
  • "limit": "100"
}

Response samples

Content type
application/json
{
  • "aggregatedPrices": [
    ],
  • "nextCursor": "string"
}

List user targets NEW

Get the list of the current user's targets. Prices are returned as integer cents. 'gameId' param values are: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
gameId
required
string
Enum: "a8db" "9a92" "tf2" "rust"

Game identifier. One of: a8db (CS2), 9a92 (Dota 2), tf2, rust.

title
string

Filter targets by title prefix (case-insensitive).

treeFilters
string

Attribute filters in comma-separated key=value format. Values must match how the attribute is stored (typically the lowercase Steam string; see allowed values below).

Supported common keys: categoryPath, amount, status. Filter by game, title, and price via the top-level gameId, title, and priceFrom/priceTo query parameters.

CS2 keys: category, exterior, floatPart, isAdvanced, paintSeed, phase.

Allowed CS2 values:

  • exterior: factory new, minimal wear, field-tested, well-worn, battle-scarred, not painted
  • phase: phase-1, phase-2, phase-3, phase-4, ruby, sapphire, emerald, black-pearl
  • floatPart: FN-0..FN-6, MW-0..MW-4, FT-0..FT-4, WW-0..WW-4, BS-0..BS-4 (bucketed float ranges per exterior)
  • category: stattrak_tm (_tm is translated to the ™ symbol server-side), souvenir, normal, (knives)

Multi-value: suffix key with [], e.g. exterior[]=factory new,exterior[]=minimal wear (URL-encode the space as %20).

Negation: prefix key with not_, e.g. not_exterior=factory new.

Example: categoryPath=rifle,exterior[]=factory new.

priceFrom
integer <int64>

Lower bound of the target price range in cents (inclusive).

priceTo
integer <int64>

Upper bound of the target price range in cents (inclusive).

orderBy
string
Enum: "price" "title" "createdAt"

Sort field. Supported values: price, title, createdAt.

orderDir
string
Enum: "asc" "desc"

Sort direction. Defaults to asc when orderBy is set.

limit
required
integer <int32> [ 1 .. 100 ]

Number of items to return per page. Range 1..100.

cursor
string <= 500 characters

Pagination cursor returned from a previous response.

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl -G 'https://api.dmarket.com/marketplace-api/v2/user/targets' \
  --data-urlencode 'gameId=a8db' \
  --data-urlencode 'title=AK-47' \
  --data-urlencode 'treeFilters=categoryPath=rifle,exterior[]=factory new' \
  --data-urlencode 'orderBy=price' \
  --data-urlencode 'orderDir=asc' \
  --data-urlencode 'limit=10' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": "3",
  • "cursor": ""
}

List user closed targets

Get the list of the user’s closed targets. The price amount format is in USD, i.e. 0.5 is 50 cents.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
Limit
string <uint64>

Limits number of returned closed targets in response.

OrderDir
string
Default: "desc"
Enum: "desc" "asc"
TargetCreated.From
string <int64>
Example: TargetCreated.From=1730419200
TargetCreated.To
string <int64>
Example: TargetCreated.To=1730419200
TargetClosed.From
string <int64>
Example: TargetClosed.From=1730419200
TargetClosed.To
string <int64>
Example: TargetClosed.To=1730419200
Cursor
string

Cursor is next page identifier.

Finalization.From
string <int64>
Example: Finalization.From=1730419200
Finalization.To
string <int64>
Example: Finalization.To=1730419200
Status
Array of strings
Items Enum: "successful" "reverted" "trade_protected"

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl -G 'https://api.dmarket.com/marketplace-api/v1/user-targets/closed' \
  --data-urlencode 'Limit=10' \
  --data-urlencode 'OrderDir=desc' \
  --data-urlencode 'Status=successful' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "Trades": [
    ],
  • "Total": "string",
  • "Cursor": "string"
}

Create targets

The request for target creation requires the following fields: "GameID" param (values are: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust) and array of "Targets". The price amount format is in USD, i.e. 0.5 is 50 cents, "Title" - full item name. Also, additional attributes ("Attrs" field in #/components/schemas/marketplaceCreateTargetRequest) for each item such as "phase", "floatPartValue" and "paintSeed" are available. You can check possible values of additional attributes here. Limitations: maximum "Amount" value is 100; maximum quantity of targets in one request is 100; maximum number of created targets for one game is individual for each user and can be different for each game. You can contact our customer support team to find out your Target's limit.

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
GameID
string

GameID of same assets in one single target entity.

Array of objects (marketplaceCreateTargetRequest)

List of targets to create.

Responses

Request samples

Content type
application/json
{
  • "GameID": "a8db",
  • "Targets": [
    ]
}

Response samples

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

Remove targets

Remove targets.

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
Array of objects (marketplaceDeleteTargetRequest)

Targets list to delete.

Responses

Request samples

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

Response samples

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

List marketplace offers NEW

Get the list of offers currently available for purchase on the DMarket storefront. Prices are returned as integer cents. 'gameId' param values are: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust.

Image URIs are omitted from this listing by default: attributes.imageUri, together with image on CS2 stickers and charms and on Dota 2 gems, come back as empty strings. They are a large share of every response and the clients that read this endpoint do not render them, so leaving them out keeps the listing fast for everyone. Pass withImages=true if you do need them — nothing else about the response changes either way.

This applies to this endpoint only. GET /marketplace-api/v2/user/inventory and GET /marketplace-api/v2/user/offers always return the image URIs.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
gameId
required
string
Enum: "a8db" "9a92" "tf2" "rust"
Example: gameId=a8db

Game identifier. One of: a8db (CS2), 9a92 (Dota 2), tf2, rust.

title
string

Filter offers by title prefix (case-insensitive).

treeFilters
string
Example: treeFilters=categoryPath=rifle,exterior[]=factory new

Attribute filters in comma-separated key=value format. Values must match how the attribute is stored (typically the lowercase Steam string; see allowed values below).

Supported common keys: categoryPath, type, tradeLockFrom, tradeLockTo. Filter by game, title, and price via the top-level gameId, title, and priceFrom/priceTo query parameters.

CS2 keys: exterior, paintSeed, floatPart, phase, category, collection, charmName, charmExists, sticker, isProskin, fadePercentFrom, fadePercentTo.

TF2 keys: exterior, collection, isCraftable. Dota 2 keys: hero.

Allowed CS2 values:

  • exterior: factory new, minimal wear, field-tested, well-worn, battle-scarred, not painted
  • phase: phase-1, phase-2, phase-3, phase-4, ruby, sapphire, emerald, black-pearl
  • floatPart: FN-0..FN-6, MW-0..MW-4, FT-0..FT-4, WW-0..WW-4, BS-0..BS-4 (bucketed float ranges per exterior)
  • category: stattrak_tm (_tm is translated to the ™ symbol server-side), souvenir, normal, (knives)

Allowed TF2 exterior values: factory new, minimal wear, field-tested, well-worn, battle-scarred, battle scarred.

Multi-value: suffix key with [], e.g. exterior[]=factory new,exterior[]=minimal wear (URL-encode the space as %20).

Negation: prefix key with not_, e.g. not_exterior=factory new. Negation is not supported for charmName/sticker.

Ranges: fadePercentFrom=10,fadePercentTo=90. Steam trade-lock filtering uses tradeLockFrom/tradeLockTo (remaining lock in days; tradeLockFrom is inclusive, tradeLockTo is exclusive).

Existence check: charmExists=true / charmExists=false.

Charm and sticker filters (charmName, sticker[], charmExists) apply to CS2 offers only.

Example: categoryPath=rifle,exterior[]=factory new,exterior[]=minimal wear.

priceFrom
integer <int64>

Lower bound of the offer price range in cents (inclusive).

priceTo
integer <int64>

Upper bound of the offer price range in cents (inclusive).

orderBy
string
Enum: "price" "title" "float" "createdAt" "discount"

Sort field. Supported values: price, title, float, createdAt, discount.

discount sorts by the offer's discount percent versus the appraiser's global market price; use orderBy=discount&orderDir=desc for best discount first. Offers without a discount come last, tie-broken by creation time (oldest first).

orderDir
string
Enum: "asc" "desc"

Sort direction. Defaults to asc when orderBy is set.

limit
required
integer <int32> [ 1 .. 100 ]

Number of items to return per page. Range 1..100.

cursor
string <= 500 characters

Pagination cursor returned from a previous response.

withImages
boolean

Return the image URIs instead of empty strings: attributes.imageUri, plus image on CS2 stickers and charms and on Dota 2 gems. Defaults to false.

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl -G 'https://api.dmarket.com/marketplace-api/v2/offers' \
  --data-urlencode 'gameId=a8db' \
  --data-urlencode 'title=AK-47' \
  --data-urlencode 'treeFilters=categoryPath=rifle,exterior[]=factory new' \
  --data-urlencode 'priceFrom=500' \
  --data-urlencode 'priceTo=5000' \
  --data-urlencode 'orderBy=price' \
  --data-urlencode 'orderDir=asc' \
  --data-urlencode 'limit=10' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
Example

What every caller receives without withImages: attributes.imageUri and the image on each sticker, charm and gem come back as empty strings.

{
  • "items": [
    ],
  • "total": "128",
  • "cursor": "eyJvZmZzZXQiOjEwfQ=="
}

Buy offers

Buy the selected offers from the market. As the result of the operation: the offer is removed, the items are transferred to the buyer, the purchase amount is transferred to the seller, the fee is transferred to DMarket. The price amount format is in coins (cents for USD).

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
required
Array of objects (entity.OfferPrice)

Responses

Request samples

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

Response samples

Content type
application/json
{
  • "dmOffersFailReason": {
    },
  • "dmOffersStatus": {
    },
  • "orderId": "string",
  • "p2pOffersStatus": {
    },
  • "status": "TxPending",
  • "txId": "string"
}

Sell Items

Create, edit, delete and list your sell offers.

Deposit assets

Transferring items from a 3rd party inventory (e.g. a Steam game) to a DMarket inventory.

The operation is asynchronous: a successful response means the transfer was registered, not completed. Poll GET /marketplace-api/v1/deposit-status/{DepositID} to track the result; for Steam games the id of the created trade offer appears there in SteamDepositInfo.TradeOfferID.

Items must be currently tradable on Steam. An item received in a recent trade stays under Steam Trade Protection and cannot be traded again until the protection window set by Steam (7 days) ends: the deposit is registered, but no Steam trade offer is created and the status resolves to TransferStatusError with the InventoryRevoked error. This restriction is enforced by Steam and applies to every Steam game.

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
AssetID
Array of strings

List of in-game asset ids to deposit, in the colon-separated composite format instanceId:classId:assetId:appId (e.g. 0:3938946694:512345678901234567:252490instanceId is 0 for items that carry no per-instance Steam data, so a leading 0 is a real value and not a placeholder). Pass the attributes.inGameAssetId value returned by GET /marketplace-api/v2/user/inventory verbatim. Plain Steam asset ids and DMarket asset UUIDs are not accepted: the request then fails with the InventoryItemsNotFound error.

Responses

Request samples

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

Response samples

Content type
application/json
{
  • "DepositID": "string"
}

Get deposit status

Get information about current deposit transfers.

Of the TransferStatus values, a deposit reports only TransferStatusPending (registered or in progress), TransferStatusSuccess (the items are in the DMarket inventory — Assets maps each requested in-game asset id to the assigned DMarket asset id) and TransferStatusError (see Error).

Authorizations:
(ApiKeySignDateRequestSign)
path Parameters
DepositID
required
string

Deposit operation unique identifier.

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl 'https://api.dmarket.com/marketplace-api/v1/deposit-status/e5f6a7b8-c9d0-1234-ef01-567890123456' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "DepositID": "string",
  • "AssetID": [
    ],
  • "Status": "TransferStatusPending",
  • "Error": "string",
  • "Assets": [
    ],
  • "SteamDepositInfo": {
    }
}

List titles blocked for deposit NEW

Get the titles of a game that DMarket currently refuses for deposit — those flagged as overstocked (the market already holds enough copies of the title) or with selling switched off. Use it to check whether a title can be sold on DMarket before acquiring the item, instead of finding out when deposit-assets rejects it.

Only blocked titles are stored, so this list is the exact set deposit-assets refuses: a title absent from the response is accepted for deposit.

Match on the full title string. Exterior and StatTrak™/Souvenir variants are separate titles and are flagged independently — M4A1-S | Black Lotus (Field-Tested) being blocked says nothing about StatTrak™ M4A1-S | Black Lotus (Field-Tested) or about other exteriors of the same skin.

The underlying flags are refreshed about once a day. The top-level updatedAt reports the most recent change across the whole blocked set of the game, so the response is safe to cache until it moves; each title also carries its own updatedAt. Nothing clears a flag once a title stops being pushed, so a long-untouched entry is less trustworthy than a fresh one — use the per-title timestamp if you want to apply your own staleness threshold. total and the top-level updatedAt are read separately from the page and can briefly disagree with it during a refresh. A game with no flagged titles returns an empty titles list rather than an error.

'gameId' param values are: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
gameId
required
string
Enum: "a8db" "9a92" "tf2" "rust"
Example: gameId=a8db

Game identifier. One of: a8db (CS2), 9a92 (Dota 2), tf2, rust.

limit
integer <int32> [ 1 .. 5000 ]
Example: limit=5000

Number of titles to return per page. Range 1..5000, defaults to 1000 when omitted. The blocked list is a few thousand titles per game, so a large page size keeps it to one or two requests.

cursor
string <= 500 characters ^[A-Za-z0-9_-]*={0,2}$

Pagination cursor returned from a previous response. Pass it unchanged to get the next page. URL-safe base64 (-/_) rather than the standard alphabet used by the other v2 listings, so it survives a query string without extra escaping.

The cursor is only stable for changes past its position. The underlying flags are refreshed once a day and not atomically, so a title alphabetically before your cursor that becomes blocked mid-walk is missed by that walk. Complete a walk promptly, and start a fresh walk from no cursor rather than resuming one held across a refresh.

Responses

Response samples

Content type
application/json
{
  • "gameId": "a8db",
  • "titles": [
    ],
  • "updatedAt": "2026-08-27T21:35:53Z",
  • "total": "3983",
  • "cursor": "U1NHIDA4IHwgU2FucyBDb21pYyAoRmFjdG9yeSBOZXcp"
}

List user offers NEW

Get the list of the current user's active sell offers for further management (edit price, remove from sale). Prices are returned as integer cents. 'gameId' param values are: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
gameId
required
string
Enum: "a8db" "9a92" "tf2" "rust"
Example: gameId=a8db

Game identifier. One of: a8db (CS2), 9a92 (Dota 2), tf2, rust.

title
string

Filter offers by title prefix (case-insensitive).

treeFilters
string
Example: treeFilters=categoryPath=rifle,exterior[]=factory new

Attribute filters in comma-separated key=value format. Values must match how the attribute is stored (typically the lowercase Steam string; see allowed values below).

Supported common keys: categoryPath, type, priceCents, tradeLockFrom, tradeLockTo. Filter by game and title via the top-level gameId and title query parameters.

CS2 keys: exterior, paintSeed, floatPart, phase, category, collection, charmName, charmExists, sticker, isProskin, fadePercentFrom, fadePercentTo.

TF2 keys: exterior, collection, isCraftable. Dota 2 keys: hero.

Allowed CS2 values:

  • exterior: factory new, minimal wear, field-tested, well-worn, battle-scarred, not painted
  • phase: phase-1, phase-2, phase-3, phase-4, ruby, sapphire, emerald, black-pearl
  • floatPart: FN-0..FN-6, MW-0..MW-4, FT-0..FT-4, WW-0..WW-4, BS-0..BS-4 (bucketed float ranges per exterior)
  • category: stattrak_tm (_tm is translated to the ™ symbol server-side), souvenir, normal, (knives)

Allowed TF2 exterior values: factory new, minimal wear, field-tested, well-worn, battle-scarred, battle scarred.

Multi-value: suffix key with [], e.g. exterior[]=factory new,exterior[]=minimal wear (URL-encode the space as %20).

Negation: prefix key with not_, e.g. not_exterior=factory new. Negation is not supported for charmName/sticker.

Ranges: fadePercentFrom=10,fadePercentTo=90. Steam trade-lock filtering uses tradeLockFrom/tradeLockTo (remaining lock in days; tradeLockFrom is inclusive, tradeLockTo is exclusive).

Existence check: charmExists=true / charmExists=false.

Charm and sticker filters (charmName, sticker[], charmExists) apply to CS2 offers only.

Example: categoryPath=rifle,exterior[]=factory new,exterior[]=minimal wear.

orderBy
string
Enum: "price" "title" "float" "createdAt"

Sort field. Supported values: price, title, float, createdAt.

orderDir
string
Enum: "asc" "desc"

Sort direction. Defaults to asc when orderBy is set.

limit
required
integer <int32> [ 1 .. 100 ]

Number of items to return per page. Range 1..100.

cursor
string <= 500 characters

Pagination cursor returned from a previous response.

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl -G 'https://api.dmarket.com/marketplace-api/v2/user/offers' \
  --data-urlencode 'gameId=a8db' \
  --data-urlencode 'title=AK-47' \
  --data-urlencode 'treeFilters=categoryPath=rifle,exterior[]=factory new' \
  --data-urlencode 'orderBy=createdAt' \
  --data-urlencode 'orderDir=desc' \
  --data-urlencode 'limit=10' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": "7",
  • "cursor": ""
}

Batch create offers

Create multiple offers in a single request.

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
Array of objects (marketplacev2CreateOfferRequest)

Responses

Request samples

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

Response samples

Content type
application/json
{
  • "offers": [
    ],
  • "failed": [
    ]
}

Batch update offers

Update multiple offers in a single request.

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
Array of objects (marketplacev2UpdateOfferRequest)

Responses

Request samples

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

Response samples

Content type
application/json
{
  • "offers": [
    ],
  • "failed": [
    ]
}

Batch delete offers

Delete multiple offers in a single request.

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
Array of objects (marketplacev2DeleteOfferRequest)

Responses

Request samples

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

Response samples

Content type
application/json
{
  • "offers": [
    ],
  • "failed": [
    ]
}

Sold user items

History of your completed sales.

List user closed offers

Get the list of the user’s closed sell offers. The price amount format is in USD, i.e. 0.5 is 50 cents.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
Limit
string <uint64>

Limits number of returned closed offers in response.

OrderDir
string
Default: "desc"
Enum: "desc" "asc"
OfferCreated.From
string <int64>
Example: OfferCreated.From=1730419200
OfferCreated.To
string <int64>
Example: OfferCreated.To=1730419200
OfferClosed.From
string <int64>
Example: OfferClosed.From=1730419200
OfferClosed.To
string <int64>
Example: OfferClosed.To=1730419200
Cursor
string

Cursor is next page identifier.

Finalization.From
string <int64>
Example: Finalization.From=1730419200
Finalization.To
string <int64>
Example: Finalization.To=1730419200
Status
Array of strings
Items Enum: "successful" "reverted" "trade_protected"

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl -G 'https://api.dmarket.com/marketplace-api/v1/user-offers/closed' \
  --data-urlencode 'Limit=10' \
  --data-urlencode 'OrderDir=desc' \
  --data-urlencode 'Status=successful' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "Trades": [
    ],
  • "Total": "string",
  • "Cursor": "string"
}

Inventory/items

User inventory, deposits and withdrawals.

List user inventory NEW

Get user inventory details. Both 3rd party (e.g. Steam) and DMarket inventories are merged into one list. Prices are returned as integer cents. 'gameId' param values are: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
gameId
required
string
Enum: "a8db" "9a92" "tf2" "rust"

Game identifier. One of: a8db (CS2), 9a92 (Dota 2), tf2, rust.

title
string

Filter assets by title prefix (case-insensitive).

treeFilters
string

Attribute filters in comma-separated key=value format. Values must match how the attribute is stored (typically the lowercase Steam string; see allowed values below).

Supported common keys: tradable, inMarket, categoryPath, type. Filter by game and title via the top-level gameId and title query parameters.

CS2 keys: exterior, paintSeed, floatPart, phase, category, collection, charmName, charmExists, isProskin, fadePercentFrom, fadePercentTo.

TF2 keys: exterior, collection, isCraftable. Dota 2 keys: hero.

Allowed CS2 values:

  • exterior: factory new, minimal wear, field-tested, well-worn, battle-scarred, not painted
  • phase: phase-1, phase-2, phase-3, phase-4, ruby, sapphire, emerald, black-pearl
  • floatPart: FN-0..FN-6, MW-0..MW-4, FT-0..FT-4, WW-0..WW-4, BS-0..BS-4 (bucketed float ranges per exterior)
  • category: stattrak_tm (_tm is translated to the ™ symbol server-side), souvenir, normal, (knives)

Allowed TF2 exterior values: factory new, minimal wear, field-tested, well-worn, battle-scarred, battle scarred.

Multi-value: suffix key with [], e.g. exterior[]=factory new,exterior[]=minimal wear (URL-encode the space as %20).

Negation: prefix key with not_, e.g. not_exterior=factory new.

Ranges: fadePercentFrom=10,fadePercentTo=90.

Existence check: charmExists=true / charmExists=false.

Example: categoryPath=rifle,exterior[]=factory new,exterior[]=minimal wear.

orderBy
string
Enum: "price" "title" "float" "createdAt" "updatedAt"

Sort field. Supported values: price, title, float, createdAt, updatedAt.

orderDir
string
Enum: "asc" "desc"

Sort direction. Defaults to asc when orderBy is set.

limit
required
integer <int32> [ 1 .. 100 ]

Number of items to return per page. Range 1..100.

cursor
string <= 500 characters

Pagination cursor returned from a previous response.

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl -G 'https://api.dmarket.com/marketplace-api/v2/user/inventory' \
  --data-urlencode 'gameId=a8db' \
  --data-urlencode 'title=AK-47' \
  --data-urlencode 'treeFilters=categoryPath=rifle,exterior[]=factory new' \
  --data-urlencode 'orderBy=price' \
  --data-urlencode 'orderDir=asc' \
  --data-urlencode 'limit=10' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total": "42",
  • "cursor": ""
}

Sync inventory with Steam

Updating DMarket inventory details to sync them with data from Steam.

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
Type
string (marketplaceInventorySyncType)
Default: "UnknownSyncType"
Enum: "UnknownSyncType" "Inventory"
GameID
string (marketplaceGames)
Default: "UnknownGame"
Enum: "UnknownGame" "CSGO" "Dota2" "TF2" "LifeBeyond" "Rust"

Responses

Request samples

Content type
application/json
{
  • "Type": "Inventory",
  • "GameID": "CSGO"
}

Response samples

Content type
application/json
{ }

Withdraw assets

Withdraw assets. 'gameId' param values are: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust

Authorizations:
(ApiKeySignDateRequestSign)
Request Body schema: application/json
required
required
Array of objects (entity.Asset)
requestId
required
string

Responses

Request samples

Content type
application/json
{
  • "assets": [
    ],
  • "requestId": "withdraw-001"
}

Response samples

Content type
application/json
{
  • "transferId": "string"
}

List low-fee items

Get the list of items with lower fees. The new list of items every day. 'gameId' param values are: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust. 'offerType' param values are: 'dmarket', 'p2p'.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
gameId
required
string

enums: CS2 - a8db, Team Fortress 2 - tf2, Dota 2 - 9a92, Rust - rust

offerType
string
Default: "dmarket"

enums: "dmarket", "p2p"

limit
integer
Default: 10

limit

offset
integer
Default: 0

offset

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl -G 'https://api.dmarket.com/exchange/v1/customized-fees' \
  --data-urlencode 'gameId=a8db' \
  --data-urlencode 'offerType=dmarket' \
  --data-urlencode 'limit=20' \
  --data-urlencode 'offset=0' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

Content type
application/json
{
  • "defaultFee": {
    },
  • "reducedFees": [
    ]
}

Aggregator

Aggregated market price data.

Get item sales history

Get the item sales history. Up to 12 last months.

Authorizations:
(ApiKeySignDateRequestSign)
query Parameters
gameId
required
string
title
required
string
filters
string

filters is a list of filters. For example: exterior[]=factory new,phase[]=phase-1,phase[]=phase-2,float[]=2,float[]=133.

txOperationType
Array of strings
Items Enum: "Offer" "Target"

tx_operation_type is a type of transaction to return. Values: "", "Target", "Offer".

limit
string <int64>

limit is a maximum number of sales to return. min: 1 max: 20

offset
string <int64>

Responses

Request samples

# Sign the request and set the three auth headers — reference clients: https://github.com/dmarket/dm-trading-tools
curl -G 'https://api.dmarket.com/trade-aggregator/v1/last-sales' \
  --data-urlencode 'gameId=a8db' \
  --data-urlencode 'title=AK-47 | Redline (Field-Tested)' \
  --data-urlencode 'limit=20' \
  -H "X-Api-Key: $DMARKET_PUBLIC_KEY" \
  -H "X-Sign-Date: $TIMESTAMP" \
  -H "X-Request-Sign: dmar ed25519 $SIGNATURE"

Response samples

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