Developers

Hashly API

v1.0.0

Hedera data as JSON: events, tokens, NFT collections with Hashly's own market history, Forever Mint pools, Mindshare, rewards and the status of the services Hashly runs on. Read-only, one key.

Endpoints

25

Groups

11

Method

GET

read-only

Rate limit

100/60s

per client

Base URLhttps://hash-ly.com/api/v1

Quickstart

3 steps
  1. 1

    Get a key

    Ask @hashly_h on X. Keep it in an environment variable, not in code.

  2. 2

    Make a request

    Send it as a Bearer token to any path under /api/v1.

  3. 3

    Read JSON

    Every answer is JSON. Failures carry a stable code.

export HASHLY_API_KEY=hk_live_…

Request

curl "https://hash-ly.com/api/v1/collections/0.0.10818349" \
  -H "Authorization: Bearer $HASHLY_API_KEY"

Response · abridged, example values

{
  "token": "0.0.10818349",
  "name": "Grumpy Ducks",
  "headline": {
    "floor": 599,
    "listed": 837,
    "listedPct": 25.4,
    "holders": 217
  },
  "mint": {
    "peakDay": "2026-09-02",
    "peakSales": 2916,
    "peakAvgPrice": 90
  }
}

Authentication

Send the key

Authorization: Bearer hk_live_…

?api_key= also works, for tools that cannot set a header. Prefer the header: a query string is written to proxy, CDN and server logs, and a key in a log is a key somebody else can read.

Two addresses answer without a key, since they describe the API and carry no data: /api/v1 and /api/v1/openapi.json.

Getting a key

Keys are issued by hand, one per person or project, so Hashly can see who is calling and stop one without touching anybody else. Ask on @hashly_h. A key looks like hk_live_… and is shown once: Hashly keeps only a hash of it, so a lost key is replaced, not read back.

Used by every Try it panel on this page. It stays in this page's memory and is sent only to /api/v1; remembering it keeps it in this tab's session storage until the tab closes.

Rate limits

Requests

100

per window

Window

60s

per client

Over it

429

with Retry-After

  • Counted per client address, before the key is checked, so a request refused for its key still counts.
  • GET only. Anything else is refused with a 405 before it reaches a route. There is no write path on this API.
  • Lists page with limit and offset, or a before cursor on sales. Each endpoint lists its own maximum below.

Errors

9 codes

Every failure is JSON with a stable code, so a client can branch on it without matching English.

400INVALID_TOKENA token id in the path is not shaped like 0.0.123456.
400INVALID_PARAMA query parameter is outside the values the endpoint accepts.
401MISSING_API_KEYNo key on the request.
401INVALID_API_KEYNot a key Hashly issued.
401REVOKED_API_KEYIt was issued and has since been revoked.
404NOT_FOUNDHashly has no record of that collection, token, event or pool.
405METHOD_NOT_ALLOWEDThe API is read-only. Use GET.
429RATE_LIMITEDToo many requests. Wait the seconds in Retry-After.
500INTERNALSomething failed on Hashly's side. Retry later; /status answers 503.

Body

{
  "error": "Missing API key. Pass it as 'Authorization: Bearer <key>' or '?api_key=<key>'.",
  "code": "MISSING_API_KEY"
}

Caching and freshness

Responses are never cached at the CDN. They carry Cache-Control: private, max-age=…, so every request reaches Hashly and is authenticated: an edge copy keyed on the URL would hand one key holder's answer to the next caller, key or not.

Heavy datasets are cached on the server for a few minutes, so two calls a moment apart can return the same body. Polling faster than the data changes spends your rate limit and gets nothing new.

Sales

15 min

every collection

Listings

30 min

collections that trade

Traits, holders

Daily

snapshots

Status checks

5 min

every service

Events

2 endpoints

NFT mints, meetups and hackathons.

GET/events

List events

Returns approved events. Filter by status, type and source.

Parameters

statusquery
string
upcomingliveendedall
Filter by lifecycle state. Default excludes ENDED.
eventTypequery
string
MINT_EVENTECOSYSTEM_MEETUPHACKATHON
sourcequery
string
SENTX
limitquery
integer1–100

default 20

offsetquery
integer≥ 0

default 0

Response200EventList22 fields

  • eventsarray<Event>19 fields
    • idstring
      e.g. cmo7b3gw10000b00je5rnuu6z
    • titlestring
      e.g. Hedera DeFi Meetup #7
    • descriptionstring
    • mintDatestring · date-timenullable
    • endDatestring · date-timenullable
    • mintPricestringnullable
      e.g. 20 HBAR
    • supplyintegernullable
      e.g. 1000
    • imageUrlstring · urinullable
    • statusstring
      UPCOMINGLIVEENDED
    • isForeverMintboolean
    • sourcestringnullable
      SENTXX_SPACE
    • event_typestring
      MINT_EVENTECOSYSTEM_MEETUPHACKATHON
    • hoststringnullable
    • xHandlestringnullable

      The organiser's X handle, without the @, when they gave one.

    • locationstringnullable
    • location_typestringnullable
      ONLINEIN_PERSONHYBRID
    • votesUpinteger
    • votesDowninteger
    • createdAtstring · date-time
  • totalinteger
    e.g. 142
  • hasMoreboolean

