Magic Eden API

Solana NFT prices with the unit written into the field name

The Magic Eden API returns Solana NFT marketplace data as clean JSON.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Magic Eden endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
M
/magiceden/v1

13 active endpoints, on 1 and 2 credit tiers.

  • POST/magiceden/v1/collections
  • POST/magiceden/v1/collection
  • POST/magiceden/v1/stats
  • POST/magiceden/v1/listings
  • POST/magiceden/v1/tokens
  • POST/magiceden/v1/token
  • POST/magiceden/v1/token_activity
  • +6 more

What Magic Eden endpoints does ReefAPI ship?

13 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

13 endpoints

collections

1 cr

Browse Magic Eden collections (paginated).

required
optional
page, limit

collection

1 cr

Full collection detail by symbol.

required
symbol
optional

stats

1 cr

Live market stats for a collection.

required
symbol
optional

listings

1 cr

Active NFT listings in a collection (NFTs currently for sale), cheapest first.

required
symbol
optional
page, limit, min_price, max_price

tokens

1 cr

All tokens (NFTs) in a collection (listed or not), paginated.

required
symbol
optional
page, limit

token

1 cr

Single NFT / token detail by its Solana mint address.

required
mint_address
optional

token_activity

1 cr

On-chain activity history for a single NFT by mint address.

required
mint_address
optional
page, limit

activity

1 cr

Recent on-chain activity for a collection.

required
symbol
optional
page, limit, event_type

attributes

1 cr

Trait floor prices for a collection.

required
symbol
optional

wallet

1 cr

NFTs held by a Solana wallet address.

required
address
optional
page, limit

popular

1 cr

Popular / trending Magic Eden collections over a time window.

required
optional
time_range, limit

launchpad

1 cr

Magic Eden Launchpad collections.

required
optional
page, limit

search

2 cr

Search Magic Eden collections by free-text name.

required
query
optional
limit

Every parameter, every allowed value →

Magic Eden API

3 of 13 endpoints, ready to run

View docs ↗

One collection, metadata and live market in a single call: floor price, how many are listed, the 24-hour average sale price, 24-hour, 7-day and 30-day volume, the highest standing offer, holder count and total supply — every money field named in SOL.

