The Members API gives your own tools read-only access to your server's NXT data: members, their roles, and their proven wallets.
The Members API is included on every plan, including Free.
Authentication
Create a key in Dashboard > API. Only the server owner and members with Administrator or Manage Server can create or revoke keys. Each server can have up to 5 active keys. The full key is shown once when it is created, so store it somewhere safe.
Send the key in the Authorization header:
Authorization: Bearer <your key>
A key only reads data for the server it was created in.
Base URL
https://nxtnft.app/api/v1/
All endpoints use GET and return JSON.
Endpoints
GET /server
Returns the server the key belongs to.
{
"id": "1234567890123456789",
"name": "My Community",
"plan": "pro",
"members_synced_at": "2026-10-16T12:00:00.000Z"
}
GET /members
Lists members with cursor pagination.
| Query parameter | Description |
|---|---|
verified |
true or false. Filter by verification status. |
role |
A Discord role ID. Only members who hold it. |
limit |
1 to 500. Default 100. |
cursor |
The next_cursor value from the previous page |
{
"members": [
{
"discord_id": "112233445566778899",
"name": "Holder",
"username": "holder",
"in_server": true,
"verified": true,
"roles": [{ "id": "998877665544332211", "name": "Holder" }],
"wallets": ["0x8f3a5c0d2e4b6a7f9c1d3e5f7a9b1c3d5e7f19c2"],
"joined_server_at": "2026-09-01T18:22:04.000Z",
"first_role_at": "2026-09-01T18:24:10.000Z"
}
],
"next_cursor": "112233445566778899"
}
Members are ordered by Discord ID. next_cursor is the Discord ID of the last member on the page, and null on the last page. roles is null when the member's roles are not known.
Without verified=true, only current members of the server are listed. With verified=true, members who verified and later left are included too. wallets is filled only for members who verified in your server, and is empty for everyone else.
GET /members/{discord_id}
Returns one member in the same shape as an item of the list above.
GET /wallets/{address}
Looks up a wallet address and returns the member it belongs to, if that member has verified in your server. Otherwise the API returns not_found.
{
"wallet": "0x8f3a5c0d2e4b6a7f9c1d3e5f7a9b1c3d5e7f19c2",
"member": { "discord_id": "112233445566778899", "name": "Holder", "username": "holder", "in_server": true, "verified": true, "roles": [], "wallets": [], "joined_server_at": null, "first_role_at": null }
}
GET /roles
Lists the server's roles with member counts.
{
"roles": [
{
"id": "998877665544332211",
"name": "Holder",
"position": 12,
"members": 640,
"verified_members": 612,
"granted_by_nxt": true
}
]
}
Member counts come from NXT's latest member sync. granted_by_nxt is true when at least one NXT rule, enabled or disabled, grants the role.
Rate limits
Each server can make 60 requests per minute and 10,000 requests per day, shared across its keys. Every response to a valid key includes:
| Header | Description |
|---|---|
X-RateLimit-Limit |
The per-minute limit |
X-RateLimit-Remaining |
Requests left in the current minute |
When a limit is exceeded, the API returns 429 with a Retry-After header giving the number of seconds to wait.
Errors
Errors use a consistent shape:
{ "error": { "code": "not_found", "message": "No member with that ID." } }
| Code | Status | Meaning |
|---|---|---|
invalid_parameter |
400 | A query or path parameter is malformed |
invalid_key |
401 | Missing, unknown, or revoked key |
plan_required |
403 | The server's plan does not include API access (reserved; every current plan includes it) |
not_found |
404 | The member, wallet, or resource does not exist |
rate_limited |
429 | Too many requests. Retry after the Retry-After delay. |
internal_error |
500 | Something went wrong on NXT's side, for example Discord did not respond. Try again. |
Example
curl -s "https://nxtnft.app/api/v1/members?verified=true&limit=50" \
-H "Authorization: Bearer $NXT_API_KEY"