Integrate real-time scam, phishing and fraud detection into your app. One account, up to 5 devices, 7-day free trial.
| Base URL | https://scamshield.epeace.in |
|---|---|
| Format | JSON over HTTPS |
| Auth | Authorization: Bearer <entitlement_token> (or X-Entitlement-Token) |
| Free tier | 5 scans/day, no token required |
| Pro tier | Higher daily quota, up to 5 devices |
Full machine-readable spec at scamshield.epeace.in/docs.
Your account and subscription live on epeace.in. After the 7-day trial is authorised, the storefront signs and provisions your account, and your app receives a signed entitlement token bound to your subscriber id and plan.
Attach that token to every /scan request. Tokens are HMAC-signed and expiry-checked; a cancelled subscription is refused server-side.
Authorization: Bearer eyJzdWIiOiJ5b3VAZXhhbXBsZS5jb20iLCJwbGFuIjoicHJvIiw...
Analyse a message, SMS, email or URL and return a conservative verdict.
| Field | Type | Notes |
|---|---|---|
| text | string | Required. The message / URL to analyse. |
| mode | int | Optional. Content-safety strictness, default 5. |
curl -X POST https://scamshield.epeace.in/scan \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"text": "URGENT: your KYC will be blocked, click http://bit.ly/x to verify OTP"}'
The response is a structured verdict:
{
"verdict": "MALICIOUS",
"risk": 95,
"confidence": 92,
"reasons": ["Credential-phishing language", "Shortened URL"],
"sources": ["webrisk"],
"disclaimer": "Informational only; no automated check is a guarantee."
}
| verdict | Meaning |
|---|---|
| MALICIOUS | Known-bad signal matched. Block it. |
| SUSPICIOUS | Risky patterns; warn the user. |
| UNCERTAIN | Inconclusive; treat with caution. |
| SAFE | No signal found (never a 100% guarantee). |
Confirm the current plan and daily limit for a token.
curl https://scamshield.epeace.in/billing/entitlement \
-H "Authorization: Bearer $TOKEN"
{ "active": true, "plan": "pro", "expires_at": 1760000000, "daily_limit": 1000 }
Public catalog of plans and platform identifiers.
These endpoints are for the storefront only (never a client). They are authenticated with a shared secret using a signed request body.
Signature scheme
signature = hex(HMAC_SHA256(secret, `${timestamp}.${rawBody}`))
X-ScamShield-Timestamp: 1760000000
X-ScamShield-Signature: 9f2c...e1
Timestamps outside a short window are rejected (replay protection).
| Endpoint | Purpose |
|---|---|
POST /billing/provision | Grant/refresh access after a mandate is authorised. Returns a signed entitlement_token. |
POST /billing/revoke | Revoke access on cancellation or refund. |
POST /billing/device/register | Register a device (5-device cap enforced). |
POST /billing/device/list | List devices for an account. |
POST /billing/device/remove | Remove a device. |
{"subscriber_id":"you@example.com","plan_id":"pro","billing":"monthly",
"status":"trialing","trial_days":7,"max_devices":5,"expires_at":1760000000}
| Status | Meaning |
|---|---|
| 400 | Invalid payload / missing field. |
| 401 | Missing or invalid entitlement token / provisioning signature. |
| 402 | Daily scan quota exhausted for the plan. |
| 409 | Device limit reached (5 devices max). |
| 429 | Rate limited — slow down. |
Python
import requests
BASE = "https://scamshield.epeace.in"
TOKEN = "<entitlement_token>"
r = requests.post(
f"{BASE}/scan",
headers={"Authorization": f"Bearer {TOKEN}"},
json={"text": "You won a prize, claim now at http://tiny.xyz"},
timeout=30,
)
r.raise_for_status()
print(r.json())
Node.js / TypeScript
const BASE = "https://scamshield.epeace.in";
const TOKEN = process.env.SCAMSHIELD_TOKEN;
const res = await fetch(`${BASE}/scan`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${TOKEN}`,
},
body: JSON.stringify({ text: message }),
});
const verdict = await res.json();
console.log(verdict.verdict, verdict.risk);
Android (Kotlin, OkHttp)
val body = """{"text": message}""".toRequestBody("application/json".toMediaType())
val req = Request.Builder()
.url("https://scamshield.epeace.in/scan")
.addHeader("Authorization", "Bearer $token")
.post(body)
.build()
client.newCall(req).execute().use { println(it.body?.string()) }
Start your 7-day free trial and get an entitlement token in minutes.