dApps Directory

A curated catalog of Starknet dApps, organized by category

A curated list of Starknet dApps, organized by category and tag. Wallets like Keon use it to power their in-app dApp browser, but anyone can hit it.

If you're building a wallet, an explorer, or a portal that needs a "discover apps" surface, this is the API for that.

Categories

GET /api/dapps/categories/ - list categories

Paginated list of all dApp categories (DeFi, NFTs, Gaming, Bridges, ...).

Code
bash
1curl 'https://api.tokenkithq.io/api/dapps/categories/' \
2 -H 'api-key: YOUR_API_KEY'

GET /api/dapps/categories/{slug}/ - one category

Code
bash
1curl 'https://api.tokenkithq.io/api/dapps/categories/defi/' \
2 -H 'api-key: YOUR_API_KEY'

dApps

GET /api/dapps/apps/ - list dApps

FilterNotes
categorySlug of a category
networkmainnet, sepolia, etc.
tagFilter by a tag
featuredtrue to limit to featured apps
verifiedtrue for verified apps
qSearch across name, description, tags
Code
bash
1curl 'https://api.tokenkithq.io/api/dapps/apps/?category=defi&network=mainnet&verified=true' \
2 -H 'api-key: YOUR_API_KEY'

Response shape

The list, search, discover, and category endpoints all return dApp entries with the same field set as the single-dApp detail endpoint — wallets can render social links and full descriptions directly from list payloads without an extra round-trip per row. Empty social URLs come back as "", not null.

Code
json
1{
2 "links": { "next": null, "previous": null },
3 "count": 20,
4 "total_pages": 1,
5 "results": [
6 {
7 "id": 21,
8 "name": "Keon Wallet",
9 "slug": "keon-wallet",
10 "tagline": "The best, developer/user friendly wallet on Starknet",
11 "description": "Full description body...",
12 "url": "https://keonwallet.app",
13 "website_url": "",
14 "docs_url": "",
15 "logo_url": "https://tokenkit.s3.amazonaws.com/keon-dark-icon....png",
16 "banner_url": "",
17 "category": { "id": 5, "name": "Wallets", "slug": "wallets", "icon": "👛" },
18 "tags": ["swap"],
19 "networks": ["mainnet", "sepolia"],
20 "twitter_url": "",
21 "discord_url": "",
22 "telegram_url": "",
23 "github_url": "",
24 "tvl_usd": null,
25 "daily_users": 0,
26 "total_transactions": 0,
27 "rating": "0.00",
28 "review_count": 0,
29 "is_featured": true,
30 "is_verified": true,
31 "is_active": true,
32 "launched_at": null,
33 "created_at": "2026-04-12T09:32:11Z",
34 "updated_at": "2026-05-23T11:42:18Z"
35 }
36 ]
37}

category is null if a dApp hasn't been categorised yet (it's not required on the model).

GET /api/dapps/apps/{slug}/ - one dApp

Returns a single dApp with the same field set as the list rows above.

Code
bash
1curl 'https://api.tokenkithq.io/api/dapps/apps/jediswap/' \
2 -H 'api-key: YOUR_API_KEY'
ParameterRequiredNotes
qyesMin 2 chars
Code
bash
1curl 'https://api.tokenkithq.io/api/dapps/apps/search/?q=swap' \
2 -H 'api-key: YOUR_API_KEY'

Discover

GET /api/dapps/discover/ - the homepage bundle

Featured + recent + popular, all in one response. Drop into a dApp browser landing page.

ParameterNotes
networkOptional, filter by chain
Code
bash
1curl 'https://api.tokenkithq.io/api/dapps/discover/?network=mainnet' \
2 -H 'api-key: YOUR_API_KEY'

GET /api/dapps/category/{slug}/ - dApps in a category

ParameterNotes
networkOptional
page, limitPagination
Code
bash
1curl 'https://api.tokenkithq.io/api/dapps/category/defi/?network=mainnet&limit=20' \
2 -H 'api-key: YOUR_API_KEY'

Ads

GET /api/dapps/ads/ - fetch active ads

Returns the highest-priority active ads for a given placement, respecting per-ad scheduling and impression caps.

ParameterRequiredNotes
placementyesOne of the configured placement slugs (e.g. discover_banner)
networknoFilter to ads targeting this chain. Ads with no network restriction always match.
categorynoCategory slug. Ads with no category restriction always match.
limitnoMax ads to return (default 1)
Code
bash
1curl 'https://api.tokenkithq.io/api/dapps/ads/?placement=discover_banner&network=mainnet' \
2 -H 'api-key: YOUR_API_KEY'

POST /api/dapps/ads/{ad_id}/impression/ - record an impression

Fire this when an ad enters the user's viewport. Increments the impression counter; ads hit their total_impression_limit and disappear from GET /api/dapps/ads/ automatically.

POST /api/dapps/ads/{ad_id}/click/ - record a click

Fire this when the user clicks the ad. Increments the click counter (used for CTR reporting).

Both impression and click endpoints accept an empty body and return 204 No Content on success.

Submitting a dApp

If you want your dApp listed, head to tokenkithq.io and submit it through the dApp submission form. We review submissions for the verified flag.

See also