Other responses

  • 401Missing or invalid API key.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/events?limit=5" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/events?limit=5

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"events": [
{
"id": "cmo7b3gw10000b00je5rnuu6z",
"title": "Hedera DeFi Meetup #7",
"description": "string",
"mintDate": "2026-09-16T12:00:00.000Z",
"endDate": "2026-09-16T12:00:00.000Z",
"mintPrice": "20 HBAR",
"supply": 1000,
"imageUrl": "https://…",
"status": "UPCOMING",
"isForeverMint": false,
"source": "SENTX",
"event_type": "MINT_EVENT",
"host": "string",
"xHandle": "string",
"location": "string",
"location_type": "ONLINE",
"votesUp": 0,
"votesDown": 0,
"createdAt": "2026-09-16T12:00:00.000Z"
}
],
"total": 142,
"hasMore": false
}
GET/events/{id}

Get event by ID

Parameters

idpathrequired
string

Response200Event19 fields

  • idstring
    e.g. cmo7b3gw10000b00je5rnuu6z
  • titlestring
    e.g. Hedera DeFi Meetup #7
  • descriptionstring
  • mintDatestring · date-timenullable
  • endDatestring · date-timenullable
  • mintPricestringnullable
    e.g. 20 HBAR
  • supplyintegernullable
    e.g. 1000
  • imageUrlstring · urinullable
  • statusstring
    UPCOMINGLIVEENDED
  • isForeverMintboolean
  • sourcestringnullable
    SENTXX_SPACE
  • event_typestring
    MINT_EVENTECOSYSTEM_MEETUPHACKATHON
  • hoststringnullable
  • xHandlestringnullable

    The organiser's X handle, without the @, when they gave one.

  • locationstringnullable
  • location_typestringnullable
    ONLINEIN_PERSONHYBRID
  • votesUpinteger
  • votesDowninteger
  • createdAtstring · date-time

Other responses

  • 401Missing or invalid API key.
  • 404Resource not found.
Error codes
curl "https://hash-ly.com/api/v1/events/{id}" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/events/{id}

Fill in id to send.

Example shape
{
"id": "cmo7b3gw10000b00je5rnuu6z",
"title": "Hedera DeFi Meetup #7",
"description": "string",
"mintDate": "2026-09-16T12:00:00.000Z",
"endDate": "2026-09-16T12:00:00.000Z",
"mintPrice": "20 HBAR",
"supply": 1000,
"imageUrl": "https://…",
"status": "UPCOMING",
"isForeverMint": false,
"source": "SENTX",
"event_type": "MINT_EVENT",
"host": "string",
"xHandle": "string",
"location": "string",
"location_type": "ONLINE",
"votesUp": 0,
"votesDown": 0,
"createdAt": "2026-09-16T12:00:00.000Z"
}

Tokens

3 endpoints

Top fungible tokens by community votes.

GET/tokens/top

Top tokens by votes

Parameters

limitquery
integer1–100

default 30

Response200object10 fields

  • tokensarray<Token>9 fields
    • idstring
    • tokenAddressstring
      e.g. 0.0.731861
    • symbolstring
      e.g. SAUCE
    • namestring
      e.g. SaucerSwap
    • iconstring · urinullable
    • totalVotesinteger
    • rankinteger
      e.g. 1
    • priceUsdnumbernullable
    • marketCapnumbernullable

Other responses

  • 401Missing or invalid API key.
Error codes
curl "https://hash-ly.com/api/v1/tokens/top?limit=5" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/tokens/top?limit=5

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"tokens": [
{
"id": "string",
"tokenAddress": "0.0.731861",
"symbol": "SAUCE",
"name": "SaucerSwap",
"icon": "https://…",
"totalVotes": 0,
"rank": 1,
"priceUsd": 0,
"marketCap": 0
}
]
}
GET/tokens/market

Token screener

Price, changes, volume, liquidity, market cap and today's stars for every listed token.

Parameters

windowquery
string
24h7d30d

default 24h

Response200object4 fields

  • windowstring
  • totalinteger
  • tokensarray<object>
  • computedAtstring · date-time

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/tokens/market" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/tokens/market

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"window": "string",
"total": 0,
"tokens": [
{}
],
"computedAt": "2026-09-16T12:00:00.000Z"
}
GET/tokens/{address}

Token detail

One token: price in USD and HBAR, changes over 1h to 30d, market cap, liquidity, volume, hourly and daily candles, pools across DEXes and what its issuer can still do to it.

Parameters

addresspathrequired
string
Hedera token id.e.g. 0.0.731861

Response200object13 fields

  • tokenAddressstring
  • symbolstring
  • namestring
  • priceUsdnumbernullable
  • priceHbarnumbernullable
  • mcapUsdnumbernullable
  • liquidityUsdnumbernullable
  • changeobject
  • volumeobject
  • hourlyarray<object>
  • dailyarray<object>
  • keysobject
  • poolsobject

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/tokens/0.0.731861" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/tokens/0.0.731861

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"tokenAddress": "string",
"symbol": "string",
"name": "string",
"priceUsd": 0,
"priceHbar": 0,
"mcapUsd": 0,
"liquidityUsd": 0,
"change": {},
"volume": {},
"hourly": [
{}
],
"daily": [
{}
],
"keys": {},
"pools": {}
}

