Security Unlocked

Phrenex API

Integrate social engineering analysis into your tools, SOAR platforms, and security workflows.

Get API Access

API keys are included with all subscription plans. Subscribe to get your key and start integrating.

View Plans Sign In

Base URL

https://se-decoder-api.joshua-j-taylor.workers.dev

Authentication

Include your API key as a Bearer token in the Authorization header:

Authorization: Bearer sed_your_api_key_here

Unauthenticated requests from the web tool are limited to 3/day per IP. Authenticated requests get tier-based limits.

POST /api/analyze

Analyze a suspicious message for social engineering tactics.

Request Body

{
  "message": "string (max 10,000 chars)",
  "messageType": "auto | email | sms | voice_transcript | chat_message | social_media | website_copy"
}

Examples

curl
curl -X POST https://se-decoder-api.joshua-j-taylor.workers.dev/api/analyze \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sed_your_api_key_here" \
  -d '{
    "message": "Your account has been suspended. Click here to verify: https://example.com/verify",
    "messageType": "email"
  }'
Python
import requests

response = requests.post(
    "https://se-decoder-api.joshua-j-taylor.workers.dev/api/analyze",
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer sed_your_api_key_here"
    },
    json={
        "message": "Your account has been suspended. Click here to verify.",
        "messageType": "email"
    }
)

result = response.json()
print(f"Risk: {result['verdict']['risk_level']}")
print(f"Summary: {result['verdict']['summary']}")
JavaScript
const response = await fetch(
  "https://se-decoder-api.joshua-j-taylor.workers.dev/api/analyze",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": "Bearer sed_your_api_key_here"
    },
    body: JSON.stringify({
      message: "Your account has been suspended. Click here to verify.",
      messageType: "email"
    })
  }
);

const result = await response.json();
console.log(`Risk: ${result.verdict.risk_level}`);
console.log(`Summary: ${result.verdict.summary}`);

Response (200)

{
  "meta": {
    "input_type": "email",
    "language": "en",
    "word_count": 142
  },
  "verdict": {
    "risk_level": "critical | high | medium | low | benign",
    "summary": "One-sentence plain language summary (max 280 chars)",
    "rationale": "Why this risk level was assigned"
  },
  "cialdini": [
    {
      "principle": "authority",
      "present": true,
      "evidence": "Claims to be from account security team",
      "strength": "strong | moderate | weak"
    }
  ],
  "cognitive_biases": [
    {
      "bias": "loss aversion",
      "explanation": "Threatens account suspension to motivate action"
    }
  ],
  "mitre_attack": [
    {
      "technique_id": "T1566.002",
      "technique_name": "Spearphishing Link",
      "tactic": "Initial Access",
      "relevance": "Contains a deceptive URL"
    }
  ],
  "attacker_goal": {
    "primary_goal": "credential_harvest",
    "target_asset": "Account credentials",
    "kill_chain_phase": "delivery"
  },
  "action_plan": {
    "do_now": ["Do not click any links in this message"],
    "do_not": ["Do not enter credentials on any linked page"],
    "report_to": "Forward to your IT security team",
    "verification_steps": ["Log in directly at the official website"]
  },
  "indicators": {
    "urls": ["https://example.com/verify"],
    "domains": ["example.com"],
    "sender_info": "[email protected]",
    "mentioned_orgs": ["Example Corp"],
    "lure_type": "account_verification"
  },
  "confidence": {
    "score": 0.92,
    "caveats": []
  },
  "_submission_id": 42
}

Error Responses

400 Invalid input (empty message, bad JSON)
402 Credits exhausted (paid tier)
429 Rate limit exceeded (includes daily_limit and daily_used)
502 Model returned invalid output after retry

POST /api/feedback

Submit quality feedback on an analysis.

{
  "submission_id": 42,
  "rating": 1,
  "text": "Optional correction or comment"
}

rating: 1 (thumbs up) or -1 (thumbs down). Returns {"ok": true}.

GET /api/credits

Check remaining credits for an API key.

GET /api/credits?key=sed_your_api_key_here

Returns:

{ "tier": "paid", "credits_remaining": 47 }

Rate Limits

TierDaily LimitBurst Limit
Web tool (no key)3/day5/min
Individual ($19.99/mo)50/day5/min
Team ($49.99/mo)200/day5/min
Business ($199.99/mo)1,000/day5/min
Credit packsUntil credits exhausted5/min

Rate limit responses (429) include daily_limit and daily_used fields.

Dashboard · Phrenex Tool · Support