Solana NFT prices with the unit written into the field name
The Magic Eden API returns Solana NFT marketplace data as clean JSON.
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.
Magic Eden API
3 of 13 endpoints, ready to run
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.
{ "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 } } }
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.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
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.
{"symbol": "okay_bears"}The baseline: floor, listed count, 24-hour average sale price, holders and supply, all in SOL.
{"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.
{"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.
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"}'{
"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.
| Thing | Format or rule | Measured |
|---|---|---|
| Collection symbol | The last path segment of a marketplace URL, lower snake_case | okay_bears, degods, solana_monkey_business, degenerate_ape_kindergarten |
| Unknown symbol | UPSTREAM_HTTP carrying the marketplace's own 400 | Invalid collection name or address: <what you sent> |
| mint_address | Base58 Solana mint, 43 to 44 characters | 9RpvZMKf1qcTsnCPRjGJ8tddzxNusGiYZc9tkS8UhZTA |
| All price fields | SOL as a decimal. Never lamports | floor_price_sol 1.1655. The same figure in lamports would be 1165500000 |
| floor_price_sol | Equals the cheapest active listing at that instant | Collection floor 1.1655 and the first row of listings 1.1655, from two separate calls |
| price_sol on a token | null when list_status is 'unlisted' | A token owned but not for sale returned list_status unlisted, price_sol null |
| seller_fee_basis_points | Creator royalty in basis points, so divide by 100 for a percentage | 500 = 5% on okay_bears, 420 = 4.2% on another collection, 0 on a third |
| block_time | Unix seconds, not milliseconds | 1787784215. Multiply by 1000 before handing it to a JS Date |
| Rarity | Two independent third-party ranks that disagree by design | Okay Bear #9541: moonrank 9502, howrare 9512 |
| attributes[].count | An absolute NFT count, not a share or a fraction | Hat = 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.
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.
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.
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.
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.
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.
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.
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.
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.
endpoints
credits per call
NFT-analytics tools call stats and listings to track a collection's floor price and volume.
Portfolio apps use wallet and token to value a holder's NFTs in real time.
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 →- 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 -X POST https://api.reefapi.com/magiceden/v1/collection \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"symbol":"okay_bears"}'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"])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.
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.