Collections

1 endpoint

Top NFT collections by community votes.

GET/collections/top

Top NFT collections by votes

Parameters

limitquery
integer1–100

default 30

Response200object9 fields

  • collectionsarray<Collection>8 fields
    • idstring
    • tokenAddressstring
      e.g. 0.0.7235629
    • namestring
      e.g. Santuario Hedera
    • imagestring · urinullable
    • ownersinteger
    • supplyinteger
    • totalVotesinteger
    • rankinteger
      e.g. 1

Other responses

  • 401Missing or invalid API key.
Error codes
curl "https://hash-ly.com/api/v1/collections/top?limit=5" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/top?limit=5

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"collections": [
{
"id": "string",
"tokenAddress": "0.0.7235629",
"name": "Santuario Hedera",
"image": "https://…",
"owners": 0,
"supply": 0,
"totalVotes": 0,
"rank": 1
}
]
}

Leaderboard

1 endpoint

Season leaderboard.

GET/leaderboard

Season leaderboard

Parameters

limitquery
integer1–100

default 50

Response200object14 fields

  • leaderboardarray<LeaderboardEntry>8 fields
    • rankinteger
      e.g. 1
    • walletAddressstring
      e.g. 0.0.1097530
    • aliasstringnullable
      e.g. PEMACLA
    • missionPointsinteger
    • badgePointsinteger
    • badgeCountinteger
    • referralPointsinteger
    • totalPointsinteger
  • seasonobject4 fields
    • numberinteger
    • namestring
    • startDatestring · date-time
    • endDatestring · date-time

Other responses

  • 401Missing or invalid API key.
Error codes
curl "https://hash-ly.com/api/v1/leaderboard?limit=5" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/leaderboard?limit=5

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"leaderboard": [
{
"rank": 1,
"walletAddress": "0.0.1097530",
"alias": "PEMACLA",
"missionPoints": 0,
"badgePoints": 0,
"badgeCount": 0,
"referralPoints": 0,
"totalPoints": 0
}
],
"season": {
"number": 0,
"name": "string",
"startDate": "2026-09-16T12:00:00.000Z",
"endDate": "2026-09-16T12:00:00.000Z"
}
}

Ecosystem

1 endpoint

Approved ecosystem projects building on Hedera.

GET/ecosystem

List approved ecosystem projects

Parameters

categoryquery
string
countryquery
string
e.g. ES
limitquery
integer1–100

default 50

offsetquery
integer≥ 0

default 0

Response200object16 fields

  • projectsarray<EcosystemProject>14 fields
    • idstring
    • namestring
      e.g. HashPack
    • slugstring
      e.g. hashpack
    • categoriesarray<string>
    • countryCodestring
      e.g. ES
    • logoUrlstring · urinullable
    • descriptionstring
    • websiteUrlstring · uri
    • twitterUrlstring · urinullable
    • discordUrlstring · urinullable
    • telegramUrlstring · urinullable
    • tokenAddressesarray<string>

      Fungible tokens that belong to the project.

    • collectionAddressesarray<string>

      NFT collections that belong to the project.

    • createdAtstring · date-time
  • totalinteger

Other responses

  • 401Missing or invalid API key.
Error codes
curl "https://hash-ly.com/api/v1/ecosystem?country=ES&limit=5" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/ecosystem?country=ES&limit=5

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"projects": [
{
"id": "string",
"name": "HashPack",
"slug": "hashpack",
"categories": [],
"countryCode": "ES",
"logoUrl": "https://…",
"description": "string",
"websiteUrl": "https://…",
"twitterUrl": "https://…",
"discordUrl": "https://…",
"telegramUrl": "https://…",
"tokenAddresses": [],
"collectionAddresses": [],
"createdAt": "2026-09-16T12:00:00.000Z"
}
],
"total": 0
}

NFT market

9 endpoints

Hashly's own NFT market history, stored from SentX and the Hedera mirror node: floor, listings, traits, holders, sales and best-value listings. Market stats go back to March 2023; trait, listing and holder snapshots start on 16 September 2026.

GET/collections/{token}

Collection summary

Floor and its changes, volume and sales, listings, holders, best offer, the mint, and where each kind of history begins.

Parameters

tokenpathrequired
string
Hedera token id of the collection.e.g. 0.0.10818349

