Quickstart
This guide walks through enrolling an elder profile, sending a transaction event, and reviewing the detected signals using the REST API.
Prerequisites
- A Kora Sentinel account (sign up)
- Your API key (starts with
test_for sandbox) - Your Tenant ID (UUID from your dashboard)
Step 1: Create an elder profile
Enroll a customer in the protected population.
- cURL
- Node.js
- Python
- Go
curl -X POST https://api.korastratum.com/sentinel/api/v1/elder/profiles \
-H "Authorization: Bearer $SENTINEL_API_KEY" \
-H "X-Tenant-ID: $SENTINEL_TENANT_ID" \
-H "Content-Type: application/json" \
-d '{
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"customer_name": "Margaret Johnson",
"date_of_birth": "1945-03-15T00:00:00Z",
"enrollment_reason": "AGE_THRESHOLD",
"country": "NG",
"account_ids": ["660e8400-e29b-41d4-a716-446655440001"]
}'
const response = await fetch("https://api.korastratum.com/sentinel/api/v1/elder/profiles", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.SENTINEL_API_KEY}`,
"X-Tenant-ID": process.env.SENTINEL_TENANT_ID,
"Content-Type": "application/json",
},
body: JSON.stringify({
customer_id: "550e8400-e29b-41d4-a716-446655440000",
customer_name: "Margaret Johnson",
date_of_birth: "1945-03-15T00:00:00Z",
enrollment_reason: "AGE_THRESHOLD",
country: "NG",
account_ids: ["660e8400-e29b-41d4-a716-446655440001"],
}),
});
const profile = await response.json();
console.log(profile.id); // "a1b2c3d4-..."
import requests
import os
response = requests.post(
"https://api.korastratum.com/sentinel/api/v1/elder/profiles",
headers={
"Authorization": f"Bearer {os.environ['SENTINEL_API_KEY']}",
"X-Tenant-ID": os.environ["SENTINEL_TENANT_ID"],
},
json={
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"customer_name": "Margaret Johnson",
"date_of_birth": "1945-03-15T00:00:00Z",
"enrollment_reason": "AGE_THRESHOLD",
"country": "NG",
"account_ids": ["660e8400-e29b-41d4-a716-446655440001"],
},
)
profile = response.json()
print(profile["id"]) # "a1b2c3d4-..."
req := sentinel.CreateProfileRequest{
CustomerID: "550e8400-e29b-41d4-a716-446655440000",
CustomerName: "Margaret Johnson",
DateOfBirth: time.Date(1945, 3, 15, 0, 0, 0, 0, time.UTC),
EnrollmentReason: "AGE_THRESHOLD",
Country: "NG",
AccountIDs: []string{"660e8400-e29b-41d4-a716-446655440001"},
}
profile, err := client.CreateProfile(ctx, req)
fmt.Println(profile.ID) // "a1b2c3d4-..."
Save the returned id — you'll use it to query signals and ERS history.
Step 2: Send a transaction event
Push a transaction event for real-time signal evaluation.
- cURL
- Node.js
- Python
- Go
curl -X POST https://api.korastratum.com/sentinel/api/v1/elder/events/transaction \
-H "Authorization: Bearer $SENTINEL_API_KEY" \
-H "X-Tenant-ID: $SENTINEL_TENANT_ID" \
-H "Content-Type: application/json" \
-d '{
"event_type": "transaction.completed",
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-04-07T14:30:00Z",
"source": "CBA",
"data": {
"transaction_id": "770e8400-e29b-41d4-a716-446655440002",
"transaction_type": "transfer",
"amount": 500000.00,
"currency": "NGN",
"channel": "mobile",
"source_account_id": "660e8400-e29b-41d4-a716-446655440001",
"dest_account_num": "0123456789",
"initiated_by": "880e8400-e29b-41d4-a716-446655440003"
}
}'
const result = await fetch(
"https://api.korastratum.com/sentinel/api/v1/elder/events/transaction",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.SENTINEL_API_KEY}`,
"X-Tenant-ID": process.env.SENTINEL_TENANT_ID,
"Content-Type": "application/json",
},
body: JSON.stringify({
event_type: "transaction.completed",
customer_id: "550e8400-e29b-41d4-a716-446655440000",
timestamp: "2026-04-07T14:30:00Z",
source: "CBA",
data: {
transaction_id: "770e8400-e29b-41d4-a716-446655440002",
transaction_type: "transfer",
amount: 500000.00,
currency: "NGN",
channel: "mobile",
source_account_id: "660e8400-e29b-41d4-a716-446655440001",
dest_account_num: "0123456789",
initiated_by: "880e8400-e29b-41d4-a716-446655440003",
},
}),
}
);
const data = await result.json();
console.log(data.signals); // 2
console.log(data.ers_after); // 45.7
console.log(data.tier_changed); // true
console.log(data.new_tier); // "ELEVATED"
result = requests.post(
"https://api.korastratum.com/sentinel/api/v1/elder/events/transaction",
headers={
"Authorization": f"Bearer {os.environ['SENTINEL_API_KEY']}",
"X-Tenant-ID": os.environ["SENTINEL_TENANT_ID"],
},
json={
"event_type": "transaction.completed",
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-04-07T14:30:00Z",
"source": "CBA",
"data": {
"transaction_id": "770e8400-e29b-41d4-a716-446655440002",
"transaction_type": "transfer",
"amount": 500000.00,
"currency": "NGN",
"channel": "mobile",
"source_account_id": "660e8400-e29b-41d4-a716-446655440001",
"dest_account_num": "0123456789",
"initiated_by": "880e8400-e29b-41d4-a716-446655440003",
},
},
)
data = result.json()
print(data["signals"]) # 2
print(data["ers_after"]) # 45.7
print(data["tier_changed"]) # True
print(data["new_tier"]) # "ELEVATED"
event := sentinel.ElderProtectionEvent{
EventType: "transaction.completed",
CustomerID: "550e8400-e29b-41d4-a716-446655440000",
Timestamp: time.Now(),
Source: "CBA",
Data: map[string]any{
"transaction_id": "770e8400-e29b-41d4-a716-446655440002",
"transaction_type": "transfer",
"amount": 500000.00,
"currency": "NGN",
"channel": "mobile",
},
}
result, err := client.ProcessTransactionEvent(ctx, event)
fmt.Println(result.Signals) // 2
fmt.Println(result.ERSAfter) // 45.7
fmt.Println(result.TierChanged) // true
The response tells you how many signals were generated and whether the ERS tier changed.
Step 3: List detected signals
- cURL
- Node.js
- Python
- Go
curl https://api.korastratum.com/sentinel/api/v1/elder/signals?profile_id=$PROFILE_ID&status=ACTIVE \
-H "Authorization: Bearer $SENTINEL_API_KEY" \
-H "X-Tenant-ID: $SENTINEL_TENANT_ID"
const signals = await fetch(
`https://api.korastratum.com/sentinel/api/v1/elder/signals?profile_id=${profileId}&status=ACTIVE`,
{
headers: {
"Authorization": `Bearer ${process.env.SENTINEL_API_KEY}`,
"X-Tenant-ID": process.env.SENTINEL_TENANT_ID,
},
}
);
const data = await signals.json();
console.log(data.data); // Array of exploitation signals
signals = requests.get(
"https://api.korastratum.com/sentinel/api/v1/elder/signals",
headers={
"Authorization": f"Bearer {os.environ['SENTINEL_API_KEY']}",
"X-Tenant-ID": os.environ["SENTINEL_TENANT_ID"],
},
params={"profile_id": profile_id, "status": "ACTIVE"},
)
data = signals.json()
print(data["data"]) # Array of exploitation signals
signals, nextCursor, err := client.ListSignals(ctx, sentinel.ListSignalsFilter{
ElderProfileID: profileID,
Status: []string{"ACTIVE"},
})
fmt.Println(len(signals)) // Number of active signals
Step 4: Review a signal
Confirm or dismiss a detected signal.
- cURL
- Node.js
- Python
- Go
curl -X PUT https://api.korastratum.com/sentinel/api/v1/elder/signals/$SIGNAL_ID/review \
-H "Authorization: Bearer $SENTINEL_API_KEY" \
-H "X-Tenant-ID: $SENTINEL_TENANT_ID" \
-H "Content-Type: application/json" \
-d '{
"status": "CONFIRMED",
"review_notes": "Verified with branch manager — customer confirmed exploitation."
}'
await fetch(
`https://api.korastratum.com/sentinel/api/v1/elder/signals/${signalId}/review`,
{
method: "PUT",
headers: {
"Authorization": `Bearer ${process.env.SENTINEL_API_KEY}`,
"X-Tenant-ID": process.env.SENTINEL_TENANT_ID,
"Content-Type": "application/json",
},
body: JSON.stringify({
status: "CONFIRMED",
review_notes: "Verified with branch manager — customer confirmed exploitation.",
}),
}
);
requests.put(
f"https://api.korastratum.com/sentinel/api/v1/elder/signals/{signal_id}/review",
headers={
"Authorization": f"Bearer {os.environ['SENTINEL_API_KEY']}",
"X-Tenant-ID": os.environ["SENTINEL_TENANT_ID"],
},
json={
"status": "CONFIRMED",
"review_notes": "Verified with branch manager — customer confirmed exploitation.",
},
)
err := client.ReviewSignal(ctx, signalID, sentinel.ReviewSignalRequest{
Status: "CONFIRMED",
ReviewNotes: "Verified with branch manager — customer confirmed exploitation.",
})
Step 5: Check the dashboard overview
- cURL
- Node.js
- Python
- Go
curl https://api.korastratum.com/sentinel/api/v1/elder/dashboard/overview \
-H "Authorization: Bearer $SENTINEL_API_KEY" \
-H "X-Tenant-ID: $SENTINEL_TENANT_ID"
const overview = await fetch(
"https://api.korastratum.com/sentinel/api/v1/elder/dashboard/overview",
{
headers: {
"Authorization": `Bearer ${process.env.SENTINEL_API_KEY}`,
"X-Tenant-ID": process.env.SENTINEL_TENANT_ID,
},
}
);
const stats = await overview.json();
console.log(stats.total_enrolled); // 1,245
console.log(stats.critical_profiles); // 12
console.log(stats.active_signals); // 87
overview = requests.get(
"https://api.korastratum.com/sentinel/api/v1/elder/dashboard/overview",
headers={
"Authorization": f"Bearer {os.environ['SENTINEL_API_KEY']}",
"X-Tenant-ID": os.environ["SENTINEL_TENANT_ID"],
},
)
stats = overview.json()
print(stats["total_enrolled"]) # 1245
print(stats["critical_profiles"]) # 12
print(stats["active_signals"]) # 87
overview, err := client.GetDashboardOverview(ctx)
fmt.Println(overview.TotalEnrolled) // 1245
fmt.Println(overview.CriticalProfiles) // 12
fmt.Println(overview.ActiveSignals) // 87
What's next
- Signal Detection — Understand the 7 exploitation detection categories and how baselines work.
- Alert Management — Learn about risk tiers, escalation, and review workflows.
- Webhooks — Set up real-time notifications for new signals and tier changes.
- Sandbox Testing — Use test fixtures for deterministic results without real customer data.
- Error Handling — Handle every error code with recovery suggestions.