Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.mannco.store/llms.txt

Use this file to discover all available pages before exploring further.

Base URL: https://api.mannco.store. Routes here use the api filter. Endpoints marked Connected + API need Authorization: Bearer <jwt> from POST /user/login. Endpoints marked API only do not require a user session (no Bearer).

Get item details

GET /item/details/{item}
Permission: API only (no session required)
item
string
required
Item identifier (numeric ID or URL slug)
Returns full item details from the items table. You can pass either a numeric item ID or a URL slug.

Response

{
  "err": false,
  "success": true,
  "content": {
    "informations": {
      "id": 101869,
      "name": "Souvenir M4A1-S | Imminent Danger (Field-Tested)",
      "effect": "",
      "SKU": "",
      "quality": "Souvenir;",
      "type": "Rifle",
      "type_steam": null,
      "class": null,
      "image": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpou-6kejhz2v_Nfz5H_uOxh7-Gw_alDK3UhH9Y78pOh-zF_Jn4t1i1uRQ5fWv3IYCXewE9Y16F-lO5kOrq0ZS86ZnMyndg6CZx4XzfnR22gBgaPLdxxavJlxkVjNA",
      "imagePertinence": 1,
      "craftable": 1,
      "rarity": "Covert",
      "featured": 0,
      "deal": 71708,
      "t": null,
      "color": "ffd700",
      "game": 730,
      "slot": "",
      "hero": null,
      "weapon": "M4A1-S",
      "exterior": "Field-Tested",
      "url": "730-souvenir-m4a1-s-imminent-danger-field-tested",
      "description": null,
      "tf2shop": null
    }
  }
}

Item Fields

FieldTypeDescription
idintegerUnique item ID
namestringItem display name
effectstringUnusual effect name (TF2) or empty
SKUstringStock Keeping Unit identifier
qualitystringItem quality (Unique, Strange, Unusual, Souvenir, etc.)
typestringItem type/category
type_steamstring/nullSteam-specific type
classstring/nullItem class (TF2)
imagestringItem image URL/path
imagePertinenceintegerImage relevance score
craftableinteger1 = craftable, 0 = uncraftable
raritystringItem rarity (CS:GO/CS2)
featuredinteger1 if featured, 0 otherwise
dealintegerSteam market price in cents
tany/nullAdditional data
colorstringHex color code for rarity
gameintegerGame App ID (440, 730, 570, 252490)
slotstringEquipment slot (TF2)
herostring/nullHero name (Dota 2)
weaponstringWeapon name (CS:GO/CS2)
exteriorstringWear condition (CS:GO/CS2)
urlstringURL-friendly slug
descriptionstring/nullItem description
tf2shopany/nullTF2 shop related data

Get item sales graph

GET /item/salesGraph/{item}?period={period}
Permission: Connected + API
item
string
required
Item identifier (numeric ID)
period
string
required
Time period for sales data: 1M, 3M, 6M, 1Y, 5Y, or ALL
Returns historical sales data for charting. Data is aggregated from the items_stats table with daily price and volume. For periods 5Y and ALL, data is grouped by week instead of by day.

Query Parameters

ParameterTypeRequiredDescription
periodstringYesTime period: 1M (1 month), 3M (3 months), 6M (6 months), 1Y (1 year), 5Y (5 years), ALL (all time)

Response (Daily data for 1M, 3M, 6M, 1Y)

{
  "err": false,
  "success": true,
  "content": {
    "values": [
      {
        "date": "2025-01-15 00:00:00",
        "price": 50000,
        "nb": 3
      },
      {
        "date": "2025-01-14 00:00:00",
        "price": 48000,
        "nb": 2
      }
    ]
  }
}

Response (Weekly data for 5Y and ALL)

{
  "err": false,
  "success": true,
  "content": {
    "values": [
      {
        "first_date": "2025-01-13",
        "week": "202502",
        "total_price": 150000,
        "total_nb": 8
      },
      {
        "first_date": "2025-01-06",
        "week": "202501",
        "total_price": 120000,
        "total_nb": 6
      }
    ]
  }
}

Response Fields (Daily)

FieldTypeDescription
datestringDate and time (YYYY-MM-DD HH:MM:SS)
priceintegerTotal sales value in cents for the day
nbintegerNumber of sales that day

