The ApiClient provides access to all Fluxer REST API endpoints. It handles HTTP requests with automatic rate limiting, JSON serialization, and error handling.
The API Client is used for:
using Fluxer.Net;
const string token = "YOUR_TOKEN_HERE";
var config = new FluxerConfig
{
EnableRateLimiting = true // Recommended
};
var apiClient = new ApiClient(token, config);
using Fluxer.Net.Data.Models;
// Simple text message
var message = new Message
{
Content = "Hello, Fluxer!"
};
await apiClient.SendMessage(channelId, message);
// Message with embed
var embed = new Embed
{
Title = "Hello!",
Description = "This is an embed",
Color = 0x5865F2,
Footer = new EmbedFooter { Text = "Footer text" },
Timestamp = DateTime.UtcNow
};
var messageWithEmbed = new Message
{
Content = "Check out this embed:",
Embeds = new List
// Get a single message
var message = await apiClient.GetMessage(channelId, messageId);
// Get recent messages from a channel
var messages = await apiClient.GetMessages(channelId);
// Edit a message
var updatedMessage = new Message
{
Content = "Updated content"
};
await apiClient.EditMessage(channelId, messageId, updatedMessage);
// Delete a message
await apiClient.DeleteMessage(channelId, messageId);
// Bulk delete messages
var messageIds = new { messages = new[] { id1, id2, id3 } };
await apiClient.BulkDeleteMessages(channelId, messageIds);
// Add reaction (use URL-encoded emoji)
await apiClient.AddReaction(channelId, messageId, "👍");
await apiClient.AddReaction(channelId, messageId, "%F0%9F%91%8D"); // URL-encoded
// Remove reaction
await apiClient.RemoveOwnReaction(channelId, messageId, "👍");
await apiClient.RemoveUserReaction(channelId, messageId, "👍", userId);
// Remove all reactions for an emoji
await apiClient.RemoveAllReactionsForEmoji(channelId, messageId, "👍");
// Remove all reactions
await apiClient.RemoveAllReactions(channelId, messageId);
// Get channel information
var channel = await apiClient.GetChannel(channelId);
// Update channel
var updatedChannel = new Channel
{
Name = "new-channel-name",
Topic = "New topic"
};
await apiClient.UpdateChannel(channelId, updatedChannel);
// Delete channel
await apiClient.DeleteChannel(channelId);
// Trigger typing indicator (lasts ~5 seconds)
await apiClient.TriggerTypingIndicator(channelId);
// Get pinned messages
var pinnedMessages = await apiClient.GetPinnedMessages>(channelId);
// Pin a message
await apiClient.PinMessage(channelId, messageId);
// Unpin a message
await apiClient.UnpinMessage(channelId, messageId);
// Add recipient to group DM
await apiClient.AddRecipient(channelId, userId);
// Remove recipient from group DM
await apiClient.RemoveRecipient(channelId, userId);
// Get guild information
var guild = await apiClient.GetGuild(guildId);
// Get current user's guilds
var guilds = await apiClient.GetCurrentUserGuilds();
// Create guild
var newGuild = new { name = "My New Guild" };
var createdGuild = await apiClient.CreateGuild(newGuild);
// Update guild
var guildUpdate = new GuildProperties
{
Name = "Updated Guild Name",
Description = "New description"
};
await apiClient.UpdateGuild(guildId, guildUpdate);
// Leave guild
await apiClient.LeaveGuild(guildId);
// Delete guild (owner only)
var confirmation = new { password = "your_password" };
await apiClient.DeleteGuild(guildId, confirmation);
// Get guild channels
var channels = await apiClient.GetChannels(guildId);
// Create channel
var newChannel = new
{
name = "new-channel",
type = 0, // Text channel
topic = "Channel topic"
};
await apiClient.CreateChannel(guildId, newChannel);
// Get all members
var members = await apiClient.GetMembers(guildId);
// Get specific member
var member = await apiClient.GetMember(guildId, userId);
// Update member (nickname, roles, etc.)
var memberUpdate = new GuildMember
{
Nick = "New Nickname"
};
await apiClient.UpdateMember(guildId, userId, memberUpdate);
// Kick member
await apiClient.KickMember(guildId, userId);
// Ban member
var banReason = new { reason = "Spam", delete_message_days = 7 };
await apiClient.BanMember(guildId, userId, banReason);
// Unban member
await apiClient.UnbanMember(guildId, userId);
// Get bans
var bans = await apiClient.GetBans>(guildId);
// Create role
var newRole = new
{
name = "Moderator",
color = 0xFF0000,
permissions = 8, // Administrator permission
hoist = true // Display separately in member list
};
await apiClient.CreateRole(guildId, newRole);
// Update role
var roleUpdate = new
{
name = "Updated Role Name",
color = 0x00FF00
};
await apiClient.UpdateRole(guildId, roleId, roleUpdate);
// Delete role
await apiClient.DeleteRole(guildId, roleId);
// Add role to member
await apiClient.AddMemberRole(guildId, userId, roleId);
// Remove role from member
await apiClient.RemoveMemberRole(guildId, userId, roleId);
// Get emojis
var emojis = await apiClient.GetEmojis>(guildId);
// Create emoji
var newEmoji = new
{
name = "custom_emoji",
image = "data:image/png;base64,..." // Base64 encoded image
};
await apiClient.CreateEmoji(guildId, newEmoji);
// Delete emoji
await apiClient.DeleteEmoji(guildId, emojiId);
// Same methods available for stickers
var stickers = await apiClient.GetStickers>(guildId);
await apiClient.CreateSticker(guildId, newSticker);
await apiClient.DeleteSticker(guildId, stickerId);
// Get current user (yourself)
var currentUser = await apiClient.GetCurrentUser();
// Get another user
var user = await apiClient.GetUser(userId);
// Get user profile
var profile = await apiClient.GetUserProfile(userId);
// Update your username, avatar, etc.
var userUpdate = new User
{
Username = "NewUsername",
// Avatar = "data:image/png;base64,..." // Base64 image
};
await apiClient.UpdateCurrentUser(userUpdate);
// Get settings
var settings = await apiClient.GetCurrentUserSettings();
// Update settings
var settingsUpdate = new
{
theme = "dark",
locale = "en-US"
};
await apiClient.UpdateCurrentUserSettings(settingsUpdate);
// Get relationships
var relationships = await apiClient.GetCurrentUserRelationships>();
// Send friend request
var friendRequest = new { username = "username", tag = "1234" };
await apiClient.PostCurrentUserRelationship(friendRequest);
// Accept friend request / Block user
var action = new { type = 1 }; // 1 = friend, 2 = block
await apiClient.PutCurrentUserRelationship(userId, action);
// Remove friend / Unblock
await apiClient.DeleteCurrentUserRelationship(userId);
// Get invite information
var invite = await apiClient.GetInvite("invite_code");
// Join guild via invite
await apiClient.JoinGuild("invite_code");
// Get channel invites
var channelInvites = await apiClient.GetChannelInvites(channelId);
// Create invite
var inviteConfig = new
{
max_age = 86400, // 24 hours in seconds
max_uses = 10
};
await apiClient.CreateInvite(channelId, inviteConfig);
// Delete invite
await apiClient.DeleteInvite("invite_code");
Warning: These methods are for user account authentication. Use carefully and never hardcode credentials.
// Login
var loginRequest = new LoginRequest
{
Email = "email@example.com",
Password = "password"
};
var loginResponse = await apiClient.Login(loginRequest);
// Logout
await apiClient.Logout();
// Get active sessions
var sessions = await apiClient.GetSessions>();
// Logout specific sessions
var sessionIds = new { session_ids = new[] { "session_id" } };
await apiClient.LogoutSessions(sessionIds);
// Get webhook
var webhook = await apiClient.GetWebhook(webhookId);
// Get channel webhooks
var webhooks = await apiClient.GetChannelWebhooks>(channelId);
// Create webhook
var newWebhook = new
{
name = "My Webhook",
avatar = null // Optional base64 image
};
await apiClient.CreateWebhook(channelId, newWebhook);
// Execute webhook (send message)
var webhookMessage = new
{
content = "Message from webhook",
username = "Custom Name", // Optional
avatar_url = "https://..." // Optional
};
await apiClient.ExecuteWebhook(webhookId, "webhook_token", webhookMessage);
// Delete webhook
await apiClient.DeleteWebhook(webhookId);
API methods can throw FluxerApiException when errors occur:
using Fluxer.Net.Extensions;
try
{
await apiClient.SendMessage(channelId, message);
}
catch (FluxerApiException ex)
{
Console.WriteLine($"API Error: {ex.Message}");
Console.WriteLine($"Response: {ex.ResponseBody}");
// Handle specific HTTP errors
if (ex.Message.Contains("404"))
{
Console.WriteLine("Channel or message not found");
}
else if (ex.Message.Contains("403"))
{
Console.WriteLine("Missing permissions");
}
else if (ex.Message.Contains("429"))
{
Console.WriteLine("Rate limited");
}
}
catch (Exception ex)
{
Console.WriteLine($"Unexpected error: {ex.Message}");
}
The API Client includes built-in client-side rate limiting to prevent 429 errors:
var config = new FluxerConfig
{
EnableRateLimiting = true // Enabled by default
};
var apiClient = new ApiClient(token, config);
When rate limiting is enabled:
See the Rate Limiting Guide for more details.
// Good
var message = await apiClient.GetMessage(channelId, messageId);
// Bad: Blocking call
var message = apiClient.GetMessage(channelId, messageId).Result; // Don't do this!
// Share HttpClient across multiple API clients
var httpClient = new HttpClient();
var config1 = new FluxerConfig { HttpClient = httpClient };
var config2 = new FluxerConfig { HttpClient = httpClient };
var apiClient1 = new ApiClient(token1, config1);
var apiClient2 = new ApiClient(token2, config2);
try
{
await apiClient.DeleteMessage(channelId, messageId);
}
catch (FluxerApiException ex) when (ex.Message.Contains("403"))
{
Console.WriteLine("Missing permission to delete message");
// Notify user or log error
}
// Don't fetch the same guild data repeatedly
var guildCache = new Dictionary();
async Task GetGuildCached(ulong guildId)
{
if (!guildCache.ContainsKey(guildId))
{
guildCache[guildId] = await apiClient.GetGuild(guildId);
}
return guildCache[guildId];
}