Response200CollectionSummary54 fields

  • tokenstring
    e.g. 0.0.10818349
  • namestring
    e.g. Grumpy Ducks
  • imagestring · urinullable
  • bannerstring · urinullable
  • descriptionstringnullable
  • socialsobject3 fields
    • websitestringnullable
    • twitterstringnullable
    • discordstringnullable
  • creatorstringnullable
  • urlstring · uri
  • headlineCollectionHeadline24 fields

    Headline figures. Changes are percentages; null when there is no earlier reading to compare with.

    • floornumbernullable
      e.g. 599
    • floorCh24hnumbernullable
    • floorCh7dnumbernullable
    • floorCh30dnumbernullable
    • athFloorobjectnullable2 fields
      • valuenumber
      • daystring · date
    • volume24hnumber
    • volume7dnumber
    • volume30dnumber
    • volumeAllnumber
    • sales24hinteger
    • sales7dinteger
    • sales30dinteger
    • salesAllinteger
    • avgSale30dnumbernullable
    • listedintegernullable
      e.g. 837
    • listedPctnumbernullable
      e.g. 25.4
    • listedCh7dnumbernullable
    • listedCh30dnumbernullable
    • supplyintegernullable
    • holdersintegernullable
      e.g. 217
    • holdersCh7dnumbernullable
    • holdersCh30dnumbernullable
    • bestOffernumbernullable
    • marketCapnumbernullable

      Floor × supply, in HBAR.

  • mintCollectionMint7 fields

    Sales through SentX's launchpad (mints and Forever Mint purchases), told apart from resales since May 2026.

    • peakDaystring · datenullable
      e.g. 2026-09-02
    • peakSalesinteger
      e.g. 2916
    • peakAvgPricenumbernullable
      e.g. 90
    • salesAllinteger
    • volumeAllnumber
    • sales30dinteger
    • volume30dnumber
  • sinceCollectionSince5 fields

    Where each kind of history begins (YYYY-MM-DD). Changes are never computed across days that were not recorded.

    • marketstringnullable
    • salesstringnullable
    • snapshotsstringnullable
    • holdersstringnullable
    • listingEventsstringnullable
  • listingsReadAtstring · date-timenullable
  • generatedAtstring · date-time

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/0.0.10818349" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/0.0.10818349

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"token": "0.0.10818349",
"name": "Grumpy Ducks",
"image": "https://…",
"banner": "https://…",
"description": "string",
"socials": {
"website": "string",
"twitter": "string",
"discord": "string"
},
"creator": "string",
"url": "https://…",
"headline": {
"floor": 599,
"floorCh24h": 0,
"floorCh7d": 0,
"floorCh30d": 0,
"athFloor": {},
"volume24h": 0,
"volume7d": 0,
"volume30d": 0,
"volumeAll": 0,
"sales24h": 0,
"sales7d": 0,
"sales30d": 0,
"salesAll": 0,
"avgSale30d": 0,
"listed": 837,
"listedPct": 25.4,
"listedCh7d": 0,
"listedCh30d": 0,
"supply": 0,
"holders": 217,
"holdersCh7d": 0,
"holdersCh30d": 0,
"bestOffer": 0,
"marketCap": 0
},
"mint": {
"peakDay": "2026-09-02",
"peakSales": 2916,
"peakAvgPrice": 90,
"salesAll": 0,
"volumeAll": 0,
"sales30d": 0,
"volume30d": 0
},
"since": {
"market": "string",
"sales": "string",
"snapshots": "string",
"holders": "string",
"listingEvents": "string"
},
"listingsReadAt": "2026-09-16T12:00:00.000Z",
"generatedAt": "2026-09-16T12:00:00.000Z"
}
GET/collections/{token}/history

Collection history

Floor, volume, sales (with launchpad sales split out), listings and holders by day, or the last seven days by hour.

Parameters

tokenpathrequired
string
Hedera token id of the collection.e.g. 0.0.10818349
rangequery
string
7d30d90d1yall

default 90d

intervalquery
string
dayhour

default day

Response200object21 fields

  • tokenstring
  • intervalstring
  • rangestring
  • pointsarray<CollectionDay>11 fields
    • daystring · date
    • floornumbernullable
    • volumenumber
    • salesinteger
    • mintSalesinteger

      Part of sales that went through the launchpad.

    • mintVolumenumber
    • avgSalenumbernullable
    • maxSalenumbernullable
    • listingsintegernullable
    • holdersintegernullable
    • newListingsintegernullable
  • sinceCollectionSince5 fields

    Where each kind of history begins (YYYY-MM-DD). Changes are never computed across days that were not recorded.

    • marketstringnullable
    • salesstringnullable
    • snapshotsstringnullable
    • holdersstringnullable
    • listingEventsstringnullable

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/0.0.10818349/history" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/0.0.10818349/history

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"token": "string",
"interval": "string",
"range": "string",
"points": [
{
"day": "2026-09-16",
"floor": 0,
"volume": 0,
"sales": 0,
"mintSales": 0,
"mintVolume": 0,
"avgSale": 0,
"maxSale": 0,
"listings": 0,
"holders": 0,
"newListings": 0
}
],
"since": {
"market": "string",
"sales": "string",
"snapshots": "string",
"holders": "string",
"listingEvents": "string"
}
}
GET/collections/{token}/traits

Trait floors

Every trait value with how many exist and are listed, its floor and premium over the collection floor, the best trait offer, floor changes and sales by trait.

Parameters

tokenpathrequired
string
Hedera token id of the collection.e.g. 0.0.10818349