Response Fields (Weekly)

FieldTypeDescription
first_datestringFirst day of the week (Monday)
weekstringYear and week number (YYYYWW)
total_priceintegerTotal sales value in cents for the week
total_nbintegerNumber of sales that week
Use daily data (1M, 3M, 6M, 1Y) for detailed graphs. Use weekly data (5Y, ALL) for long-term trends to reduce data points.

Get listing count

GET /item/listing/count/{item}
GET /item/listing/count/{item}/{userid}
Permission: API
item
string
required
Item identifier (numeric ID)
userid
string
Optional user SteamID to filter listings by seller
Returns the number of active listings for an item. If userid is provided, returns the count for that specific seller only.

Response

{
  "err": false,
  "success": true,
  "content": {
    "count": 13291
  }
}

Response Fields

FieldTypeDescription
errbooleanError flag (false if no error)
successbooleanSuccess flag (true if successful)
content.countintegerNumber of active listings for the item

Get item listings

GET /item/listing/{item}
GET /item/listing/{item}/{userid}
Permission: API
item
string
required
Item identifier (numeric ID)
userid
string
Optional user SteamID to filter by seller
count
integer
default:"10"
Number of items per page
page
integer
default:"0"
Page number (offset = page × count)
game
integer
Game ID filter (440 for TF2, 730 for CS2). Affects which extra info is joined.
Returns paginated listings sorted by price ascending. The number of items per page is capped by the server configuration (maxCount.itemListing). Each listing includes backpack details. For non-admin callers, user and ip are omitted from each listing.

Listing type

FieldTypeDescription
idintegerBackpack entry ID
assetIdstringSteam asset ID
item_idintegerItem definition ID
userstringSeller SteamID
stateintegerItem state (1 = on sale)
priceintegerListed price in cents
botstringBot holding the item
gameintegerGame App ID
wearfloat|nullWear value (CS2 items)
sheenstringKillstreak sheen (TF2)
killstreakerstringKillstreaker effect (TF2)
spellstringHalloween spell (TF2)
partsstringStrange parts (TF2)
htmlstringCustom HTML description
paintstringPaint color (TF2)
valuesobject|nullExtra inspection values (CS2/TF2)
getImagestring|nullCustom image URL

Get buy order list

GET /item/buyorderList/{item}
Permission: API
item
string
required
Item identifier (numeric ID)
Returns active buy orders for an item, grouped by price tier. Up to 5 price tiers are returned as keys 04; additional tiers are aggregated under the key "more".

Response

{
  "err": false,
  "success": true,
  "content": {
    "informations": {
      "0": { "count": 5, "price": 15000 },
      "1": { "count": 3, "price": 14500 },
      "2": { "count": 12, "price": 14000 },
      "more": { "count": 8, "price": 13500 }
    }
  }
}
FieldTypeDescription
informations[n].countintegerTotal quantity at this price
informations[n].priceintegerBuy order price in cents
informations.moreobjectAggregated count and lowest price for remaining tiers

Get item pricing

GET /item/pricing/{item}
Permission: Connected + API
item
string
required
Item identifier (numeric ID)
Returns calculated pricing data for an item including lowest sale, highest buy order, Steam price, suggested listing price, and optional last sale.

Response

{
  "err": false,
  "success": true,
  "content": {
    "item_id": 12345,
    "cached": true,
    "last_updated": "2025-02-19 12:00:00",
    "pricing": {
      "lowest_sale_price": 15000,
      "lowest_buy_order": 12000,
      "steam_price": 18000,
      "suggested_price": 14999,
      "last_sale": {
        "price": 14800,
        "date": 1706745600
      }
    }
  }
}
FieldTypeDescription
item_idintegerItem ID
cachedbooleanWhether the result was served from cache
last_updatedstringLast calculation or cache update (Y-m-d H:i:s)
pricing.lowest_sale_pricefloatLowest active listing price in cents
pricing.lowest_buy_orderfloatHighest active buy order price in cents
pricing.steam_pricefloatSteam Community Market price in cents
pricing.suggested_pricefloatSuggested listing price
pricing.last_saleobject/nullLast sale price and date (Unix timestamp) if available
Pricing data is cached for 20 minutes. Fresh data is calculated and stored when the cache expires.

