-
Notifications
You must be signed in to change notification settings - Fork 1
API Reference
Zaal Panthaki edited this page Mar 29, 2026
·
1 revision
ZAO OS API routes follow consistent patterns. This page documents the conventions and lists all route families.
src/app/api/[feature]/[action]/route.ts
Every route exports named functions for HTTP methods: GET, POST, PUT, DELETE, PATCH.
Every API route follows this structure:
import { NextRequest, NextResponse } from 'next/server';
import { z } from 'zod';
import { getSession } from '@/lib/auth/session';
const InputSchema = z.object({
// Define expected input
});
export async function POST(req: NextRequest) {
try {
// 1. Check auth
const session = await getSession();
if (!session?.fid) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
// 2. Validate input
const body = await req.json();
const result = InputSchema.safeParse(body);
if (!result.success) {
return NextResponse.json({ error: result.error.flatten() }, { status: 400 });
}
// 3. Business logic
const data = await doSomething(result.data);
// 4. Return response
return NextResponse.json({ data });
} catch (error) {
console.error('Route error:', error);
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
}
}-
Always validate with Zod —
safeParseon all inputs, return 400 with error details - Always check session — return 401 if missing for authenticated routes
-
Always return
NextResponse.json()— never plainResponseor raw strings - Always wrap in try/catch — log errors server-side, return sanitized 500 to client
- Never expose secrets — no API keys, service role keys, or private keys in responses
-
Use
Promise.allSettled— for parallel operations that should be fault-tolerant
| Route | Method | Purpose |
|---|---|---|
/api/auth/register |
POST | Register new user via SIWF |
/api/auth/session |
GET | Get current session |
/api/auth/logout |
POST | Clear session cookie |
/api/auth/verify |
POST | Verify signed message |
/api/auth/siwe |
POST | Sign In With Ethereum |
/api/auth/signer |
POST | Request Neynar signer |
/api/auth/signer/save |
POST | Save approved signer |
/api/auth/signer/status |
GET | Check signer approval status |
Platform OAuth:
| Route | Method | Purpose |
|---|---|---|
/api/auth/lastfm |
GET | Last.fm OAuth start |
/api/auth/lastfm/callback |
GET | Last.fm OAuth callback |
/api/auth/lastfm/disconnect |
POST | Disconnect Last.fm |
/api/auth/listenbrainz |
POST | Connect ListenBrainz |
/api/auth/twitch |
GET | Twitch OAuth start |
/api/auth/twitch/callback |
GET | Twitch OAuth callback |
/api/auth/youtube |
GET | YouTube OAuth start |
/api/auth/youtube/callback |
GET | YouTube OAuth callback |
/api/auth/kick |
GET | Kick OAuth start |
/api/auth/kick/callback |
GET | Kick OAuth callback |
/api/auth/facebook |
GET | Facebook OAuth start |
/api/auth/facebook/callback |
GET | Facebook OAuth callback |
| Route | Method | Purpose |
|---|---|---|
/api/chat/messages |
GET | Fetch channel messages (paginated) |
/api/chat/send |
POST | Send a cast to channel |
/api/chat/react |
POST | Like or recast |
/api/chat/thread/[hash] |
GET | Get thread replies |
/api/chat/search |
GET | Search casts |
/api/chat/hide |
POST | Hide a message (admin) |
/api/chat/schedule |
GET, POST, PUT, DELETE | Scheduled posts CRUD |
/api/chat/trending |
GET | Trending casts |
| Route | Method | Purpose |
|---|---|---|
/api/music/metadata |
GET | Fetch track metadata by URL |
/api/music/resolve |
GET | Detect platform + resolve metadata |
/api/music/search |
GET | Search tracks |
/api/music/library |
GET, POST | User's saved tracks |
/api/music/library/like |
POST | Like a track |
/api/music/library/react |
POST | React to a track |
/api/music/library/play |
POST | Record a play |
/api/music/playlists |
GET, POST | User playlists |
/api/music/playlists/[id] |
GET, PUT, DELETE | Single playlist |
/api/music/playlists/[id]/tracks |
POST, DELETE | Playlist tracks |
/api/music/submissions |
GET, POST | Song submissions |
/api/music/submissions/vote |
POST | Vote on submission |
/api/music/submissions/review |
POST | Review submission (curator) |
/api/music/trending-weighted |
GET | Respect-weighted trending |
/api/music/radio |
GET | Radio playlists |
/api/music/track-of-day |
GET | Current track of the day |
/api/music/track-of-day/vote |
POST | Vote for track of day |
/api/music/track-of-day/select |
POST | Select winner (admin) |
/api/music/lyrics |
GET | Fetch lyrics |
/api/music/comments |
GET, POST | Track comments |
/api/music/history |
GET | Play history |
/api/music/scrobble |
POST | Scrobble to Last.fm/ListenBrainz |
/api/music/artists |
GET | Artist directory |
/api/music/permaweb |
POST | Upload to Arweave |
/api/music/mint |
POST | Mint track as NFT |
/api/music/collect |
POST | Collect a minted track |
/api/music/wallet |
GET | Music wallet (collected NFTs) |
/api/music/share-card |
GET | Generate share card image |
/api/music/frame |
GET | Farcaster frame embed |
| Route | Method | Purpose |
|---|---|---|
/api/members/directory |
GET | Member directory (paginated) |
/api/members/me |
GET | Current user's profile |
/api/members/profile |
GET, PUT | Profile read/update |
/api/members/[username] |
GET | Public profile by username |
| Route | Method | Purpose |
|---|---|---|
/api/admin/allowlist |
GET, POST | Allowlist CRUD |
/api/admin/users |
GET | User management |
/api/admin/users/import |
POST | Bulk CSV import |
/api/admin/member-health |
GET | Data quality report |
/api/admin/search-users |
GET | Search members |
/api/admin/hidden |
GET | Hidden members |
/api/admin/respect-import |
POST | Backfill Respect data |
/api/admin/backfill |
POST | General backfill operations |
/api/admin/discord-link |
POST | Link Discord accounts |
/api/admin/poll-config |
GET, PUT | Poll configuration |
/api/admin/upload |
POST | Admin file upload |
/api/admin/ens-subnames |
GET, POST | ENS subname management |
| Route | Method | Purpose |
|---|---|---|
/api/snapshot/polls |
GET | Snapshot poll data |
/api/fractals/sessions |
GET, POST | Fractal session management |
/api/fractals/proposals |
GET, POST | Fractal proposals |
/api/fractals/analytics |
GET | Participation metrics |
/api/fractals/member/[wallet] |
GET | Member fractal stats |
/api/fractals/webhook |
POST | Fractal event webhook |
/api/zounz/proposals |
GET | ZOUNZ DAO proposals |
/api/zounz/proposals/list |
GET | Proposal list |
| Route | Method | Purpose |
|---|---|---|
/api/respect/leaderboard |
GET | Ranked member list |
/api/respect/leaderboard/embed |
GET | Embeddable widget |
/api/respect/member |
GET | Individual balance |
/api/respect/sync |
POST | Sync from on-chain |
/api/respect/transfers |
GET | Transfer history |
/api/respect/event |
POST | Alchemy webhook |
/api/respect/fractal |
GET | Fractal integration data |
| Route | Method | Purpose |
|---|---|---|
/api/publish/farcaster |
POST | Publish to Farcaster |
/api/publish/x |
POST | Publish to X/Twitter |
/api/publish/bluesky |
POST | Publish to Bluesky |
/api/publish/telegram |
POST | Publish to Telegram |
/api/publish/discord |
POST | Publish to Discord |
/api/publish/lens |
POST | Publish to Lens |
/api/publish/hive |
POST | Publish to Hive |
/api/publish/status |
GET | Check publish status |
/api/broadcast/targets |
GET, POST | Broadcast target config |
/api/broadcast/start |
POST | Start broadcast |
/api/broadcast/status |
GET | Broadcast status |
| Route | Method | Purpose |
|---|---|---|
/api/100ms/token |
POST | Voice room auth token |
/api/100ms/rooms |
GET, POST | Room management |
/api/stream/token |
POST | Stream.io auth token |
/api/livepeer/stream |
POST | Create Livepeer stream |
/api/livepeer/clip |
POST | Clip from stream |
/api/search |
GET | Global search |
/api/search/users |
GET | User search |
/api/upload |
POST | File upload |
/api/hats/check |
GET | Hat ownership check |
/api/hats/tree |
GET | Hat tree structure |
/api/ens |
GET | ENS resolution |
/api/notifications |
GET | User notifications |
/api/notifications/send |
POST | Send notification |
/api/notifications/status |
GET | Notification status |
/api/users/profile |
GET, PUT | User profile |
/api/users/wallet |
PUT | Update wallet |
/api/users/wallet-visibility |
PUT | Toggle wallet display |
/api/users/solana-wallet |
PUT | Link Solana wallet |
/api/users/messaging-prefs |
GET, PUT | XMTP preferences |
/api/users/xmtp-address |
GET | Resolve XMTP address |
/api/moderation/queue |
GET | Moderation queue |
/api/activity/feed |
GET | Activity feed |
/api/wavewarz/sync |
POST | WaveWarZ data sync |
/api/wavewarz/artists |
GET | WaveWarZ artists |
/api/miniapp/auth |
POST | Mini app auth |
/api/miniapp/webhook |
POST | Mini app webhook |
All API routes are rate limited per IP via middleware (src/middleware.ts). Limits are configured per route family using Upstash Redis.
If you hit a rate limit, you'll receive:
{ "error": "Rate limit exceeded", "status": 429 }All errors follow this format:
{
"error": "Human-readable error message"
}| Status | Meaning |
|---|---|
| 400 | Invalid input (Zod validation failed) |
| 401 | Not authenticated |
| 403 | Not authorized (missing role/hat) |
| 404 | Resource not found |
| 429 | Rate limited |
| 500 | Server error (details logged server-side) |