Response200object21 fields

  • tokenstring
  • snapshotDaystringnullable
  • trackedSincestringnullable
  • collectionFloornumbernullable
  • traitsarray<object>2 fields
    • typestring
      e.g. Background
    • valuesarray<TraitValue>14 fields
      • valuestring
        e.g. Pond
      • countinteger
        e.g. 31
      • listedinteger
        e.g. 12
      • floornumbernullable
        e.g. 1750
      • offernumbernullable
      • rarityPctnumbernullable

        Share of the collection carrying this value (0–1).

      • imagestringnullable
      • floorCh7dnumbernullable
      • floorCh30dnumbernullable
      • premiumPctnumbernullable

        Trait floor over the collection floor, in percent.

      • sales90dinteger
      • avgSale90dnumbernullable
      • avgSalePrev90dnumbernullable
      • floorSeriesarray<number>

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/0.0.10818349/traits" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/0.0.10818349/traits

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"token": "string",
"snapshotDay": "string",
"trackedSince": "string",
"collectionFloor": 0,
"traits": [
{
"type": "Background",
"values": []
}
]
}
GET/collections/{token}/listings

Listing book

Floor depth bands, the cost to lift the floor, the cheapest and best-value listings, how long listings have waited, and optionally every listing as rarity rank and price. Re-read every 30 minutes for collections that trade.

Parameters

tokenpathrequired
string
Hedera token id of the collection.e.g. 0.0.10818349
includequery
string
scatter
Add every listing as (rank, price) and the best-value frontier.

Response200object45 fields

  • tokenstring
  • readAtstring · date-timenullable
  • floornumbernullable
  • listedintegernullable
  • listedPctnumbernullable
  • listedCh7dnumbernullable
  • listedCh30dnumbernullable
  • bestOffernumbernullable
  • bandsarray<object>4 fields
    • labelstring
      e.g. +10–25%
    • fromnumber
    • tonumbernullable
    • countinteger
  • sweeparray<object>4 fields
    • targetPctinteger
      e.g. 25
    • targetnumber
    • nftsinteger
    • hbarnumber
  • listingAgearray<object>2 fields
    • labelstring
    • countinteger
  • cheapestarray<ListingCard>5 fields
    • serialIdinteger
    • namestringnullable
    • imagestringnullable
    • pricenumber
    • rarityRankintegernullable
  • bestValuearray<BestValueListing>11 fields
    • serialIdinteger
    • namestringnullable
    • imagestringnullable
    • rankintegernullable
    • pricenumber
    • rarityPctnumbernullable

      Rank over collection size, in percent: 2.7 is the rarest 2.7%.

    • premiumPctnumbernullable
    • valuenumber

      What the listing is reckoned to be worth, in HBAR.

    • discountPctnumber

      How far under that value it is listed, in percent.

    • basisstring

      Which sets the value.

      raritytrait
    • traitobjectnullable5 fields

      Its most valuable skin or onesie.

      • typestring
      • valuestring
      • worthnumbernullable

        What the trait is worth today, in HBAR.

      • fromstringnullable
        saleskindfloorlistingsscarcity
      • countintegernullable

        NFTs in the collection carrying it.

  • maxRankintegernullable

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/0.0.10818349/listings" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/0.0.10818349/listings

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"token": "string",
"readAt": "2026-09-16T12:00:00.000Z",
"floor": 0,
"listed": 0,
"listedPct": 0,
"listedCh7d": 0,
"listedCh30d": 0,
"bestOffer": 0,
"bands": [
{
"label": "+10–25%",
"from": 0,
"to": 0,
"count": 0
}
],
"sweep": [
{
"targetPct": 25,
"target": 0,
"nfts": 0,
"hbar": 0
}
],
"listingAge": [
{
"label": "string",
"count": 0
}
],
"cheapest": [
{
"serialId": 0,
"name": "string",
"image": "string",
"price": 0,
"rarityRank": 0
}
],
"bestValue": [
{
"serialId": 0,
"name": "string",
"image": "string",
"rank": 0,
"price": 0,
"rarityPct": 0,
"premiumPct": 0,
"value": 0,
"discountPct": 0,
"basis": "rarity",
"trait": {}
}
],
"maxRank": 0
}
GET/collections/{token}/holders

Holders

Holders counted from the Hedera mirror node: latest count, share held by the largest wallet and the top 10, wallets by how many they hold, and the daily count.

Parameters

tokenpathrequired
string
Hedera token id of the collection.e.g. 0.0.10818349

Response200object14 fields

  • tokenstring
  • latestobjectnullable6 fields
    • daystring
    • holdersinteger
    • supplyinteger
    • top1Pctnumber
    • top10Pctnumber
    • bucketsmap<string, integer>
      e.g. {"1":56,"2-5":65,"6-20":55,"21-50":23,"51+":18}
  • change7dnumbernullable
  • change30dnumbernullable
  • trackedSincestringnullable
  • historyarray<object>2 fields
    • daystring
    • holdersinteger

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/0.0.10818349/holders" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/0.0.10818349/holders

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"token": "string",
"latest": {
"day": "string",
"holders": 0,
"supply": 0,
"top1Pct": 0,
"top10Pct": 0,
"buckets": {}
},
"change7d": 0,
"change30d": 0,
"trackedSince": "string",
"history": [
{
"day": "string",
"holders": 0
}
]
}
GET/collections/{token}/sales

