{"openapi":"3.0.3","info":{"title":"ZeroPop Card Catalog","version":"0.1.0","description":"Look up trading card identity and current market value. Covers Pokemon, Yu-Gi-Oh, Disney Lorcana, One Piece and sports cards, answered from ZeroPop’s own first-party catalog, which is built from real collector scans and sold-comp pricing rather than asking prices. Use it to identify a card from a name, to price a card a user owns or is considering buying, or to explore a set. Prices are in US dollars. The API is free and needs no authentication, no API key and no account.","termsOfService":"https://zeropop.app/terms","contact":{"name":"ZeroPop support","url":"https://zeropop.app/contact"}},"paths":{"/v1/public/cards/{cardKey}":{"get":{"operationId":"getPublicCard","tags":["PublicCatalog"],"summary":"Get one card by its catalog key","parameters":[{"name":"cardKey","in":"path","required":true,"schema":{"maxLength":256,"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["card","scans"],"properties":{"card":{"type":"object","required":["cardKey","slug","justTcgCardId","tcgplayerId","cardName","setName","setId","cardNumber","year","rarity","variant","finish","printing","game","setReleaseDate","setCardCount","lastSeenPrice","priceSource","priceHistory"],"properties":{"cardKey":{"type":"string"},"slug":{"nullable":true,"type":"string"},"justTcgCardId":{"nullable":true,"type":"string"},"tcgplayerId":{"nullable":true,"type":"string"},"cardName":{"type":"string"},"setName":{"type":"string"},"setId":{"nullable":true,"type":"string"},"cardNumber":{"nullable":true,"type":"string"},"year":{"nullable":true,"type":"string"},"rarity":{"nullable":true,"type":"string"},"variant":{"nullable":true,"type":"string"},"finish":{"nullable":true,"type":"string"},"printing":{"nullable":true,"type":"string"},"game":{"nullable":true,"type":"string"},"setReleaseDate":{"nullable":true,"type":"string"},"setCardCount":{"nullable":true,"type":"number"},"lastSeenPrice":{"nullable":true,"type":"number"},"priceSource":{"nullable":true,"type":"string"},"priceHistory":{"type":"array","items":{"type":"object","required":["t","p"],"properties":{"t":{"type":"number"},"p":{"type":"number"}}}}}},"scans":{"type":"array","items":{"type":"object","required":["id","justTcgCardId","cardName","setName","cardType","cardNumber","year","rarity","variant","finish","overallGrade","corners","edges","surface","centering","cornerDefects","edgeDefects","surfaceDefects","estimatedValueUsd","imagePath","gradedAt","authorUsername"],"properties":{"id":{"type":"string"},"justTcgCardId":{"nullable":true,"type":"string"},"cardName":{"type":"string"},"setName":{"type":"string"},"cardType":{"type":"string"},"cardNumber":{"nullable":true,"type":"string"},"year":{"nullable":true,"type":"string"},"rarity":{"nullable":true,"type":"string"},"variant":{"nullable":true,"type":"string"},"finish":{"nullable":true,"type":"string"},"overallGrade":{"type":"number"},"corners":{"type":"number"},"edges":{"type":"number"},"surface":{"type":"number"},"centering":{"type":"number"},"cornerDefects":{"type":"string"},"edgeDefects":{"type":"string"},"surfaceDefects":{"type":"string"},"estimatedValueUsd":{"type":"number"},"imagePath":{"type":"string"},"gradedAt":{"type":"number"},"authorUsername":{"nullable":true,"type":"string"}}}}}}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}},"description":"Look up a single card in full detail once you know its `cardKey`, which comes from a search hit. Returns the card record (identity, set, number, year, rarity, variant, finish, game, `lastSeenPrice` in US dollars and its price history) together with recent real collector scans of that card, including the condition grade each scan received. Use this when the user has picked a specific card and wants its value, its printing details, or evidence of how copies actually grade. Returns 404 when the key is unknown, which means ZeroPop does not have that card: say so plainly and never invent a price, a grade or any other detail for it."}},"/v1/public/sets/{setId}":{"get":{"operationId":"getPublicSet","tags":["PublicCatalog"],"summary":"Get a set and the cards in it","parameters":[{"name":"setId","in":"path","required":true,"schema":{"maxLength":256,"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["setId","setName","year","releaseDate","cardCount","cards"],"properties":{"setId":{"type":"string"},"setName":{"type":"string"},"year":{"nullable":true,"type":"string"},"releaseDate":{"nullable":true,"type":"string"},"cardCount":{"nullable":true,"type":"number"},"cards":{"type":"array","items":{"type":"object","required":["cardKey","slug","justTcgCardId","tcgplayerId","cardName","setName","setId","cardNumber","year","rarity","variant","finish","printing","game","setReleaseDate","setCardCount","lastSeenPrice","priceSource","priceHistory"],"properties":{"cardKey":{"type":"string"},"slug":{"nullable":true,"type":"string"},"justTcgCardId":{"nullable":true,"type":"string"},"tcgplayerId":{"nullable":true,"type":"string"},"cardName":{"type":"string"},"setName":{"type":"string"},"setId":{"nullable":true,"type":"string"},"cardNumber":{"nullable":true,"type":"string"},"year":{"nullable":true,"type":"string"},"rarity":{"nullable":true,"type":"string"},"variant":{"nullable":true,"type":"string"},"finish":{"nullable":true,"type":"string"},"printing":{"nullable":true,"type":"string"},"game":{"nullable":true,"type":"string"},"setReleaseDate":{"nullable":true,"type":"string"},"setCardCount":{"nullable":true,"type":"number"},"lastSeenPrice":{"nullable":true,"type":"number"},"priceSource":{"nullable":true,"type":"string"},"priceHistory":{"type":"array","items":{"type":"object","required":["t","p"],"properties":{"t":{"type":"number"},"p":{"type":"number"}}}}}}}}}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}},"description":"Fetch one set by its `setId` along with every card in it. Returns the set name, release year and date, the official card count, and the full card list with prices. Use this to answer questions about a whole release rather than a single card, such as what is in a set, how big it is, when it came out, or which cards in it are the most valuable. A `setId` must be taken from the `setId` field of a card where that field is actually filled in. Many cards have no `setId` at all, sports cards especially, so never guess a `setId` or build one out of a set name. Returns 404 when the set is unknown, which means ZeroPop does not have that set: say so plainly and never invent its card list, its size or its prices."}},"/v1/public/search":{"get":{"operationId":"searchPublicCatalog","tags":["PublicCatalog"],"summary":"Search the card catalog by name","parameters":[{"name":"q","in":"query","required":false,"schema":{"maxLength":256,"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["hits"],"properties":{"hits":{"type":"array","items":{"type":"object","required":["card","heroImagePath","heroScanId"],"properties":{"card":{"type":"object","required":["cardKey","slug","justTcgCardId","tcgplayerId","cardName","setName","setId","cardNumber","year","rarity","variant","finish","printing","game","setReleaseDate","setCardCount","lastSeenPrice","priceSource","priceHistory"],"properties":{"cardKey":{"type":"string"},"slug":{"nullable":true,"type":"string"},"justTcgCardId":{"nullable":true,"type":"string"},"tcgplayerId":{"nullable":true,"type":"string"},"cardName":{"type":"string"},"setName":{"type":"string"},"setId":{"nullable":true,"type":"string"},"cardNumber":{"nullable":true,"type":"string"},"year":{"nullable":true,"type":"string"},"rarity":{"nullable":true,"type":"string"},"variant":{"nullable":true,"type":"string"},"finish":{"nullable":true,"type":"string"},"printing":{"nullable":true,"type":"string"},"game":{"nullable":true,"type":"string"},"setReleaseDate":{"nullable":true,"type":"string"},"setCardCount":{"nullable":true,"type":"number"},"lastSeenPrice":{"nullable":true,"type":"number"},"priceSource":{"nullable":true,"type":"string"},"priceHistory":{"type":"array","items":{"type":"object","required":["t","p"],"properties":{"t":{"type":"number"},"p":{"type":"number"}}}}}},"heroImagePath":{"nullable":true,"type":"string"},"heroScanId":{"nullable":true,"type":"string"}}}}}}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}},"description":"The normal entry point. Search ZeroPop’s trading card catalog by name and get back matching cards with their identity and latest known market value. Pass ONLY the card name as `q`, for example \"Charizard\", \"Umbreon VMAX\" or \"Shohei Ohtani\". Matching is name-prefix only, so never append the card number, the set name or a year to `q`: a trailing number such as \"Charizard 4/102\" returns an empty list. `q` must be at least 2 characters or the result list comes back empty. Each hit carries the full card record (name, set, number, year, rarity, variant, finish, game) plus `lastSeenPrice`, which is US dollars, and `priceHistory`, a series of timestamped USD points. To find the exact printing the user meant, search the name on its own and then narrow among the hits using each hit’s own `cardNumber`, `setName`, `year`, `variant` and `finish` fields. Use the `cardKey` on a hit to look the card up in detail. An empty `hits` array is a definitive answer and not an error: it means the card is not in ZeroPop’s catalog, not that the query was malformed. Two causes are common, one fixable and one not: a card number, set name or year was appended to `q`, in which case retry once with the bare card name on its own, or the card is from a game ZeroPop does not cover. If `hits` is still empty, tell the user that ZeroPop does not have that card, and do NOT estimate, guess, recall or otherwise supply a price for it from any other source."}},"/v1/public/sets/{setId}/scans":{"get":{"operationId":"getPublicSetScans","tags":["PublicCatalog"],"summary":"Get recent scans from a set","parameters":[{"name":"setId","in":"path","required":true,"schema":{"maxLength":256,"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["scans"],"properties":{"scans":{"type":"array","items":{"type":"object","required":["id","justTcgCardId","cardName","setName","cardType","cardNumber","year","rarity","variant","finish","overallGrade","corners","edges","surface","centering","cornerDefects","edgeDefects","surfaceDefects","estimatedValueUsd","imagePath","gradedAt","authorUsername"],"properties":{"id":{"type":"string"},"justTcgCardId":{"nullable":true,"type":"string"},"cardName":{"type":"string"},"setName":{"type":"string"},"cardType":{"type":"string"},"cardNumber":{"nullable":true,"type":"string"},"year":{"nullable":true,"type":"string"},"rarity":{"nullable":true,"type":"string"},"variant":{"nullable":true,"type":"string"},"finish":{"nullable":true,"type":"string"},"overallGrade":{"type":"number"},"corners":{"type":"number"},"edges":{"type":"number"},"surface":{"type":"number"},"centering":{"type":"number"},"cornerDefects":{"type":"string"},"edgeDefects":{"type":"string"},"surfaceDefects":{"type":"string"},"estimatedValueUsd":{"type":"number"},"imagePath":{"type":"string"},"gradedAt":{"type":"number"},"authorUsername":{"nullable":true,"type":"string"}}}}}}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}},"description":"List recent real collector scans of cards from one set, newest first, with the condition grade each scan received. `limit` defaults to 24 and is capped at 100. Use this when the user wants to see what people are actually pulling and grading from a release, or wants examples of real cards from a set rather than the catalog listing. As with the set lookup, take the `setId` from a card whose `setId` field is actually filled in and never guess one. An empty `scans` array is a definitive answer and not an error: it means ZeroPop has no scans for that set, so say so and never invent scans, grades or prices for it."}}},"components":{"schemas":{}},"servers":[{"url":"https://api.zeropop.app","description":"ZeroPop production API"}],"externalDocs":{"description":"ZeroPop connector documentation","url":"https://zeropop.app/muse/docs"}}