Skip to content
Open the app

KURV data API

The data API answers the questions an agent or a dashboard asks about KURV: how many collections launched, what was minted, what moved, where sign-ups came from. It is read only. A key opens only the GET routes under /api/v1 and nothing else: no route here creates, changes, signs or spends anything.

Every request carries an API key as a bearer token:

Authorization: Bearer kurv_sk_...

Keys are made by the KURV team, one per agent, and shown once when they are made. KURV keeps only a digest, so a lost key is replaced, never recovered. A key can be revoked at any time; its next request is refused. Requests without a key, with a revoked key, or with a key that lacks the route’s scope get a 401 or 403 with one sentence that says so.

ScopeOpens
kurv:stats:readThe four /api/v1/stats/* routes: counts, volume, fees and sources, with no email and no name in any answer
kurv:admin:read/api/v1/admin/*: applications with their emails, who accepted an invitation, the creator behind each collection, the seats used, the daily export and the counts by source

A key carries one scope or both. The admin scope is the only one that carries emails.

RequestAnswers
GET /api/v1/stats/overview?chain=Collections launched, mints, unique minters, volume, fees, creators and sign-ups, each for the last 24 hours, the last 7 days and all time
GET /api/v1/stats/collections?chain=&sort=volume|mints|new&cursor=Every launched collection with total_minted, its volume by coin, its last mint and its creator account, 25 a page
GET /api/v1/stats/mints?chain=&since=&cursor=Mints newest first, 50 a page, from since onwards
GET /api/v1/stats/users?chain=&since=Sign-ups, accounts per network, active creators and minters, the breakdown by source tag, and the funnel from sign-up to launch
GET /api/v1/admin/signups?since=&source=Applications, accounts, invitation links with their redemptions, counts by source, and launches that carried no tag
GET /api/v1/admin/acceptances?since=&source=Every accepted invitation, newest first: the account, its profile, its X handle, an email where an application names one, the time and the tag it came with
GET /api/v1/admin/creators?chain=&since=The creator behind each collection on every network, or on the one chain names: the account, its profile, its handle and its X handle when known
GET /api/v1/admin/seatsThe seats used so far, day by day
GET /api/v1/admin/funnel?chain=&since=Accepted invitations on one network, per window and by tag, and the funnel with them
GET /api/v1/admin/testersEveryone let in and everyone who reported on the tester guide, with where each of their tasks stands. Their notes stay out
GET /api/v1/admin/export?day=The export written every day at 6:30 AM in Guayaquil, that day’s or the newest, with the days there are: the acceptances, the creators and the seats, complete up to the moment it ran

chain names one network the deployment serves, base-sepolia (or its chain id, 84532) or solana-devnet; left out, it is the default EVM chain. since is ISO 8601 or unix seconds. cursor is the pagination.next_cursor of the previous page, opaque, and null on the last page.

In acceptances, creators and the export, email_basis says what kind of email a row carries. email with founder_tagged_link is verified: the KURV team tagged the link for one person, it was used once, and one application carries the tag. email_claimed with ref_tag_unverified is a claim and never identity: the account arrived from an address with a ref tag, and one application carries that tag, but anyone can type such an address. Tags before 30 October 2026 give neither, and a handle typed into a form gives neither.

Every answer carries api_version, chain, environment and read_at. Amounts are base units as decimal strings, one entry per coin under native; usd is the USDC part in dollars, or null when only a coin without a dollar figure moved. Money in one coin is never added to money in another.

Terminal window
curl -H "Authorization: Bearer $KURV_KEY" \
"https://testnet.kurv.fun/api/v1/stats/overview?chain=base-sepolia"
{ "api_version": "1", "chain": "base-sepolia", "read_at": "2026-10-25T18:02:11.000Z",
"windows": { "24h": { "collections": { "created": 3, "drafts": 2, "launched": 1 }, "mints": { "events": 12, "pieces": 12 },
"unique_minters": 9, "volume": { "native": [{ "asset_id": "evm:84532:token:0x036c...", "symbol": "USDC", "decimals": 6, "base_units": "48000000" }], "usd": "48.00" },
"fees": { "native": [{ "asset_id": "evm:84532:token:0x036c...", "symbol": "USDC", "decimals": 6, "base_units": "2400000" }], "usd": "2.40" },
"creators": 1, "signups": 3 }, "7d": { }, "all": { } },
"notes": [ ] }
Terminal window
curl -H "Authorization: Bearer $KURV_KEY" \
"https://testnet.kurv.fun/api/v1/stats/collections?chain=base-sepolia&sort=volume"
{ "sort": "volume", "collections": [ { "id": "evm:84532:0xabc...", "address": "0xabc...", "name": "MAXCAT", "creator": "0x2787...",
"launched_at": "2026-10-20T15:00:00.000Z", "total_minted": 120, "volume": { "native": [ ], "usd": "600.00" }, "last_mint_at": "2026-10-25T17:40:02.000Z" } ],
"pagination": { "limit": 25, "next_cursor": null, "total": 1 } }
Terminal window
curl -H "Authorization: Bearer $KURV_KEY" \
"https://testnet.kurv.fun/api/v1/stats/mints?chain=base-sepolia&since=2026-10-25T17:00:00Z"
{ "since": "2026-10-25T17:00:00.000Z", "mints": [ { "id": "evm:84532:0xabc...:4200100:3", "collection": "evm:84532:0xabc...", "minter": "0x70997...",
"pieces": 1, "paid": { "symbol": "USDC", "decimals": 6, "base_units": "5000000" }, "tx": "0x5e2b...", "at": "2026-10-25T17:40:02.000Z" } ],
"pagination": { "limit": 50, "next_cursor": null } }
Terminal window
curl -H "Authorization: Bearer $KURV_KEY" \
"https://testnet.kurv.fun/api/v1/stats/users?chain=base-sepolia"
{ "accounts": { "base_sepolia": 34, "solana_devnet": 6 },
"windows": { "7d": { "signups": 5, "active_creators": 2, "active_minters": 9, "by_source": { "XD-ana": { "signups": 2, "accounts": 1, "launched": 1 } },
"funnel": { "visits": 40, "submissions": 5, "building": 3, "launched": 2 } } },
"notes": [ "Visits, sign-ups and the wizard are not per network." ] }
Terminal window
curl -H "Authorization: Bearer $KURV_ADMIN_KEY" \
"https://testnet.kurv.fun/api/v1/admin/signups?since=2026-10-01&source=XD-ana"
{ "applications": [ { "handle": "ana_builds", "email": "[email protected]", "created_at": "2026-10-24T09:12:00.000Z", "ref": "XD-ana" } ],
"accounts": { "base_sepolia": 34, "solana_devnet": 6 },
"invites": [ { "link_id": "3f9c...", "label": "Friends on X", "uses": 12,
"redemptions": [ { "account": "0x3c44...", "handle": "ana_builds", "accepted_at": "2026-10-24T10:01:00.000Z", "ref": "XD-ana" } ] } ],
"by_source": { "XD-ana": { "signups": 2, "accepted": 1, "launched": 1 } },
"launched_outside_outreach": 7 }

Each key may make 120 requests a minute, and 30 a minute on /api/v1/admin/*. Past that the answer is 429 with a retry-after header. Every answer is at most 60 seconds old: the server reads once a minute and read_at is the time of that read. To follow mints as they happen, call /api/v1/stats/mints every 30 to 60 seconds with since set to the last read_at you saw; there is no stream to keep open.

Nothing. A key reads. It cannot create a collection, prepare a launch, mint, trade, change a profile or touch an invitation. An agent that should build collections connects through MCP instead, with the person’s approval, and that connection is separate from any key.

Errors use { "api_version": "1", "error": { "code": "...", "message": "..." } } with 400, 401, 403, 429 or 503 status codes. The public, keyless routes are described in Public APIs; KURV for Developers lists every entry point. The fees in these figures are each collection’s own: read Fees and Risks and disclaimer.

Nothing here is financial advice. Read Risks and disclaimer before you mint, buy or sell back. Back to kurv.fun. Privacy policy. Terms of use. .