Get bulk pricing

GET /item/pricing/bulk
Permission: Connected + API
items
string
required
Comma-separated item IDs (maximum 100 items)
Returns pricing data for multiple items at once. Each entry mirrors GET /item/pricing/{item} pricing fields, plus from_cache: true if the row was read from prices while still considered fresh, false if prices were recalculated and written back to prices. The envelope includes cached_items and refreshed_items counts (same semantics as from_cache, summed over every returned row — duplicate IDs in the query string are counted separately).

Response

{
  "err": false,
  "success": true,
  "content": {
    "total_items": 3,
    "cached_items": 2,
    "refreshed_items": 1,
    "items": [
      {
        "item_id": 12345,
        "from_cache": true,
        "last_updated": "2025-02-19 12:00:00",
        "pricing": {
          "lowest_sale_price": 15000,
          "lowest_buy_order": 12000,
          "steam_price": 18000,
          "suggested_price": 14999,
          "last_sale": { "price": 14800, "date": 1706745600 }
        }
      },
      {
        "item_id": 67890,
        "from_cache": false,
        "last_updated": "2025-02-19 12:01:05",
        "pricing": {
          "lowest_sale_price": 9000,
          "lowest_buy_order": 8500,
          "steam_price": 9500,
          "suggested_price": 8999,
          "last_sale": null
        }
      }
    ]
  }
}
FieldTypeDescription
total_itemsintegerNumber of item entries returned (same length as items)
cached_itemsintegerHow many entries were served from cache (from_cache true)
refreshed_itemsintegerHow many entries were recalculated and persisted (from_cache false)
items[].item_idintegerItem ID
items[].from_cachebooleantrue if read from prices without recalculation; false if refreshed this request
items[].last_updatedstringupdated_at from DB when cached, or time of refresh (Y-m-d H:i:s)
items[].pricing.*Same as Get item pricing (lowest_sale_price, lowest_buy_order, steam_price, suggested_price, last_sale)
Bulk pricing reuses rows in prices when updated_at is within the last 5 minute (shorter than the single-item GET /item/pricing/{item} cache window). Outside that window, the API recomputes from live tables and updates prices.

Example

GET /item/pricing/bulk?items=12345,67890,11111

Get item details from backpack ID (TF2)

GET /item/details/fromid/{backpackid}
Permission: API
backpackid
string
required
Backpack asset ID
Returns full backpack + item details for a TF2 item by its asset ID. Joins backpack, items, and item_infos tables.

Get item details from backpack ID (CS2)

GET /item/cs/details/fromid/{backpackid}
Permission: API
backpackid
string
required
Backpack asset ID
Same as above but specifically for CS2 items with wear, sticker, and pattern information.

Response Fields for Backpack Details

Both endpoints return combined data from backpack, items, and item_infos tables:
{
  "err": false,
  "success": true,
  "content": {
    "informations": {
      // Backpack fields
      "id": "integer",
      "assetId": "string",
      "user": "string (Steam ID)",
      "item_id": "integer",
      "price": "integer (cents) or null",
      "state": "integer (0=inventory, 1=on sale, 2=withdrawal)",
      "bot": "string (bot Steam ID)",
      "game": "integer (440/730/570/252490)",
      "wear": "float or null (CS2 items)",
      "sheen": "string (TF2 killstreak)",
      "killstreaker": "string (TF2 killstreak)",
      "spell": "string (TF2 spells)",
      "parts": "string or null (TF2 strange parts)",
      "paint": "string or null (TF2 paint)",
      "lastupdate": "integer (Unix timestamp)",
      
      // Items table fields
      "name": "string",
      "effect": "string",
      "quality": "string",
      "type": "string",
      "craftable": "integer or empty string",
      "image": "string",
      "rarity": "string",
      "url": "string",
      "color": "string (hex color)",
      
      // item_infos fields (if available)
      "values": "string (JSON) or null",
      "getImage": "integer or null"
    }
  }
}
Important: The craftable field is set to empty string ("") for all non-TF2 games. Only TF2 items (game 440) retain the original craftable value (0 or 1). Additionally, trailing spaces and trailing semicolons are removed from all string fields.