The IsThisAScam API.
Integrate scam detection into your applications. Analyze emails, URLs, text messages, and screenshots with our six-layer detection engine.
https://isthisascam.to/api/v1Authentication
All API requests require a Bearer token in the Authorization header. Get your API key from your dashboard.
Authorization: Bearer itas_your_api_key_hereYour API key starts with itas_ and is 36 characters long. Keep it secret — never expose it in client-side code or public repositories.
Quick start
Get up and running in three steps.
Get your API key
Subscribe to an API plan at pricing and copy your key from the dashboard.
Make a request
curl -X POST https://isthisascam.to/api/v1/check \
-H "Authorization: Bearer itas_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"content": "Urgent: Your PayPal account has been limited. Verify now: http://paypa1-secure.xyz/verify",
"input_type": "text"
}'Parse the response
{
"json-key">"id": "sR4kX9pLm2wN",
"json-key">"verdict": "confirmed_scam",
"json-key">"composite_score": 87,
"json-key">"confidence": 94,
"json-key">"scam_type": "phishing",
"json-key">"explanation": "This message exhibits strong phishing indicators including credential harvesting links, urgency pressure, and sender domain spoofing."
}Use verdict and composite_score to decide how to handle the content in your application.
/v1/check
Analyze a single piece of content for scam indicators. Supports text, URLs, and email content.
Parameters
| Field | Type | Description |
|---|---|---|
| content | string | requiredThe text, URL, or email to analyze. Max 100,000 characters. |
| input_type | string | One of "text", "url", or "email". Auto-detected if omitted. |
| locale | string | Language code for the explanation (e.g. "en", "es"). Defaults to "en". |
Example request
curl -X POST https://isthisascam.to/api/v1/check \
-H "Authorization: Bearer itas_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"content": "Urgent: Your PayPal account has been limited. Verify now: http://paypa1-secure.xyz/verify",
"input_type": "text",
"locale": "en"
}'Example response
{
"json-key">"id": "sR4kX9pLm2wN",
"json-key">"input_type": "email",
"json-key">"composite_score": 87,
"json-key">"verdict": "confirmed_scam",
"json-key">"scam_type": "phishing",
"json-key">"confidence": 94,
"json-key">"explanation": "This message exhibits strong phishing indicators including credential harvesting links, urgency pressure, and sender domain spoofing.",
"json-key">"red_flags": [
{
"json-key">"id": "rf_1",
"json-key">"title": "Suspicious sender domain",
"json-key">"description": "Domain registered 2 days ago",
"json-key">"severity": "critical",
"json-key">"layer": 2,
"json-key">"evidence": "paypa1-secure.xyz registered 2024-04-13"
},
{
"json-key">"id": "rf_2",
"json-key">"title": "Urgency pressure",
"json-key">"description": "Threatens account suspension within 24 hours",
"json-key">"severity": "high",
"json-key">"layer": 4
},
{
"json-key">"id": "rf_3",
"json-key">"title": "Credential harvesting",
"json-key">"description": "Links to fake login page",
"json-key">"severity": "critical",
"json-key">"layer": 4,
"json-key">"evidence": "http://paypa1-secure.xyz/verify"
}
],
"json-key">"layers": [
{
"json-key">"layer": 1,
"json-key">"name": "URL Reputation",
"json-key">"score": 85,
"json-key">"status": "danger",
"json-key">"flags": [],
"json-key">"latency_ms": 320
},
{
"json-key">"layer": 2,
"json-key">"name": "Domain Intelligence",
"json-key">"score": 92,
"json-key">"status": "danger",
"json-key">"flags": [],
"json-key">"latency_ms": 450
},
{
"json-key">"layer": 3,
"json-key">"name": "Email Authentication",
"json-key">"score": 70,
"json-key">"status": "warning",
"json-key">"flags": [],
"json-key">"latency_ms": 180
},
{
"json-key">"layer": 4,
"json-key">"name": "AI Text Analysis",
"json-key">"score": 88,
"json-key">"status": "danger",
"json-key">"flags": [],
"json-key">"latency_ms": 2100
},
{
"json-key">"layer": 5,
"json-key">"name": "Visual Analysis",
"json-key">"score": 0,
"json-key">"status": "skipped",
"json-key">"flags": [],
"json-key">"latency_ms": 0
},
{
"json-key">"layer": 6,
"json-key">"name": "Community Database",
"json-key">"score": 45,
"json-key">"status": "warning",
"json-key">"flags": [],
"json-key">"latency_ms": 120
}
],
"json-key">"processing_time_ms": 3170,
"json-key">"analyzed_at": "2026-04-15T12:00:00Z"
}/v1/bulk
Analyze up to ten items in a single request. Each item counts as one API call towards your rate limit.
Parameters
| Field | Type | Description |
|---|---|---|
| items | array | requiredArray of objects with content (string, required) and optional input_type. Max 10 items. |
Example request
curl -X POST https://isthisascam.to/api/v1/bulk \
-H "Authorization: Bearer itas_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "content": "https://suspicious-url.com" },
{ "content": "You won a free iPhone! Claim here...", "input_type": "text" },
{ "content": "From: [email protected]\nSubject: Account locked" }
]
}'Example response
{
"json-key">"results": [
{
"json-key">"id": "a1b2c3",
"json-key">"verdict": "likely_scam",
"json-key">"composite_score": 72,
"json-key">"scam_type": "phishing"
},
{
"json-key">"id": "d4e5f6",
"json-key">"verdict": "confirmed_scam",
"json-key">"composite_score": 91,
"json-key">"scam_type": "lottery"
},
{
"json-key">"id": "g7h8i9",
"json-key">"verdict": "confirmed_scam",
"json-key">"composite_score": 88,
"json-key">"scam_type": "phishing"
}
],
"json-key">"total": 3,
"json-key">"processing_time_ms": 8420
}Response format
Every successful scan returns a ScanResult object with the following fields.
ScanResult
| Field | Type | Description |
|---|---|---|
| id | string | Unique scan identifier |
| input_type | string | Detected or specified input type: text, url, or email |
| composite_score | number | Overall risk score from 0 (safe) to 100 (confirmed scam) |
| verdict | string | One of safe, suspicious, likely_scam, or confirmed_scam |
| scam_type | string | Detected category (e.g. phishing, romance, tech_support) or none |
| confidence | number | Analysis confidence from 0 to 100 |
| explanation | string | Human-readable explanation of the verdict |
| red_flags | RedFlag[] | Array of detected red flags (see below) |
| layers | Layer[] | Per-layer detection results (see below) |
| processing_time_ms | number | Total server-side processing time in milliseconds |
| analyzed_at | string | ISO 8601 timestamp of when the analysis completed |
RedFlag
| Field | Type | Description |
|---|---|---|
| id | string | Unique flag identifier |
| title | string | Short title of the red flag |
| description | string | Detailed explanation |
| severity | string | low, medium, high, or critical |
| layer | number | Which detection layer produced this flag (1-6) |
| evidence | string? | Optional supporting evidence |
Layer
| Field | Type | Description |
|---|---|---|
| layer | number | Layer number (1-6) |
| name | string | Human-readable layer name |
| score | number | Layer-specific risk score (0-100) |
| status | string | clean, warning, danger, or skipped |
| flags | string[] | Flag IDs produced by this layer |
| latency_ms | number | Processing time for this layer in milliseconds |
Error codes
All errors return a JSON body with error and message fields.
| Code | Meaning | Description |
|---|---|---|
| 400 | Bad Request | Missing or invalid parameters (e.g. empty content, exceeds max length) |
| 401 | Unauthorized | Missing or invalid API key |
| 403 | Forbidden | API key does not have permission for this endpoint or plan |
| 429 | Rate Limited | Rate limit exceeded. Check X-RateLimit-Reset header for reset time. |
| 500 | Server Error | Unexpected error. Retry with exponential backoff. |
{
"json-key">"error": "rate_limit_exceeded",
"json-key">"message": "Daily limit reached. Resets at 2026-04-16T00:00:00Z."
}Rate limits
Rate limits are applied per API key on a daily (24-hour rolling window) basis.
| Plan | Daily limit | Notes |
|---|---|---|
| Free | 5 / day | Web scans only, no API access |
| API | 1,500 / month | Full API access, credit packs available for overages |
| Enterprise | Unlimited | Custom limits, dedicated support. Contact us |
Rate limit headers
Every response includes these headers so you can track your usage.
| Header | Description |
|---|---|
| X-RateLimit-Remaining | Number of requests remaining in the current window |
| X-RateLimit-Reset | ISO 8601 timestamp when the rate limit resets |
SDK examples
Use any HTTP client to call the API. Here are examples in popular languages.
Native SDKs are coming. We're building official packages for JavaScript, Python, and Go. For now, use raw HTTP requests as shown below.
const response = await fetch("https://isthisascam.to/api/v1/check", {
method: "POST",
headers: {
"Authorization": "Bearer itas_your_api_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
content: "Urgent: Verify your account at http://paypa1-secure.xyz",
input_type: "text",
}),
});
const data = await response.json();
console.log(data.verdict, data.composite_score);Changelog
Initial API release. Includes /v1/check and /v1/bulk endpoints with six-layer scam detection.