Search
The Flipdare search API supports flexible querying across different content types (users, groups, dares, friends) with various scoping options.
Controls whose content to search:
None- Default, Public content, anyone can see (no authentication required)MINE- User’s own content only (requires authentication)FRIENDS- Content from user’s friends only (requires authentication)
Controls which type of objects to return:
ALL- All content typesUSER- User profiles onlyGROUP- Groups onlyDARE- Dares (challenges) onlyFRIEND- Friend connections only (special case)GROUP_DARE- Dares specific to groups (filtered from DARE)
Controls result ranking:
RELEVANCE- Best matches first (score + views)NEWEST- Most recent first (creation date)OLDEST- Oldest first (creation date)POPULAR- Most viewed first (views + score)DEF- Default (balanced score + recency)
SearchRequest(
q: "john",
// search_type None searches all
category: SearchCategory.USER,
sort_type: SearchSortType.RELEVANCE
)
Use Case: Directory search, finding new users to follow
SearchRequest(
q: "fitness",
// search_type None searches all
category: SearchCategory.GROUP,
sort_type: SearchSortType.POPULAR
)
Use Case: Discover public groups by interest
SearchRequest(
q: "cooking challenge",
// search_type None searches all
category: SearchCategory.DARE,
sort_type: SearchSortType.NEWEST
)
Use Case: Browse public challenges
SearchRequest(
q: "marathon",
// search_type None searches all
category: SearchCategory.ALL,
sort_type: SearchSortType.RELEVANCE
)
Use Case: General discovery across all content Note: Returns mixed results (users, groups, dares)
SearchRequest(
q: "book club",
search_type: SearchType.MINE,
category: SearchCategory.GROUP,
sort_type: SearchSortType.RELEVANCE
)
Use Case: Find a specific group I’m in or own
SearchRequest(
q: "fitness",
search_type: SearchType.MINE,
category: SearchCategory.DARE,
sort_type: SearchSortType.NEWEST
)
Use Case: Search through my active/completed challenges
SearchRequest(
q: "sarah",
search_type: SearchType.FRIENDS,
category: SearchCategory.USER,
sort_type: SearchSortType.RELEVANCE
)
Use Case: Quick lookup of a friend in my network
SearchRequest(
q: "workout",
search_type: SearchType.FRIENDS,
category: SearchCategory.DARE,
sort_type: SearchSortType.NEWEST
)
Use Case: See what challenges my friends are doing
SearchRequest(
q: "gaming",
search_type: SearchType.FRIENDS,
category: SearchCategory.GROUP,
sort_type: SearchSortType.POPULAR
)
Use Case: Discover groups my friends belong to
SearchRequest(
q: "marathon",
search_type: SearchType.FRIENDS,
category: SearchCategory.ALL,
sort_type: SearchSortType.RELEVANCE
)
Use Case: See all friend activity related to a topic
// ❌ DON'T DO THIS
SearchRequest(
// search_type None searches all
category: SearchCategory.FRIEND // Invalid
)
Why Invalid: FRIEND category is for specific friend-to-friend connections, not searchable publicly.
Alternative: Use SearchType.FRIENDS + SearchCategory.USER to find specific friends
// ❌ DON'T DO THIS
SearchRequest(
search_type: SearchType.MINE,
category: SearchCategory.USER // Questionable
)
Why Invalid: Searching for “my own user profile” doesn’t make sense. Alternative: Direct profile fetch, not search
// ❌ DON'T DO THIS
SearchRequest(
search_type: SearchType.MINE,
category: SearchCategory.FRIEND // Invalid
)
Why Invalid: Can’t search “my friends” - friend connections aren’t keyword-searchable.
Alternative: Use SearchType.FRIENDS + SearchCategory.USER with query
// ❌ DON'T DO THIS
SearchRequest(
search_type: SearchType.FRIENDS,
category: SearchCategory.FRIEND // Invalid
)
Why Invalid: Friend connections are relationships, not searchable entities.
// Search for known contacts
SearchRequest(
q: "jane.doe@example.com",
// search_type None searches all
category: SearchCategory.USER,
sort_type: SearchSortType.RELEVANCE
)
// Latest friend activity
SearchRequest(
q: "*", // All content
search_type: SearchType.FRIENDS,
category: SearchCategory.DARE,
sort_type: SearchSortType.NEWEST
)
// Trending public challenges
SearchRequest(
q: "*",
// search_type None searches all
category: SearchCategory.DARE,
sort_type: SearchSortType.POPULAR
)
// Autocomplete for friend mentions
SearchRequest(
q: "joh", // Partial match
search_type: SearchType.FRIENDS,
category: SearchCategory.USER,
sort_type: SearchSortType.RELEVANCE,
auto_complete: true
)
SearchRequest(
q: "photography",
query_by is used to filter search results based on a relationship.
// Search for known contacts
SearchRequest(
q: "jane.doe@example.com",
// search all by default
category: SearchCategory.USER,
sort_type: SearchSortType.RELEVANCE
)
// Latest friend activity
SearchRequest(
q: "*", // All content
search_type: SearchType.FRIENDS,
category: SearchCategory.DARE,
sort_type: SearchSortType.NEWEST
)
// Trending public challenges
SearchRequest(
q: "*",
// search all by default
category: SearchCategory.DARE,
sort_type: SearchSortType.POPULAR
)
// Autocomplete for friend mentions
SearchRequest(
q: "joh", // Partial match
search_type: SearchType.FRIENDS,
category: SearchCategory.USER,
sort_type: SearchSortType.RELEVANCE,
auto_complete: true
)
SearchRequest(
q: "photography",
// search all by default
category: SearchCategory.GROUP,
sort_type: SearchSortType.POPULAR
)
SearchRequest(
q: "30 day plank",
search_type: SearchType.MINE,
category: SearchCategory.DARE,
sort_type: SearchSortType.OLDEST
)
SearchRequest(
q: "30 day plank",
search_type: SearchType.MINE,
category: SearchCategory.DARE,
sort_type: SearchSortType.OLDEST
)
// ✅ GOOD - Fast, searches one collection
SearchRequest(category: SearchCategory.USER, ...)
// ⚠️ SLOWER - Searches multiple collections, merges results
SearchRequest(category: SearchCategory.ALL, ...)
// ✅ Optimized for typeahead
SearchRequest(
q: "joh",
auto_complete: true,
per_page: 10 // Smaller page size for autocomplete
)
- Identical searches are cached for 5 minutes (configurable)
- Cache key includes: uid, query, page, search_type, category
- Cache disabled in dev/emulator mode
// First page
SearchRequest(page_num: 1, ...)
// Subsequent pages - reuse same query params
SearchRequest(page_num: 2, ...) // Cached results help
// Error: SearchType.MINE or SearchType.FRIENDS without auth
{
"code": "SEARCH_KNOWN_NO_UID",
"message": "We had a problem verifying your account..."
}
Solution: Ensure user is authenticated before using MINE/FRIENDS
// Error: Empty or malformed query
{
"code": "SEARCH_ERROR",
"message": "Our bad. We couldn't search for your awesome query."
}
Solution: Validate query before submission
// Success with no matches
{
"found": 0,
"results": [],
"page": 1,
"out_of": 0
}
Not an error - Just no matches found
{
"q": "fitness",
"found": 42,
"page": 1,
"out_of": 5,
"collection_name": "dare",
"results": [
{
"id": "dare_123",
"fromUid": "user_456",
"title": "30-Day Fitness Challenge",
"description": "Complete 30 days of exercise...",
// ... other dare fields
},
// ... more results
],
"highlights": [ // Optional, for search term highlighting
{
"field": "title",
"matched_tokens": ["fitness"],
"snippet": "30-Day <mark>Fitness</mark> Challenge"
}
]
}
{
"code": "SEARCH_ERROR",
"title": "Search Error",
"message": "Our bad. We couldn't search for your awesome query.",
"details": {
"endpoint": "c_search",
"timestamp": "2026-03-07T10:30:00Z"
}
}
// OLD (deprecated)
SearchType.MEMBER
// NEW (use instead)
SearchType.FRIENDS // For friend network content
// OR
SearchType.MINE + filter for group membership
// OLD - Single "general" collection
// All searches hit one big collection
// NEW - Separate collections
// SearchCategory.USER → user collection
// SearchCategory.GROUP → group collection
// SearchCategory.DARE → dare collection
// SearchCategory.FRIEND → friend collection
Impact: Faster queries, but SearchCategory.ALL now requires multi-search