API Reference
Complete API documentation for Huddle Pulse. Query events, manage apps, handle RSVPs, and more through our REST API.
https://www.huddlepulse.xyzNo Auth Required
Public GET endpoints are open. No API key needed.
REST JSON API
Standard HTTP verbs, JSON responses throughout.
Write Protection
POST/PATCH/DELETE require valid session authentication.
API Categories
Events
Wave management, RSVPs, and event discovery
Apps
App ecosystem, associations, and app-specific events
Users
Identity resolution, search, and participant management
Portal
Proxy endpoints for Abstract Portal integration
Auth
Session management and user preferences
Admin
Reports, content moderation, and system utilities
Endpoints
/api/eventsReturns a list of active and upcoming Waves from the last 6 months. Supports filtering, search, and pagination.
?category=<string>&search=<string>&limit=<number>&offset=<number>&creator=<address>
[
{
"id": "uuid",
"title": "string",
"description": "string",
"startTime": "ISO 8601",
"endTime": "ISO 8601 | null",
"bannerUrl": "string | null",
"category": "string",
"repeat": "none | daily | weekly | biweekly | monthly",
"priority": "number",
"eventType": "spotlight | standard",
"isMintedOut": "boolean",
"creator": { "address": "0x..." },
"link": "string | null",
"prize": "string | null",
"physicalAddress": "string | null",
"latitude": "number | null",
"longitude": "number | null",
"videoUrl": "string | null"
}
]/api/events/[id]Returns detailed information for a specific Wave including RSVP status if userAddress is provided.
?userAddress=<address>
{
"id": "uuid",
"title": "string",
"description": "string",
"startTime": "ISO 8601",
"endTime": "ISO 8601 | null",
"bannerUrl": "string | null",
"category": "string",
"repeat": "none | daily | weekly | biweekly | monthly",
"priority": "number",
"eventType": "spotlight | standard",
"isMintedOut": "boolean",
"creator": { "address": "0x..." },
"link": "string | null",
"prize": "string | null",
"physicalAddress": "string | null",
"latitude": "number | null",
"longitude": "number | null",
"videoUrl": "string | null",
"rsvpd": "boolean | null", // if userAddress provided
"participantsCount": "number"
}/api/events/mineReturns the creator's own Waves, including pending (`approved: false`) and hidden (`visible: false`) events. With public session auth it returns the current wallet's events. With API key auth, pass `?creator=<address>`.
?creator=<address> // required only for API key usage
{
"events": [
{
"id": "uuid",
"title": "string",
"description": "string | null",
"startTime": "ISO 8601 | null",
"endTime": "ISO 8601 | null",
"bannerUrl": "string | null",
"galleryUrls": ["string"],
"category": "string | null",
"repeat": "none | daily | weekly | biweekly | monthly",
"priority": "number",
"eventType": "spotlight | standard",
"isMintedOut": "boolean",
"isTba": "boolean",
"visible": "boolean",
"approved": "boolean",
"creator": { "address": "0x..." },
"link": "string | null",
"isReferralLink": "boolean",
"videoUrl": "string | null",
"physicalAddress": "string | null",
"latitude": "number | null",
"longitude": "number | null",
"zoomLevel": "number | null",
"createdAt": "ISO 8601"
}
]
}/api/eventsCreates a new Wave via API key. If `approved` is omitted, it defaults to `false`. API-created events are not subject to the end-user daily creation limit. When `sourceEventId` is provided for another event by the same creator, the API also copies the banner image, linked apps, and role participants from the source event.
{
"creator_address": "0x...",
"title": "string",
"description": "string | null",
"start_time": "ISO 8601",
"end_time": "ISO 8601 | null",
"category": "string | null",
"repeat": "none | daily | weekly | biweekly | monthly",
"link": "string | null",
"banner_url": "string | null",
"gallery_urls": ["string"],
"physical_address": "string | null",
"latitude": "number | null",
"longitude": "number | null",
"zoom_level": "number",
"video_url": "string | null",
"video_format": "landscape | portrait | square",
"visible": "boolean",
"approved": "boolean // defaults to false if omitted",
"is_referral_link": "boolean",
"is_minted_out": "boolean",
"is_tba": "boolean",
"sourceEventId": "uuid | null // optional duplicate source; copies banner/apps/participants"
}{
"success": true,
"eventId": "uuid",
"approved": "boolean",
"visible": "boolean",
"isPending": "boolean",
"warnings": ["string"]
}/api/events/recurring-candidatesAutomation helper endpoint for recurring Waves. Without query params it returns recently ended, approved, visible events whose `repeat` is not `none`, filtered by a repeat-specific age window. With `creator`, `window_start`, and `window_end`, it returns candidate successor events for duplicate detection.
?limit=<number>&now=<ISO 8601> or ?creator=<address>&window_start=<ISO 8601>&window_end=<ISO 8601>&exclude_event_id=<uuid>&limit=<number>
{
"mode": "candidates | window",
"now": "ISO 8601",
"windows": {
"daily": 2,
"weekly": 7,
"monthly": 31,
"biweekly": 14
},
"events": [
{
"id": "uuid",
"creator_address": "0x...",
"title": "string",
"description": "string | null",
"start_time": "ISO 8601",
"end_time": "ISO 8601 | null",
"banner_url": "string | null",
"category": "string | null",
"repeat": "daily | weekly | biweekly | monthly",
"link": "string | null",
"is_referral_link": "boolean",
"is_minted_out": "boolean",
"visible": "boolean",
"approved": "boolean",
"physical_address": "string | null",
"latitude": "number | null",
"longitude": "number | null",
"zoom_level": "number | null",
"video_url": "string | null",
"video_format": "string | null",
"is_tba": "boolean",
"priority": "number",
"event_type": "spotlight | standard",
"recurrence_window_days": "number",
"effective_end_time": "ISO 8601"
}
]
}/api/events/[id]Updates an existing Wave via API key. `creator_address` must match the event creator. This endpoint can also update moderation flags like `approved` and `visible`.
{
"creator_address": "0x...",
"title": "string | null",
"description": "string | null",
"start_time": "ISO 8601 | null",
"end_time": "ISO 8601 | null",
"category": "string | null",
"repeat": "none | daily | weekly | biweekly | monthly | null",
"link": "string | null",
"banner_url": "string | null",
"gallery_urls": ["string"] | null,
"physical_address": "string | null",
"latitude": "number | null",
"longitude": "number | null",
"zoom_level": "number | null",
"video_url": "string | null",
"video_format": "landscape | portrait | square | null",
"visible": "boolean | null",
"approved": "boolean | null",
"is_referral_link": "boolean | null",
"is_minted_out": "boolean | null",
"is_tba": "boolean | null"
}{
"success": true
}/api/events/[id]Deletes a Wave via API key. `creator_address` must match the event creator.
{
"creator_address": "0x..."
}{
"success": true
}/api/events/lightLightweight event listing for performance-critical use cases. Returns minimal event data.
[
{
"id": "uuid",
"title": "string",
"startTime": "ISO 8601",
"endTime": "ISO 8601 | null",
"category": "string",
"priority": "number",
"creator": { "address": "0x..." },
"bannerUrl": "string | null"
}
]/api/events/[id]/participantsReturns the participant list for a specific Wave with identity data.
[
{
"address": "0x...",
"name": "string | null",
"avatar": "string | null",
"verificationType": "portal | verified | regular",
"identityPreference": "ans | portal | null"
}
]/api/rsvpReturns the RSVP list for a given Wave. Pass ?eventId=<uuid> as query param.
?eventId=<uuid>
{
"count": number,
"attendees": ["0x...", "0x..."]
}/api/rsvpRSVP to a Wave. Requires wallet authentication.
{
"eventId": "uuid",
"action": "rsvp" | "cancel"
}{
"success": true,
"message": "string"
}/api/rsvpCancel RSVP to a Wave. Requires wallet authentication.
{
"eventId": "uuid"
}{
"success": true,
"message": "string"
}/api/appsSearch apps by name. Returns up to 5 results sorted by shortest name first.
?q=<search_query>
[
{
"id": "number",
"name": "string",
"icon": "string | null",
"category": "string | null",
"in_portal": "boolean"
}
]/api/apps/allReturns all apps with complete information (SELECT *). No query parameters required.
[
{
"id": "number",
"name": "string",
"description": "string | null",
"icon": "string | null",
"banner": "string | null",
"link": "string | null",
"docs_url": "string | null",
"spotlight": "daily | weekly | null",
"launched": "boolean",
"in_portal": "boolean",
"category": "string | null",
"socials": "object",
"created_at": "ISO 8601",
"updated_at": "ISO 8601"
}
]/api/apps/listReturns apps with pagination and optional in_portal filter. Returns complete information for each app.
?page=<number>&limit=<number>&in_portal=<boolean>
{
"data": [
{
"id": "number",
"name": "string",
"description": "string | null",
"icon": "string | null",
"banner": "string | null",
"link": "string | null",
"docs_url": "string | null",
"spotlight": "daily | weekly | null",
"launched": "boolean",
"in_portal": "boolean",
"category": "string | null",
"socials": "object",
"created_at": "ISO 8601",
"updated_at": "ISO 8601"
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 150,
"totalPages": 3
}
}/api/apps/[id]Get detailed information for a specific app.
{
"id": "number",
"name": "string",
"description": "string | null",
"icon": "string | null",
"banner": "string | null",
"link": "string | null",
"docs_url": "string | null",
"spotlight": "daily | weekly | null",
"launched": "boolean",
"in_portal": "boolean",
"category": "string | null",
"socials": "object",
"created_at": "ISO 8601",
"updated_at": "ISO 8601"
}/api/apps/[id]/eventsGet events associated with a specific app. Can include past events.
?includePast=<boolean>
[
{
"id": "uuid",
"title": "string",
"description": "string",
"startTime": "ISO 8601",
"endTime": "ISO 8601 | null",
"bannerUrl": "string | null",
"category": "string",
"link": "string | null",
"creator": { "address": "0x..." },
"isMintedOut": "boolean",
"approved": "boolean",
"visible": "boolean"
}
]/api/events/[id]/appsGet apps associated with a specific event.
[
{
"id": "string",
"event_id": "string",
"app_id": "number",
"created_at": "ISO 8601",
"app": {
"id": "number",
"name": "string",
"icon": "string | null",
"category": "string | null",
"in_portal": "boolean"
}
}
]/api/events/[id]/appsSet apps for an event (replaces all existing associations). Requires event creator permissions.
{
"appIds": [number, number, ...]
}{
"success": true
}/api/events/[id]/participantsGet participants with roles for a specific event.
[
{
"id": "string",
"event_id": "string",
"wallet_address": "string",
"role": "host | co-host | speaker | panelist | moderator | participant | guest",
"created_at": "ISO 8601",
"display_name": "string | null",
"avatar": "string | null",
"verified": "boolean",
"verified_portal": "boolean",
"identity_preference": "ans | portal | null"
}
]/api/events/[id]/participantsSet participants with roles for an event (replaces all existing). Requires event creator permissions.
{
"participants": [
{
"wallet_address": "string",
"role": "host | co-host | speaker | panelist | moderator | participant | guest"
}
]
}{
"success": true
}/api/appsCreate a single app. Requires API key with POST permission on "apps". Only name and description are required.
{
"name": "string", // Required
"description": "string", // Required
"icon": "string | null",
"banner": "string | null",
"link": "string | null",
"docs_url": "string | null",
"category": "Skill Based Games | Arcade Games | Trading | Social | Collectibles | Tools | Others | null",
"launched": "boolean",
"in_portal": "boolean",
"spotlight": "daily | weekly | null",
"socials": { "twitter": "url", "discord": "url" }
}{
"success": true,
"app": { "id": 123, "name": "My App" }
}/api/apps/batchCreate multiple apps in a single request (max 50). Each app requires name and description. Returns created apps and any validation errors.
{
"apps": [
{
"name": "string", // Required
"description": "string", // Required
"icon": "string | null",
"banner": "string | null",
"link": "string | null",
"category": "string | null",
"launched": "boolean",
"in_portal": "boolean",
"socials": {}
}
]
}{
"success": true,
"created": [{ "id": 123, "name": "App A" }, { "id": 124, "name": "App B" }],
"errors": [{ "index": 2, "error": ""name" is required" }]
}/api/apps/[id]Update a single app by ID. Only provided fields are updated. Returns 404 if app not found.
{
"name": "string | null",
"description": "string | null",
"icon": "string | null",
"banner": "string | null",
"link": "string | null",
"docs_url": "string | null",
"category": "Skill Based Games | Arcade Games | Trading | Social | Collectibles | Tools | Others | null",
"launched": "boolean | null",
"in_portal": "boolean | null",
"spotlight": "daily | weekly | null",
"socials": "object | null"
}{
"success": true,
"app": {
"id": 123,
"name": "Updated App Name",
"icon": "icon-name",
"category": "Skill Based Games",
"in_portal": true,
"launched": true,
"banner": "banner-url",
"link": "https://app.com",
"docs_url": "https://docs.app.com",
"socials": {},
"spotlight": "daily",
"description": "Updated description"
}
}/api/apps/batchUpdate multiple apps in a single request (max 50). Each item must include an "id" field. Returns updated apps and any errors per app.
{
"apps": [
{
"id": 123, // Required
"name": "string | null",
"description": "string | null",
"icon": "string | null",
"banner": "string | null",
"link": "string | null",
"category": "string | null",
"launched": "boolean | null",
"in_portal": "boolean | null",
"spotlight": "daily | weekly | null",
"socials": "object | null"
}
]
}{
"success": true,
"updated": [
{
"id": 123,
"name": "Updated App 1",
"icon": "icon-name",
"category": "Skill Based Games",
"in_portal": true,
"launched": true,
"spotlight": "daily"
},
{
"id": 124,
"name": "Updated App 2",
"category": "Social",
"in_portal": true,
"spotlight": "weekly"
}
],
"errors": [
{
"id": 125,
"error": "App not found"
}
]
}/api/users/searchSearch users by name or address. Combines local database with Portal API results.
?q=<search_query>
[
{
"wallet_address": "string",
"portal_name": "string | null",
"portal_avatar": "string | null",
"ans_name": "string | null",
"ans_avatar": "string | null",
"verified": "boolean",
"verified_portal": "boolean",
"identity_preference": "ans | portal | null",
"in_db": "boolean"
}
]/api/portal/fetchProxy endpoint to fetch data from the Abstract Portal API to bypass CORS.
?url=<encoded_portal_url>
{
"data": "object",
"cached": "boolean"
}/api/portal/fetchPOST proxy to Abstract Portal API.
{
"url": "string",
"method": "GET | POST",
"body": "object | null"
}{
"data": "object",
"cached": "boolean"
}/api/sessionCheck if a valid session exists (reads httpOnly cookie).
{
"valid": "boolean",
"address": "string | null"
}/api/sessionSession operations. Use action parameter.
?action=nonce | verify
{
"action": "nonce",
"address": "string"
}{
"nonce": "string",
"message": "string"
}/api/sessionDestroy the current session (logout).
{
"success": "boolean"
}/api/preferencesGet user notification and identity preferences.
{
"email_notifications": "boolean",
"push_notifications": "boolean",
"identity_preference": "ans | portal | null"
}/api/preferencesUpdate user preferences.
{
"email_notifications": "boolean",
"push_notifications": "boolean",
"identity_preference": "ans | portal | null"
}{
"success": true
}/api/reportsSubmit a report for inappropriate content.
{
"eventId": "string",
"message": "string"
}{
"success": true
}/api/twitter/resolveResolve Twitter handle to wallet address via Abstract Name Service.
?handle=<twitter_handle>
{
"address": "string | null",
"handle": "string"
}Data Models
Event Model
{
id: string, // UUID
title: string,
description: string,
startTime: string, // ISO 8601
endTime: string | null, // ISO 8601
bannerUrl: string | null,
category: "irl" | "online" | "mint" | "other",
priority: number, // For ordering spotlight events
eventType: "spotlight" | "standard",
isMintedOut: boolean,
creator: {
address: string // Wallet address
},
link: string | null, // External link
prize: string | null, // Prize description
physicalAddress: string | null,
latitude: number | null,
longitude: number | null,
videoUrl: string | null,
approved: boolean, // Admin approval status
visible: boolean, // Public visibility
createdAt: string, // ISO 8601
updatedAt: string // ISO 8601
}App Model
{
id: number,
name: string,
description: string | null,
icon: string | null, // URL to icon image
banner: string | null, // URL to banner image
link: string | null, // Main app URL
docs_url: string | null, // Documentation URL
spotlight: "daily" | "weekly" | null,
launched: boolean,
in_portal: boolean, // Listed on Abstract Portal
category: "Skill Based Games" | "Arcade Games" | "Trading" | "Social" | "Collectibles" | "Tools" | "Others" | null,
socials: object, // { platform: url, ... }
created_at: string, // ISO 8601
updated_at: string // ISO 8601
}Participant Roles
hostEvent organizer/creatorco-hostSecondary organizerspeakerEvent speaker/presenterpanelistPanel discussion membermoderatorQ&A moderatorparticipantGeneral participantguestSpecial guestNeed more endpoints or a dedicated integration?
Contact us on X