This document provides a complete reference of all API endpoints available in the WildDuck mail server deployment, including both WildDuck core API and the Mail Box Indexer.
- WildDuck API:
https://HOSTNAME/api - Mail Box Indexer API:
https://HOSTNAME/idx
All WildDuck endpoints are prefixed with /api and require the X-Access-Token header for authentication.
Authenticate a user with credentials or access token
- Body:
{ "username": string, "password": string }or{ "token": string } - Response: Authentication token
Invalidate authentication token
- Headers:
X-Access-Token
Generate pre-authentication token
- Body:
{ "username": string, "scope": string, "sess": string, "ip": string }
List authentication events for a user
- Params:
user- User ID
Get authentication event details
- Params:
user- User ID,event- Event ID
List registered users
- Query:
query,tags,requiredTags,limit,next,previous
Create new user account
- Body:
{ "username": string, "password": string, "address": string, "name": string, ... }
Resolve username to user ID
- Params:
username- Username to resolve
Request user information
- Params:
user- User ID
Update user information
- Params:
user- User ID - Body: Updated user fields
Delete a user
- Params:
user- User ID
Restore a deleted user
- Params:
user- User ID
Cancel user restore request
- Params:
user- User ID
Log out user (invalidate sessions)
- Params:
user- User ID
Recalculate user quota
- Params:
user- User ID
Recalculate quota for all users
Reset password for a user
- Params:
user- User ID - Body:
{ "password": string }
List all addresses
- Query:
query,tags,requiredTags,limit,next,previous
List user email addresses
- Params:
user- User ID
Create new email address for user
- Params:
user- User ID - Body:
{ "address": string, "name": string, "tags": array, "main": boolean }
Request address information
- Params:
user- User ID,address- Address ID
Update address information
- Params:
user- User ID,id- Address ID - Body: Updated address fields
Delete an address
- Params:
user- User ID,address- Address ID
List addresses from email headers
- Params:
user- User ID
Get address information
- Params:
address- Email address
Rename domain in addresses
- Body:
{ "oldDomain": string, "newDomain": string }
List forwarded addresses
- Query:
query,tags,limit,next,previous
Request forwarded address information
- Params:
id- Address ID
Create new forwarded address
- Params:
address- Email address - Body:
{ "targets": array, "forwards": number, "name": string, "tags": array }
Update forwarded address
- Params:
address- Address ID - Body: Updated fields
Delete a forwarded address
- Params:
address- Address ID
List user mailboxes
- Params:
user- User ID - Query:
specialUse,showHidden
Create new mailbox
- Params:
user- User ID - Body:
{ "path": string, "hidden": boolean, "retention": number }
Request mailbox information
- Params:
user- User ID,mailbox- Mailbox ID
Update mailbox information
- Params:
user- User ID,mailbox- Mailbox ID - Body: Updated mailbox fields
Delete a mailbox
- Params:
user- User ID,mailbox- Mailbox ID
List messages in a mailbox
- Params:
user- User ID,mailbox- Mailbox ID - Query:
limit,order,next,previous,page
Search for messages (GET)
- Params:
user- User ID - Query:
query,datestart,dateend,from,to,subject
Search for messages (POST with complex queries)
- Params:
user- User ID - Body: Search criteria
Get message details
- Params:
user- User ID,mailbox- Mailbox ID,message- Message ID - Query:
markAsSeen
Download raw message (EML format)
- Params:
user- User ID,mailbox- Mailbox ID,message- Message ID
Download attachment
- Params:
user,mailbox,message,attachment
Update message flags/move message
- Params:
user- User ID,mailbox- Mailbox ID,message- Message ID - Body:
{ "moveTo": string, "seen": boolean, "flagged": boolean, "draft": boolean }
Delete a message
- Params:
user- User ID,mailbox- Mailbox ID,message- Message ID
Delete all messages in mailbox
- Params:
user- User ID,mailbox- Mailbox ID
Upload message to mailbox
- Params:
user- User ID,mailbox- Mailbox ID - Body: Raw message or structured message data
Update multiple messages
- Params:
user- User ID,mailbox- Mailbox ID - Body: Message IDs and updates
Forward stored message
- Params:
user,mailbox,message - Body:
{ "targets": array }
Submit Draft for delivery
- Params:
user,mailbox,message
Delete outbound message from queue
- Params:
user- User ID,queueId- Queue ID
List archived messages
- Params:
user- User ID - Query:
limit,next,previous,order
Restore archived messages
- Params:
user- User ID - Body:
{ "start": date, "end": date }
Restore single archived message
- Params:
user- User ID,message- Message ID
Submit a message for delivery
- Params:
user- User ID - Body:
{ "from": string, "to": array, "subject": string, "text": string, "html": string, ... }
Submit a message for delivery by username
- Params:
username- Username
List all filters (admin)
- Query:
query,limit,next,previous
List filters for a user
- Params:
user- User ID
Get filter information
- Params:
user- User ID,filter- Filter ID
Create new filter
- Params:
user- User ID - Body: Filter rules and actions
Update filter information
- Params:
user- User ID,filter- Filter ID - Body: Updated filter fields
Delete a filter
- Params:
user- User ID,filter- Filter ID
List application passwords
- Params:
user- User ID
Request ASP information
- Params:
user- User ID,asp- ASP ID
Create new application password
- Params:
user- User ID - Body:
{ "description": string, "scopes": array, "generateMobileconfig": boolean }
Delete an application password
- Params:
user- User ID,asp- ASP ID
Generate TOTP seed
- Params:
user- User ID
Enable TOTP for user
- Params:
user- User ID - Body:
{ "token": string }
Disable TOTP
- Params:
user- User ID
Validate TOTP token
- Params:
user- User ID - Body:
{ "token": string }
Check 2FA status
- Params:
user- User ID
List WebAuthn credentials
- Params:
user- User ID
Delete WebAuthn credential
- Params:
user- User ID,credential- Credential ID
Request registration challenge
- Params:
user- User ID
Verify registration response
- Params:
user- User ID - Body: Registration attestation data
Request authentication challenge
- Params:
user- User ID
Verify authentication response
- Params:
user- User ID - Body: Authentication assertion data
Enable custom 2FA
- Params:
user- User ID - Body: Custom 2FA configuration
Disable custom 2FA
- Params:
user- User ID
Get autoreply information
- Params:
user- User ID
Update autoreply information
- Params:
user- User ID - Body:
{ "status": boolean, "subject": string, "text": string, "html": string, "start": date, "end": date }
Delete autoreply
- Params:
user- User ID
List registered DKIM keys
- Query:
query,limit,next,previous
Resolve domain to DKIM ID
- Params:
domain- Domain name
Create or update DKIM key for domain
- Body:
{ "domain": string, "selector": string, "privateKey": string, "description": string }
Request DKIM information
- Params:
dkim- DKIM ID
Delete a DKIM key
- Params:
dkim- DKIM ID
List registered webhooks
- Query:
limit,next,previous
Create new webhook
- Body:
{ "type": string, "url": string, "user": string }
Delete a webhook
- Params:
webhook- Webhook ID
List registered certificates
- Query:
limit,next,previous
Resolve certificate by servername
- Params:
servername- Server name
Create or update certificate
- Body:
{ "servername": string, "privateKey": string, "cert": string, "ca": array }
Request certificate information
- Params:
cert- Certificate ID
Delete a certificate
- Params:
cert- Certificate ID
List domain aliases
- Query:
query,limit,next,previous
Create new domain alias
- Body:
{ "alias": string, "domain": string }
Resolve alias domain to ID
- Params:
alias- Alias domain
Request alias information
- Params:
alias- Alias ID
Delete an alias
- Params:
alias- Alias ID
List allowed domains
- Params:
tag- Tag name
List blocked domains
- Params:
tag- Tag name
Add domain to allowlist
- Params:
tag- Tag name - Body:
{ "domain": string }
Add domain to blocklist
- Params:
tag- Tag name - Body:
{ "domain": string }
Remove domain from lists
- Params:
domain- Domain name
List stored files
- Params:
user- User ID - Query:
query,limit,next,previous
Upload file to storage
- Params:
user- User ID - Body: File data
Download stored file
- Params:
user- User ID,file- File ID
Delete stored file
- Params:
user- User ID,file- File ID
List all settings
Get setting value
- Params:
key- Setting key
Create or update setting
- Params:
key- Setting key - Body:
{ "value": any }
List audits
- Query:
user,action,filterIp,limit,next,previous
Request audit information
- Params:
audit- Audit ID
Export audit as mbox
- Params:
audit- Audit ID
Export user data
- Body:
{ "user": string, "types": array }
Import user data
- Body: Import data
Get user event stream (Server-Sent Events)
- Params:
user- User ID
Health check endpoint
- Response:
{ "success": true }
ACME challenge verification
- Params:
token- ACME token
All indexer endpoints are prefixed with /idx. Some endpoints require wallet signature authentication.
Get top users by points (leaderboard)
- Params:
count- Number of top users (1-100) - Auth: None (public)
Get site-wide statistics
- Auth: None (public)
Initiate KYC verification with Sumsub
- Params:
walletAddress- Wallet address - Body:
{ "verificationLevel": "basic" | "enhanced" | "accredited" } - Auth: Wallet signature required
Get KYC verification status
- Params:
walletAddress- Wallet address - Auth: Wallet signature required
Sumsub webhook handler (internal)
- Auth: Webhook signature verification
OpenID Connect discovery endpoint
- Auth: None (public)
Generate wallet authentication challenge
- Body:
{ "wallet_identifier": string, "client_id": string, "redirect_uri": string } - Auth: None
Verify wallet signature
- Body:
{ "session_id": string, "signature": string, "chain_type": "evm" | "solana", "current_wallet": string } - Auth: Signature verification
OAuth authorization endpoint
- Query:
client_id,redirect_uri,response_type,scope,state,code_challenge,nonce - Auth: Session ID in header
Token exchange endpoint
- Body:
{ "grant_type": string, "code"?: string, "refresh_token"?: string, "client_id": string, "redirect_uri": string } - Auth: Client credentials
Get user information from token
- Auth: Bearer token
Revoke refresh token
- Body:
{ "token": string } - Auth: None
Get OAuth client information
- Params:
clientId- Client ID - Auth: None (public)
Helius webhook for Solana transactions
- Auth: None (webhook)
Setup Helius webhooks
- Auth: None
Check Solana indexer status
- Auth: None (public)
Create test transaction (debugging)
- Body:
{ "chainId"?: number, "eventType"?: string } - Auth: None
Validate username format
- Params:
username- Username to validate - Auth: None (public)
Get email accounts for wallet
- Params:
walletAddress- Wallet address - Headers:
x-referral(optional) - Referral code - Auth: Wallet signature required
Get wallet this address delegated to
- Params:
walletAddress- Delegator address - Auth: Wallet signature required
Get wallets delegated to this address
- Params:
walletAddress- Delegate address - Auth: Wallet signature required
Create new nonce
- Params:
username- Username/wallet - Auth: Wallet signature required
Retrieve nonce
- Params:
username- Username/wallet - Auth: Wallet signature required
Check nameservice entitlement (RevenueCat)
- Params:
walletAddress- Wallet address - Auth: Wallet signature required
Get user points balance
- Params:
walletAddress- Wallet address - Auth: Wallet signature required
Check if user authenticated before
- Params:
walletAddress- Wallet address - Auth: Wallet signature required
Add reward points (internal)
- Params:
walletAddress- Wallet address - Body:
{ "action": string, "referrer"?: string } - Auth: IP restricted to WildDuck server
Get deterministic signing message
- Params:
walletAddress- Wallet address - Query:
chainId,domain,url - Auth: None (public)
Authenticate user with signature (internal)
- Body:
{ "username": string, "password": string, "message": string, "signer": string, "referrer"?: string } - Auth: IP restricted to WildDuck server
Verify wallet signature (internal)
- Params:
address- Wallet address - Auth: IP restricted + signature
Get/generate referral code
- Params:
walletAddress- Wallet address - Auth: Wallet signature required
Get referral statistics
- Params:
referralCode- Referral code - Auth: None (public)
Get current block numbers
- Auth: None (public)
GraphQL interface (Ponder)
- Auth: None (public)
GraphQL endpoint
- Auth: None (public)
- X-Access-Token: Header containing API access token
- Get token from
/config-generated/wildduck/api.toml
- Wallet Signature: Sign message with wallet private key
- Bearer Token: OAuth 2.0 access token
- IP Restriction: Internal endpoints only accessible from WildDuck server IP
- Webhook Signature: HMAC verification for webhooks
All endpoints return standard error responses:
{
"error": "Error description",
"code": "ERROR_CODE",
"success": false
}Common HTTP status codes:
200- Success400- Bad Request401- Unauthorized403- Forbidden404- Not Found429- Too Many Requests500- Internal Server Error
- WildDuck API: Configurable per endpoint
- Indexer API: Standard rate limiting applies
- OAuth endpoints: Strict rate limiting for security
List endpoints support pagination with:
limit- Number of results per pagenext- Next page cursorprevious- Previous page cursorpage- Page number (some endpoints)
Total Endpoints: 118+ WildDuck endpoints + 36 Indexer REST endpoints + 2 GraphQL endpoints