-
Notifications
You must be signed in to change notification settings - Fork 0
API Reference
Complete API endpoint documentation for developers.
http://localhost:8000/api/v1
For production deployments, replace with your PATAS server URL.
PATAS API uses API keys for authentication:
curl -H "Authorization: Bearer YOUR_API_KEY" \
http://localhost:8000/api/v1/analyzeGET /api/v1/health
Check API status.
Response:
{
"status": "ok",
"core_ready": true,
"version": "2.0.0"
}POST /api/v1/analyze
Main endpoint for batch message analysis. Returns pattern groups with SQL queries.
Request:
{
"messages": [
{
"id": "msg_001",
"text": "Buy now! http://spam.com",
"is_spam": true,
"meta": {
"sender": "user123",
"source": "chat456"
}
}
],
"run_mining": true,
"run_evaluation": true,
"export_backend": "sql",
"profile": "conservative",
"min_precision": 0.95,
"include_explanations": false,
"group_by_pattern": false
}New Parameters (v2.1):
-
profile(optional): Filter rules by aggressiveness profile-
conservative: min_precision=0.95, max_coverage=0.05, max_ham_hits=5 -
balanced: min_precision=0.90, max_coverage=0.10, max_ham_hits=10 -
aggressive: min_precision=0.85, max_coverage=0.20, max_ham_hits=20
-
-
min_precision(optional): Explicit minimum precision threshold (0.0-1.0)- Takes priority over
profileif both are specified - Default: 0.95 when
profile=conservativeis used
- Takes priority over
-
include_explanations(optional, default: false): Include human-readable rule explanations -
group_by_pattern(optional, default: false): Group rules under their patterns
Response:
{
"patterns": [
{
"id": 1,
"type": "URL",
"description": "URL pattern: http://spam.com",
"group_size": 45,
"sources_count": 3,
"senders_count": 2,
"similarity_reason": "Messages contain the same suspicious URL: http://spam.com",
"example_report_ids": ["msg_001", "msg_002", "msg_003"],
"bot_likelihood": 0.85,
"sql_query": "SELECT id, message_content, sender, source FROM reports WHERE LOWER(message_content) LIKE '%http://spam.com%'"
}
],
"rules": [
{
"id": 1,
"pattern_id": 1,
"status": "candidate",
"sql_expression": "SELECT id FROM messages WHERE text LIKE '%http://spam.com%'",
"precision": 0.95,
"coverage": 0.15,
"hits_total": 100,
"explanation": "This rule detects messages matching the pattern: 'URL pattern: http://spam.com'. This rule was created because messages with this pattern were frequently marked as spam (precision: 95.0%).",
"risk_assessment": {
"risk_level": "low",
"risk_warnings": [],
"false_positive_scenarios": []
}
}
],
"export": "...",
"system_info": {
"how_it_works": "Rules are created based on spam frequency: patterns are detected when messages with similar content were frequently marked as spam (is_spam=true).",
"rule_creation": "Rules are generated from patterns that appear frequently in spam messages. Each rule is evaluated on historical data to measure precision, recall, and coverage."
},
"meta": {
"ingested_count": 10,
"patterns_created": 3,
"rules_created": 3,
"evaluation_count": 3,
"timings": {
"ingest_seconds": 0.123,
"mining_seconds": 2.456,
"evaluation_seconds": 0.789,
"total_seconds": 3.368
}
}
}Parameters:
-
messages(required): Array of message objects -
run_mining(optional, default: true): Run pattern mining -
run_evaluation(optional, default: true): Evaluate rules -
export_backend(optional): Export format ("sql" or "rol") -
profile(optional, v2.1): Filter rules by aggressiveness profile -
min_precision(optional, v2.1): Explicit minimum precision threshold -
include_explanations(optional, v2.1, default: false): Include rule explanations -
group_by_pattern(optional, v2.1, default: false): Group rules under patterns
POST /api/v1/messages/ingest
Ingest messages into the system.
Request:
[
{
"id": "msg_001",
"text": "Spam message",
"is_spam": true,
"meta": {}
}
]Response:
{
"ingested_count": 1,
"last_id": "msg_001"
}POST /api/v1/patterns/mine
Run pattern mining on existing messages.
Request:
{
"from_timestamp": "2025-01-01T00:00:00Z",
"to_timestamp": "2025-01-07T00:00:00Z"
}Response:
{
"patterns_created": 5,
"rules_created": 5
}GET /api/v1/patterns
Get list of all patterns.
Query Parameters:
-
limit(optional): Maximum number of patterns to return -
type(optional): Filter by pattern type
Response:
{
"patterns": [
{
"id": 1,
"type": "URL",
"description": "...",
"created_at": "2025-01-01T00:00:00Z"
}
]
}GET /api/v1/rules
Get list of all rules with optional filtering, explanations, and risk assessment.
Query Parameters:
-
status(optional): Filter by rule status (candidate, shadow, active, deprecated) -
limit(optional, default: 100): Maximum number of rules to return -
offset(optional, default: 0): Pagination offset -
include_evaluation(optional, default: false): Include evaluation metrics -
profile(optional, v2.1): Filter by aggressiveness profile (conservative, balanced, aggressive) -
min_precision(optional, v2.1): Explicit minimum precision threshold (0.0-1.0) -
include_explanations(optional, v2.1, default: false): Include rule explanations -
sort_by(optional, v2.1, default: "id"): Sort by field (id, precision, coverage, created_at) -
deduplicate(optional, v2.1, default: false): Remove duplicate rules by SQL expression
Response:
[
{
"id": 1,
"pattern_id": 1,
"status": "active",
"sql_expression": "SELECT id FROM messages WHERE text LIKE '%spam%'",
"created_at": "2025-01-01T00:00:00Z",
"evaluation": {
"hits_total": 100,
"spam_hits": 95,
"ham_hits": 5,
"precision": 0.95,
"coverage": 0.15
},
"explanation": "This rule detects messages matching the pattern: 'Spam keyword pattern'. This rule was created because messages with this pattern were frequently marked as spam (precision: 95.0%).",
"risk_assessment": {
"risk_level": "low",
"risk_warnings": [],
"false_positive_scenarios": []
}
}
]POST /api/v1/rules/eval-shadow
Evaluate rules in shadow mode.
Request:
{
"rule_ids": [1, 2, 3],
"days": 7
}Response:
{
"evaluated_count": 3,
"evaluations": [
{
"rule_id": 1,
"hits_total": 100,
"spam_hits": 95,
"ham_hits": 5,
"precision": 0.95,
"coverage": 0.15
}
]
}POST /api/v1/rules/promote
Promote shadow rules to active status based on evaluation metrics.
Response:
{
"promoted_count": 2,
"promoted_rules": [1, 2]
}GET /api/v1/rules/export
Export active rules in specified format.
Query Parameters:
-
backend(required): Export format ("sql" or "rol")
Response:
- For SQL: Plain text SQL script
- For ROL: JSON object
interface Message {
id: string; // Unique message identifier
text: string; // Message text content
is_spam?: boolean; // Spam label (if available)
meta?: { // Additional metadata
sender?: string;
source?: string;
country?: string;
has_media?: boolean;
[key: string]: any;
};
}interface Pattern {
id: number;
type: "URL" | "KEYWORD" | "SIGNATURE" | "TEXT";
description: string;
group_size: number;
sources_count: number;
senders_count: number;
similarity_reason: string;
example_report_ids: string[];
bot_likelihood?: number;
sql_query: string;
}interface Rule {
id: number;
pattern_id?: number;
status: "candidate" | "shadow" | "active" | "deprecated";
sql_expression: string;
precision?: number;
coverage?: number;
hits_total?: number;
explanation?: string; // v2.1: Human-readable explanation
risk_assessment?: { // v2.1: Risk assessment
risk_level: "low" | "medium" | "high" | "unknown";
risk_warnings: string[];
false_positive_scenarios: string[];
};
}All errors are returned in the following format:
{
"detail": "Error message"
}HTTP Status Codes:
-
200- Success -
400- Bad Request -
401- Unauthorized -
404- Not Found -
500- Internal Server Error
- Free tier: 100 requests/hour
- Pro tier: 1000 requests/hour
- Enterprise: Unlimited
See API Quickstart for usage examples.
New features added in v2.1:
- Rule Filtering: Filter rules by precision threshold and aggressiveness profile
- Rule Explanations: Optional human-readable explanations for rules
- Risk Assessment: Automatic detection of false positive risks
- Rule Organization: Grouping, sorting, and deduplication
- System Information: Added system_info to responses
See API Enhancements v2.1 for complete documentation.
Last Updated: 2025-01-20