_ registry / mcp streamable-http · checked 3h ago

Card Hedge API

https://api.cardhedger.com

Registry code: f95f9ef2f995e46b

api record

Get card information and pricing by grader certificate number.

from a public catalogue that lists it, not from the operator

endpoint
https://api.cardhedger.com/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is Card Hedge API live?
Yes — it answered the hub's last check (checked 3h ago). It answered 100% of checks over the last 30 days.
Is Card Hedge API free to use?
Not anonymously — it asks for a key or a login before it will serve. Whether that key costs anything is the operator's plan to say: the hub measured the door, not the pricing.
What tools does Card Hedge API have?
18 tools: search_cards, search_sets, search_cards_sorted, get_details_by_certs, get_all_prices, get_total_sales_by_player, get_player_index, search_players, ….
Is Card Hedge API safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
99.7%

90 days 98.7%· all time 98.7%

latency
573ms

last good check

priced tools
0

of 18 tools

_ answered our checks, 90 days 543 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • down → live
  • degraded → live
  • live → degraded· timeout after 20000ms
_ what it is for
used for
  • estimate a trading card price by grade
  • get comparable card sales
  • look up card value by grading certificate
  • find top moving cards
  • search card sets and players
takes → gives
text → data
tools
18 reads
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 18 tools
18 auth-required 18 of 18 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • search_cards reads auth-required 36d ago

    Search Cards Search for cards with flexible filtering options. Searches CardHedge database with optional filters for search query, set, category, player, card number, subset, and rookie status. Supports pagination to iterate through large result sets. **Response includes:** - `pages`: Total number of pages available - `count`: Total number of matching cards - `cards`: Array of card objects for the current page **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "search": "Shohei Ohtani", "category": "Baseball", "page": 1, "page_size": 20 }' \ "{base_url}/v1/cards/card-search" ``` Returns matching cards with pricing, sales data, and pagination metadata. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "pages": 15, "count": 742, "cards": [ { "description": "Shohei Ohtani 2018 Topps Chrome Baseball", "player": "Shohei Ohtani", "set": "2018 Topps Chrome Baseball", "number": "150", "variant": "Base", "card_id": "1587446850514x224832321163624450", "image": "//s3.amazonaws.com/appforest_uf/example.jpg", "category": "Baseball", "category_group": "Sports Cards", "set_type": "Topps Chrome Baseball", "7 Day Sales": 45, "30 Day Sales": 187, "rookie": true, "gain": 2.5, "prices": [ { "grade": "PSA 10", "price": "850" }, { "grade": "PSA 9", "price": "125" }, { "grade": "Raw", "price": "45.99" } ] } ] } ``` **Output Schema:** ```json { "properties": { "pages": { "type": "integer", "title": "Pages", "description": "Total number of pages available", "default": 1 }, "count": { "type": "integer", "title": "Count", "description": "Total number of matching cards", "default": 0 }, "count_capped": { "type": "boolean", "title": "Count Capped", "description": "True when `count` is a capped value and the real total is higher (filter-only browses cap the count for performance). Render as `count`+ \u2014 e.g. \"10,000+\".", "default": false }, "cards": { "items": { "properties": { "description": { "type": "string", "title": "Description", "description": "Full card description" }, "player": { "type": "string", "title": "Player", "description": "Player or character name" }, "set": { "type": "string", "title": "Set", "description": "Card set name" }, "number": { "type": "string", "title": "Number", "description": "Card number in set" }, "variant": { "type": "string", "title": "Variant", "description": "Card variant (e.g., 'Base', 'Reverse Foil')" }, "card_id": { "type": "string", "title": "Card Id", "description": "Unique card identifier" }, "image": { "type": "string", "title": "Image", "description": "Card image URL" }, "category": { "type": "string", "title": "Category", "description": "Card category" }, "category_group": { "type": "string", "title": "Category Group", "description": "Category group" }, "set_type": { "type": "string", "title": "Set Type", "description": "Set type" }, "7 Day Sales": { "type": "integer", "title": "7 Day Sales", "description": "Sales in last 7 days" }, "30 Day Sales": { "type": "integer", "title": "30 Day Sales", "description": "Sales in last 30 days" }, "rookie": { "type": "boolean", "title": "Rookie", "description": "Whether the card is a rookie card" }, "gain": { "type": "number", "title": "Gain", "description": "Price gain percentage" }, "prices": { "items": { "properties": { "grade": { "type": "string", "title": "Grade", "description": "Card grade (e.g., 'Raw', 'PSA 10')" }, "price": { "type": "string", "title": "Price", "description": "Price in string format" } }, "type": "object", "required": [ "grade", "price" ], "title": "CardPrice", "description": "Price information for a card at different grades." }, "type": "array", "title": "Prices", "description": "Price information at different grades" }, "subset": { "title": "Subset", "description": "Card subset within the set (e.g. 'Base Set', 'Chrome'); null when the card has no subset" } }, "type": "object", "required": [ "description", "player", "set", "number", "variant", "card_id", "image", "category", "category_group", "set_type", "7 Day Sales", "30 Day Sales", "rookie", "gain", "prices" ], "title": "CardSearchCard", "description": "Card information from search results." }, "type": "array", "title": "Cards", "description": "List of matching cards" } }, "type": "object", "required": [ "cards" ], "title": "CardSearchResponse", "description": "Response model for card search endpoint.", "examples": [ { "cards": [ { "30 Day Sales": 187, "7 Day Sales": 45, "card_id": "1587446850514x224832321163624450", "category": "Baseball", "category_group": "Sports Cards", "description": "Shohei Ohtani 2018 Topps Chrome Baseball", "gain": 2.5, "image": "//s3.amazonaws.com/appforest_uf/example.jpg", "number": "150", "player": "Shohei Ohtani", "prices": [ { "grade": "PSA 10", "price": "850" }, { "grade": "PSA 9", "price": "125" }, { "grade": "Raw", "price": "45.99" } ], "rookie": true, "set": "2018 Topps Chrome Baseball", "set_type": "Topps Chrome Baseball", "variant": "Base" } ], "count": 742, "pages": 15 } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "search_cardsArguments",
      "properties": {
        "set": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "set",
          "description": "Filter by set name (e.g., '2025 Topps Baseball')"
        },
        "page": {
          "type": "integer",
          "title": "page",
          "default": 1,
          "minimum": 1,
          "description": "Page number for pagination"
        },
        "number": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "number",
          "description": "Filter by card number within the set (exact match, e.g. '150')"
        },
        "player": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "player",
          "description": "Filter by player name"
        },
        "rookie": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "rookie",
          "description": "Filter by rookie status (e.g., 'Rookie')"
        },
        "search": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "search",
          "description": "Search query for card name/description"
        },
        "subset": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "subset",
          "description": "Filter by subset within the set (exact match, e.g. 'Base Set', 'Chrome')"
        },
        "category": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "category",
          "description": "Filter by category (e.g., 'Baseball', 'Basketball')"
        },
        "page_size": {
          "type": "integer",
          "title": "page_size",
          "default": 50,
          "maximum": 100,
          "minimum": 1,
          "description": "Number of results per page (1-100)"
        },
        "raw_images_only": {
          "type": "boolean",
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "title": "raw_images_only",
          "description": "Image preference. Omitted (default): return the raw card photo, falling back to the graded slab image only when no raw photo exists. true: force raw-only (no graded fallback). false: prefer the graded slab image."
        }
      }
    }
    arguments 125 lines
  • search_sets reads auth-required never probed

    Search Card Sets Search for card sets with optional name and category filters. Search the CardHedge database for sets by name and/or category. Useful for populating set dropdowns, browsing available sets, or finding specific product lines. **Parameters:** - `search`: Optional text query matched against set names (e.g., "Topps Chrome", "Pokemon 151") - `category`: Optional category filter (e.g., "Baseball", "Basketball", "Pokemon", "Football") - `count`: Number of results to return (1-100, default: 25) **Response includes:** - `count`: Number of sets returned - `sets`: Array of set objects with name, year, category, image, and 30-day sales volume **Example curl:** ```bash # Search by name curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "search": "Pokemon 151", "count": 10 }' \ "{base_url}/v1/cards/set-search" # Filter by category curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "category": "Baseball", "count": 25 }' \ "{base_url}/v1/cards/set-search" # Combined search + category curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "search": "Topps Chrome", "category": "Baseball", "count": 50 }' \ "{base_url}/v1/cards/set-search" ``` Returns matching sets with metadata and sales data. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "count": 3, "sets": [ { "id": "1587446850514x224832321163624450", "name": "2023 Topps Chrome Baseball", "year": "2023", "set_type": "Topps Chrome Baseball", "description": "2023 Topps Chrome Baseball", "category": "Baseball", "image": "//942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1724143874181x158765543979815900/crop_image", "30 Day Sales": 1250 }, { "id": "1684286084852x189232814543430100", "name": "2024 Topps Chrome Baseball", "year": "2024", "set_type": "Topps Chrome Baseball", "description": "2024 Topps Chrome Baseball", "category": "Baseball", "image": "//942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1724143874181x158765543979815901/crop_image", "30 Day Sales": 2340 }, { "id": "1699670576265x928796749151534600", "name": "2022 Topps Chrome Baseball", "year": "2022", "set_type": "Topps Chrome Baseball", "description": "2022 Topps Chrome Baseball", "category": "Baseball", "image": "//942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1724143874181x158765543979815902/crop_image", "30 Day Sales": 870 } ] } ``` **Output Schema:** ```json { "properties": { "count": { "type": "integer", "title": "Count", "description": "Number of sets returned" }, "sets": { "items": { "properties": { "id": { "type": "string", "title": "Id", "description": "Unique set identifier" }, "name": { "type": "string", "title": "Name", "description": "Set name" }, "year": { "type": "string", "title": "Year", "description": "Set year", "default": "" }, "set_type": { "type": "string", "title": "Set Type", "description": "Set type" }, "description": { "type": "string", "title": "Description", "description": "Set description" }, "category": { "type": "string", "title": "Category", "description": "Set category" }, "image": { "type": "string", "title": "Image", "description": "Set image URL" }, "30 Day Sales": { "type": "integer", "title": "30 Day Sales", "description": "Sales in last 30 days" } }, "type": "object", "required": [ "id", "name", "set_type", "description", "category", "image", "30 Day Sales" ], "title": "SetSearchSet", "description": "Set information from search results." }, "type": "array", "title": "Sets", "description": "List of matching sets" } }, "type": "object", "required": [ "count", "sets" ], "title": "SetSearchResponse", "description": "Response model for set search endpoint.", "examples": [ { "count": 3, "sets": [ { "30 Day Sales": 1250, "category": "Baseball", "description": "2023 Topps Chrome Baseball", "id": "1587446850514x224832321163624450", "image": "//942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1724143874181x158765543979815900/crop_image", "name": "2023 Topps Chrome Baseball", "set_type": "Topps Chrome Baseball", "year": "2023" }, { "30 Day Sales": 2340, "category": "Baseball", "description": "2024 Topps Chrome Baseball", "id": "1684286084852x189232814543430100", "image": "//942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1724143874181x158765543979815901/crop_image", "name": "2024 Topps Chrome Baseball", "set_type": "Topps Chrome Baseball", "year": "2024" }, { "30 Day Sales": 870, "category": "Baseball", "description": "2022 Topps Chrome Baseball", "id": "1699670576265x928796749151534600", "image": "//942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1724143874181x158765543979815902/crop_image", "name": "2022 Topps Chrome Baseball", "set_type": "Topps Chrome Baseball", "year": "2022" } ] } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "search_setsArguments",
      "properties": {
        "count": {
          "type": "integer",
          "title": "count",
          "default": 25,
          "maximum": 100,
          "minimum": 1,
          "description": "Number of results to return (1-100)"
        },
        "search": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "search",
          "description": "Search query for set name"
        },
        "category": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "category",
          "description": "Filter by category (e.g., 'Baseball', 'Basketball', 'Pokemon')"
        }
      }
    }
    arguments 40 lines
  • search_cards_sorted reads auth-required 36d ago

    Search Cards with Sorting Search for cards from the database with full-text search, filtering, sorting, and pagination. **⚠️ Required:** At least one filter parameter (`search`, `set`, `category`, or `player`) is required. **Search Parameter:** - `search`: Full-text fuzzy search across card description and player names - Supports multiple keywords: "Shohei Ohtani rookie" matches cards containing all terms **Filter Parameters (exact match):** - `player`: Exact player name match (e.g., "Mike Trout") - `set`: Exact set name match (e.g., "2018 Panini Prizm Basketball") - `category`: Exact category match (e.g., "Baseball", "Pokemon", "Basketball") **Sorting Options:** - `sort_by`: - `"gain"` - 7-day price change percentage - `"gain_30day"` - 30-day price change percentage - `"sales_7day"` - 7-day sales volume - `"sales_30day"` - 30-day sales volume - `"sales"` - alias for sales_30day (backwards compatible) - `"price"` - current price - `"description"` - alphabetical - `sort_order`: "asc" or "desc" **Other Options:** - `raw_images_only`: When true, returns raw card images instead of graded slab images - `page` / `page_size`: Pagination controls (max 100 per page) **Response:** - `pages`: Total pages available - `count`: Total matching cards - `cards`: Array of card objects including: - `gain`: 7-day price change percentage - `gain_30day`: 30-day price change percentage - `7 Day Sales` / `30 Day Sales`: Sales volume - `prices`: Array of grade/price pairs ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "pages": 15, "count": 742, "cards": [ { "description": "Shohei Ohtani 2024 Topps Chrome Baseball", "player": "Shohei Ohtani", "set": "2024 Topps Chrome Baseball", "number": "150", "variant": "Base", "card_id": "1587446850514x224832321163624450", "image": "https://example.com/card.jpg", "category": "Baseball", "category_group": "Sports Cards", "set_type": "Topps Chrome Baseball", "7 Day Sales": 45, "30 Day Sales": 187, "rookie": false, "gain": 12.5, "gain_30day": 18.3, "prices": [ { "grade": "PSA 10", "price": "850" }, { "grade": "PSA 9", "price": "125" }, { "grade": "Raw", "price": "45.99" } ] } ] } ``` **Output Schema:** ```json { "properties": { "pages": { "type": "integer", "title": "Pages", "description": "Total number of pages available", "default": 1 }, "count": { "type": "integer", "title": "Count", "description": "Total number of matching cards", "default": 0 }, "cards": { "items": { "properties": { "description": { "type": "string", "title": "Description", "description": "Full card description" }, "player": { "type": "string", "title": "Player", "description": "Player or character name" }, "set": { "type": "string", "title": "Set", "description": "Card set name" }, "number": { "type": "string", "title": "Number", "description": "Card number in set" }, "variant": { "type": "string", "title": "Variant", "description": "Card variant (e.g., 'Base', 'Gold', 'Refractor')" }, "card_id": { "type": "string", "title": "Card Id", "description": "Unique card identifier" }, "image": { "type": "string", "title": "Image", "description": "Card image URL" }, "category": { "type": "string", "title": "Category", "description": "Card category (e.g., 'Baseball', 'Pokemon')" }, "category_group": { "type": "string", "title": "Category Group", "description": "Category group (e.g., 'Sports Cards', 'Trading Cards')" }, "set_type": { "type": "string", "title": "Set Type", "description": "Set type" }, "7 Day Sales": { "type": "integer", "title": "7 Day Sales", "description": "Sales volume in last 7 days" }, "30 Day Sales": { "type": "integer", "title": "30 Day Sales", "description": "Sales volume in last 30 days" }, "rookie": { "type": "boolean", "title": "Rookie", "description": "Whether the card is a rookie card" }, "gain": { "type": "number", "title": "Gain", "description": "Price gain percentage (7-day)" }, "gain_30day": { "type": "number", "title": "Gain 30Day", "description": "Price gain percentage (30-day)" }, "stats_grade": { "type": "string", "title": "Stats Grade", "description": "Primary grade (e.g., 'PSA 10', 'BGS 9.5')" }, "prices": { "items": { "properties": { "grade": { "type": "string", "title": "Grade", "description": "Card grade (e.g., 'Raw', 'PSA 10')" }, "price": { "type": "string", "title": "Price", "description": "Price in string format" } }, "type": "object", "required": [ "grade", "price" ], "title": "CardPrice", "description": "Price information for a card at different grades." }, "type": "array", "title": "Prices", "description": "Price information at different grades" }, "subset": { "title": "Subset", "description": "Card subset within the set (e.g. 'Base Set', 'Chrome'); null when the card has no subset" } }, "type": "object", "required": [ "description", "player", "set", "number", "variant", "card_id", "image", "category", "category_group", "set_type", "7 Day Sales", "30 Day Sales", "rookie", "gain", "gain_30day", "stats_grade", "prices" ], "title": "CardSearchLocalCard", "description": "Card information from local database search results." }, "type": "array", "title": "Cards", "description": "List of matching cards" } }, "type": "object", "title": "CardSearchLocalResponse", "description": "Response model for local card search endpoint.", "examples": [ { "cards": [ { "30 Day Sales": 187, "7 Day Sales": 45, "card_id": "1587446850514x224832321163624450", "category": "Baseball", "category_group": "Sports Cards", "description": "Shohei Ohtani 2024 Topps Chrome Baseball", "gain": 12.5, "gain_30day": 18.3, "image": "https://example.com/card.jpg", "number": "150", "player": "Shohei Ohtani", "prices": [ { "grade": "PSA 10", "price": "850" }, { "grade": "PSA 9", "price": "125" }, { "grade": "Raw", "price": "45.99" } ], "rookie": false, "set": "2024 Topps Chrome Baseball", "set_type": "Topps Chrome Baseball", "stats_grade": "PSA 10", "variant": "Base" } ], "count": 742, "pages": 15 } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "search_cards_sortedArguments",
      "properties": {
        "set": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "set",
          "description": "Filter by exact set name (e.g., '2024 Topps Chrome Baseball')"
        },
        "page": {
          "type": "integer",
          "title": "page",
          "default": 1,
          "minimum": 1,
          "description": "Page number for pagination"
        },
        "player": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "player",
          "description": "Filter by exact player name (e.g., 'Mike Trout', 'Shohei Ohtani')"
        },
        "search": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "search",
          "description": "Full-text search query for fuzzy matching on card description/player (e.g., 'Trout rookie')"
        },
        "sort_by": {
          "enum": [
            "gain",
            "gain_30day",
            "sales",
            "sales_7day",
            "sales_30day",
            "price",
            "description"
          ],
          "type": "string",
          "title": "sort_by",
          "default": "gain",
          "description": "Field to sort by: gain (7-day price change %), gain_30day (30-day price change %), sales_7day (7-day volume), sales_30day or sales (30-day volume), price (current price), description (alphabetical)"
        },
        "category": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "category",
          "description": "Filter by exact category (e.g., 'Baseball', 'Pokemon', 'Basketball')"
        },
        "page_size": {
          "type": "integer",
          "title": "page_size",
          "default": 50,
          "maximum": 100,
          "minimum": 1,
          "description": "Number of results per page (1-100)"
        },
        "sort_order": {
          "enum": [
            "asc",
            "desc"
          ],
          "type": "string",
          "title": "sort_order",
          "default": "desc",
          "description": "Sort order: asc (ascending) or desc (descending)"
        },
        "raw_images_only": {
          "type": "boolean",
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "title": "raw_images_only",
          "description": "Image preference. Omitted (default): return the raw card photo, falling back to the graded slab image only when no raw photo exists. true: force raw-only (no graded fallback). false: prefer the graded slab image."
        }
      }
    }
    arguments 111 lines
  • get_details_by_certs reads auth-required never probed

    Get Card Details by Certificate Numbers (Batch) Get card details for multiple certificate numbers in a single request. This endpoint performs batch lookups without price history: 1. Checks the persistent validated-certificate cache for each certificate; queries GemRate only for certificates not successfully retrieved before 2. Fetches card details from CardHedge using GemRate IDs 3. Fallback: if step 2 finds no card, matches the GemRate description against the AI `card-match` endpoint 4. Returns certificate info and card details (or null if not found in either lookup) `card_source` reports how each card was resolved -- `gemrate_id` for the direct GemRate ID lookup, or `card_match` for the description fallback. When the fallback is used, `match_confidence` carries the AI match score (0-1); treat low-confidence matches with care. **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "certs": ["76676185", "50000000", "12345678"], "grader": "PSA" }' \ "{base_url}/v1/cards/details-by-certs" ``` Returns card details for each certificate. Cards not found in CardHedge will have null card field. Maximum 100 certificates per request. Each submitted certificate counts as one unit toward the customer's minute and day rate limits, including duplicate and cached certificates. A batch that exceeds the remaining allowance is rejected with HTTP 429 before any certificates are processed. GemRate HTTP 400 not-found results are cached by grader and certificate and reused on later requests. Each account also has a daily budget of **uncached** certificate lookups (shared by every certificate endpoint and every API key of the account, resetting at 00:00 UTC). Only certificates that were never looked up before spend it. Once it is spent, cached certificates are still served and any other certificate comes back with `error: "gemrate_daily_quota_exceeded"`; if none of the batch could be served the request returns HTTP 429 with a `Retry-After` header. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "results": [ { "cert_info": { "grader": "psa", "cert": "76676185", "grade": "PSA 9", "gemrate_id": "9f4cd2db01a0a873ba5da0feb23428686fd556ac", "universal_gemrate_id": "9f4cd2db01a0a873ba5da0feb23428686fd556ac", "description": "2000 Pokemon Japanese Neo Wooper 194" } }, { "cert_info": { "grader": "psa", "cert": "50000000", "grade": "PSA 10", "gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "universal_gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "description": "1999 Bowman Chrome C.C. Sabathia 344" }, "card": { "card_id": "1699670576265x928796749151534600", "description": "C.C. Sabathia 1999 Bowman Chrome Baseball", "player": "C.C. Sabathia", "set": "1999 Bowman Chrome Baseball", "number": "344", "variant": "Base", "image": "https://942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1699670857725x475053799924132860/resized_20231111_024737.jpeg", "category": "Baseball", "category_group": "Sports Cards", "set_type": "Bowman Chrome Baseball" } } ], "total_requested": 2, "total_found": 1 } ``` **Output Schema:** ```json { "properties": { "results": { "items": { "properties": { "cert_info": { "description": "Certificate verification information.", "properties": { "grader": { "type": "string", "title": "Grader", "description": "Grading company (e.g., PSA, BGS, CGC)" }, "cert": { "type": "string", "title": "Cert", "description": "Certificate number" }, "grade": { "type": "string", "title": "Grade", "description": "Card grade (e.g., PSA 10, BGS 9.5)" }, "gemrate_id": { "title": "Gemrate Id", "description": "Unique card identifier" }, "universal_gemrate_id": { "title": "Universal Gemrate Id", "description": "Universal card identifier" }, "description": { "title": "Description", "description": "Card description from certificate" } }, "additionalProperties": true, "type": "object", "required": [ "grader", "cert", "grade" ], "title": "GemRateCertInfo" }, "card": { "description": "Card details and metadata (null if not found)" }, "card_source": { "title": "Card Source", "description": "How the card was resolved: 'gemrate_id' for a direct GemRate ID -> CardHedge lookup, or 'card_match' when that lookup found nothing and the card was matched from the GemRate description via the AI card-match fallback. Null when no card was resolved. Cards resolved via 'card_match' have null 'category_group' and 'set_type' -- the matcher does not return those two fields." }, "match_confidence": { "title": "Match Confidence", "description": "AI match confidence (0-1) when 'card_source' is 'card_match'; null otherwise. Treat results derived from a low-confidence match with care." }, "error": { "title": "Error", "description": "Set to 'gemrate_daily_quota_exceeded' when this certificate needed an uncached GemRate lookup but the account's daily budget for such lookups was already spent (it resets at 00:00 UTC). The row then carries placeholder cert_info (grade 'Unknown') and no card; retry after the reset. Null for every other row." } }, "type": "object", "required": [ "cert_info" ], "title": "SingleCertResult", "description": "Single certificate result in batch lookup." }, "type": "array", "title": "Results", "description": "List of certificate lookup results" }, "total_requested": { "type": "integer", "title": "Total Requested", "description": "Total number of certificates requested" }, "total_found": { "type": "integer", "title": "Total Found", "description": "Number of cards found in database with pricing data" } }, "type": "object", "required": [ "results", "total_requested", "total_found" ], "title": "BatchCertLookupResponse", "description": "Response model for batch certificate lookup endpoint.", "examples": [ { "results": [ { "cert_info": { "cert": "76676185", "description": "2000 Pokemon Japanese Neo Wooper 194", "gemrate_id": "9f4cd2db01a0a873ba5da0feb23428686fd556ac", "grade": "PSA 9", "grader": "psa", "universal_gemrate_id": "9f4cd2db01a0a873ba5da0feb23428686fd556ac" } }, { "card": { "card_id": "1699670576265x928796749151534600", "category": "Baseball", "category_group": "Sports Cards", "description": "C.C. Sabathia 1999 Bowman Chrome Baseball", "image": "https://942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1699670857725x475053799924132860/resized_20231111_024737.jpeg", "number": "344", "player": "C.C. Sabathia", "set": "1999 Bowman Chrome Baseball", "set_type": "Bowman Chrome Baseball", "variant": "Base" }, "cert_info": { "cert": "50000000", "description": "1999 Bowman Chrome C.C. Sabathia 344", "gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "grade": "PSA 10", "grader": "psa", "universal_gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885" } } ], "total_found": 1, "total_requested": 2 } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_details_by_certsArguments",
      "required": [
        "certs"
      ],
      "properties": {
        "certs": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "certs",
          "examples": [
            [
              "76676185",
              "50000000",
              "12345678"
            ]
          ],
          "maxItems": 100,
          "minItems": 1,
          "description": "List of certificate numbers to lookup (max 100); each entry counts toward minute and day rate limits"
        },
        "grader": {
          "type": "string",
          "title": "grader",
          "default": "PSA",
          "examples": [
            "PSA"
          ],
          "description": "Grading company (defaults to PSA)"
        }
      }
    }
    arguments 35 lines
  • get_all_prices reads auth-required never probed

    Get Latest Prices Across All Grades Get all latest prices for a card across all available grades. Requires a card_id. If you only have a card name/description, call `card-match` or `card-search` first to get the card_id, then use it here. This endpoint returns the most recent price for each grade/grader combination available for the specified card. Includes prices from all major grading companies (PSA, BGS, SGC, CGC, CSG, HGA) plus raw (ungraded) prices. The response includes: - Grade and grader information - Latest price for each grade - Display order for sorting grades consistently **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "card_id": "1586414093385x612765462196125700" }' \ "{base_url}/v1/cards/all-prices-by-card" ``` Returns all available grades with their latest prices for the card. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "prices": [ { "card_id": "1586414093385x612765462196125700", "grade": "Raw", "grader": "Raw", "price": "1299.99", "display_order": "-1" }, { "card_id": "1586414093385x612765462196125700", "grade": "PSA 10", "grader": "PSA", "price": "16999.99", "display_order": "1" }, { "card_id": "1586414093385x612765462196125700", "grade": "PSA 9", "grader": "PSA", "price": "3700.00", "display_order": "2" }, { "card_id": "1586414093385x612765462196125700", "grade": "BGS 9.5", "grader": "BGS", "price": "5200.00", "display_order": "323" } ] } ``` **Output Schema:** ```json { "properties": { "prices": { "items": { "properties": { "card_id": { "type": "string", "title": "Card Id", "description": "Unique card identifier" }, "grade": { "type": "string", "title": "Grade", "description": "Card grade (e.g., PSA 10, BGS 9.5, Raw)" }, "grader": { "type": "string", "title": "Grader", "description": "Grading company (e.g., PSA, BGS, SGC, CGC)" }, "price": { "type": "string", "title": "Price", "description": "Latest price for this grade" }, "display_order": { "type": "string", "title": "Display Order", "description": "Display order for sorting grades" } }, "type": "object", "required": [ "card_id", "grade", "grader", "price", "display_order" ], "title": "GradePrice", "description": "Price information for a specific grade." }, "type": "array", "title": "Prices", "description": "Latest prices across all available grades" } }, "type": "object", "required": [ "prices" ], "title": "AllPricesByCardResponse", "description": "Response model for all latest prices by card endpoint.", "examples": [ { "prices": [ { "card_id": "1586414093385x612765462196125700", "display_order": "-1", "grade": "Raw", "grader": "Raw", "price": "1299.99" }, { "card_id": "1586414093385x612765462196125700", "display_order": "1", "grade": "PSA 10", "grader": "PSA", "price": "16999.99" }, { "card_id": "1586414093385x612765462196125700", "display_order": "2", "grade": "PSA 9", "grader": "PSA", "price": "3700.00" }, { "card_id": "1586414093385x612765462196125700", "display_order": "323", "grade": "BGS 9.5", "grader": "BGS", "price": "5200.00" } ] } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_all_pricesArguments",
      "required": [
        "card_id"
      ],
      "properties": {
        "card_id": {
          "type": "string",
          "title": "card_id",
          "examples": [
            "1586414093385x612765462196125700"
          ],
          "description": "Unique card identifier"
        }
      }
    }
    arguments 17 lines
  • get_total_sales_by_player reads auth-required never probed

    Get Total Sales Count by Player Get total sales counts per player/character over a recent window. Counts sales records from the last N days that mention each player or character name. Returns only the counts — no individual sale records — so it stays fast even for high-volume players. **Parameters:** - `players`: List of player/character names (max 25) - `days`: Look-back window in days (default: 30, max: 365) ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "results": [ { "player": "Mike Trout", "total_sales": 12809, "search_time_ms": 391 }, { "player": "Shohei Ohtani", "total_sales": 87192, "search_time_ms": 618 } ], "days": 30 } ``` **Output Schema:** ```json { "properties": { "results": { "items": { "properties": { "player": { "type": "string", "title": "Player", "description": "Player/character name searched" }, "total_sales": { "type": "integer", "title": "Total Sales", "description": "Total number of sales found" }, "search_time_ms": { "type": "integer", "title": "Search Time Ms", "description": "Upstream search request time in ms" } }, "type": "object", "required": [ "player", "total_sales", "search_time_ms" ], "title": "PlayerSalesResult" }, "type": "array", "title": "Results" }, "days": { "type": "integer", "title": "Days", "description": "Number of days looked back" } }, "type": "object", "required": [ "results", "days" ], "title": "TotalSalesByPlayerResponse" } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_total_sales_by_playerArguments",
      "required": [
        "players"
      ],
      "properties": {
        "days": {
          "type": "integer",
          "title": "days",
          "default": 30,
          "maximum": 365,
          "minimum": 1,
          "description": "Number of days to look back (default: 30, max: 365)"
        },
        "players": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "players",
          "maxItems": 25,
          "minItems": 1,
          "description": "List of player/character names to look up (max 25)"
        }
      }
    }
    arguments 27 lines
  • get_player_index reads auth-required never probed

    Get Player Index Latest cached player index: a market-cap-weighted average price (USD) of the player's top-10 cards, with 1d/7d/30d/90d/365d changes and the cards behind it. Identify the player by `player_id` (recommended — from `player-search`) or by `name` (+ optional `category`). A name must match exactly one player, otherwise the response is 409 with `candidates`. Merged duplicate IDs resolve to their canonical player (`resolution.resolved_via: "alias"`). `status` is `current` (updated within `PLAYER_INDEX_STALE_DAYS` days, default 2), `stale` (older; still served — the API never triggers a recalculation), or `withheld` (at least `PLAYER_INDEX_WITHHOLD_FOREIGN_PCT` percent, default 25, of the index's weight comes from other players' cards; `value` is null and `integrity.reason` explains). **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" -H "Content-Type: application/json" -d '{"name":"Luka Doncic"}' "{base_url}/v1/cards/player-index" ``` ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "player": { "player_id": "1585918730738x583198232556601300", "name": "Luka Doncic", "categories": [ "Basketball" ], "aliases": [] }, "resolution": { "requested_player_id": "1585918730738x583198232556601300", "resolved_via": "player_id" }, "index": { "value": 948.01, "as_of": "2026-09-25", "status": "current", "days_since_update": 0, "volume_30d": 357, "card_count": 10, "changes": { "1d": { "abs": 11.52, "pct": 1.23 }, "7d": { "abs": -20.4, "pct": -2.11 } }, "methodology": { "algorithm": "market_cap_weighted", "base_grade": "PSA 10", "version": "2.0.0" } }, "integrity": { "verdict": "ok", "foreign_weight_pct": 0.0, "unknown_weight_pct": 0.0 }, "constituents": [ { "card_id": "1588995508450x437304889574424600", "card_name": "Luka Doncic 2018 Panini Prizm Basketball Silver", "set": "2018 Panini Prizm Basketball", "variant": "Silver", "grade": "PSA 10", "price": 1850.0, "weight": 40.0, "volume_30d": 38, "owned_by_player": true } ] } ``` **Output Schema:** ```json { "properties": { "player": { "properties": { "player_id": { "type": "string", "title": "Player Id", "description": "Canonical Card Hedge player ID" }, "name": { "type": "string", "title": "Name" }, "categories": { "items": { "type": "string" }, "type": "array", "title": "Categories" }, "aliases": { "items": { "type": "string" }, "type": "array", "title": "Aliases", "description": "Player IDs merged into this player" } }, "type": "object", "required": [ "player_id", "name" ], "title": "PlayerBlock" }, "resolution": { "properties": { "requested_player_id": { "title": "Requested Player Id" }, "requested_name": { "title": "Requested Name" }, "requested_category": { "title": "Requested Category" }, "resolved_via": { "type": "string", "enum": [ "player_id", "alias", "name" ], "title": "Resolved Via" } }, "type": "object", "required": [ "resolved_via" ], "title": "ResolutionBlock" }, "index": { "properties": { "value": { "title": "Value", "description": "USD: market-cap-weighted average price of the top-10 cards; null when withheld" }, "as_of": { "type": "string", "format": "date", "title": "As Of" }, "status": { "type": "string", "enum": [ "current", "stale", "withheld" ], "title": "Status" }, "days_since_update": { "type": "integer", "title": "Days Since Update" }, "volume_30d": { "title": "Volume 30D" }, "card_count": { "title": "Card Count" }, "changes": { "additionalProperties": { "anyOf": [ { "properties": { "abs": { "type": "number", "title": "Abs", "description": "Change in index value (USD)" }, "pct": { "type": "number", "title": "Pct", "description": "Percent change" } }, "type": "object", "required": [ "abs", "pct" ], "title": "IndexChange" }, { "type": "null" } ] }, "propertyNames": { "enum": [ "1d", "7d", "30d", "90d", "365d" ] }, "type": "object", "title": "Changes" }, "methodology": { "properties": { "algorithm": { "title": "Algorithm" }, "base_grade": { "title": "Base Grade" }, "version": { "title": "Version" } }, "type": "object", "title": "Methodology" } }, "type": "object", "required": [ "value", "as_of", "status", "days_since_update", "changes", "methodology" ], "title": "IndexSnapshot" }, "integrity": { "properties": { "verdict": { "type": "string", "enum": [ "ok", "warning", "withheld" ], "title": "Verdict" }, "foreign_weight_pct": { "type": "number", "title": "Foreign Weight Pct", "description": "% of index weight from other players' cards" }, "unknown_weight_pct": { "type": "number", "title": "Unknown Weight Pct", "description": "% of index weight whose card owner is unknown", "default": 0.0 }, "reason": { "title": "Reason" } }, "type": "object", "required": [ "verdict", "foreign_weight_pct" ], "title": "IntegrityBlock" }, "constituents": { "items": { "properties": { "card_id": { "type": "string", "title": "Card Id" }, "card_name": { "title": "Card Name" }, "set": { "title": "Set" }, "variant": { "title": "Variant" }, "grade": { "title": "Grade" }, "price": { "title": "Price" }, "weight": { "type": "number", "title": "Weight", "description": "Share of the index (weights sum to 100)" }, "volume_30d": { "title": "Volume 30D" }, "owned_by_player": { "title": "Owned By Player", "description": "False when the card belongs to another player; null when unknown" } }, "type": "object", "required": [ "card_id", "weight" ], "title": "ConstituentBlock" }, "type": "array", "title": "Constituents" } }, "type": "object", "required": [ "player", "resolution", "index", "integrity" ], "title": "PlayerIndexResponse" } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_player_indexArguments",
      "properties": {
        "name": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "maxLength": 100
            },
            {
              "type": "null"
            }
          ],
          "title": "name",
          "description": "Player name; resolves only when it matches exactly one player (else 409 with candidates)."
        },
        "category": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "maxLength": 50
            },
            {
              "type": "null"
            }
          ],
          "title": "category",
          "description": "With `name` only: one category (name or slug) to tell same-named players apart."
        },
        "player_id": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "maxLength": 64
            },
            {
              "type": "null"
            }
          ],
          "title": "player_id",
          "description": "Card Hedge player ID (from player-search). Alias IDs resolve to their canonical player."
        },
        "include_constituents": {
          "type": "boolean",
          "title": "include_constituents",
          "default": true,
          "description": "Include the cards behind the index"
        }
      }
    }
    arguments 54 lines
  • search_players reads auth-required never probed

    Search Players Search Card Hedge's canonical player catalog by partial name. Duplicate player records (e.g. two "LeBron James" records) are folded into one canonical player: `player_id` is the canonical ID and `aliases` lists the merged IDs, whose stats are summed. `categories` lists every category the player appears in; the optional `category` filter matches any of them. `index` says whether a player index is available (`current`, `stale`, `withheld`, or `none`). Results are ranked by 30-day sales and capped by `count`. **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" -H "Content-Type: application/json" -d '{"search":"Luka","count":5}' "{base_url}/v1/cards/player-search" ``` ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "count": 1, "players": [ { "player_id": "1585495598505x695909526016884700", "name": "Michael Jordan", "categories": [ "Basketball", "Baseball" ], "aliases": [], "cards_tracked": 3746, "thirty_day_sales": 20946, "index": { "has_index": true, "as_of": "2026-09-25", "status": "current" } } ] } ``` **Output Schema:** ```json { "properties": { "count": { "type": "integer", "minimum": 0.0, "title": "Count", "description": "Number of players returned" }, "players": { "items": { "properties": { "player_id": { "type": "string", "minLength": 1, "title": "Player Id", "description": "Canonical Card Hedge player ID. Duplicate player records are folded into one player; their IDs are listed in `aliases`." }, "name": { "type": "string", "minLength": 1, "title": "Name", "description": "Canonical player or character name" }, "categories": { "items": { "type": "string" }, "type": "array", "title": "Categories", "description": "Categories the player appears in, e.g. ['Basketball', 'Baseball']" }, "aliases": { "items": { "type": "string" }, "type": "array", "title": "Aliases", "description": "Other player IDs merged into this player; requests for them resolve here" }, "cards_tracked": { "title": "Cards Tracked", "description": "Cards tracked for the player, summed across merged records", "default": 0 }, "thirty_day_sales": { "title": "Thirty Day Sales", "description": "Sales in the last 30 days, summed across merged records", "default": 0 }, "index": { "description": "Player index availability; null when it could not be determined" } }, "type": "object", "required": [ "player_id", "name" ], "title": "PlayerSearchPlayer", "description": "Canonical Card Hedge player metadata." }, "type": "array", "title": "Players", "description": "Canonical players matching the search" } }, "type": "object", "required": [ "count" ], "title": "PlayerSearchResponse", "description": "Response model for canonical player search.", "examples": [ { "count": 1, "players": [ { "aliases": [], "cards_tracked": 3746, "categories": [ "Basketball", "Baseball" ], "index": { "as_of": "2026-09-25", "has_index": true, "status": "current" }, "name": "Michael Jordan", "player_id": "1585495598505x695909526016884700", "thirty_day_sales": 20946 } ] } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "search_playersArguments",
      "required": [
        "search"
      ],
      "properties": {
        "count": {
          "type": "integer",
          "title": "count",
          "default": 25,
          "maximum": 100,
          "minimum": 1,
          "description": "Maximum number of players to return (1-100)"
        },
        "search": {
          "type": "string",
          "title": "search",
          "maxLength": 100,
          "minLength": 2,
          "description": "Player or character name to search for (2-100 characters)"
        },
        "category": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "maxLength": 50
            },
            {
              "type": "null"
            }
          ],
          "title": "category",
          "description": "Only return players in this category (name or slug, e.g. 'Baseball' or 'yu-gi-oh'). A multi-category player matches any of its categories."
        }
      }
    }
    arguments 38 lines
  • get_card_details reads auth-required never probed

    Get Card Details by ID Get detailed information for a specific card by its ID. Requires a card_id. If you only have a card name/description, call `card-match` or `card-search` first to get the card_id, then use it here. Fetches card details from CardHedge database using the card's unique identifier. Returns the same data structure as card search endpoint. **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{"card_id": "1586812246197x228181943611293700"}' \ "{base_url}/v1/cards/card-details" ``` Returns card with pricing, sales data, and metadata. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "cards": [ { "description": "Mike Trout 2011 Topps Update Baseball", "player": "Mike Trout", "set": "2011 Topps Update Baseball", "number": "US175", "variant": "Base", "card_id": "1586812246197x228181943611293700", "image": "//s3.amazonaws.com/appforest_uf/f1586812239788x796554493579861000/2011-Mike-Trout-Topps-Update-US175-Graded.jpg", "category": "Baseball", "category_group": "Sports Cards", "set_type": "Topps Update Baseball", "7 Day Sales": 27, "30 Day Sales": 103, "rookie": true, "gain": 0.5, "prices": [ { "grade": "PSA 10", "price": "1000" }, { "grade": "PSA 9", "price": "319.99" }, { "grade": "Raw", "price": "269.39" } ] } ] } ``` **Output Schema:** ```json { "properties": { "pages": { "type": "integer", "title": "Pages", "description": "Total number of pages available", "default": 1 }, "count": { "type": "integer", "title": "Count", "description": "Total number of matching cards", "default": 0 }, "count_capped": { "type": "boolean", "title": "Count Capped", "description": "True when `count` is a capped value and the real total is higher (filter-only browses cap the count for performance). Render as `count`+ \u2014 e.g. \"10,000+\".", "default": false }, "cards": { "items": { "properties": { "description": { "type": "string", "title": "Description", "description": "Full card description" }, "player": { "type": "string", "title": "Player", "description": "Player or character name" }, "set": { "type": "string", "title": "Set", "description": "Card set name" }, "number": { "type": "string", "title": "Number", "description": "Card number in set" }, "variant": { "type": "string", "title": "Variant", "description": "Card variant (e.g., 'Base', 'Reverse Foil')" }, "card_id": { "type": "string", "title": "Card Id", "description": "Unique card identifier" }, "image": { "type": "string", "title": "Image", "description": "Card image URL" }, "category": { "type": "string", "title": "Category", "description": "Card category" }, "category_group": { "type": "string", "title": "Category Group", "description": "Category group" }, "set_type": { "type": "string", "title": "Set Type", "description": "Set type" }, "7 Day Sales": { "type": "integer", "title": "7 Day Sales", "description": "Sales in last 7 days" }, "30 Day Sales": { "type": "integer", "title": "30 Day Sales", "description": "Sales in last 30 days" }, "rookie": { "type": "boolean", "title": "Rookie", "description": "Whether the card is a rookie card" }, "gain": { "type": "number", "title": "Gain", "description": "Price gain percentage" }, "prices": { "items": { "properties": { "grade": { "type": "string", "title": "Grade", "description": "Card grade (e.g., 'Raw', 'PSA 10')" }, "price": { "type": "string", "title": "Price", "description": "Price in string format" } }, "type": "object", "required": [ "grade", "price" ], "title": "CardPrice", "description": "Price information for a card at different grades." }, "type": "array", "title": "Prices", "description": "Price information at different grades" }, "subset": { "title": "Subset", "description": "Card subset within the set (e.g. 'Base Set', 'Chrome'); null when the card has no subset" } }, "type": "object", "required": [ "description", "player", "set", "number", "variant", "card_id", "image", "category", "category_group", "set_type", "7 Day Sales", "30 Day Sales", "rookie", "gain", "prices" ], "title": "CardSearchCard", "description": "Card information from search results." }, "type": "array", "title": "Cards", "description": "List of matching cards" } }, "type": "object", "required": [ "cards" ], "title": "CardSearchResponse", "description": "Response model for card search endpoint.", "examples": [ { "cards": [ { "30 Day Sales": 187, "7 Day Sales": 45, "card_id": "1587446850514x224832321163624450", "category": "Baseball", "category_group": "Sports Cards", "description": "Shohei Ohtani 2018 Topps Chrome Baseball", "gain": 2.5, "image": "//s3.amazonaws.com/appforest_uf/example.jpg", "number": "150", "player": "Shohei Ohtani", "prices": [ { "grade": "PSA 10", "price": "850" }, { "grade": "PSA 9", "price": "125" }, { "grade": "Raw", "price": "45.99" } ], "rookie": true, "set": "2018 Topps Chrome Baseball", "set_type": "Topps Chrome Baseball", "variant": "Base" } ], "count": 742, "pages": 15 } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_card_detailsArguments",
      "required": [
        "card_id"
      ],
      "properties": {
        "card_id": {
          "type": "string",
          "title": "card_id",
          "description": "Unique card identifier from CardHedge"
        },
        "raw_images_only": {
          "type": "boolean",
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "title": "raw_images_only",
          "description": "Deprecated and ignored: this endpoint now always returns the raw card photo (not the graded slab image). The field is retained for backward compatibility but no longer affects the response."
        }
      }
    }
    arguments 27 lines
  • get_fmv_by_cert reads auth-required never probed

    Get Fair Market Value (FMV) by Certificate Number Get the Fair Market Value (FMV) for a card by grader certificate number. Convenience wrapper that chains a certificate lookup into an FMV valuation, so callers holding only a cert number do not need to resolve the card themselves. ## How it works 1. Checks the persistent validated-certificate cache; queries GemRate only when that certificate has not been successfully retrieved before. 2. Resolves the card in CardHedge using the GemRate IDs. 3. Fallback: if step 2 finds no card, matches the GemRate description against the AI `card-match` endpoint. 4. Requests the FMV for the resolved card at the certificate's grade. ## Card resolution (`card_source` / `match_confidence`) - `card_source: "gemrate_id"` — direct GemRate ID → CardHedge lookup succeeded. `match_confidence` is null. - `card_source: "card_match"` — direct lookup found nothing; the card was matched from the GemRate description via the AI fallback. `match_confidence` (0-1) is the matcher's score; **treat an FMV derived from a low-confidence match with care**. Cards resolved this way have null `category_group` and `set_type` because the matcher doesn't return those two fields. ## FMV (`fmv`) The `fmv` object is identical to the `/v1/cards/card-fmv` response — see that endpoint for the full method cascade (`direct`, `card_interpolation`, `cross_provider`, `anchor_multiplier`, `segment_fallback`, `no_data`), `_indexed` variants, confidence grading, and movement-index metadata. ## When fields are null - `card` and `fmv` are both null only when the certificate cannot be matched to a card by EITHER the GemRate ID lookup or the description fallback. - When the card is found but the upstream has insufficient sale data, `fmv` is a populated object with `method: "no_data"` and `price: null` — `card` is still populated in this case. **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "cert": "50000000", "grader": "PSA" }' \ "{base_url}/v1/cards/fmv-by-cert" ``` ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "cert_info": { "grader": "psa", "cert": "50000000", "grade": "PSA 10", "gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "universal_gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "description": "1999 Bowman Chrome C.C. Sabathia 344" }, "card": { "card_id": "1699670576265x928796749151534600", "description": "C.C. Sabathia 1999 Bowman Chrome Baseball", "player": "C.C. Sabathia", "set": "1999 Bowman Chrome Baseball", "number": "344", "variant": "Base", "image": "https://942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1699670857725x475053799924132860/resized_20231111_024737.jpeg", "category": "Baseball", "category_group": "Sports Cards", "set_type": "Bowman Chrome Baseball" }, "fmv": { "price": 416.25, "price_low": 397.26, "price_high": 435.24, "confidence": 0.3499, "method": "direct", "freshness_days": 1, "support_grades": 1, "grade_label": "PSA 10", "provider": "PSA", "grade_value": 10.0, "raw_price": 416.25, "index_truncated": false, "fmv_window_days": 7, "fmv_sample_count": 3, "confidence_grade": "B", "price_explanation": "Used 7d FMV ($416.25, Winsorized median of 3 daily prints) in place of latest_price $416.25. Fresh (1d) \u2014 no movement adjustment applied." }, "card_source": "gemrate_id" } ``` **Output Schema:** ```json { "properties": { "cert_info": { "description": "Certificate verification information.", "properties": { "grader": { "type": "string", "title": "Grader", "description": "Grading company (e.g., PSA, BGS, CGC)" }, "cert": { "type": "string", "title": "Cert", "description": "Certificate number" }, "grade": { "type": "string", "title": "Grade", "description": "Card grade (e.g., PSA 10, BGS 9.5)" }, "gemrate_id": { "title": "Gemrate Id", "description": "Unique card identifier" }, "universal_gemrate_id": { "title": "Universal Gemrate Id", "description": "Universal card identifier" }, "description": { "title": "Description", "description": "Card description from certificate" } }, "additionalProperties": true, "type": "object", "required": [ "grader", "cert", "grade" ], "title": "GemRateCertInfo" }, "card": { "description": "Card details and metadata (null when the certificate could not be matched to a card)" }, "fmv": { "description": "Fair Market Value for the card at the certificate's grade. Null when the certificate could not be matched to a card; a populated object with method 'no_data' indicates the card was found but the upstream had insufficient sale data to value it." }, "card_source": { "title": "Card Source", "description": "How the card was resolved: 'gemrate_id' for a direct GemRate ID -> CardHedge lookup, or 'card_match' when that lookup found nothing and the card was matched from the GemRate description via the AI card-match fallback. Null when no card was resolved. Cards resolved via 'card_match' have null 'category_group' and 'set_type' -- the matcher does not return those two fields." }, "match_confidence": { "title": "Match Confidence", "description": "AI match confidence (0-1) when 'card_source' is 'card_match'; null otherwise. Treat an FMV derived from a low-confidence match with care." } }, "type": "object", "required": [ "cert_info" ], "title": "FMVByCertResponse", "description": "Response model for the FMV-by-certificate endpoint.", "examples": [ { "card": { "card_id": "1699670576265x928796749151534600", "category": "Baseball", "category_group": "Sports Cards", "description": "C.C. Sabathia 1999 Bowman Chrome Baseball", "image": "https://942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1699670857725x475053799924132860/resized_20231111_024737.jpeg", "number": "344", "player": "C.C. Sabathia", "set": "1999 Bowman Chrome Baseball", "set_type": "Bowman Chrome Baseball", "variant": "Base" }, "card_source": "gemrate_id", "cert_info": { "cert": "50000000", "description": "1999 Bowman Chrome C.C. Sabathia 344", "gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "grade": "PSA 10", "grader": "psa", "universal_gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885" }, "fmv": { "confidence": 0.3499, "confidence_grade": "B", "fmv_sample_count": 3, "fmv_window_days": 7, "freshness_days": 1, "grade_label": "PSA 10", "grade_value": 10.0, "index_truncated": false, "method": "direct", "price": 416.25, "price_explanation": "Used 7d FMV ($416.25, Winsorized median of 3 daily prints) in place of latest_price $416.25. Fresh (1d) \u2014 no movement adjustment applied.", "price_high": 435.24, "price_low": 397.26, "provider": "PSA", "raw_price": 416.25, "support_grades": 1 } } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_fmv_by_certArguments",
      "required": [
        "cert"
      ],
      "properties": {
        "cert": {
          "type": "string",
          "title": "cert",
          "examples": [
            "50000000"
          ],
          "description": "Certificate number to look up"
        },
        "grader": {
          "type": "string",
          "title": "grader",
          "default": "PSA",
          "examples": [
            "PSA"
          ],
          "description": "Grading company (defaults to PSA)"
        }
      }
    }
    arguments 26 lines
  • get_prices_by_cert reads auth-required never probed

    Get Price History by Certificate Number Get card information and pricing by grader certificate number. This endpoint performs a multi-step lookup: 1. Checks the persistent validated-certificate cache; queries GemRate only when that certificate has not been successfully retrieved before 2. Fetches card details from CardHedge using GemRate IDs 3. Fallback: if step 2 finds no card, matches the GemRate description against the AI `card-match` endpoint 4. Retrieves price history for the card at the specified grade, served from the synced `card_prices` table with upstream fallback for cards the sync does not cover **Related:** to look up many certificates at once, use `details-by-certs` (card details only) or `batch-prices-by-cert` (one price estimate per cert instead of price history). `card_source` reports how the card was resolved -- `gemrate_id` for the direct GemRate ID lookup, or `card_match` for the description fallback. When the fallback is used, `match_confidence` carries the AI match score (0-1); treat prices derived from a low-confidence match with care. Cards resolved via the `card_match` fallback have null `category_group` and `set_type` -- the matcher does not return those two fields. **Example curl:** ```bash # Default: 180 days of price history curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "cert": "76676185", "grader": "PSA" }' \ "{base_url}/v1/cards/prices-by-cert" # Custom: 30 days of price history curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "cert": "76676185", "grader": "PSA", "days": 30 }' \ "{base_url}/v1/cards/prices-by-cert" ``` Returns certificate info, card details, and price history (default: 180 days, max: 365 days). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "cert_info": { "grader": "psa", "cert": "50000000", "grade": "PSA 10", "gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "universal_gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "description": "1999 Bowman Chrome C.C. Sabathia 344" }, "card": { "card_id": "1699670576265x928796749151534600", "description": "C.C. Sabathia 1999 Bowman Chrome Baseball", "player": "C.C. Sabathia", "set": "1999 Bowman Chrome Baseball", "number": "344", "variant": "Base", "image": "https://942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1699670857725x475053799924132860/resized_20231111_024737.jpeg", "category": "Baseball", "category_group": "Sports Cards", "set_type": "Bowman Chrome Baseball" }, "prices": [ { "closing_date": "2025-10-26T23:59:00.000Z", "Grade": "PSA 10", "card_id": "1699670576265x928796749151534600", "price": "125.50" }, { "closing_date": "2025-10-25T23:59:00.000Z", "Grade": "PSA 10", "card_id": "1699670576265x928796749151534600", "price": "122.00" } ] } ``` **Output Schema:** ```json { "properties": { "cert_info": { "description": "Certificate verification information.", "properties": { "grader": { "type": "string", "title": "Grader", "description": "Grading company (e.g., PSA, BGS, CGC)" }, "cert": { "type": "string", "title": "Cert", "description": "Certificate number" }, "grade": { "type": "string", "title": "Grade", "description": "Card grade (e.g., PSA 10, BGS 9.5)" }, "gemrate_id": { "title": "Gemrate Id", "description": "Unique card identifier" }, "universal_gemrate_id": { "title": "Universal Gemrate Id", "description": "Universal card identifier" }, "description": { "title": "Description", "description": "Card description from certificate" } }, "additionalProperties": true, "type": "object", "required": [ "grader", "cert", "grade" ], "title": "GemRateCertInfo" }, "card": { "description": "Card details and metadata (null if not found in database)" }, "prices": { "items": { "properties": { "closing_date": { "type": "string", "title": "Closing Date", "description": "Date of the price point" }, "Grade": { "type": "string", "title": "Grade", "description": "Card grade" }, "card_id": { "type": "string", "title": "Card Id", "description": "Card ID" }, "price": { "type": "string", "title": "Price", "description": "Price value" } }, "type": "object", "required": [ "closing_date", "Grade", "card_id", "price" ], "title": "PriceHistory", "description": "Individual price point from CardHedge." }, "type": "array", "title": "Prices", "description": "Daily price history for the card" }, "card_source": { "title": "Card Source", "description": "How the card was resolved: 'gemrate_id' for a direct GemRate ID -> CardHedge lookup, or 'card_match' when that lookup found nothing and the card was matched from the GemRate description via the AI card-match fallback. Null when no card was resolved. Cards resolved via 'card_match' have null 'category_group' and 'set_type' -- the matcher does not return those two fields." }, "match_confidence": { "title": "Match Confidence", "description": "AI match confidence (0-1) when 'card_source' is 'card_match'; null otherwise. Treat results derived from a low-confidence match with care." } }, "type": "object", "required": [ "cert_info" ], "title": "CertLookupResponse", "description": "Response model for certificate lookup endpoint.", "examples": [ { "card": { "card_id": "1699670576265x928796749151534600", "category": "Baseball", "category_group": "Sports Cards", "description": "C.C. Sabathia 1999 Bowman Chrome Baseball", "image": "https://942284f33c575895b4be9de571ca6e40.cdn.bubble.io/d112/f1699670857725x475053799924132860/resized_20231111_024737.jpeg", "number": "344", "player": "C.C. Sabathia", "set": "1999 Bowman Chrome Baseball", "set_type": "Bowman Chrome Baseball", "variant": "Base" }, "cert_info": { "cert": "50000000", "description": "1999 Bowman Chrome C.C. Sabathia 344", "gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885", "grade": "PSA 10", "grader": "psa", "universal_gemrate_id": "25783324b9710f1366ca4d54f3dd4689c02b6885" }, "prices": [ { "Grade": "PSA 10", "card_id": "1699670576265x928796749151534600", "closing_date": "2025-10-26T23:59:00.000Z", "price": "125.50" }, { "Grade": "PSA 10", "card_id": "1699670576265x928796749151534600", "closing_date": "2025-10-25T23:59:00.000Z", "price": "122.00" } ] } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_prices_by_certArguments",
      "required": [
        "cert"
      ],
      "properties": {
        "cert": {
          "type": "string",
          "title": "cert",
          "examples": [
            "76676185"
          ],
          "description": "Certificate number to lookup"
        },
        "days": {
          "type": "integer",
          "title": "days",
          "default": 180,
          "maximum": 365,
          "minimum": 1,
          "examples": [
            180
          ],
          "description": "Number of days of price history to retrieve (1-365, defaults to 180)"
        },
        "grader": {
          "type": "string",
          "title": "grader",
          "default": "PSA",
          "examples": [
            "PSA"
          ],
          "description": "Grading company (defaults to PSA)"
        }
      }
    }
    arguments 37 lines
  • get_price_history reads auth-required never probed

    Get Price History for a Card Get price history for a specific card and grade. Requires a card_id. If you only have a card name/description, call `card-match` or `card-search` first to get the card_id, then use it here. Returns daily price points for the card at the requested grade. By default the window ends today, so `days` alone reaches back at most one year (366 days). Results are cached for improved performance. ## Getting price history older than one year Set `end_date` to shift the `days` window into the past and page backwards, one window at a time. Each response covers `(end_date - days, end_date]` — exclusive start, inclusive end — so consecutive pages are contiguous and never overlap or skip a day. **Paging by calendar year:** | Page | Request body | |------|--------------| | This year to date | `{"card_id": "...", "grade": "PSA 9", "days": <days since Dec 31>}` | | 2025 | `{"card_id": "...", "grade": "PSA 9", "days": 365, "end_date": "2025-12-31"}` | | 2024 (leap year) | `{"card_id": "...", "grade": "PSA 9", "days": 366, "end_date": "2024-12-31"}` | | 2023 | `{"card_id": "...", "grade": "PSA 9", "days": 365, "end_date": "2023-12-31"}` | | ... | continue stepping `end_date` back a year at a time | Stop paging when a response returns an empty `prices` list — you have reached the start of the card's history (price coverage generally begins around spring 2020). Use `days: 366` for leap years so the page covers the full calendar year; `end_date` may not be in the future. Windows that end in the past are immutable, so they are cached longer (24 hours) than live windows (1 hour) — historical pages are fast and cheap to re-request. **Example curl:** ```bash # Default: 180 days of price history curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "card_id": "1587446850514x224832321163624450", "grade": "PSA 9" }' \ "{base_url}/v1/cards/prices-by-card" # Custom: 30 days of price history curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "card_id": "1587446850514x224832321163624450", "grade": "PSA 9", "days": 30 }' \ "{base_url}/v1/cards/prices-by-card" # Historical: calendar year 2024 (366 days, leap year) curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "card_id": "1587446850514x224832321163624450", "grade": "PSA 9", "days": 366, "end_date": "2024-12-31" }' \ "{base_url}/v1/cards/prices-by-card" ``` Returns price history (default window: 180 days; max: 366 days per window). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "prices": [ { "closing_date": "2025-10-26T23:59:00.000Z", "Grade": "PSA 9", "card_id": "1587446850514x224832321163624450", "price": "337.67" }, { "closing_date": "2025-10-25T23:59:00.000Z", "Grade": "PSA 9", "card_id": "1587446850514x224832321163624450", "price": "337.00" }, { "closing_date": "2025-10-24T23:59:00.000Z", "Grade": "PSA 9", "card_id": "1587446850514x224832321163624450", "price": "331.29" } ] } ``` **Output Schema:** ```json { "properties": { "prices": { "items": { "properties": { "closing_date": { "type": "string", "title": "Closing Date", "description": "Date of the price point" }, "Grade": { "type": "string", "title": "Grade", "description": "Card grade" }, "card_id": { "type": "string", "title": "Card Id", "description": "Card ID" }, "price": { "type": "string", "title": "Price", "description": "Price value" } }, "type": "object", "required": [ "closing_date", "Grade", "card_id", "price" ], "title": "PriceHistory", "description": "Individual price point from CardHedge." }, "type": "array", "title": "Prices", "description": "Daily price history for the specified card and grade" } }, "type": "object", "required": [ "prices" ], "title": "PricesByCardResponse", "description": "Response model for prices by card endpoint.", "examples": [ { "prices": [ { "Grade": "PSA 9", "card_id": "1587446850514x224832321163624450", "closing_date": "2025-10-26T23:59:00.000Z", "price": "337.67" }, { "Grade": "PSA 9", "card_id": "1587446850514x224832321163624450", "closing_date": "2025-10-25T23:59:00.000Z", "price": "337.00" }, { "Grade": "PSA 9", "card_id": "1587446850514x224832321163624450", "closing_date": "2025-10-24T23:59:00.000Z", "price": "331.29" } ] } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_price_historyArguments",
      "required": [
        "card_id",
        "grade"
      ],
      "properties": {
        "days": {
          "type": "integer",
          "title": "days",
          "default": 180,
          "maximum": 366,
          "minimum": 1,
          "examples": [
            180
          ],
          "description": "Length of the price window in days (1-366, defaults to 180). 366 is allowed so a single window can cover a full leap year."
        },
        "grade": {
          "type": "string",
          "title": "grade",
          "examples": [
            "PSA 9"
          ],
          "description": "Grade (e.g., 'PSA 9', 'BGS 9.5')"
        },
        "card_id": {
          "type": "string",
          "title": "card_id",
          "examples": [
            "1587446850514x224832321163624450"
          ],
          "description": "Unique card identifier"
        },
        "end_date": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "format": "date"
            },
            {
              "type": "null"
            }
          ],
          "title": "end_date",
          "examples": [
            "2024-12-31"
          ],
          "description": "Optional end of the price window (YYYY-MM-DD, inclusive). Defaults to today. Set it in the past to retrieve history older than one year by paging windows back in time, e.g. days=365 with end_date=2025-12-31, then days=366 with end_date=2024-12-31 (leap year), and so on. The window covers (end_date - days, end_date]."
        }
      }
    }
    arguments 54 lines
  • get_comps reads auth-required never probed

    Get Comparable Sales (Comps) Get comparable sales (comps) for a card, with anomaly filtering and optional time-weighting. Requires a card_id. If you only have a card name/description, call `card-match` or `card-search` first to get the card_id, then use it here. This endpoint: 1. Fetches the most recent sales for the card at the requested grade 2. Filters only statistical price anomalies using IQR fences (keeps non-anomalous highs/lows) 3. Calculates comp price using either: - Simple average (default) - Weighted Moving Average (if time_weighted=True), giving recent sales more weight 4. Returns `high`/`low` from the filtered sales used in the comp 5. Returns `raw_high`/`raw_low` from the unfiltered sales fetched for the request 6. Optionally returns raw price data (if include_raw_prices=True) **Time-Weighting Algorithm (WMA):** When time_weighted=True, recent sales are weighted more heavily: - Most recent sale: weight = n - Second most recent: weight = n-1 - ... - Oldest sale: weight = 1 - Formula: (P1*n + P2*(n-1) + ... + Pn*1) / (n + (n-1) + ... + 1) **Example curl:** ```bash # Basic comp (simple average) curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "card_id": "1587446850514x224832321163624450", "count": 10, "grade": "PSA 9" }' \ "{base_url}/v1/cards/comps" # Time-weighted comp with raw prices curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "card_id": "1587446850514x224832321163624450", "count": 10, "grade": "PSA 10", "time_weighted": true, "include_raw_prices": true }' \ "{base_url}/v1/cards/comps" ``` Returns calculated comp price with anomaly-aware filtering. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "comp_price": 336.0, "high": 348.0, "low": 325.0, "raw_high": 348.0, "raw_low": 325.0, "count_requested": 5, "count_used": 5, "time_weighted": true, "raw_prices": [ { "price": 325.0, "sale_date": "2025-10-26T13:00:00.000Z", "price_source": "marketplace", "card_id": "1587446850514x224832321163624450", "price_history_id": "1761480061129x501444455762531900", "grade": "PSA 9", "sale_type": "Best Offer", "title": "[listing title]", "sale_url": "[sale url]", "image": "[image url]" }, { "price": 348.0, "sale_date": "2025-10-26T03:36:00.000Z", "price_source": "marketplace", "card_id": "1587446850514x224832321163624450", "price_history_id": "1761446206940x522975047258362750", "grade": "PSA 9", "sale_type": "Auction", "title": "[listing title]", "sale_url": "[sale url]", "image": "[image url]" } ] } ``` **Output Schema:** ```json { "properties": { "comp_price": { "type": "number", "title": "Comp Price", "description": "Calculated comparable price (after anomaly filtering)" }, "high": { "type": "number", "title": "High", "description": "Highest sale price used in comp calculation" }, "low": { "type": "number", "title": "Low", "description": "Lowest sale price used in comp calculation" }, "raw_high": { "type": "number", "title": "Raw High", "description": "Highest unfiltered sale price fetched for this comp request" }, "raw_low": { "type": "number", "title": "Raw Low", "description": "Lowest unfiltered sale price fetched for this comp request" }, "count_requested": { "type": "integer", "title": "Count Requested", "description": "Number of prices requested" }, "count_used": { "type": "integer", "title": "Count Used", "description": "Number of prices used in calculation (after anomaly filtering)" }, "time_weighted": { "type": "boolean", "title": "Time Weighted", "description": "Whether time-weighted algorithm was used" }, "raw_prices": { "title": "Raw Prices", "description": "Raw price data (only included if include_raw_prices=true)" } }, "type": "object", "required": [ "comp_price", "high", "low", "raw_high", "raw_low", "count_requested", "count_used", "time_weighted" ], "title": "CompsResponse", "description": "Response schema for comp prices.", "examples": [ { "comp_price": 336.0, "count_requested": 5, "count_used": 5, "high": 348.0, "low": 325.0, "raw_high": 348.0, "raw_low": 325.0, "raw_prices": [ { "card_id": "1587446850514x224832321163624450", "grade": "PSA 9", "image": "[image url]", "price": 325.0, "price_history_id": "1761480061129x501444455762531900", "price_source": "marketplace", "sale_date": "2025-10-26T13:00:00.000Z", "sale_type": "Best Offer", "sale_url": "[sale url]", "title": "[listing title]" }, { "card_id": "1587446850514x224832321163624450", "grade": "PSA 9", "image": "[image url]", "price": 348.0, "price_history_id": "1761446206940x522975047258362750", "price_source": "marketplace", "sale_date": "2025-10-26T03:36:00.000Z", "sale_type": "Auction", "sale_url": "[sale url]", "title": "[listing title]" } ], "time_weighted": true } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_compsArguments",
      "required": [
        "card_id",
        "count",
        "grade"
      ],
      "properties": {
        "count": {
          "type": "integer",
          "title": "count",
          "maximum": 100,
          "minimum": 1,
          "description": "Number of comp prices (1-100)"
        },
        "grade": {
          "type": "string",
          "title": "grade",
          "description": "Card grade (e.g., 'PSA 10', 'BGS 9.5')"
        },
        "card_id": {
          "type": "string",
          "title": "card_id",
          "description": "Card ID"
        },
        "time_weighted": {
          "type": "boolean",
          "title": "time_weighted",
          "default": false,
          "description": "If true, weight recent sales more heavily using WMA algorithm"
        },
        "include_raw_prices": {
          "type": "boolean",
          "title": "include_raw_prices",
          "default": false,
          "description": "If true, include raw price data in response"
        }
      }
    }
    arguments 40 lines
  • estimate_price reads auth-required never probed

    Get Price Estimate for a Card Get a price estimate for a card at a specific grade. Requires a card_id. If you only have a card name/description, call `card-match` or `card-search` first to get the card_id, then use it here. This endpoint uses CardHedge's correlated price estimation service to provide price estimates with confidence intervals. The estimation can use either direct sales data or correlated pricing from similar cards. **Response Fields:** - `price`: Estimated price in USD - `price_low`: Lower bound of price estimate - `price_high`: Upper bound of price estimate - `confidence`: Confidence score (0-1) - `method`: Estimation method used ('direct' or 'correlated') - `freshness_days`: Age of data used for estimation in days - `support_grades`: Number of supporting grade data points - `grade_label`: Grade label used for estimation - `provider`: Grading provider (e.g., 'PSA', 'BGS') - `grade_value`: Numeric grade value **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "card_id": "1586812246197x228181943611293700", "grade": "PSA 9" }' \ "{base_url}/v1/cards/price-estimate" ``` Returns price estimate with confidence bounds and metadata. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "price": 349.99, "price_low": 329.2, "price_high": 370.78, "confidence": 0.3869, "method": "direct", "freshness_days": 0, "support_grades": 1, "grade_label": "PSA 9", "provider": "PSA", "grade_value": 9.0 } ``` **Output Schema:** ```json { "properties": { "price": { "title": "Price", "description": "Estimated price in USD (null when no data available)" }, "price_low": { "title": "Price Low", "description": "Lower bound of price estimate (null when no data available)" }, "price_high": { "title": "Price High", "description": "Upper bound of price estimate (null when no data available)" }, "confidence": { "type": "number", "title": "Confidence", "description": "Confidence score (0-1)" }, "method": { "type": "string", "title": "Method", "description": "Estimation method used (e.g., 'direct', 'correlated', 'segment_fallback')" }, "freshness_days": { "title": "Freshness Days", "description": "Age of data used for estimation in days (null for fallback methods)" }, "support_grades": { "type": "integer", "title": "Support Grades", "description": "Number of supporting grade data points" }, "grade_label": { "type": "string", "title": "Grade Label", "description": "Grade label used for estimation" }, "provider": { "type": "string", "title": "Provider", "description": "Grading provider (e.g., 'PSA', 'BGS', 'AGS')" }, "grade_value": { "type": "number", "title": "Grade Value", "description": "Numeric grade value" } }, "type": "object", "required": [ "confidence", "method", "support_grades", "grade_label", "provider", "grade_value" ], "title": "PriceEstimateResponse", "description": "Response model for price estimation endpoint.", "examples": [ { "confidence": 0.3809, "freshness_days": 2, "grade_label": "PSA 9", "grade_value": 9.0, "method": "direct", "price": 385.0, "price_high": 407.92, "price_low": 362.08, "provider": "PSA", "support_grades": 1 } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "estimate_priceArguments",
      "required": [
        "card_id",
        "grade"
      ],
      "properties": {
        "grade": {
          "type": "string",
          "title": "grade",
          "description": "Card grade (e.g., 'PSA 9', 'PSA 10', 'BGS 9.5')"
        },
        "card_id": {
          "type": "string",
          "title": "card_id",
          "description": "Unique card identifier from CardHedge"
        }
      }
    }
    arguments 20 lines
  • match_card reads auth-required never probed

    Match a Card from a Text Description (AI) Match a natural language card description to the best card in the CardHedge database. Uses AI to evaluate search results and return the single best match with a confidence score. **How it works:** 1. Your query is sent to the card search API to find candidates 2. An LLM evaluates each candidate against your description 3. The best match is returned with a confidence score (0.0 - 1.0) **Confidence levels:** - **0.9 - 1.0**: Very high confidence — near-exact match - **0.7 - 0.9**: High confidence — likely correct match - **0.5 - 0.7**: Moderate confidence — possible match, verify manually - **Below 0.5**: No match returned (threshold not met) **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "query": "2025 Topps Chrome Cooper Flagg 251", "category": "Basketball" }' \ "{base_url}/v1/cards/card-match" ``` ### Responses: **200**: Best matching card, or a null match below the confidence threshold (Success Response) Content-Type: application/json **Example Response:** ```json { "match": { "confidence": 0.95, "reasoning": "Exact match on player, year, set, and card number.", "description": "Shohei Ohtani 2018 Topps Chrome Baseball", "player": "Shohei Ohtani", "set": "2018 Topps Chrome Baseball", "number": "150", "variant": "Base", "card_id": "1587446850514x224832321163624450", "image": "https://images.example.com/ohtani-150.jpg", "category": "Baseball", "prices": [ { "grade": "PSA 10", "price": "850" }, { "grade": "PSA 9", "price": "125" } ] }, "candidates_evaluated": 10, "search_query_used": "2018 Topps Chrome Shohei Ohtani #150" } ``` **Output Schema:** ```json { "properties": { "match": { "description": "Best matching card with confidence score, or null if no confident match found" }, "candidates_evaluated": { "type": "integer", "title": "Candidates Evaluated", "description": "Number of candidate cards evaluated by the AI" }, "search_query_used": { "type": "string", "title": "Search Query Used", "description": "The search query that was sent to the card search API" } }, "type": "object", "required": [ "candidates_evaluated", "search_query_used" ], "title": "CardMatchResponse", "description": "Response model for AI-powered card matching.", "examples": [ { "candidates_evaluated": 10, "match": { "card_id": "1587446850514x224832321163624450", "category": "Baseball", "confidence": 0.95, "description": "Shohei Ohtani 2018 Topps Chrome Baseball", "image": "//s3.amazonaws.com/appforest_uf/example.jpg", "number": "150", "player": "Shohei Ohtani", "prices": [ { "grade": "PSA 10", "price": "850" }, { "grade": "PSA 9", "price": "125" } ], "reasoning": "Exact match on player (Shohei Ohtani), year (2018), set (Topps Chrome), and variant (Base). This is the most commonly referenced version of this card.", "set": "2018 Topps Chrome Baseball", "variant": "Base" }, "search_query_used": "Shohei Ohtani 2018 Topps Chrome" } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "match_cardArguments",
      "required": [
        "query"
      ],
      "properties": {
        "query": {
          "type": "string",
          "title": "query",
          "maxLength": 500,
          "minLength": 3,
          "description": "Natural language description of the card to match (e.g., '2018 Topps Chrome Shohei Ohtani rookie base')"
        },
        "category": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "category",
          "description": "Optional category filter to narrow search (e.g., 'Baseball', 'Pokemon')"
        },
        "max_candidates": {
          "type": "integer",
          "title": "max_candidates",
          "default": 10,
          "maximum": 10,
          "minimum": 1,
          "description": "Number of search results to evaluate (1-10, more = slower but potentially more accurate)"
        },
        "raw_images_only": {
          "type": "boolean",
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "title": "raw_images_only",
          "default": true,
          "description": "If true, only return actual card photos (not graded slab images). Defaults to true."
        }
      }
    }
    arguments 51 lines
  • get_player_index_history reads auth-required never probed

    Get Player Index History Player index values over a date range (default: the 365 days up to the latest index date; at most 1,830 days). `weekly` points are averages keyed by the ISO-week Monday, `monthly` by the 1st. Points built from a constituent set that fails the integrity check come back with `value: null, withheld: true`. **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" -H "Content-Type: application/json" -d '{"name":"Luka Doncic","interval":"monthly"}' "{base_url}/v1/cards/player-index-history" ``` ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "player": { "player_id": "1585918730738x583198232556601300", "name": "Luka Doncic", "categories": [ "Basketball" ], "aliases": [] }, "resolution": { "requested_player_id": "1585918730738x583198232556601300", "resolved_via": "player_id" }, "interval": "weekly", "start_date": "2026-09-21", "end_date": "2026-09-25", "points": [ { "date": "2026-09-21", "value": 941.2, "volume_30d": 350, "card_count": 10, "withheld": false } ], "integrity": { "verdict": "ok", "foreign_weight_pct": 0.0, "unknown_weight_pct": 0.0 } } ``` **Output Schema:** ```json { "properties": { "player": { "properties": { "player_id": { "type": "string", "title": "Player Id", "description": "Canonical Card Hedge player ID" }, "name": { "type": "string", "title": "Name" }, "categories": { "items": { "type": "string" }, "type": "array", "title": "Categories" }, "aliases": { "items": { "type": "string" }, "type": "array", "title": "Aliases", "description": "Player IDs merged into this player" } }, "type": "object", "required": [ "player_id", "name" ], "title": "PlayerBlock" }, "resolution": { "properties": { "requested_player_id": { "title": "Requested Player Id" }, "requested_name": { "title": "Requested Name" }, "requested_category": { "title": "Requested Category" }, "resolved_via": { "type": "string", "enum": [ "player_id", "alias", "name" ], "title": "Resolved Via" } }, "type": "object", "required": [ "resolved_via" ], "title": "ResolutionBlock" }, "interval": { "type": "string", "enum": [ "daily", "weekly", "monthly" ], "title": "Interval" }, "start_date": { "type": "string", "format": "date", "title": "Start Date" }, "end_date": { "type": "string", "format": "date", "title": "End Date" }, "points": { "items": { "properties": { "date": { "type": "string", "format": "date", "title": "Date" }, "value": { "title": "Value" }, "volume_30d": { "title": "Volume 30D" }, "card_count": { "title": "Card Count" }, "withheld": { "type": "boolean", "title": "Withheld", "default": false } }, "type": "object", "required": [ "date" ], "title": "HistoryPointBlock" }, "type": "array", "title": "Points" }, "integrity": { "properties": { "verdict": { "type": "string", "enum": [ "ok", "warning", "withheld" ], "title": "Verdict" }, "foreign_weight_pct": { "type": "number", "title": "Foreign Weight Pct", "description": "% of index weight from other players' cards" }, "unknown_weight_pct": { "type": "number", "title": "Unknown Weight Pct", "description": "% of index weight whose card owner is unknown", "default": 0.0 }, "reason": { "title": "Reason" } }, "type": "object", "required": [ "verdict", "foreign_weight_pct" ], "title": "IntegrityBlock" } }, "type": "object", "required": [ "player", "resolution", "interval", "start_date", "end_date", "points", "integrity" ], "title": "PlayerIndexHistoryResponse" } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_player_index_historyArguments",
      "properties": {
        "name": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "maxLength": 100
            },
            {
              "type": "null"
            }
          ],
          "title": "name",
          "description": "Player name; resolves only when it matches exactly one player (else 409 with candidates)."
        },
        "category": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "maxLength": 50
            },
            {
              "type": "null"
            }
          ],
          "title": "category",
          "description": "With `name` only: one category (name or slug) to tell same-named players apart."
        },
        "end_date": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "format": "date"
            },
            {
              "type": "null"
            }
          ],
          "title": "end_date",
          "description": "Default: the latest index date"
        },
        "interval": {
          "enum": [
            "daily",
            "weekly",
            "monthly"
          ],
          "type": "string",
          "title": "interval",
          "default": "daily",
          "description": "daily | weekly (Monday buckets) | monthly (1st-of-month buckets)"
        },
        "player_id": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "maxLength": 64
            },
            {
              "type": "null"
            }
          ],
          "title": "player_id",
          "description": "Card Hedge player ID (from player-search). Alias IDs resolve to their canonical player."
        },
        "start_date": {
          "type": "string",
          "anyOf": [
            {
              "type": "string",
              "format": "date"
            },
            {
              "type": "null"
            }
          ],
          "title": "start_date",
          "description": "Default: end_date minus 365 days"
        }
      }
    }
    arguments 87 lines
  • get_card_fmv reads auth-required never probed

    Get Fair Market Value (FMV) for a Card Get the Fair Market Value (FMV) for a card at a specific grade. Requires a `card_id`. If you only have a card name/description, call `match-card` or `card-search` first to resolve it. ## What FMV is FMV is CardHedge's smoothed valuation for a card at a specific grade, computed by an underlying pricing service that: 1. Looks for a direct price for this card+grade, and if found, replaces the raw `latest_price` with a **Winsorized-median FMV** computed over a 7/15/30/90-day window (the shortest window with enough daily prints wins). Winsorizing trims outlier sales so a single hot/cold day doesn't move the value. 2. If no direct price exists, falls back through a cascade of related data: other grades of the same card → other graders → grade multipliers → segment baselines. 3. If the chosen base price is stale, overlays a **movement index** to project it to today. The index is picked from the most specific level with enough sample density (card+grade → card → player → segment). 4. Returns the price, a confidence score, and full metadata so callers can decide how much to trust the result. Compared to `price-estimate`, the FMV response includes the smoothing window, sample counts, confidence grade, and a human-readable `price_explanation`. ## FMV calculation methods (the **method** field) The `method` field tells you which cascade step produced the price. There are **6 base methods** plus an `_indexed` variant of each non-terminal method (10 indexed + 1 terminal = 11 possible values). **Base methods**, in cascade priority: | Method | Meaning | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `direct` | Exact card+grade lookup. The 7/15/30/90-day Winsorized-median FMV is used when enough daily prints exist; otherwise raw `latest_price` is returned. See `fmv_window_days` / `fmv_sample_count`. | | `card_interpolation` | No direct price; isotonic regression in log-space across the card's OTHER same-provider grades, interpolated/extrapolated to the target grade. Requires 2+ supporting grades. | | `cross_provider` | No same-provider data; translates from another grader (e.g., BGS 9 → PSA 9) using a learned price ratio. | | `anchor_multiplier` | One same-provider grade is the anchor; a within-provider grade multiplier projects it to the target. Variants: same-provider, chained (e.g., BGS 8.5 → BGS 9 → PSA 9), raw (Raw → graded). | | `segment_fallback` | Last resort: uses the (set × year × category) segment baseline price and applies a grade multiplier. Lowest confidence — no card-specific data was used. | | `no_data` | Terminal: nothing in the cascade produced a usable price. `price` and the range bounds are null. | **`_indexed` variants** — `direct_indexed`, `card_interpolation_indexed`, `cross_provider_indexed`, `anchor_multiplier_indexed`, `segment_fallback_indexed`. The base method produced a stale price (older than the freshness threshold), so a **movement index** was overlaid to bring it to today. The index is chosen from a cascade of entities: - `index_level: "card_grade"` — most specific: this card at this grade - `index_level: "card"` — blended across all grades of this card - `index_level: "player"` — player-level (all this player's cards) - `index_level: "segment"` — (year × category) segment-level - `index_level: "none"` — stale, but no index met the minimum sample threshold (an `un_indexed_penalty` was applied to confidence) - `index_level: null` — fresh estimate, no adjustment was needed Examine `raw_price` (pre-adjustment) vs `price` (post-adjustment) and `index_pct_change` to see exactly what the index changed. Filter low-signal adjustments by requiring `index_sample_count >= 10`. ## Picking a method by use case - **Pricing UI for end users** — Trust `confidence_grade` A/B; show `price_explanation` on a "How was this calculated?" tooltip. Hide or caveat C/D and `no_data`. - **Portfolio valuation** — Use `price` directly; band it with `price_low` / `price_high` for uncertainty visualization. - **Sensitive financial decisions** — On C-grade or any `_indexed` method, also show `raw_price` so the user can see what the movement index changed. - **Bulk analytics** — Aggregate by `method` to see what % of cards have direct data vs are interpolated vs fall back to segments. ## Response field reference See the response schema (CardFMVResponse) for the full field-by-field description. Highlights: - `price` / `price_low` / `price_high` — FMV and uncertainty band in USD. - `confidence` (0-1) and bucketed `confidence_grade` (A/B/C/D) — single trust score folding in method, FMV quality, and index quality. - `raw_price` — pre-adjustment price. Differs from `price` when a movement index was applied (`_indexed`), or shows the FMV value for `direct` when latest_price was replaced. - `fmv_window_days` / `fmv_sample_count` — FMV smoothing window (7/15/30/90) and sample density. - `index_level` / `index_pct_change` / `index_sample_count` / `index_truncated` / `as_of_date` — movement-index provenance. - `cross_grade_fmv_count` — for cross-grade methods, how many source grades had their `latest_price` FMV-substituted before the cascade ran. - `price_explanation` — plain-English derivation (debug/audit only). Any additional fields the upstream returns are passed through unchanged. **Example curl:** ```bash curl -X POST -H "X-API-Key: your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "card_id": "1586812246197x228181943611293700", "grade": "PSA 9" }' \ "{base_url}/v1/cards/card-fmv" ``` ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "price": 2000.0, "price_low": 1908.05, "price_high": 2091.95, "confidence": 0.9772, "method": "direct", "freshness_days": 3, "support_grades": 1, "grade_label": "BGS 9.5", "provider": "BGS", "grade_value": 9.5, "index_truncated": false, "confidence_grade": "A", "price_explanation": "Used latest_price $2000.00 (card_grade_prints direct lookup). Fresh (3d) \u2014 no movement adjustment applied." } ``` **Output Schema:** ```json { "properties": { "price": { "title": "Price", "description": "Fair market value in USD (null when no data available)" }, "price_low": { "title": "Price Low", "description": "Lower bound of the FMV range (null when no data available)" }, "price_high": { "title": "Price High", "description": "Upper bound of the FMV range (null when no data available)" }, "confidence": { "title": "Confidence", "description": "Confidence score (0-1) for the FMV calculation" }, "method": { "title": "Method", "description": "FMV calculation method. One of 11 values from the cascade:\n\n**Base methods (in priority order):**\n- `direct` \u2014 Exact card+grade lookup. Latest_price is replaced with a Winsorized-median FMV over a 7/15/30/90-day window when enough daily prints exist; otherwise latest_price is used as-is.\n- `card_interpolation` \u2014 No direct price; isotonic regression in log-space across the card's OTHER same-provider grades, then interpolating/extrapolating to the target grade.\n- `cross_provider` \u2014 No same-provider data; translates from another grader (e.g., BGS 9 \u2192 PSA 9) using a learned price ratio.\n- `anchor_multiplier` \u2014 Uses one same-provider grade as an anchor and applies a within-provider grade multiplier. Variants include same-provider, chained (e.g., BGS 8.5 \u2192 BGS 9 \u2192 PSA 9), and raw (Raw card price \u2192 graded). See `anchor_from_raw` / `anchor_chained_from_provider`.\n- `segment_fallback` \u2014 Last resort: uses the set/year \u00d7 category baseline price and applies a grade multiplier.\n- `no_data` \u2014 No sale data could produce a value; `price` is null.\n\n**`_indexed` variants** (`direct_indexed`, `card_interpolation_indexed`, `cross_provider_indexed`, `anchor_multiplier_indexed`, `segment_fallback_indexed`) \u2014 the base method produced a stale price, so a movement index was overlaid to bring it to today. See `index_level`, `index_pct_change`, and `raw_price` for the adjustment details." }, "freshness_days": { "title": "Freshness Days", "description": "Age of the underlying sale data in days (0 = today). On `_indexed` methods this reflects the index's `as_of_date`, not the base price's age. Null on `segment_fallback` and `no_data`." }, "support_grades": { "title": "Support Grades", "description": "Number of grade data points contributing to the estimate. 1 for `direct`; 2+ for `card_interpolation` (other grades of this card); 1 for `anchor_multiplier`; 0 for `segment_fallback` / `no_data`." }, "grade_label": { "title": "Grade Label", "description": "Normalized grade label the FMV was computed for (e.g., 'PSA 9', 'BGS 9.5', 'Raw')." }, "provider": { "title": "Provider", "description": "Grading provider (e.g., 'PSA', 'BGS', 'SGC', 'CGC', 'Raw')." }, "grade_value": { "title": "Grade Value", "description": "Numeric grade value (e.g., 9.0, 9.5, 10.0). 0 for Raw; negative values denote authenticated-only grades (e.g., 'PSA Auth')." }, "as_of_date": { "title": "As Of Date", "description": "ISO 8601 date the applied movement index was last computed. Set only on `_indexed` methods; null otherwise." }, "index_level": { "title": "Index Level", "description": "Cascade level used for movement adjustment. One of:\n\n- `card_grade` \u2014 most specific: this card at this grade\n- `card` \u2014 blended across all grades of this card\n- `player` \u2014 player-level index (all cards of this player)\n- `segment` \u2014 (year \u00d7 category) segment-level index\n- `none` \u2014 stale price, but no index met the minimum sample threshold (an `un_indexed_penalty` is applied to confidence)\n- `null` \u2014 fresh estimate, no movement adjustment needed" }, "index_pct_change": { "title": "Index Pct Change", "description": "Cumulative percent change applied by the movement index over the FMV's lookback window (decimal, e.g., 0.157 = +15.7%). Set only on `_indexed` methods." }, "raw_price": { "title": "Raw Price", "description": "Pre-adjustment price in USD. For `direct`: the chosen FMV value (or the original `latest_price` when no FMV qualified). For other cascade methods: the original method result before any movement adjustment. Compare `price` vs `raw_price` to see what the movement index changed." }, "index_truncated": { "title": "Index Truncated", "description": "True if the FMV's lookback window was capped at the maximum (730 days) because the underlying price was extremely stale. Treat truncated movement adjustments as lower-confidence." }, "fmv_window_days": { "title": "Fmv Window Days", "description": "FMV smoothing window used for the base price. One of 7, 15, 30, or 90 \u2014 the upstream picks the shortest window with enough samples. Null when no FMV smoothing was applied (the lookup fell back to `card_grade_prices.latest_price`, or the method is not `direct`)." }, "fmv_sample_count": { "title": "Fmv Sample Count", "description": "Number of distinct daily prints that fed the chosen FMV's Winsorized median. Higher = more reliable. Null when no FMV was applied." }, "base_sample_count": { "title": "Base Sample Count", "description": "Number of sales behind the base latest_price (90-day sale count on the source grade row). Only set on `direct` lookups that did NOT substitute a Winsorized-median FMV \u2014 where `fmv_sample_count` is present it describes the FMV instead. Use to tell a well-backed latest_price from a single-sale print; null means the source reported no sale count." }, "index_sample_count": { "title": "Index Sample Count", "description": "Number of observations at the chosen movement-index window. Useful for filtering low-signal adjustments \u2014 e.g., ignore `index_pct_change` when `index_sample_count < 10`." }, "confidence_grade": { "title": "Confidence Grade", "description": "Bucketed confidence grade \u2014 a quick proxy for the numeric `confidence`:\n\n- `A` \u2014 confidence \u2265 0.42 (~86% of prices within 2\u00d7 of the actual sale). Trust for valuations.\n- `B` \u2014 confidence \u2265 0.25 (~74% within 2\u00d7). Usable; consider showing `raw_price` too.\n- `C` \u2014 confidence \u2265 0.10 (~63% within 2\u00d7). Borderline; consider falling back to `latest_price` for sensitive decisions.\n- `D` \u2014 confidence < 0.10 (~49% within 2\u00d7). Likely noisy; show with disclaimer.\n\nCutoffs are calibrated to measured accuracy on held-out sales and may be re-tuned as the model improves \u2014 rely on the letter grade rather than hard-coding numeric thresholds.\n\nNull on `no_data`. The numeric `confidence` already folds in cascade method, FMV signal strength, and movement-index quality, so this single grade reflects total trust in the returned price." }, "price_explanation": { "title": "Price Explanation", "description": "Human-readable description of how the FMV was derived \u2014 e.g., 'Used 7d FMV ($416.25, Winsorized median of 3 daily prints) in place of latest_price $416.25. Fresh (1d) \u2014 no movement adjustment applied.' Useful for debug UIs and audit trails; not intended for programmatic parsing (wording may change)." }, "cross_grade_fmv_count": { "title": "Cross Grade Fmv Count", "description": "For cross-grade methods (`card_interpolation`, `cross_provider`, `anchor_multiplier`): count of source grades whose `latest_price` was replaced with a Winsorized-median FMV before the cascade ran. Higher = more smoothing applied. Null when the method wasn't used; 0 when used but no FMV qualified for any source." } }, "additionalProperties": true, "type": "object", "title": "CardFMVResponse", "description": "Response model for the card FMV endpoint.\n\nMirrors the upstream FMV service response. Any additional fields returned\nby the upstream are preserved via ``extra='allow'`` so consumers receive\nthe full payload even if the upstream adds new fields.", "examples": [ { "confidence": 0.3499, "confidence_grade": "B", "fmv_sample_count": 3, "fmv_window_days": 7, "freshness_days": 1, "grade_label": "PSA 9", "grade_value": 9.0, "index_truncated": false, "method": "direct", "price": 416.25, "price_explanation": "Used 7d FMV ($416.25, Winsorized median of 3 daily prints) in place of latest_price $416.25. Fresh (1d) \u2014 no movement adjustment applied.", "price_high": 435.24, "price_low": 397.26, "provider": "PSA", "raw_price": 416.25, "support_grades": 1 } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_card_fmvArguments",
      "required": [
        "card_id",
        "grade"
      ],
      "properties": {
        "grade": {
          "type": "string",
          "title": "grade",
          "description": "Card grade label. Supported formats: '<Provider> <Grade>' (e.g., 'PSA 9', 'PSA 10', 'BGS 9.5', 'SGC 9', 'CGC 10'), 'Raw' for ungraded, or '<Provider> Auth' for authenticated-only."
        },
        "card_id": {
          "type": "string",
          "title": "card_id",
          "description": "Unique CardHedge card identifier. If you only have a card name or description, call `match-card` or `card-search` first to resolve it."
        }
      }
    }
    arguments 20 lines
  • get_top_movers reads auth-required never probed

    Get Top Movers (Weekly Price Gainers) Get the cards with the largest price gains over the past week. Gains of 500% or more are filtered out as likely data errors, so results reflect realistic market movement. Results are cached for 1 hour. **Example curl:** ```bash # All categories curl -H "X-API-Key: your-api-key-here" \ "{base_url}/v1/cards/top-movers?count=20" # Baseball only curl -H "X-API-Key: your-api-key-here" \ "{base_url}/v1/cards/top-movers?count=20&category=Baseball" ``` Returns cards with realistic price increases (< 500% gain), limited to requested count. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "cards": [ { "description": "Shohei Ohtani 2018 Topps Chrome Baseball", "player": "Shohei Ohtani", "set": "2018 Topps Chrome Baseball", "number": "150", "variant": "Refractor", "card_id": "1587446850514x224832321163624450", "image": "//s3.amazonaws.com/appforest_uf/example.jpg", "category": "Baseball", "category_group": "Sports Cards", "set_type": "Topps Chrome Baseball", "30 Day Sales": 45, "rookie": true, "gain": 650.5, "prices": [ { "grade": "PSA 10", "price": "2500" }, { "grade": "PSA 9", "price": "850" } ] } ], "total_count": 50, "filtered_count": 1, "gain_threshold": 500.0 } ``` **Output Schema:** ```json { "properties": { "cards": { "items": { "properties": { "description": { "type": "string", "title": "Description", "description": "Full card description" }, "player": { "type": "string", "title": "Player", "description": "Player or character name" }, "set": { "type": "string", "title": "Set", "description": "Card set name" }, "number": { "type": "string", "title": "Number", "description": "Card number in set" }, "variant": { "type": "string", "title": "Variant", "description": "Card variant (e.g., 'Reverse Foil')" }, "card_id": { "type": "string", "title": "Card Id", "description": "Unique card identifier" }, "image": { "type": "string", "title": "Image", "description": "Card image URL" }, "category": { "type": "string", "title": "Category", "description": "Card category" }, "category_group": { "type": "string", "title": "Category Group", "description": "Category group" }, "set_type": { "type": "string", "title": "Set Type", "description": "Set type" }, "7 Day Sales": { "type": "integer", "title": "7 Day Sales", "description": "Sales in last 7 days" }, "30 Day Sales": { "type": "integer", "title": "30 Day Sales", "description": "Sales in last 30 days" }, "rookie": { "type": "boolean", "title": "Rookie", "description": "Whether the card is a rookie card" }, "gain": { "type": "number", "title": "Gain", "description": "Percentage gain" }, "prices": { "items": { "properties": { "grade": { "type": "string", "title": "Grade", "description": "Card grade (e.g., 'Raw', 'PSA 10')" }, "price": { "type": "string", "title": "Price", "description": "Price in string format" } }, "type": "object", "required": [ "grade", "price" ], "title": "CardPrice", "description": "Price information for a card at different grades." }, "type": "array", "title": "Prices", "description": "Price information at different grades" } }, "type": "object", "required": [ "description", "player", "set", "number", "variant", "card_id", "image", "category", "category_group", "set_type", "7 Day Sales", "30 Day Sales", "rookie", "gain", "prices" ], "title": "TopMoverCard", "description": "Card information for top movers endpoint." }, "type": "array", "title": "Cards", "description": "List of top moving cards" }, "total_count": { "type": "integer", "title": "Total Count", "description": "Total number of cards returned" }, "filtered_count": { "type": "integer", "title": "Filtered Count", "description": "Number of cards after filtering" }, "gain_threshold": { "type": "number", "title": "Gain Threshold", "description": "Minimum gain percentage used for filtering (default: 500%)" } }, "type": "object", "required": [ "cards", "total_count", "filtered_count", "gain_threshold" ], "title": "TopMoversResponse", "description": "Response model for top movers endpoint.", "examples": [ { "cards": [ { "30 Day Sales": 45, "7 Day Sales": 12, "card_id": "1587446850514x224832321163624450", "category": "Baseball", "category_group": "Sports Cards", "description": "Shohei Ohtani 2018 Topps Chrome Baseball", "gain": 650.5, "image": "//s3.amazonaws.com/appforest_uf/example.jpg", "number": "150", "player": "Shohei Ohtani", "prices": [ { "grade": "PSA 10", "price": "2500" }, { "grade": "PSA 9", "price": "850" } ], "rookie": true, "set": "2018 Topps Chrome Baseball", "set_type": "Topps Chrome Baseball", "variant": "Refractor" } ], "filtered_count": 1, "gain_threshold": 500.0, "total_count": 50 } ] } ```

    mcp-tool

    {
      "type": "object",
      "title": "get_top_moversArguments",
      "properties": {
        "count": {
          "type": "integer",
          "title": "count",
          "default": 20,
          "maximum": 100,
          "minimum": 1,
          "description": "Number of cards to return"
        },
        "category": {
          "type": "string",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "category",
          "description": "Optional category filter (e.g., 'Baseball', 'Basketball', 'Pokemon')"
        }
      }
    }
    arguments 27 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id f95f9ef2f995e46b.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/f95f9ef2f995e46b/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/f95f9ef2f995e46b/badge.svg)](https://brick.blue/agent/f95f9ef2f995e46b?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.