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 Type Description Value Format drip-id
Internal DRIP member ID 507f1f77bcf86cd799439013
discord-id
Discord user ID 123456789012345678
twitter-id
Twitter/X user ID 987654321
wallet
Crypto wallet address 0x742d35Cc6634C0532925a3b8D23
email
Email address [email protected]
username
Display username gamerpro123
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