Users
Get User Data
Retrieve complete user profile and settings.
curl https://api.monkeytype.com/users \
-H "Authorization: Bearer YOUR_TOKEN"
Account creation timestamp
Personal best records by mode
Total number of completed tests
Total number of started tests
Total seconds spent typing
Current and max streak information
Premium subscription status
Count of unread inbox messages
Create User
Register a new user account.
curl -X POST https://api.monkeytype.com/users/signup \
-H "Content-Type: application/json" \
-d '{
"name": "username",
"email": "[email protected] ",
"captcha": "CAPTCHA_TOKEN"
}'
Desired username (1-16 characters, alphanumeric, underscores, hyphens, dots)
Get User Profile
Retrieve public profile of any user.
curl "https://api.monkeytype.com/users/{uidOrName}/profile?isUid=false"
Whether the path parameter is a UID (true) or username (false)
Update Username
Change username (once per 30 days).
curl -X PATCH https://api.monkeytype.com/users/name \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "newusername"}'
Requires fresh token (issued within last 60 seconds). Limited to once per 30 days.
Results
Submit Test Result
Submit a completed typing test result.
curl -X POST https://api.monkeytype.com/results \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"result": {
"wpm": 85.5,
"acc": 96.8,
"mode": "time",
"mode2": "60",
"language": "english",
"timestamp": 1234567890,
"testDuration": 60,
"consistency": 78.5,
"rawWpm": 90.2,
"hash": "RESULT_HASH"
}
}'
Show CompletedEvent object
Raw WPM (includes errors)
Accuracy percentage (0-100)
Test mode: “time”, “words”, “quote”, “zen”, “custom”
Mode variant (e.g., “60” for 60-second test)
Language code (e.g., “english”)
Test completion timestamp
Object hash for verification
Whether this result is a personal best
Database ID of inserted result
XP gained from this result
Detailed XP calculation breakdown
Whether daily XP bonus was applied
Rank on daily leaderboard (if applicable)
Results undergo anticheat validation. Invalid results (hash mismatch, suspicious timing, bot detection) will be rejected.
Get Results
Retrieve paginated test results.
curl "https://api.monkeytype.com/results?limit=50&offset=0" \
-H "Authorization: Bearer YOUR_TOKEN"
Number of results to return (max 1000)
Filter results on or after this timestamp
Premium users can retrieve more results than regular users. Limits are configurable per deployment.
Get Result by ID
Retrieve a specific result by its ID.
curl https://api.monkeytype.com/results/id/{resultId} \
-H "Authorization: Bearer YOUR_TOKEN"
Delete All Results
Permanently delete all test results.
curl -X DELETE https://api.monkeytype.com/results \
-H "Authorization: Bearer YOUR_TOKEN"
Requires fresh token. This action is irreversible.
Leaderboards
Get All-Time Leaderboard
Retrieve global leaderboard entries.
curl "https://api.monkeytype.com/leaderboards?language=english&mode=time&mode2=60&page=0&pageSize=50"
Language code (e.g., “english”)
Test mode: “time” or “words”
Mode variant: “15”, “60” for time; “10”, “25”, “50”, “100” for words
Results per page (10-200)
Show only friends (requires authentication)
Show Leaderboard response
Array of leaderboard entries
Get Leaderboard Rank
Get current user’s rank on leaderboard.
curl "https://api.monkeytype.com/leaderboards/rank?language=english&mode=time&mode2=60" \
-H "Authorization: Bearer YOUR_TOKEN"
Get Daily Leaderboard
Retrieve today’s daily leaderboard.
curl "https://api.monkeytype.com/leaderboards/daily?language=english&mode=time&mode2=60"
Get leaderboard from N days ago (0 = today, 1 = yesterday)
Get Weekly XP Leaderboard
Retrieve weekly XP leaderboard.
curl "https://api.monkeytype.com/leaderboards/xp/weekly?page=0&pageSize=50"
Configs
Get User Configuration
Retrieve user’s configuration settings.
curl https://api.monkeytype.com/configs \
-H "Authorization: Bearer YOUR_TOKEN"
User’s configuration object including theme, test settings, behavior preferences, etc.
Update Configuration
Update user configuration (partial update).
curl -X PATCH https://api.monkeytype.com/configs \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"theme": "serika_dark",
"difficulty": "expert",
"showAverage": "wpm"
}'
Only provided fields are updated. Missing fields remain unchanged.
Quotes
Get Quote Submissions
Retrieve pending quote submissions (moderators only).
curl https://api.monkeytype.com/quotes \
-H "Authorization: Bearer YOUR_TOKEN"
Requires quoteMod permission.
Submit Quote
Submit a new quote for approval.
curl -X POST https://api.monkeytype.com/quotes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"text": "Quote text that is at least 60 characters long to meet requirements",
"source": "Author Name",
"language": "english",
"captcha": "CAPTCHA_TOKEN"
}'
Quote text (minimum 60 characters)
Report Quote
Report a problematic quote.
curl -X POST https://api.monkeytype.com/quotes/report \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"quoteId": "123",
"quoteLanguage": "english",
"reason": "inappropriate",
"comment": "Optional comment",
"captcha": "CAPTCHA_TOKEN"
}'
Presets
Get Presets
Retrieve user’s test presets.
curl https://api.monkeytype.com/presets \
-H "Authorization: Bearer YOUR_TOKEN"
Create Preset
Create a new test preset.
curl -X POST https://api.monkeytype.com/presets \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "My Preset",
"config": {
"mode": "time",
"time": 60,
"language": "english",
"difficulty": "normal"
}
}'
Update Preset
Update an existing preset.
curl -X PATCH https://api.monkeytype.com/presets \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"_id": "507f1f77bcf86cd799439011",
"name": "Updated Name",
"config": {}
}'
Delete Preset
Delete a preset by ID.
curl -X DELETE https://api.monkeytype.com/presets/{presetId} \
-H "Authorization: Bearer YOUR_TOKEN"
ApeKeys
List ApeKeys
Retrieve all API keys for the current user.
curl https://api.monkeytype.com/ape-keys \
-H "Authorization: Bearer YOUR_TOKEN"
Generate ApeKey
Create a new API key.
curl -X POST https://api.monkeytype.com/ape-keys \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "My Integration",
"enabled": true
}'
Update ApeKey
Modify an existing API key.
curl -X PATCH https://api.monkeytype.com/ape-keys/{apeKeyId} \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Updated Name", "enabled": false}'
Delete ApeKey
Delete an API key.
curl -X DELETE https://api.monkeytype.com/ape-keys/{apeKeyId} \
-H "Authorization: Bearer YOUR_TOKEN"
Retrieve all tags for the current user.
curl https://api.monkeytype.com/users/tags \
-H "Authorization: Bearer YOUR_TOKEN"
Array of tag objects with ID, name, and personal bests
Create Tag
Create a new tag.
curl -X POST https://api.monkeytype.com/users/tags \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tagName": "Practice"}'
Tag name (1-16 characters)
Created tag object with _id and name
Update Tag
Update an existing tag’s name.
curl -X PATCH https://api.monkeytype.com/users/tags \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tagId": "507f1f77bcf86cd799439011",
"newName": "Updated Name"
}'
New tag name (1-16 characters)
Delete Tag
Delete a tag by ID.
curl -X DELETE https://api.monkeytype.com/users/tags/{tagId} \
-H "Authorization: Bearer YOUR_TOKEN"
Delete Tag Personal Best
Clear personal bests for a specific tag.
curl -X DELETE https://api.monkeytype.com/users/tags/{tagId}/personalBest \
-H "Authorization: Bearer YOUR_TOKEN"
Tag ID to clear personal bests for
Custom Themes
Get Custom Themes
Retrieve all custom themes for the current user.
curl https://api.monkeytype.com/users/customThemes \
-H "Authorization: Bearer YOUR_TOKEN"
Array of custom theme objects with colors
Create Custom Theme
Create a new custom theme.
curl -X POST https://api.monkeytype.com/users/customThemes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "My Theme",
"colors": {
"bg": "#323437",
"main": "#e2b714",
"caret": "#e2b714",
"sub": "#646669",
"text": "#d1d0c5",
"error": "#ca4754",
"errorExtra": "#7e2a33",
"colorfulError": "#ca4754",
"colorfulErrorExtra": "#7e2a33"
}
}'
Theme name (1-16 characters)
Colorful error color (hex)
Colorful error extra color (hex)
Created theme with _id and name
Update Custom Theme
Update an existing custom theme.
curl -X PATCH https://api.monkeytype.com/users/customThemes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"themeId": "507f1f77bcf86cd799439011",
"theme": {
"name": "Updated Theme",
"colors": {...}
}
}'
Theme object with name and colors
Delete Custom Theme
Delete a custom theme.
curl -X DELETE https://api.monkeytype.com/users/customThemes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"themeId": "507f1f77bcf86cd799439011"}'
Inbox
Get Inbox
Retrieve user’s inbox messages.
curl https://api.monkeytype.com/users/inbox \
-H "Authorization: Bearer YOUR_TOKEN"
Maximum number of messages allowed
Update Inbox
Mark messages as read or delete them.
curl -X PATCH https://api.monkeytype.com/users/inbox \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mailIdsToMarkRead": ["uuid1", "uuid2"],
"mailIdsToDelete": ["uuid3"]
}'
Array of message UUIDs to mark as read
Array of message UUIDs to delete
Streak
Get Streak
Retrieve user’s streak data.
curl https://api.monkeytype.com/users/streak \
-H "Authorization: Bearer YOUR_TOKEN"
Current streak length in days
Maximum streak length achieved
Hour offset for streak calculation
Set Streak Hour Offset
Set the hour offset for streak calculation (can only be set once).
curl -X PATCH https://api.monkeytype.com/users/streak/hourOffset \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"hourOffset": -5}'
This can only be set once and cannot be changed.
Connections
Get Connections
Retrieve user’s connections (friends).
curl "https://api.monkeytype.com/connections?status=accepted&type=outgoing" \
-H "Authorization: Bearer YOUR_TOKEN"
Filter by status: “pending”, “accepted”, “rejected”, “blocked”
Filter by type: “incoming”, “outgoing”
Array of connection objects
Create Connection
Send a friend request to another user.
curl -X POST https://api.monkeytype.com/connections \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"receiverName": "username"}'
Username of the user to connect with
Created connection object with status “pending”
Update Connection
Accept, reject, or block a connection request.
curl -X PATCH https://api.monkeytype.com/connections/{id} \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "accepted"}'
New status: “accepted”, “rejected”, or “blocked”
Delete Connection
Remove a connection.
curl -X DELETE https://api.monkeytype.com/connections/{id} \
-H "Authorization: Bearer YOUR_TOKEN"
Discord Integration
Get Discord OAuth Link
Get the OAuth link to start Discord integration.
curl https://api.monkeytype.com/users/discord/oauth \
-H "Authorization: Bearer YOUR_TOKEN"
Discord OAuth URL to redirect user to
Link Discord Account
Link a Discord account after OAuth callback.
curl -X POST https://api.monkeytype.com/users/discord/link \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tokenType": "Bearer",
"accessToken": "DISCORD_ACCESS_TOKEN",
"state": "STATE_FROM_OAUTH"
}'
Token type from Discord OAuth
Access token from Discord OAuth
State parameter from OAuth (20 characters)
Unlink Discord Account
Unlink the connected Discord account.
curl -X POST https://api.monkeytype.com/users/discord/unlink \
-H "Authorization: Bearer YOUR_TOKEN"
Additional User Endpoints
Get Test Activity
Retrieve complete test activity data (premium feature).
curl https://api.monkeytype.com/users/testActivity \
-H "Authorization: Bearer YOUR_TOKEN"
Requires premium subscription.
Test activity data organized by year and day
Update Profile
Update user’s public profile information.
curl -X PATCH https://api.monkeytype.com/users/profile \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"bio": "Typing enthusiast",
"keyboard": "Custom 60%",
"selectedBadgeId": 1,
"socialProfiles": {
"twitter": "username",
"github": "username"
},
"showActivityOnPublicProfile": true
}'
ID of badge to display on profile
Social media profile usernames
showActivityOnPublicProfile
Whether to show test activity on public profile
Get Favorite Quotes
Retrieve user’s favorite quotes.
curl https://api.monkeytype.com/users/favoriteQuotes \
-H "Authorization: Bearer YOUR_TOKEN"
Favorite quotes organized by language
Add Favorite Quote
Add a quote to favorites.
curl -X POST https://api.monkeytype.com/users/favoriteQuotes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"language": "english",
"quoteId": "123"
}'
Quote ID to add to favorites
Remove Favorite Quote
Remove a quote from favorites.
curl -X DELETE https://api.monkeytype.com/users/favoriteQuotes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"language": "english",
"quoteId": "123"
}'
Quote ID to remove from favorites
Error Responses
All endpoints may return these common error responses:
400 Bad Request
401 Unauthorized
422 Validation Error
429 Rate Limited
460 Test Too Short
{
"message" : "Invalid request parameters"
}
Rate Limits
Endpoints have varying rate limits. Common limits:
User endpoints : 30-60 requests per minute
Result submission : 500 per day
Leaderboards : 60 per minute
Config updates : 120 per hour
See Authentication for rate limit details.