Sales

Recorded SentX sales, newest first or dearest first. Page with before set to the previous response's nextBefore.

Parameters

tokenpathrequired
string
Hedera token id of the collection.e.g. 0.0.10818349
limitquery
integer1–100

default 50

beforequery
string · date-time
sortquery
string
recentprice

default recent

Response200object15 fields

  • tokenstring
  • sortstring
  • recordedSincestringnullable
  • salesarray<Sale>10 fields
    • transactionIdstring
    • serialIdinteger
    • namestringnullable
    • imagestringnullable
    • priceHbarnumber
    • buyerstringnullable
    • sellerstringnullable
    • kindstringnullable
      ListingOfferOrderTrait Order
    • rarityRankintegernullable
    • soldAtstring · date-time
  • nextBeforestringnullable

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/0.0.10818349/sales?limit=5" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/0.0.10818349/sales?limit=5

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"token": "string",
"sort": "string",
"recordedSince": "string",
"sales": [
{
"transactionId": "string",
"serialId": 0,
"name": "string",
"image": "string",
"priceHbar": 0,
"buyer": "string",
"seller": "string",
"kind": "Listing",
"rarityRank": 0,
"soldAt": "2026-09-16T12:00:00.000Z"
}
],
"nextBefore": "string"
}
GET/collections/{token}/activity

Trading activity

Resales (median holding time, median return, share in profit, best flip), how sales happen, when they happen with launchpad sales left out, top buyers and sellers over 30 days, most traded NFTs and biggest sales.

Parameters

tokenpathrequired
string
Hedera token id of the collection.e.g. 0.0.10818349

Response200object31 fields

  • tokenstring
  • resalesobjectnullable
  • saleKindsarray<object>3 fields
    • kindstring
    • countinteger
    • hbarnumber
  • clockobject3 fields
    • byHourarray<integer>
    • byWeekdayarray<integer>
    • mintSalesExcludedinteger
  • tradersobject
  • mostTradedarray<object>
  • topSalesarray<Sale>10 fields
    • transactionIdstring
    • serialIdinteger
    • namestringnullable
    • imagestringnullable
    • priceHbarnumber
    • buyerstringnullable
    • sellerstringnullable
    • kindstringnullable
      ListingOfferOrderTrait Order
    • rarityRankintegernullable
    • soldAtstring · date-time
  • mintCollectionMint7 fields

    Sales through SentX's launchpad (mints and Forever Mint purchases), told apart from resales since May 2026.

    • peakDaystring · datenullable
      e.g. 2026-09-02
    • peakSalesinteger
      e.g. 2916
    • peakAvgPricenumbernullable
      e.g. 90
    • salesAllinteger
    • volumeAllnumber
    • sales30dinteger
    • volume30dnumber

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/0.0.10818349/activity" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/0.0.10818349/activity

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"token": "string",
"resales": {},
"saleKinds": [
{
"kind": "string",
"count": 0,
"hbar": 0
}
],
"clock": {
"byHour": [],
"byWeekday": [],
"mintSalesExcluded": 0
},
"traders": {},
"mostTraded": [
{}
],
"topSales": [
{
"transactionId": "string",
"serialId": 0,
"name": "string",
"image": "string",
"priceHbar": 0,
"buyer": "string",
"seller": "string",
"kind": "Listing",
"rarityRank": 0,
"soldAt": "2026-09-16T12:00:00.000Z"
}
],
"mint": {
"peakDay": "2026-09-02",
"peakSales": 2916,
"peakAvgPrice": 90,
"salesAll": 0,
"volumeAll": 0,
"sales30d": 0,
"volume30d": 0
}
}
GET/collections/best-value

Best-value listings

Listings that nothing rarer in the same collection undercuts, nearest the lower-left of the rarity against price chart, from Hashly's featured collections. Refreshed every 30 minutes.

Parameters

None. The request is the path and the key.

Response200object14 fields

  • collectionsarray<string>
  • listingsarray<MarketDeal>12 fields
    • tokenAddressstring
    • collectionNamestring
    • slugstringnullable
    • serialIdinteger
    • namestringnullable
    • imagestringnullable
    • rarityRankinteger
    • maxRankinteger
    • raritySharenumber

      0.02 is the rarest 2%.

    • priceHbarnumber
    • floorHbarnumber
    • premiumPctnumber

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/best-value" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/best-value

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"collections": [
"string"
],
"listings": [
{
"tokenAddress": "string",
"collectionName": "string",
"slug": "string",
"serialId": 0,
"name": "string",
"image": "string",
"rarityRank": 0,
"maxRank": 0,
"rarityShare": 0,
"priceHbar": 0,
"floorHbar": 0,
"premiumPct": 0
}
]
}
GET/collections/market

NFT market screener

Every tracked collection with its floor, 30-day volume and sales, listed share, weekly change in listings and holders.

Parameters

sortquery
string
volume30dlistedPctlistedCh7dholdersfloor

default volume30d

limitquery
integer1–200

default 50

offsetquery
integer≥ 0

default 0

