{"openapi":"3.0.3","info":{"title":"nyctal","version":"0.1.0","description":"Open API for pump.fun. New coins and trades, heard at processed commitment, each one marked when its slot confirms. No key. Press **Execute** on any endpoint: the examples are filled with coins and wallets from the last few seconds."},"servers":[{"url":"https://nyctal.xyz"}],"tags":[{"name":"Mints","description":"Every new pump.fun coin, the moment the transaction is replayed."},{"name":"Trades","description":"Every bonding curve buy and sell, with the wallet and the curve after it."},{"name":"Curves","description":"Curves on the way to full. This is where migration starts."},{"name":"Wallets","description":"What a wallet did on pump.fun while the ear was listening."},{"name":"Wire","description":"Slots, shreds, leaders and pressure. The layer under the coins."},{"name":"Stream","description":"One open HTTP connection. Events as they are heard."}],"paths":{"/v1/mints/latest":{"get":{"operationId":"latestMints","tags":["Mints"],"summary":"New coins, newest first","description":"Each row starts as `heard`. When its slot gets optimistic confirmation it turns `confirmed` and `lead_ms` is filled in: how long you had the coin before a confirmed RPC did.","parameters":[{"name":"limit","in":"query","description":"Rows to return, 1 to 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"example":3},{"name":"min_dev_sol","in":"query","description":"Only coins where the creator bought at least this much in the create slot.","schema":{"type":"number","minimum":0}},{"name":"state","in":"query","description":"Only rows in this state.","schema":{"type":"string","enum":["heard","confirmed","dropped"]}},{"name":"q","in":"query","description":"Search in symbol and name.","schema":{"type":"string"}}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Mint"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/mints/{mint}":{"get":{"operationId":"getMint","tags":["Mints"],"summary":"One coin: curve, first buyers, flags","description":"Everything nyctal heard about a coin since its create: curve position, the first 24 buyers with their slot offset, the dev buy, the dev sell, and bundle flags. Coins are kept while they are in the last 6,000 mints.","parameters":[{"name":"mint","in":"path","required":true,"description":"Mint address.","schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"5AeDnwvuWjD4fTJXYVH2s9gE2L3QsDwDSKhUKtuUpump"}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MintDetail"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"404":{"description":"Not in memory. It is older than the window or it never traded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/mints/{mint}/trades":{"get":{"operationId":"mintTrades","tags":["Mints"],"summary":"Trades of one coin","description":"Newest first. Works for any mint that traded recently, not only for coins created while the ear was on.","parameters":[{"name":"mint","in":"path","required":true,"description":"Mint address.","schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"5AeDnwvuWjD4fTJXYVH2s9gE2L3QsDwDSKhUKtuUpump"},{"name":"limit","in":"query","description":"Rows to return, 1 to 200.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"example":3}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Trade"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/trades/latest":{"get":{"operationId":"latestTrades","tags":["Trades"],"summary":"The tape, newest first","description":"All pump.fun curve trades. Filter by side, size, coin or wallet. `slot_offset` is the number of slots since the coin was created, so 0 means same slot as the create.","parameters":[{"name":"limit","in":"query","description":"Rows to return, 1 to 200.","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"example":3},{"name":"side","in":"query","description":"buy or sell.","schema":{"type":"string","enum":["buy","sell"]}},{"name":"min_sol","in":"query","description":"Smallest trade to include, in SOL.","schema":{"type":"number","minimum":0},"example":1},{"name":"mint","in":"query","description":"Only this coin.","schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"}},{"name":"wallet","in":"query","description":"Only this wallet.","schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"}},{"name":"state","in":"query","description":"Only rows in this state.","schema":{"type":"string","enum":["heard","confirmed","dropped"]}}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Trade"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/curves/near-full":{"get":{"operationId":"nearFull","tags":["Curves"],"summary":"Curves about to fill","description":"Curves with a trade in the last 30 minutes, closest to 100% first. A pump.fun curve migrates when it is full. `climbed_pct` is how far it moved since nyctal first heard it.","parameters":[{"name":"limit","in":"query","description":"Rows to return, 1 to 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"example":3},{"name":"min_pct","in":"query","description":"Lowest curve position, in percent.","schema":{"type":"number","minimum":0,"maximum":100,"default":70}}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Curve"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/wallets/{address}":{"get":{"operationId":"getWallet","tags":["Wallets"],"summary":"One wallet on pump.fun","description":"Buys, sells, SOL in and out, coins touched, coins created and the last 20 trades. Counts start when the ear woke up, so this is a recent window and not a lifetime.","parameters":[{"name":"address","in":"path","required":true,"description":"Wallet address.","schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"},"example":"GNbYfwBaEbooU46p32LfMJkzEuBVqg6ejPyJ7gEbgf6L"}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Wallet"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"404":{"description":"Not in memory. It is older than the window or it never traded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/status":{"get":{"operationId":"status","tags":["Wire"],"summary":"Is it listening, and how far ahead","description":"The measured lead over confirmation (p50, p90, p99), the chain tip, the pressure on the pump program and the totals since start.","parameters":[],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Status"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/pressure":{"get":{"operationId":"pressure","tags":["Wire"],"summary":"How crowded pump.fun is right now","description":"Transactions per second that touch the pump program over the last minute, and how many of them failed. Most of them fail: that is the fight for the first slots.","parameters":[],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Pressure"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/slots/latest":{"get":{"operationId":"latestSlots","tags":["Wire"],"summary":"The life of the last slots","description":"Measured on a Solana node: first shred received, block complete, bank frozen, optimistic confirmation, root. This is the time a block spends in the air.","parameters":[{"name":"limit","in":"query","description":"Rows to return, 1 to 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"example":3}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Slot"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/slots/{slot}":{"get":{"operationId":"getSlot","tags":["Wire"],"summary":"One slot","description":"The same record for one slot. The last 4,000 slots are kept, about 27 minutes.","parameters":[{"name":"slot","in":"path","required":true,"description":"Slot number.","schema":{"type":"integer"},"example":465786851}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Slot"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"404":{"description":"Not in memory. It is older than the window or it never traded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/slots/{slot}/shreds":{"get":{"operationId":"getSlotShreds","tags":["Wire"],"summary":"Shred map of a slot (modeled)","description":"A modeled layout of the slot: how its data would be cut into FEC sets of 32 data and 32 coding shreds and spread through Turbine, timed against the real first shred and complete marks. `modeled` is always true: nyctal does not read raw shreds on this tier.","parameters":[{"name":"slot","in":"path","required":true,"description":"Slot number.","schema":{"type":"integer"},"example":465786851}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ShredMap"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"404":{"description":"Not in memory. It is older than the window or it never traded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leaders/next":{"get":{"operationId":"nextLeaders","tags":["Wire"],"summary":"Who builds the next blocks","description":"The leader schedule from the tip forward. Know who gets your transaction before you send it.","parameters":[{"name":"limit","in":"query","description":"Rows to return, 1 to 32.","schema":{"type":"integer","minimum":1,"maximum":32,"default":8},"example":3}],"responses":{"200":{"description":"Live data.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Leader"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/stream":{"get":{"operationId":"stream","tags":["Stream"],"summary":"Live stream (Server-Sent Events)","description":"A plain HTTP connection that never ends. Open it with `curl -N` or `EventSource`. Event names: `mint`, `trade`, `confirm`, `drop`, `slot`, `hello`. A comment line is sent every 15 seconds. Swagger waits for a response to finish, so it cannot show this one: press Run in the docs, or use curl.","parameters":[{"name":"types","in":"query","description":"Comma list of event names.","schema":{"type":"string","default":"mint,confirm"},"example":"mint,confirm"},{"name":"mint","in":"query","description":"Only events of this coin.","schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"}},{"name":"wallet","in":"query","description":"Only trades of this wallet.","schema":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"}},{"name":"min_sol","in":"query","description":"Only trades at least this big.","schema":{"type":"number","minimum":0}}],"responses":{"200":{"description":"An endless text/event-stream.","content":{"text/event-stream":{"schema":{"type":"string"},"example":"event: mint\ndata: {\"mint\":\"…\",\"symbol\":\"…\",\"slot\":465776419,\"state\":\"heard\"}\n\n"}}},"429":{"description":"Over 300 requests a minute from one address. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Meta":{"type":"object","properties":{"tip_slot":{"type":"integer"},"took_ms":{"type":"integer"},"ear":{"type":"string","enum":["listening","asleep"]}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"Mint":{"type":"object","properties":{"mint":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"uri":{"type":"string","description":"Metadata link written by the creator."},"creator":{"type":"string"},"bonding_curve":{"type":"string"},"signature":{"type":"string"},"slot":{"type":"integer"},"heard_at":{"type":"string","format":"date-time"},"state":{"type":"string","enum":["heard","confirmed","dropped"]},"confirmed_at":{"type":"string","nullable":true,"format":"date-time"},"lead_ms":{"type":"integer","nullable":true,"description":"Measured: confirmed_at minus heard_at."},"dev_buy_sol":{"type":"number"},"mcap_sol":{"type":"number","nullable":true},"curve_pct":{"type":"number"},"token_2022":{"type":"boolean"}}},"MintDetail":{"allOf":[{"$ref":"#/components/schemas/Mint"},{"type":"object","properties":{"trades":{"type":"object","properties":{"buys":{"type":"integer"},"sells":{"type":"integer"},"buyers":{"type":"integer"},"sol_in":{"type":"number"},"sol_out":{"type":"number"},"last_at":{"type":"string","format":"date-time"}}},"flags":{"type":"object","properties":{"dev_sold":{"type":"boolean"},"dev_sold_sol":{"type":"number"},"same_slot_buyers":{"type":"integer"},"same_slot_sol":{"type":"number"},"top_early_buyer_pct":{"type":"number","nullable":true},"bundled":{"type":"boolean","description":"Three or more non-dev buyers in the create slot."}}},"first_buyers":{"type":"array","items":{"type":"object","properties":{"wallet":{"type":"string"},"sol":{"type":"number"},"slot_offset":{"type":"integer"},"is_dev":{"type":"boolean"},"signature":{"type":"string"}}}}}}]},"Trade":{"type":"object","properties":{"signature":{"type":"string"},"slot":{"type":"integer"},"mint":{"type":"string"},"symbol":{"type":"string","nullable":true},"side":{"type":"string","enum":["buy","sell"]},"wallet":{"type":"string"},"sol":{"type":"number"},"tokens":{"type":"number"},"price_sol":{"type":"number","nullable":true},"mcap_sol":{"type":"number","nullable":true},"curve_pct":{"type":"number"},"state":{"type":"string","enum":["heard","confirmed","dropped"]},"lead_ms":{"type":"integer","nullable":true},"slot_offset":{"type":"integer","nullable":true,"description":"Slots since the create. Null if the create came before the ear woke."},"is_dev":{"type":"boolean","nullable":true},"heard_at":{"type":"string","format":"date-time"},"confirmed_at":{"type":"string","nullable":true,"format":"date-time"}}},"Curve":{"type":"object","properties":{"mint":{"type":"string"},"symbol":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"curve_pct":{"type":"number"},"mcap_sol":{"type":"number"},"buys":{"type":"integer"},"sells":{"type":"integer"},"last_trade_at":{"type":"string","format":"date-time"},"climbed_pct":{"type":"number"}}},"Wallet":{"type":"object","properties":{"wallet":{"type":"string"},"buys":{"type":"integer"},"sells":{"type":"integer"},"sol_in":{"type":"number"},"sol_out":{"type":"number"},"net_sol":{"type":"number"},"mints_touched":{"type":"integer"},"first_heard_at":{"type":"string","format":"date-time"},"last_heard_at":{"type":"string","format":"date-time"},"created":{"type":"array","items":{"type":"string"}},"recent":{"type":"array","items":{"$ref":"#/components/schemas/Trade"}}}},"Slot":{"type":"object","properties":{"slot":{"type":"integer"},"leader":{"type":"string","nullable":true},"state":{"type":"string","enum":["in_flight","completed","frozen","confirmed","rooted","dead"]},"first_shred_at":{"type":"string","nullable":true,"format":"date-time"},"completed_at":{"type":"string","nullable":true,"format":"date-time"},"frozen_at":{"type":"string","nullable":true,"format":"date-time"},"confirmed_at":{"type":"string","nullable":true,"format":"date-time"},"rooted_at":{"type":"string","nullable":true,"format":"date-time"},"shreds_ms":{"type":"integer","nullable":true,"description":"First shred to block complete."},"replay_ms":{"type":"integer","nullable":true,"description":"Block complete to bank frozen."},"vote_ms":{"type":"integer","nullable":true,"description":"Bank frozen to optimistic confirmation."},"first_shred_to_confirm_ms":{"type":"integer","nullable":true},"pump":{"type":"object","properties":{"tx":{"type":"integer"},"failed":{"type":"integer"},"mints":{"type":"integer"},"trades":{"type":"integer"},"sol":{"type":"number"}}}}},"ShredMap":{"type":"object","properties":{"slot":{"type":"integer"},"modeled":{"type":"boolean","enum":[true]},"fec_sets":{"type":"integer"},"data_shreds":{"type":"integer"},"coding_shreds":{"type":"integer"},"turbine":{"type":"object"},"sets":{"type":"array","items":{"type":"object"}}}},"Leader":{"type":"object","properties":{"from_slot":{"type":"integer"},"in_slots":{"type":"integer"},"in_ms":{"type":"integer","description":"Slots away times 400 ms."},"leader":{"type":"string"}}},"Pressure":{"type":"object","properties":{"window_sec":{"type":"integer"},"tx_per_sec":{"type":"number"},"failed_pct":{"type":"number","nullable":true},"trades_per_sec":{"type":"number"},"mints_per_min":{"type":"number"},"sol_per_sec":{"type":"number"},"buy_pct":{"type":"number","nullable":true},"by_sec":{"type":"array","items":{"type":"object"}}}},"Status":{"type":"object","properties":{"ear":{"type":"string"},"tip_slot":{"type":"integer"},"confirmed_slot":{"type":"integer"},"slots_behind":{"type":"integer"},"lead_ms":{"type":"object","properties":{"samples":{"type":"integer"},"avg":{"type":"integer","nullable":true},"p50":{"type":"integer","nullable":true},"p90":{"type":"integer","nullable":true},"p99":{"type":"integer","nullable":true}}},"pressure":{"$ref":"#/components/schemas/Pressure"},"totals":{"type":"object"},"kept":{"type":"object"},"up_since":{"type":"string","format":"date-time"}}}}}}