This guide covers everything you need to know about managing members in your DRIP realm, from searching and retrieving member data to updating balances and transferring points.

Overview

Member management is one of the most common use cases for the DRIP API. You can:
  • Search for members using various identifiers
  • Retrieve detailed member information and balances
  • Update individual or multiple member point balances
  • Transfer points between members
  • Track member activity and engagement

Searching Members

Search by Different Identifiers

The member search endpoint allows you to find members using various identifiers:
async function searchMembers(realmId, searchType, values) {
  const response = await fetch(
    `https://api.drip.re/api/v1/realm/${realmId}/members/search?type=${searchType}&values=${values}`,
    {
      headers: {
        'Authorization': `Bearer ${process.env.DRIP_API_KEY}`,
        'Content-Type': 'application/json'
      }
    }
  );
  
  return response.json();
}

// Search by Discord ID
const discordMembers = await searchMembers('YOUR_REALM_ID', 'discord-id', '123456789012345678');

// Search by multiple wallet addresses
const walletMembers = await searchMembers(
  'YOUR_REALM_ID', 
  'wallet', 
  '0x742d35Cc6634C0532925a3b8D23,0x8ba1f109551bD432803012645Hac136c'
);

Search Types and Examples

Search TypeDescriptionValue Format
drip-idInternal DRIP member ID507f1f77bcf86cd799439013
discord-idDiscord user ID123456789012345678
twitter-idTwitter/X user ID987654321
walletCrypto wallet address0x742d35Cc6634C0532925a3b8D23
emailEmail address[email protected]
usernameDisplay usernamegamerpro123
You can search for multiple values at once by separating them with commas. For example: values=user1,user2,user3

Updating Member Balances

Single Member Balance Update

Update a specific member’s point balance:
async function updateMemberBalance(realmId, memberId, tokens, realmPointId = null) {
  const response = await fetch(
    `https://api.drip.re/api/v1/realm/${realmId}/members/${memberId}/point-balance`,
    {
      method: 'PATCH',
      headers: {
        'Authorization': `Bearer ${process.env.DRIP_API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        tokens: tokens,
        ...(realmPointId && { realmPointId })
      })
    }
  );
  
  return response.json();
}

// Award 100 points to a member
const result = await updateMemberBalance('YOUR_REALM_ID', 'MEMBER_ID', 100);

// Award 50 points of a specific currency
const specificResult = await updateMemberBalance(
  'YOUR_REALM_ID', 
  'MEMBER_ID', 
  50, 
  'REALM_POINT_ID'
);

Batch Balance Updates

Update multiple members’ balances in a single API call:
async function batchUpdateBalances(realmId, updates) {
  const response = await fetch(
    `https://api.drip.re/api/v1/realm/${realmId}/members/transaction`,
    {
      method: 'PATCH',
      headers: {
        'Authorization': `Bearer ${process.env.DRIP_API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ updates })
    }
  );
  
  return response.json();
}

// Update multiple members at once
const updates = [
  { memberId: 'MEMBER_ID_1', tokens: 100 },
  { memberId: 'MEMBER_ID_2', tokens: 150, realmPointId: 'SPECIFIC_POINT_ID' },
  { memberId: 'MEMBER_ID_3', tokens: -25 } // Deduct points
];

const batchResult = await batchUpdateBalances('YOUR_REALM_ID', updates);
Batch updates are atomic - if any single update fails, the entire batch is rolled back. This ensures data consistency.

Transferring Points Between Members

Transfer points directly from one member to another:
async function transferPoints(realmId, senderId, recipientId, tokens, realmPointId) {
  const response = await fetch(
    `https://api.drip.re/api/v1/realm/${realmId}/members/${senderId}/transfer`,
    {
      method: 'PATCH',
      headers: {
        'Authorization': `Bearer ${process.env.DRIP_API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        tokens,
        recipientId,
        realmPointId
      })
    }
  );
  
  return response.json();
}

// Transfer 50 points from one member to another
const transfer = await transferPoints(
  'YOUR_REALM_ID',
  'SENDER_MEMBER_ID',
  'RECIPIENT_MEMBER_ID',
  50,
  'REALM_POINT_ID'
);

Common Use Cases

Activity-Based Rewards

Automatically reward members for various activities:
// Reward system for different activities
const ACTIVITY_REWARDS = {
  'message_sent': 5,
  'reaction_added': 2,
  'voice_join': 10,
  'quest_completed': 100,
  'referral_successful': 250
};

async function rewardActivity(realmId, memberId, activityType) {
  const points = ACTIVITY_REWARDS[activityType];
  if (!points) return null;
  
  return updateMemberBalance(realmId, memberId, points);
}

// Usage in Discord bot or webhook handler
await rewardActivity('YOUR_REALM_ID', 'MEMBER_ID', 'message_sent');

Leaderboard Generation

Create leaderboards by fetching and sorting member data:
async function generateLeaderboard(realmId, limit = 10) {
  // This would typically involve fetching multiple members
  // and sorting by their point balances
  const members = await searchMembers(realmId, 'drip-id', 'all'); // Pseudo-code
  
  return members
    .sort((a, b) => b.pointBalances[0].balance - a.pointBalances[0].balance)
    .slice(0, limit)
    .map((member, index) => ({
      rank: index + 1,
      username: member.username,
      points: member.pointBalances[0].balance
    }));
}

Member Onboarding

Set up new members with welcome bonuses:
async function onboardNewMember(realmId, memberId) {
  const welcomeBonus = 100;
  const result = await updateMemberBalance(realmId, memberId, welcomeBonus);
  
  console.log(`Welcomed new member with ${welcomeBonus} points!`);
  return result;
}

Error Handling

Handle common errors when managing members:
async function safeUpdateBalance(realmId, memberId, tokens) {
  try {
    const result = await updateMemberBalance(realmId, memberId, tokens);
    return { success: true, data: result };
  } catch (error) {
    if (error.status === 404) {
      return { success: false, error: 'Member not found' };
    } else if (error.status === 400) {
      return { success: false, error: 'Invalid request data' };
    } else if (error.status === 403) {
      return { success: false, error: 'Insufficient permissions' };
    }
    
    return { success: false, error: 'Unknown error occurred' };
  }
}

Best Practices

Efficient Searching

  • Use specific search types when possible
  • Batch multiple searches together
  • Cache frequently accessed member data
  • Implement pagination for large result sets

Balance Management

  • Always validate point amounts before updates
  • Use batch operations for multiple updates
  • Implement transaction logs for audit trails
  • Handle insufficient balance scenarios gracefully

Performance

  • Use batch endpoints for bulk operations
  • Implement rate limiting in your application
  • Cache member data to reduce API calls
  • Monitor API response times

Security

  • Validate all input parameters
  • Implement proper error handling
  • Log all balance changes for auditing
  • Use least-privilege API keys

Next Steps