Response200object13 fields

  • totalinteger
  • sortstring
  • collectionsarray<object>10 fields
    • tokenstring
    • namestring
    • imagestringnullable
    • floornumbernullable
    • volume30dnumber
    • sales30dinteger
    • listedintegernullable
    • listedPctnumbernullable
    • listedCh7dnumbernullable
    • holdersintegernullable

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/collections/market?limit=5" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/collections/market?limit=5

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"total": 0,
"sort": "string",
"collections": [
{
"token": "string",
"name": "string",
"image": "string",
"floor": 0,
"volume30d": 0,
"sales30d": 0,
"listed": 0,
"listedPct": 0,
"listedCh7d": 0,
"holders": 0
}
]
}

Forever Mint

2 endpoints

Forever Mint pools on SentX: size, price, mints, buyers and team activity.

GET/forever-mint

Forever Mint pools

Every open Forever Mint pool with its size, price, cost to clear, recorded volume and collectors, plus totals and mints per day across all pools.

Parameters

None. The request is the path and the key.

Response200object29 fields

  • totalsobject
  • last24hobject2 fields
    • countinteger
    • hbarnumber
  • dailyarray<object>3 fields
    • daystring
    • countinteger
    • hbarnumber
  • generatedAtstring · date-time
  • poolsarray<object>19 fields
    • tokenstring
    • namestring
    • imagestringnullable
    • mintUrlstringnullable
    • poolAddressstringnullable
    • priceHbarnumbernullable
    • availableinteger
    • mintedinteger
    • totalinteger
    • lockedHbarnumber

      Cost to clear the pool at the mint price.

    • volumeHbarnumber
    • volumeMintsinteger
    • volumeSincestringnullable
    • collectorsinteger
    • isSoldOutboolean
    • collectionSupplyintegernullable
    • poolSharenumbernullable
    • mints24hinteger
    • teamTrackedboolean

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/forever-mint" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/forever-mint

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"totals": {},
"last24h": {
"count": 0,
"hbar": 0
},
"daily": [
{
"day": "string",
"count": 0,
"hbar": 0
}
],
"generatedAt": "2026-09-16T12:00:00.000Z",
"pools": [
{
"token": "string",
"name": "string",
"image": "string",
"mintUrl": "string",
"poolAddress": "string",
"priceHbar": 0,
"available": 0,
"minted": 0,
"total": 0,
"lockedHbar": 0,
"volumeHbar": 0,
"volumeMints": 0,
"volumeSince": "string",
"collectors": 0,
"isSoldOut": false,
"collectionSupply": 0,
"poolShare": 0,
"mints24h": 0,
"teamTracked": false
}
]
}
GET/forever-mint/{token}

Forever Mint pool detail

One pool in full: mints, volume and collectors per window (24h, 7d, 30d, all), daily and hourly mints, top buyers per window, recent mints, pool value over time and, where the project published its wallets, what the team holds, mints out of its own pool and buys back on the open market.

Parameters

tokenpathrequired
string
Hedera token id of the pool's collection.e.g. 0.0.10818349

Response200object16 fields

  • tokenAddressstring
  • windowsmap<string, object>4 fields
    • mintsinteger
    • hbarnumber
    • collectorsinteger
    • sincestringnullable
  • dailyarray<object>
  • hourlyarray<object>
  • buyersByWindowobject
  • recentarray<object>
  • valuearray<object>
  • walletsarray<object>
  • treasuryarray<object>
  • secondaryarray<object>
  • teamMintedinteger
  • recordedinteger

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/forever-mint/0.0.10818349" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/forever-mint/0.0.10818349

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"tokenAddress": "string",
"windows": {
"key": {}
},
"daily": [
{}
],
"hourly": [
{}
],
"buyersByWindow": {},
"recent": [
{}
],
"value": [
{}
],
"wallets": [
{}
],
"treasury": [
{}
],
"secondary": [
{}
],
"teamMinted": 0,
"recorded": 0
}

Mindshare

1 endpoint

Community attention across Hedera projects.

GET/mindshare

Mindshare ranking

Which Hedera projects hold the community's attention over a window, and how their rank moved.

Parameters

windowquery
string
24h7d30d

default 7d

Response200object2 fields

  • windowstring
  • entriesarray<object>

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/mindshare" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/mindshare

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"window": "string",
"entries": [
{}
]
}

Rewards

2 endpoints

Raffles and Dragon staking.

GET/raffles

Raffles

Published raffles: prize, ticket cost in embers, holding requirement, dates, tickets and wallets entered, and winners with the on-chain randomness each draw used.

Parameters

None. The request is the path and the key.

Response200object2 fields

  • topicstringnullable

    HCS topic the raffle events are published to.

  • rafflesarray<object>

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/raffles" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/raffles

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"topic": "string",
"raffles": [
{}
]
}
GET/staking

Dragon staking

Embers per day by rarity tier, holding bonuses, and how much of the Santuario Hedera collection is staked and listed.

Parameters

None. The request is the path and the key.