1 credit1 required · 0 optional
POST/magiceden/v1/collection
ok2258 ms · 1 records · sample
{
  "ok": true,
  "meta": {
    "api": "magiceden",
    "endpoint": "collection",
    "mode": "live",
    "latency_ms": 2258.3,
    "record_count": 1,
    "cache_hit": false
  },
  "data": {
    "collection": {
      "symbol": "okay_bears",
      "name": "Okay Bears",
      "description": "Okay Bears is a culture shift. A clean collection of 10,000 diverse bears building a virtuous community that will transcend the internet into the real world.",
      "image_url": "https://bafybeiedc6mf2vtqv7l5hgz6wyd2juw4q423wfcsegvrnw7u6ixqshuciu.ipfs.w3s.link/okb.jpg",
      "categories": [
        "pfps"
      ],
      "twitter": "https://twitter.com/okaybears",
      "discord": "https://discord.com/invite/okaybears",
      "website": "https://www.okaybears.com",
      "is_badged": null,
      "has_compressed_nfts": null,
      "magiceden_url": "https://magiceden.io/marketplace/okay_bears",
      "floor_price_sol": 1.1795,
      "listed_count": 692,
      "avg_price_24hr_sol": 2.176008,
      "volume_24hr_sol": 28.2881,
      "volume_7d_sol": 162.574898,
      "unique_holders": 4224,
      "total_supply": 9858
    }
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Magic Eden API works

Magic Eden is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 184 engines.

02
Call
POST /magiceden/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Price a single NFT rather than the collection it sits in

A collection floor prices the worst token in the set. Anything better than the floor needs the trait table, and the trait table is one call.

01collection
POST/magiceden/v1/collection
{"symbol": "okay_bears"}

The baseline: floor, listed count, 24-hour average sale price, holders and supply, all in SOL.

02attributes
POST/magiceden/v1/attributes
{"symbol": "okay_bears"}

Every trait value with how many tokens carry it and its OWN floor in SOL. A trait held by four tokens floors an order of magnitude above the collection floor.

03activity
POST/magiceden/v1/activity
{"symbol": "okay_bears", "event_type": "buyNow", "limit": 20}

The last executed sales with block times, so the ask you just read can be checked against what people are paying.

A price for one specific token, built from its own traits' floors and checked against real trades — instead of quoting the collection floor at a holder who owns something better.

request
curl -X POST https://api.reefapi.com/magiceden/v1/collection \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"symbol":"okay_bears"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "magiceden",
    "endpoint": "collection",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

Symbols, mint addresses and the unit every price is in

Two identifiers run through this engine and they are not interchangeable: a collection is addressed by its symbol, an individual NFT by its Solana mint address. The second thing worth settling before you write any arithmetic is the price unit. Everything below was measured on 2026-08-27 against okay_bears.

ThingFormat or ruleMeasured
Collection symbolThe last path segment of a marketplace URL, lower snake_caseokay_bears, degods, solana_monkey_business, degenerate_ape_kindergarten
Unknown symbolUPSTREAM_HTTP carrying the marketplace's own 400Invalid collection name or address: <what you sent>
mint_addressBase58 Solana mint, 43 to 44 characters9RpvZMKf1qcTsnCPRjGJ8tddzxNusGiYZc9tkS8UhZTA
All price fieldsSOL as a decimal. Never lamportsfloor_price_sol 1.1655. The same figure in lamports would be 1165500000
floor_price_solEquals the cheapest active listing at that instantCollection floor 1.1655 and the first row of listings 1.1655, from two separate calls
price_sol on a tokennull when list_status is 'unlisted'A token owned but not for sale returned list_status unlisted, price_sol null
seller_fee_basis_pointsCreator royalty in basis points, so divide by 100 for a percentage500 = 5% on okay_bears, 420 = 4.2% on another collection, 0 on a third
block_timeUnix seconds, not milliseconds1787784215. Multiply by 1000 before handing it to a JS Date
RarityTwo independent third-party ranks that disagree by designOkay Bear #9541: moonrank 9502, howrare 9512
attributes[].countAn absolute NFT count, not a share or a fractionHat = Rubik's Cube, count 4, floor_sol 22.0 against a collection floor of 1.1655

The marketplace rate-limits around 120 requests a minute per source address, and a burst returns RATE_LIMITED with retryable true rather than bad data. Space out paging loops, and retry rather than treating a rate-limit as an empty collection.

One chain, one unit, and the difference between an ask and a sale

Measured against the live gateway on several collections. One of these is a broken endpoint you should route around.

Every price field says SOL in its own name

floor_price_sol, avg_price_24hr_sol, volume_24hr_sol, volume_7d_sol, volume_30d_sol, highest_offer_sol, price_sol on a listing. There is no USD figure anywhere in this engine and no field where the unit has to be inferred from context, which means there is also no field that can quietly change unit on you. Convert to your own currency once, at your own rate, and you are done.

The floor is an ask; the 24-hour average is a sale

floor_price_sol is the cheapest live listing — nobody has paid it. avg_price_24hr_sol with txns_24hr beside it is what did trade. For individual transactions, activity filtered to buyNow returned twenty of twenty rows with a SOL price, a counterparty pair and a block time you can turn into a timestamp. Reading a floor as a sale price is the single most common mistake in this data.

Trait floors, not just a collection floor

The attributes call returned 162 trait values for one collection, each with how many tokens carry it and its own floor in SOL. On the collection we measured, a hat worn by four of roughly ten thousand tokens floored at many times the collection floor. That is the difference between valuing a set and valuing an asset.

Against us: `popular` comes back empty

Three calls across two ranking windows and two page sizes all answered ok:true with an empty collection list. The leaderboard endpoint is not returning data right now. The collections browse action and per-collection stats both answer normally, so route around it — and treat this as the reason we publish record counts rather than asking you to trust a 200.

Wallets are on the record, and this page does not publish them

A listing carries the seller's Solana wallet, an activity row carries both counterparties, and a token record carries its current owner. Those are real addresses that resolve to a public trading history, so the sample response on this page drops them. The API returns them to you; we do not republish them on an indexable page of our own.

Paging does not repeat, and repeats are stable

Listings page one and page two shared zero of twenty token mints. The same listings query run twice returned the identical twenty. Deterministic in both directions, which is what a diff-based watcher needs.

Against us: a dead symbol answers three different ways

The same invented collection symbol returns three different things depending on which action you ask. stats answers NOT_FOUND saying it has no market data. collection answers with the marketplace's own 400 wrapped as an upstream error. listings answers ok:true with an EMPTY list and has_more false — indistinguishable, from the envelope alone, from a real collection where nothing is listed. Validate a symbol with stats or collection before you page listings, and never read an empty listings array as a market signal.

Rarity arrives from two independent rankings

Every listing carries both a Moonrank and a HowRare position. They disagree on individual tokens, which is useful rather than annoying: a token the two systems rank very differently is a token whose rarity is contested, and that is exactly where mispricing lives.

What people build with Magic Eden

The jobs this data is most often used for.

13

endpoints

1/2

credits per call

01

NFT-analytics tools call stats and listings to track a collection's floor price and volume.

02

Portfolio apps use wallet and token to value a holder's NFTs in real time.

03

Web3 products use activity and attributes to power trait rarity and market feeds.

What Magic Eden data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 184 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/magiceden/v1/collection \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"symbol":"okay_bears"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/magiceden/v1/collection",
    headers={"x-api-key": REEF_KEY},
    json={
  "symbol": "okay_bears"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Magic Eden.

Get a free key →
Are prices in SOL or in lamports?

SOL, as decimals, on every price field: floor_price_sol, price_sol, avg_price_24hr_sol, volume_24hr_sol, mint_price_sol and floor_sol on trait rows. A measured okay_bears floor of 1.1655 would be 1165500000 in lamports, so the two are never ambiguous at a glance. No conversion is needed and none should be applied.

When do I pass a symbol and when a mint address?

Collection-scoped actions (collection, stats, listings, tokens, activity, attributes) take `symbol`. NFT-scoped actions (token, token_activity) take `mint_address`. `wallet` takes a Solana wallet address. Mints come out of listings[].token_mint, tokens[].mint_address and activity[].token_mint, so the normal route is symbol first, mint second. `search` only resolves an exact symbol, so a free-text word such as 'bears' returned a 400 while 'okay_bears' and 'degods' each resolved to a single collection.

Why do two activity rows share the same transaction signature?

Because one on-chain transaction can produce more than one marketplace event. A single signature on okay_bears came back as both a 'bid' row (with a buyer, no seller) and a 'poolUpdate' row (with a seller, no buyer) at the same price and the same block_time. Note that poolUpdate is not one of the documented event_type filter values, so it only appears when you leave event_type off. If you are summing volume, deduplicate on signature plus type or you will double-count.

Why is token_mint null on some activity rows?

Because those events are collection-level, not token-level. Bids and pool updates placed against the whole collection rather than one NFT have no mint to name, so the field is null while collection_symbol and price_sol are populated. Filtering with event_type 'buyNow' returned 20 rows that all carried a token_mint, which is the clean path if you want per-NFT sale history.

Moonrank and HowRare disagree on the same NFT. Which is right?

Neither is authoritative; they are two independent rarity services with different scoring methods, and both are passed through unchanged. Okay Bear #9541 ranked 9502 by Moonrank and 9512 by HowRare. Pick one and stay with it for internal comparisons rather than averaging them. If you want a valuation signal grounded in actual money instead, use `attributes`, which returned 162 trait-value rows for okay_bears, each with the number of NFTs carrying that trait and the current floor for it.

total_supply says 9,858 but the collection describes itself as 10,000. Which is wrong?

Neither. total_supply is the live on-chain count and the description is the mint-day marketing number; the difference is burns and lost tokens. On the same call, unique_holders came back as 4,230 and listed_count as 689, so roughly 7% of the surviving supply was on sale at that moment. Use listed_count over total_supply for a sell-pressure ratio, and never use the description's number for anything arithmetic.

Which stats does the engine actually return?

The `stats` action returned symbol, floor_price_sol, listed_count, avg_price_24hr_sol, volume_24hr_sol, volume_7d_sol, volume_30d_sol, txns_24hr, highest_offer_sol, unique_holders and total_supply. `collection` returns a subset of those merged with the metadata (name, description, image_url, categories, twitter, discord, website). Note that volume comes in fixed 24-hour, 7-day and 30-day windows; there is no all-time volume figure in the live payload, so do not build against one.

Does launchpad only show upcoming mints?

No. The rows are drawn from the marketplace's launchpad list and include mints whose launch_datetime is already in the past, so the first page returned launches dated February 2026 when queried in August. Each row carries symbol, name, mint_price_sol, size (the planned supply, e.g. 495 or 4444), launch_datetime as an ISO string, chain_id ('solana') and the contract_address. Filter on launch_datetime yourself if you only want what has not opened yet.

What is the Magic Eden API?

Magic Eden API is a ReefAPI endpoint group for magic eden It returns live JSON through POST requests under /magiceden/v1.

Is the Magic Eden API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Magic Eden calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Magic Eden login or account?

No login to Magic Eden is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Magic Eden data?

The page example is captured from a live collections call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Magic Eden API use?

Magic Eden actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Magic Eden from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call magiceden actions with the same key, credit pool and JSON envelope used by normal REST requests.

36 E-commerce & Marketplaces APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Magic Eden, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.