SafeAdd API Documentation
The SafeAdd API gives you read-only access to community-sourced safety signals for Roblox users. Use it to add trust and reputation context to your tools, games, bots, and platforms.
https://api.safeadd.io/v1To get started, you need an API key. Create an account at api.safeadd.io, then generate your key from the dashboard. Every account starts with 100 free requests per month.
Authentication
All API requests must include your API key in the Authorization header using the Bearer scheme.
API keys start with sk_live_ followed by 64 hex characters. Keep your key secret — it grants access to your account's request quota. If your key is compromised, regenerate it from the dashboard. The old key is immediately revoked.
Requests without a valid key return 401 Unauthorized.
Profile Lookup
/v1/profile/{username}Look up a Roblox user's safety summary by their Roblox username. Returns the community signal status, review distribution, flagged behaviors, and time-shape flags.
The username is case-insensitive. It must be 3–20 characters, alphanumeric or underscores only.
If the user has not been reviewed on SafeAdd yet, the endpoint returns a valid response with status: "Not enough data" and zero counts — not a 404. This still counts as one request toward your quota.
Response Format
All responses are JSON. The profile lookup endpoint returns these fields:
| Field | Type | Description |
|---|---|---|
| username | string | The Roblox username as stored in SafeAdd. |
| robloxId | string | null | The Roblox user ID. Null if the user hasn't been indexed. |
| status | string | The public safety label. See Status Labels below. |
| flags | string[] | Time-shape flags indicating recent patterns. |
| reviewCounts | object | Breakdown of reviews by comfort level. |
| behaviorTags | string[] | Top flagged behaviors, sorted by frequency (max 6). |
| reportCount | number | Total number of reviews submitted for this user. |
| updatedAt | string | null | ISO 8601 timestamp of the most recent review. |
The reviewCounts object always has four keys:
| Key | Meaning |
|---|---|
| comfortable | Reviewer felt comfortable interacting with this user. |
| neutral | No strong feeling either way. |
| uncomfortable | Reviewer felt uncomfortable. |
| veryUncomfortable | Reviewer felt very uncomfortable or unsafe. |
Status Labels
The status field contains one of seven possible labels. These are computed from a recency-weighted scoring algorithm — recent reviews carry more weight than older ones.
| Label | What it means |
|---|---|
| Not enough data | No reviews yet, or only neutral reviews. Cannot determine safety. |
| Positive signal | Strong positive sentiment with sufficient review volume (3+). |
| Mostly positive | Positive-leaning signal, may have limited reviews. |
| Mixed signal | A mix of positive and negative reviews. No clear direction. |
| Emerging concern | Recent negative reviews are starting to appear. |
| Elevated concern | Significant negative signal with moderate confidence. |
| Strong concern | Consistently negative signal with sufficient volume (3+). |
The harshest labels (Positive signal, Strong concern) require at least 3 reviews. This prevents a single report from producing extreme labels.
Behavior Tags
When users submit reviews on SafeAdd, they can optionally flag specific behaviors. The behaviorTags array contains the most commonly flagged behaviors for this user, sorted by frequency. Up to 6 tags are returned.
Common behavior tags include:
| Tag | Description |
|---|---|
| asked personal info | Requested real name, age, location, or other personal details. |
| moved off platform | Tried to move the conversation to Discord, Instagram, etc. |
| persistent pressure | Continued pushing after being told no or ignored. |
| inappropriate language | Used sexual, violent, or otherwise inappropriate language. |
| scam attempt | Attempted to scam through fake trades, links, or giveaways. |
| bullying or harassment | Targeted harassment, insults, or intimidation. |
| cheating or exploiting | Used cheats, exploits, or hacks in games. |
An empty behaviorTags array means no specific behaviors have been flagged.
Flags
The flags array contains time-shape indicators about the user's review pattern. These help you understand the trajectory, not just the current state.
| Flag | When it appears |
|---|---|
| Recent concern pattern | 2 or more negative reviews (uncomfortable/very uncomfortable) in the last 30 days. |
| Recent positive pattern | 2 or more positive reviews (comfortable) in the last 30 days. |
| Limited context | The user has only 1–2 total reviews. Take the status with a grain of salt. |
Rate Limits
Your monthly request quota depends on your plan. Every API call — including lookups for unknown users — counts as one request.
| Plan | Price | Monthly Requests |
|---|---|---|
| Free | $0 | 100 |
| Hobby | $4.99/mo | 1,000 |
| Builder | $9.99/mo | 5,000 |
| Pro | $19.99/mo | 20,000 |
Usage resets on the 1st of each month (UTC). When you hit your limit, the API returns 429 Too Many Requests with a message telling you to upgrade.
You can check your current usage anytime from the dashboard.
Error Handling
The API uses standard HTTP status codes. Error responses always include a JSON body with an error field.
| Status | Meaning | Example |
|---|---|---|
| 400 | Bad request — invalid username format. | { "error": "Invalid username..." } |
| 401 | Unauthorized — missing, malformed, or revoked API key. | { "error": "Invalid API key." } |
| 429 | Rate limited — monthly quota exceeded. | { "error": "Monthly request limit reached..." } |
| 500 | Server error — something went wrong on our end. | { "error": "Internal server error." } |
A successful lookup always returns 200, even if the user hasn't been reviewed yet. Check the reportCount field to determine if there's actual data.
Code Examples
Below are complete, copy-paste-ready examples for common use cases.
JavaScript / TypeScript
Works in Node.js, Deno, Bun, or any environment with fetch.
Python
Uses the built-in requests library.
Roblox (Luau)
Use HttpService in a server-side Script to check player safety when they join your game. You must enable HTTP requests in Game Settings → Security.
You can also use this to gate access to sensitive features. For example, restrict trading with flagged players or add extra verification steps:
Discord Bot (discord.js)
Add a /check command to your Discord bot that lets members look up a Roblox player's safety status.
Health Endpoint
/v1/healthReturns the API status. No authentication required. Use this to verify connectivity or for uptime monitoring.