Response200object9 fields

  • basePerDaynumber
  • bonusesarray<object>
  • tiersarray<object>
  • collectionobject5 fields
    • totalinteger
    • listedinteger
    • stakesinteger
    • stakedinteger
    • emberPerDaynumber

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/staking" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/staking

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"basePerDay": 0,
"bonuses": [
{}
],
"tiers": [
{}
],
"collection": {
"total": 0,
"listed": 0,
"stakes": 0,
"staked": 0,
"emberPerDay": 0
}
}

Digest

1 endpoint

The last day or week on Hedera in one read, for reports and scheduled posts.

GET/digest

Market and platform digest

The last 24 hours or 7 days in one read: NFT volume and sales with the change against the window before (mints counted apart), the five biggest sales, the busiest collections, the largest floor moves among collections with real trading, best-value listings, live and upcoming events, and Hashly's releases and current season. Events carry their source and the X handle their organiser gave. Every figure is recorded history, never a forecast.

Parameters

windowquery
string
24h7d

default 24h

Response200object81 fields

  • windowstring
    e.g. 24h
  • fromstring · date-time
  • tostring · date-time
  • nftobject11 fields
    • volumeHbarnumber
    • salesinteger
    • mintsobject2 fields
      • volumeHbarnumber
      • salesinteger
    • previousobject2 fields
      • volumeHbarnumber
      • salesinteger
    • volumeChangePctnumbernullable
    • salesChangePctnumbernullable
    • collectionsTradedinteger
    • topSalesarray<object>9 fields
      • collectionobject
      • serialinteger
      • namestringnullable
      • imagestringnullable
      • priceHbarnumber
      • kindstringnullable
      • rarityRankintegernullable
      • soldAtstring · date-time
      • urlstring
    • topCollectionsarray<object>12 fields
      • tokenstring
      • namestring
      • xHandlestringnullable

        X handle of the collection's ecosystem project on Hashly.

      • imagestringnullable
      • urlstring
      • volumeHbarnumber
      • salesinteger
      • floorHbarnumbernullable
      • floorChangePctnumbernullable
      • holdersintegernullable
      • listedintegernullable
      • listedPctnumbernullable
    • floorMoversobject3 fields
      • rulestring
      • uparray<object>
      • downarray<object>
    • bestValuearray<object>
  • eventsobject2 fields
    • livearray<object>14 fields
      • idstring
      • titlestring
      • typestring
      • isForeverMintboolean
      • sourcestring
      • startsAtstringnullable
      • endsAtstringnullable
      • mintPricestringnullable
      • supplyintegernullable
      • hoststringnullable
      • xHandlestringnullable
      • imagestringnullable
      • votesinteger
      • urlstring
    • startingSoonarray<object>14 fields
      • idstring
      • titlestring
      • typestring
      • isForeverMintboolean
      • sourcestring
      • startsAtstringnullable
      • endsAtstringnullable
      • mintPricestringnullable
      • supplyintegernullable
      • hoststringnullable
      • xHandlestringnullable
      • imagestringnullable
      • votesinteger
      • urlstring
  • hashlyobject2 fields
    • releasesarray<object>
    • seasonobject4 fields
      • numberinteger
      • namestring
      • endsAtstring · date-time
      • daysLeftinteger

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/digest" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/digest

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"window": "24h",
"from": "2026-09-16T12:00:00.000Z",
"to": "2026-09-16T12:00:00.000Z",
"nft": {
"volumeHbar": 0,
"sales": 0,
"mints": {},
"previous": {},
"volumeChangePct": 0,
"salesChangePct": 0,
"collectionsTraded": 0,
"topSales": [],
"topCollections": [],
"floorMovers": {},
"bestValue": []
},
"events": {
"live": [],
"startingSoon": []
},
"hashly": {
"releases": [],
"season": {}
}
}

Platform

2 endpoints

Service status and release notes.

GET/status

Service status

Hashly's services as the five-minute checks see them: current state, uptime over 24 hours, 7 and 30 days, 90 days of daily bars and recent incidents.

Parameters

None. The request is the path and the key.

Response200object4 fields

  • overallstring
    okdegradedpartialmajorunknown
  • headlinestring
  • servicesarray<object>
  • incidentsarray<object>

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/status" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/status

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"overall": "ok",
"headline": "string",
"services": [
{}
],
"incidents": [
{}
]
}
GET/changelog

Release notes

Hashly's releases, newest first.

Parameters

limitquery
integer1–50

default 10

Response200object7 fields

  • lateststring
    e.g. 2.5.0
  • releasesarray<object>5 fields
    • versionstring
    • datestring
    • titlestring
    • summarystring
    • highlightsarray<object>

Other responses

  • 400A parameter is malformed.
  • 401Missing or invalid API key.
  • 404Resource not found.
  • 429Too many requests.
Error codes
curl "https://hash-ly.com/api/v1/changelog?limit=5" \
  -H "Authorization: Bearer $HASHLY_API_KEY"
Try it
GET /api/v1/changelog?limit=5

Without a key the API answers 401 MISSING_API_KEY, which is also worth seeing.

Example shape
{
"latest": "2.5.0",
"releases": [
{
"version": "string",
"date": "string",
"title": "string",
"summary": "string",
"highlights": []
}
]
}

Something not answering, or a field you expected missing? Check the service status first, then what changed.