Inventory search
GET /api/cards?search=is:pokemon-center selects the authenticated seller’s
Pokémon Center-named singles, including parenthetical “Pokemon Center Exclusive”
names or a matching stamped catalog product ID. It excludes the ordinary Pokémon Center Trainer card, sealed products and accessories. The same operator works in
pricing-rule queries and composes with cond:NM or price>20.
See Advanced search for matching limits and the
PriceCharting identity hold for stamped cards. If a stamped card has neither
a usable configured reference nor a current price, it is skipped; rule preview
and test responses use null target/breakdown prices rather than a zero price.
Market evidence freshness
GET /analytics/clearing_coverage reports observed market sales, not a complete
monthly total. sales_30d counts units in a sample of the latest 25 product
sales, filtered to the card’s condition, printing, language, and last 30 days.
Unknown or stale observations return null; zero does not prove no demand.
fetched_at is the sales observation time. Listings have independent freshness,
so a listings-only refresh cannot raise sales confidence.
The recent-sales list shows sampled transactions; sales_30d sums recorded
units, so one transaction can contribute more than one unit. Neither surface
is a complete monthly sales ledger.
Base URL
Authentication
Every request must include your API key in theAuthorization header:
Endpoints
AI assistant endpoints
Beyond the agent surface above, a set of read/write endpoints (mounted at/api/..., not /api/v1/...) are exposed to AI assistants over Bearer auth and
the hosted MCP. See:
- Card lists — manage binders, shoeboxes, and con stacks.
- Discovery — find which sellers across the consented network have a card in stock, with prices and an affiliate buy link.
Pricing explanation
GET /api/v1/pricing/explain/:tcgplayer_id returns the card’s governing
pricing rule, diagnostic blockers, and the other live rules that match the
seller SKU. The matching_rules array is ordered by priority and contains
live permanent base-rule candidates plus active temporary-sale overlays;
expired sales are omitted. governing_rule is the winning permanent base.
Cap receipt steps identify the formula target, period-start/current reference
prices and seller limit. Buyouts and sales evidence never remove an upward cap. A temporary sale applies after the cap. Final Direct minimum and enabled rule-level fee-gap adjustments can raise a capped result; the fee-gap step raises 3.24 to $3.25.
Use the frozen receipt to explain a past decision; live rules may have changed.
The legacy velocity_boost_enabled key now protects recent movers from stale
reduction without adding a markup. Nullable per-rule inheritance is unchanged.
The typed MCP helper hoard.pricing.explainCard preserves nullable
historical_breakdown, including the original ordered steps, inputs and
reflects_current_price. Check that flag before using a receipt to explain the
current target. Both typed and raw responses use snake_case keys.
Receipt availability is separate from cap safety history; an absent receipt does not prove that no cap history exists.
Older MCP builds without ahg-o48qt omit the receipt field; use
hoard.http.get('/api/v1/pricing/explain/12345'), substituting the seller SKU,
as a compatibility fallback. A missing field in an older helper is not evidence
that no receipt exists.
Pricing change-set transition limits
POST /api/v1/agent/plans accepts pricing.change_set for atomic pricing
matrices. If a matrix enables or disables a rule, it supports at most five
actions and those transition scopes cannot overlap another pricing action in
the same matrix. The API returns transition_matrix_too_large or
overlapping_rule_transitions with HTTP 422; split the matrix into separate
proposals so every resulting-state price impact is checked against pricing
floors before commit.
Product line header
ThePOST /sync endpoint accepts an X-Product-Line header to specify which product line the inventory belongs to (e.g., Magic, Pokemon). This tells the server which product line the uploaded CSV is for, so it can process each game’s inventory separately.
The value is case-sensitive and must exactly match one of the product line names returned by POST /heartbeat. Any other value returns 422 with code: "invalid_product_line".
Heartbeat response
ThePOST /heartbeat response includes fields the local Hoard install uses to stay current:
Response format
All endpoints return JSON exceptGET /export/price-updates, which returns text/csv.
Error responses follow this format:
code field is present on all error responses and is intended for programmatic handling.
Status codes
This API powers Hoard Desktop and Hoard Agent and is also available for custom integrations. Hoard handles all API communication automatically during sync cycles. You can call these endpoints directly to build tooling, scripts, or alternative clients.
Smart Actions price reviews
GET /api/recommendations is a dashboard/hosted-MCP endpoint outside /api/v1.
It requires a session, seller API key or MCP OAuth mcp:read token.
Each card has at most one pending competing price review (depth raise, sales
anchor, generic raise, or per-card demand pulse). Liquidation and account
suggestions remain separate. The response includes revision (UTC timestamp,
six fractional digits) and up to three evidence.competing_signals, preserving
why the winning review was prioritized. Expected values are estimates, not ROI.
Depth acceptance rechecks current seller eligibility and exact market-cell
evidence. market_evidence_changed returns a conflict and leaves the item
pending for a fresh review. Generic pricing still queues a new preview; existing
locked-raise guards remain. The saved automatic-anchor preference is preserved.
Automatic mode changes are auto_applied, separate from human accepted events.
Dashboard exposure uses session-only POST /api/recommendations/shown, at most
20 {id, revision} observations. A shown event means at least half the
individual actionable row was visible in a foreground tab. It is idempotent per
revision. GETs, badges and collapsed groups do not count. Delivery is best-effort;
missing exposure is unknown. Shown, accepted, auto-applied and expired counts do
not establish conversion or causal value. The preregistered intelligence study
and its holdouts/logging definitions are unchanged.
GET /api/v1/pricing/explain/{tcgplayer_id} can return a frozen
historical_breakdown from final sync repricing when attribution logging was
enabled. It retains the original calculation and market inputs after settings
change. reflects_current_price distinguishes a historical target from the live
price. Older events and flag-off reprices do not gain retroactive receipts.
Market gate receipts include listings/sales/market observation timestamps;
aggressive_price is null when the market reference was stale at the decision.
Partial collections do not renew that reference. New collectors leave missing
sales-history prices unknown rather than substituting live listing medians.
Future-dated sales are excluded from observed counts and live sales comps.
GET /api/market_depth/holds rechecks receipt observation clocks and the
four-hour buyout window before returning actionable price options. Unknown,
future or expired evidence yields null options; historical single-card receipts
retain what was recorded at the decision. buy_out_detected_at is included.
A thin-market hold may remain in place using earlier listing evidence while
Hoard requests a fresh check. gate_verdict.condition_listings is the
decision-time count, or null when no usable count was recorded. A saved count
can remain after its observation clock expires; do not present it as current.
The holds endpoint rechecks sales/market clocks for actionable price options;
the single-card explanation preserves the historical verdict.
When a selected sales anchor cannot pass its evidence checks, the price-source
step names the source used and explains why recent sales were not used. Frozen
sync receipts retain this reason even after the market evidence changes.
Pokémon inventory queries also support v:shadowless, v:"1999-2000" (alias v:"4th print"), v:"No Symbol", v:prerelease, v:staff, v:winner, and game:pokemon_japan v:"No Rarity". These selectors use explicit printing metadata; pricing requires compatible product and printing identity, and missing premium references hold or skip rather than substitute an ordinary reference.