EvoMarket

EvoMarket API

A small REST API for reading our card catalog and managing your own listings + orders. Versioned at /api/v1.

Getting started

Mint an API key from /sell/integrations/api-keys. Send it in the Authorization header:

curl https://evolvedmarket.com/api/v1/listings \
  -H "Authorization: Bearer evom_ak_..."

Conventions

  • JSON requests + responses, UTF-8, camelCase field names.
  • Money is always integer cents (priceCents, totalCents).
  • Pagination: ?page=1&pageSize=50 (max 100). Response includes total, page, pageSize.
  • Errors: { "error": { "code": "...", "message": "..." } }. Codes: UNAUTHORIZED · FORBIDDEN · NOT_FOUND · VALIDATION · CONFLICT · INTERNAL.

Catalog

GET/api/v1/catalog/sets

List active sets across all supported games (filter with ?game=pokemon or ?game=magic).

GET/api/v1/catalog/cards

Search cards. Query params: game, set, rarity, q, page, pageSize.

GET/api/v1/catalog/cards/{id}

Fetch a single card by ID (e.g. me3-15).

Listings

All listings endpoints require auth. They're scoped to your listings only.

GET/api/v1/listings

Your listings. Filter with ?status=ACTIVE|PAUSED|SOLD_OUT.

POST/api/v1/listings

Create a listing.

{
  "cardId": "me3-15",
  "condition": "NEAR_MINT",
  "priceCents": 499,
  "quantity": 3,
  "notes": "minor edge whitening"
}

PATCH/api/v1/listings/{id}

Partial update. Send any subset of priceCents, quantity, notes, status.

DELETE/api/v1/listings/{id}

Soft-deletes by setting status to DELISTED.

Orders

Each shipmentin our model is what you'd call an "order" from a seller's POV — the slice of a buyer's checkout that you ship. id in these endpoints is a shipment ID.

GET/api/v1/orders

Your incoming shipments. Filter with ?status=AWAITING_SHIPMENT|SHIPPED|DELIVERED|CANCELLED.

GET/api/v1/orders/{id}

One shipment with full address + line items.

Rate limits

No hard limit yet. Be reasonable — under ~10 requests/sec sustained is fine. Vercel may rate-limit egregious abuse at the infrastructure layer.

Field naming

We use camelCase to match our internal model. If your tooling prefers snake_case, you'll need to translate at your edge.

Versioning

The path includes /v1/. Breaking changes go in a new prefix (/v2/, etc.). We won't remove or rename v1 fields without major version bump + 6 months notice.