Members
Member API for RestoreCord: list and look up verified Discord members, pull one member into a server, delete members and clean up unauthorized members.
Overview
Member endpoints expose verified member records, single-member pull operations, and unauthorized cleanup. Server path params use internal RestoreCord server IDs; list and unauthorized routes also accept all.
| Endpoint | Purpose | Permission |
|---|---|---|
GET /api/v3/servers/{serverId}/members | Paginated member list for one server or all accessible servers. | READ_MEMBERS |
GET|DELETE /api/v3/servers/{serverId}/members/unauthorized | Count or delete unauthorized members. | READ_MEMBERS for GET, WRITE_MEMBERS for DELETE |
GET /api/v3/members/{userId} | Find a Discord user across servers owned by the API key's account. | READ_MEMBERS |
GET /api/v3/members/resolve/{memberId} | Resolve one member record ID on a server owned by the API key's account. | READ_MEMBERS |
PUT /api/v3/servers/{serverId}/members/{userId} | Pull one member into a Discord server. | SERVER_PULL |
DELETE /api/v3/servers/{serverId}/members/{userId} | Delete one member record and remove role best-effort. | WRITE_MEMBERS; owner only |
GET /api/v3/members/{userId}/guilds | Return the member's Discord servers (needs the guilds scope). | READ_MEMBERS; Business+ |
Member data may include personal data. Personal details such as IP address, email and location are gated by plan and permission.
List Members
Returns member summaries, counts, pagination, and pullable/unauthorized totals.
GET /api/v3/servers/{serverId}/membersProp
Type
{
"success": true,
"members": [
{
"id": 987,
"serverId": "42",
"userId": "123456789012345678",
"username": "alice#0000",
"avatar": "avatar-hash",
"country": "US",
"createdAt": "2026-06-07T10:30:00.000Z",
"guildId": "111111111111111111",
"guildName": "Community",
"unauthorized": false
}
],
"total": 1,
"pullable": 1,
"unauthorized": 0,
"currentPage": 1,
"maxPages": 1
}- Very deep pagination is rejected; use filters to narrow results.
- For
serverId=all, servers shared with the API key's account are included only when that account has theVIEW_MEMBERSsub-user permission. - IP and email searches follow the same rules as the member details: the server owner's plan must be Premium or higher for IP and Business or higher for email, and on shared servers the account needs the View Member Details sub-user permission. For
serverId=all, servers that don't meet these rules are left out of the results. If no server meets them, the request returns403 INSUFFICIENT_PERMISSIONS. - Country filters must be a supported two-letter ISO country code.
Unauthorized Members
Unauthorized members removed your bot from their Discord account, so they can no longer be pulled until they verify again.
Count unauthorized members
Returns unauthorized member counts for one server or all accessible servers.
GET /api/v3/servers/{serverId}/members/unauthorizedProp
Type
{
"success": true,
"count": 12,
"serverId": "all",
"breakdown": [
{ "serverId": "42", "guildId": "111111111111111111", "serverName": "Community", "count": 12 }
]
}Delete unauthorized members
Deletes unauthorized member records. Use dryRun to preview counts first.
DELETE /api/v3/servers/{serverId}/members/unauthorizedProp
Type
{
"success": true,
"dryRun": true,
"wouldRemove": 12,
"message": "Dry run: Would remove 12 unauthorized members."
}{
"success": true,
"removed": 12,
"message": "Successfully removed 12 unauthorized members.",
"serverId": "42"
}Lookup Member
Returns one entry per server owned by the API key's account that contains the Discord user. Servers shared with the account through sub-user access are not searched for API keys. Not-found lookups return servers: [].
GET /api/v3/members/{userId}Prop
Type
{
"success": true,
"servers": [
{
"serverId": 42,
"guildId": "111111111111111111",
"serverName": "Community",
"hasFullAccess": true,
"member": {
"id": 987,
"userId": "123456789012345678",
"username": "alice#0000",
"avatar": "avatar-hash",
"joinedAt": "2026-06-07T10:30:00.000Z",
"country": "US",
"unauthorized": false,
"ip": "203.0.113.***",
"location": { "country": "United States", "vpn": false }
}
}
]
}Resolve Member
Returns one server/member entry for a member record ID (member.id). API keys can only resolve members of servers owned by the key's account; other members return 404.
GET /api/v3/members/resolve/{memberId}Prop
Type
{
"success": true,
"server": {
"serverId": 42,
"guildId": "111111111111111111",
"serverName": "Community",
"hasFullAccess": true,
"member": {
"id": 987,
"serverId": "42",
"userId": "123456789012345678",
"username": "alice#0000",
"unauthorized": false
}
}
}Pull Member
Auth: API key with SERVER_PULL. The key's account must own the server, or have the pull_members and view_members sub-user permissions on it. The response is text/event-stream, not JSON. Invalid IDs and a missing permission bit return a JSON error; every other failure (server access, member not found, unauthorized member, bot, guild or Discord errors) arrives as an error event in a 200 stream. See Pull One Member for every message.
Pulls one stored member into a target Discord guild and streams progress events.
PUT /api/v3/servers/{serverId}/members/{userId}Prop
Type
event: info
data: {"time":1780837800000,"success":true,"message":"Started Pulling..."}
event: info
data: {"time":1780837801000,"success":true,"message":"Successfully Pulled"}
SSE Events
| Event | Payload fields | Notes |
|---|---|---|
info | time, success, message | Progress and successful Discord add-member states. |
error | time, success: false, message | Validation, access, Discord token, guild, invite-disabled, or rate-limit failures. |
Delete Member
Auth: API key with WRITE_MEMBERS. The key's account must own the server; sub-user access is not accepted.
Deletes one member record and removes the verified role best-effort through Discord.
DELETE /api/v3/servers/{serverId}/members/{userId}Prop
Type
{
"success": true,
"message": "Member removed from server."
}Member Guilds
Returns the member's Discord servers. Auth: API key with READ_MEMBERS. Requires a valid serverId query, VIEW_MEMBERS access to that server, a Business or Enterprise server owner plan, and the guilds scope enabled for the server.
GET /api/v3/members/{userId}/guildsProp
Type
{
"success": true,
"guilds": [
{ "id": "999999999999999999", "name": "Other Guild", "icon": null }
],
"cached": false
}Status and Errors
| Status/code | When it appears |
|---|---|
200 | Successful member list, lookup, count, delete, guild lookup, or stream start. |
400 INVALID_INPUT | Invalid server ID, user ID, member ID, country code, search value, or page depth. |
401 UNAUTHORIZED | Missing auth. |
403 FORBIDDEN / INSUFFICIENT_PERMISSIONS | Missing API key permission, the key's account lacks sub-user access to the server, non-owner delete, Business plan required for member guild lookup, or an IP or email search without the required plan or VIEW_MEMBER_INFO. |
404 NOT_FOUND | Server, member, bot, or lookup target not found. |
429 RATE_LIMITED | Rate limit reached for lookup or member guilds. The pull stream reports Discord rate limits as an info event and does not retry; send the request again after the stated wait. |
409 MEMBER_GUILDS_SCOPE_REQUIRED / MEMBER_REAUTHORIZATION_REQUIRED | Member guilds: the guilds scope is off or wasn't granted, or the member must verify again. |
502 EXTERNAL_SERVICE_ERROR | Discord could not be reached or returned an error. |
- Use
GET /members/{userId}for Discord-user lookup andGET /members/resolve/{memberId}for member record ID lookup. - Use
DELETE /members/unauthorized?dryRun=truebefore destructive cleanup. - Handle pull responses as SSE, not JSON.