feat(boc): Complete Business Operations Center v1.0

- Go backend API with full CRUD for all modules (CRM, Sales, Finance, HR, Legal, Marketing, Support, Purchase, Inventory, Projects, Automation, Analytics)
- Rust analytics service with parallel report generation
- C runtime with POSIX shared memory IPC
- PostgreSQL schema with 30+ tables, full migrations
- Redis cache, sessions, pub/sub
- Kafka event streaming with Zookeeper
- WebSocket hub for real-time updates
- Automation engine with cron jobs, workflows, event triggers
- JWT authentication, multi-tenant from start
- Docker Compose with all services
- Nginx reverse proxy with rate limiting
- Integration tests passing
- Feature gap analysis against Fortnox/Odoo/Visma

Refs: BOC-001
This commit is contained in:
Bernt
2026-07-12 12:41:35 +00:00
parent 4789a7fb48
commit 58ca4e68db
26666 changed files with 575891 additions and 2074516 deletions
@@ -0,0 +1,311 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Authentication — AAMOS API Docs</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--navy: #0A2540; --blue: #635BFF; --blue-light: #7B74FF; --blue-faint: #F0EFFF;
--text: #1a2332; --text-muted: #5a6880; --border: #e2e8f0;
--bg: #ffffff; --bg-sidebar: #f8fafc; --bg-code: #f1f5f9;
--success: #0ea472; --warning: #f59e0b; --danger: #ef4444;
--sidebar-w: 260px; --header-h: 60px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', sans-serif; color: var(--text); background: var(--bg); font-size: 15px; line-height: 1.6; }
a { color: var(--blue); text-decoration: none; }
a:hover { text-decoration: underline; }
.header {
position: fixed; top: 0; left: 0; right: 0; height: var(--header-h);
background: var(--navy); display: flex; align-items: center;
padding: 0 24px; z-index: 100; gap: 16px;
}
.header-logo { display: flex; align-items: center; gap: 10px; color: #fff; font-weight: 700; font-size: 18px; text-decoration: none; }
.header-logo-mark { width: 32px; height: 32px; background: var(--blue); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 800; color: #fff; }
.header-badge { background: rgba(99,91,255,0.25); color: #a5a0ff; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 20px; letter-spacing: 0.05em; }
.header-nav { margin-left: auto; display: flex; gap: 24px; align-items: center; }
.header-nav a { color: rgba(255,255,255,0.75); font-size: 14px; font-weight: 500; }
.header-nav a:hover { color: #fff; text-decoration: none; }
.btn-primary { background: var(--blue); color: #fff; padding: 8px 18px; border-radius: 8px; font-size: 13px; font-weight: 600; }
.hamburger { display: none; background: none; border: none; color: #fff; cursor: pointer; padding: 4px; }
.layout { display: flex; margin-top: var(--header-h); min-height: calc(100vh - var(--header-h)); }
.sidebar {
width: var(--sidebar-w); background: var(--bg-sidebar); border-right: 1px solid var(--border);
position: fixed; top: var(--header-h); bottom: 0; overflow-y: auto; padding: 24px 0;
transition: transform 0.25s ease;
}
.sidebar-section { margin-bottom: 8px; }
.sidebar-label { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; color: var(--text-muted); padding: 8px 20px 4px; text-transform: uppercase; }
.sidebar-link { display: flex; align-items: center; gap: 8px; padding: 7px 20px; color: var(--text-muted); font-size: 13.5px; font-weight: 500; transition: all 0.15s; border-left: 3px solid transparent; }
.sidebar-link:hover { color: var(--navy); background: var(--blue-faint); text-decoration: none; }
.sidebar-link.active { color: var(--blue); background: var(--blue-faint); border-left-color: var(--blue); }
.sidebar-link .icon { width: 16px; height: 16px; flex-shrink: 0; opacity: 0.7; }
.main { margin-left: var(--sidebar-w); flex: 1; padding: 48px 56px; max-width: calc(860px + var(--sidebar-w)); }
.page-header { margin-bottom: 40px; }
.breadcrumb { font-size: 13px; color: var(--text-muted); margin-bottom: 12px; }
.breadcrumb a { color: var(--text-muted); }
.breadcrumb a:hover { color: var(--blue); }
h1 { font-size: 32px; font-weight: 800; color: var(--navy); margin-bottom: 12px; }
.page-desc { font-size: 16px; color: var(--text-muted); }
h2 { font-size: 20px; font-weight: 700; color: var(--navy); margin: 36px 0 12px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
h3 { font-size: 16px; font-weight: 600; color: var(--navy); margin: 20px 0 8px; }
p { color: var(--text-muted); margin-bottom: 12px; }
.code-wrap { position: relative; margin: 12px 0; }
.code-lang { position: absolute; top: 10px; right: 44px; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.4); text-transform: uppercase; letter-spacing: 0.05em; font-family: 'Inter', sans-serif; }
.copy-btn { position: absolute; top: 8px; right: 10px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.7); border-radius: 6px; padding: 4px 8px; font-size: 11px; cursor: pointer; font-family: 'Inter', sans-serif; font-weight: 500; transition: all 0.15s; }
.copy-btn:hover { background: rgba(255,255,255,0.2); color: #fff; }
.copy-btn.copied { color: #4ade80; border-color: #4ade80; }
pre { background: #0f1923; color: #e2e8f0; border-radius: 10px; padding: 18px 20px; overflow-x: auto; font-family: 'JetBrains Mono', monospace; font-size: 13px; line-height: 1.7; }
code { font-family: 'JetBrains Mono', monospace; }
.inline-code { background: var(--bg-code); color: #c2410c; padding: 2px 6px; border-radius: 4px; font-size: 13px; font-family: 'JetBrains Mono', monospace; }
.tok-kw { color: #c792ea; } .tok-str { color: #c3e88d; } .tok-num { color: #f78c6c; } .tok-cmt { color: #546e7a; }
.tok-url { color: #80cbc4; } .tok-key { color: #89ddff; } .tok-bool { color: #ff5572; }
.tok-method { color: #ffcb6b; font-weight: 600; } .tok-path { color: #80cbc4; }
.info-box { background: var(--blue-faint); border: 1px solid #d4d0ff; border-radius: 10px; padding: 16px 20px; display: flex; gap: 12px; margin: 20px 0; }
.info-box.warning { background: #fffbeb; border-color: #fde68a; }
.info-box.danger { background: #fff5f5; border-color: #fecaca; }
.info-box-icon { font-size: 18px; flex-shrink: 0; }
.info-box-body { font-size: 13.5px; color: var(--text); }
.info-box-body strong { color: var(--navy); }
.divider { border: none; border-top: 1px solid var(--border); margin: 40px 0; }
/* Tier table */
.tier-table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 14px; }
.tier-table th { background: var(--navy); color: #fff; padding: 12px 16px; text-align: left; font-size: 12px; font-weight: 600; letter-spacing: 0.05em; }
.tier-table th:first-child { border-radius: 8px 0 0 0; } .tier-table th:last-child { border-radius: 0 8px 0 0; }
.tier-table td { padding: 12px 16px; border-bottom: 1px solid var(--border); color: var(--text-muted); }
.tier-table tr:hover td { background: var(--bg-sidebar); }
.tier-table tr:last-child td { border-bottom: none; }
.tier-badge { display: inline-block; padding: 2px 10px; border-radius: 20px; font-size: 11px; font-weight: 700; }
.tier-free { background: #dcfce7; color: #15803d; }
.tier-starter { background: #dbeafe; color: #1d4ed8; }
.tier-pro { background: var(--blue-faint); color: var(--blue); }
/* Error table */
.error-table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 14px; }
.error-table th { padding: 10px 14px; text-align: left; font-size: 12px; font-weight: 600; color: var(--text-muted); border-bottom: 2px solid var(--border); }
.error-table td { padding: 12px 14px; border-bottom: 1px solid var(--border); color: var(--text-muted); vertical-align: top; }
.status-badge { display: inline-block; padding: 3px 10px; border-radius: 6px; font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 700; }
.s-401 { background: #fff5f5; color: #dc2626; }
.s-403 { background: #fff7ed; color: #d97706; }
.s-429 { background: #faf5ff; color: #7c3aed; }
.s-500 { background: #f1f5f9; color: #475569; }
@media (max-width: 768px) {
.sidebar { transform: translateX(-100%); z-index: 50; }
.sidebar.open { transform: translateX(0); }
.main { margin-left: 0; padding: 24px 20px; }
.hamburger { display: flex; }
.header-nav { display: none; }
.overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 40; }
.overlay.visible { display: block; }
}
</style>
</head>
<body>
<header class="header">
<button class="hamburger" id="hamburger" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"><rect y="4" width="22" height="2" rx="1" fill="white"/><rect y="10" width="22" height="2" rx="1" fill="white"/><rect y="16" width="22" height="2" rx="1" fill="white"/></svg>
</button>
<a href="/docs/" class="header-logo"><div class="header-logo-mark">A</div>AAMOS</a>
<span class="header-badge">API DOCS</span>
<nav class="header-nav">
<a href="https://aamos.ai">Home</a>
<a href="/docs/">Docs</a>
<a href="https://aamos.ai/signup/" class="btn-primary">Get API Key</a>
</nav>
</header>
<div class="overlay" id="overlay"></div>
<div class="layout">
<nav class="sidebar" id="sidebar">
<div class="sidebar-section">
<div class="sidebar-label">Getting Started</div>
<a href="/docs/" class="sidebar-link">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h12v2H2zm0 4h12v2H2zm0 4h8v2H2z"/></svg>Overview</a>
<a href="/docs/authentication/" class="sidebar-link active">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>Authentication</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">APIs</div>
<a href="/docs/vims/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M1 3h14v2H1zm2 4h10v2H3zm2 4h6v2H5z"/></svg>VIMS</a>
<a href="/docs/reality-alerts/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1L1 14h14L8 1zm0 3l5 9H3l5-9zm-1 3v3h2V7H7zm0 4v2h2v-2H7z"/></svg>Reality Alerts</a>
<a href="/docs/kyz/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>KYZ</a>
<a href="/docs/modules/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h5v5H2zm7 0h5v5H9zm-7 7h5v5H2zm7 0h5v5H9z"/></svg>AAMOS Modules</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">Resources</div>
<a href="https://aamos.ai" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0a8 8 0 100 16A8 8 0 008 0zm0 2a6 6 0 010 12A6 6 0 018 2zm0 2a4 4 0 100 8 4 4 0 000-8z"/></svg>Website</a>
<a href="https://aamos.ai/signup/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm5 11H3a1 1 0 00-1 1v2h14v-2a1 1 0 00-1-1z"/></svg>Sign Up</a>
</div>
</nav>
<main class="main">
<div class="page-header">
<div class="breadcrumb"><a href="/docs/">Docs</a> / Authentication</div>
<h1>Authentication</h1>
<p class="page-desc">How to authenticate requests to the AAMOS API using API keys.</p>
</div>
<h2>Getting an API Key</h2>
<p>To access the AAMOS API, you need an API key. Sign up for a free account at <a href="https://aamos.ai/signup/">aamos.ai/signup</a> and generate a key from your dashboard under <strong>Settings → API Keys</strong>.</p>
<div class="info-box">
<span class="info-box-icon">🔑</span>
<div class="info-box-body"><strong>Keep your key secret.</strong> Your API key grants full access to your account. Never include it in client-side JavaScript, public repositories, or log files.</div>
</div>
<h2>Request Format</h2>
<p>Include your API key in every request as a Bearer token in the <code class="inline-code">Authorization</code> header:</p>
<div class="code-wrap">
<span class="code-lang">http</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>Authorization: Bearer ak_live_xxxxxxxxxxxxxxxxxxxx</pre>
</div>
<p>Here's a complete example with curl:</p>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">https://api.aamos.ai/v1/vims/objects</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-H <span class="tok-str">"Content-Type: application/json"</span></pre>
</div>
<h3>API Key format</h3>
<p>Live keys follow the format:</p>
<div class="code-wrap">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>ak_live_[32-character alphanumeric string]</pre>
</div>
<p>Test keys (for sandbox) use:</p>
<div class="code-wrap">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>ak_test_[32-character alphanumeric string]</pre>
</div>
<hr class="divider">
<h2>Rate Limits</h2>
<p>Rate limits are enforced per API key, per minute. Limits vary by plan:</p>
<table class="tier-table">
<thead>
<tr>
<th>Plan</th>
<th>Requests / minute</th>
<th>Requests / day</th>
<th>File uploads / day</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="tier-badge tier-free">Free</span></td>
<td>20</td>
<td>1,000</td>
<td>100</td>
</tr>
<tr>
<td><span class="tier-badge tier-starter">Starter</span></td>
<td>100</td>
<td>10,000</td>
<td>1,000</td>
</tr>
<tr>
<td><span class="tier-badge tier-pro">Pro</span></td>
<td>500</td>
<td>100,000</td>
<td>Unlimited</td>
</tr>
</tbody>
</table>
<p>Rate limit headers are included in every response:</p>
<div class="code-wrap">
<span class="code-lang">http</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1705312800</pre>
</div>
<hr class="divider">
<h2>Error Responses</h2>
<p>Authentication and authorization errors return appropriate HTTP status codes with a JSON body:</p>
<table class="error-table">
<thead>
<tr>
<th>Status</th>
<th>Code</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="status-badge s-401">401</span></td>
<td><code class="inline-code">unauthorized</code></td>
<td>Missing or invalid API key. Check your Authorization header.</td>
</tr>
<tr>
<td><span class="status-badge s-403">403</span></td>
<td><code class="inline-code">forbidden</code></td>
<td>Your key doesn't have permission for this resource or endpoint.</td>
</tr>
<tr>
<td><span class="status-badge s-429">429</span></td>
<td><code class="inline-code">rate_limit_exceeded</code></td>
<td>You've exceeded your plan's rate limit. Wait and retry, or upgrade your plan.</td>
</tr>
<tr>
<td><span class="status-badge s-500">500</span></td>
<td><code class="inline-code">internal_error</code></td>
<td>Something went wrong on our side. Retry with exponential backoff.</td>
</tr>
</tbody>
</table>
<p>Error response body format:</p>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"error"</span>: {
<span class="tok-key">"code"</span>: <span class="tok-str">"unauthorized"</span>,
<span class="tok-key">"message"</span>: <span class="tok-str">"Invalid API key provided"</span>,
<span class="tok-key">"request_id"</span>: <span class="tok-str">"req_a1b2c3d4e5"</span>
}
}</pre>
</div>
<div class="info-box warning">
<span class="info-box-icon">⚠️</span>
<div class="info-box-body"><strong>Rate limit 429 handling:</strong> When you receive a 429, check the <code class="inline-code">Retry-After</code> header for the number of seconds to wait before retrying.</div>
</div>
<hr class="divider">
<h2>Complete Example</h2>
<p>A fully authenticated request to list VIMS objects:</p>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -s <span class="tok-str">https://api.aamos.ai/v1/vims/objects</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-H <span class="tok-str">"Accept: application/json"</span> | jq .</pre>
</div>
</main>
</div>
<script>
function copyCode(btn) {
const pre = btn.closest('.code-wrap').querySelector('pre');
navigator.clipboard.writeText(pre.innerText || pre.textContent).then(() => {
btn.textContent = 'Copied!'; btn.classList.add('copied');
setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('copied'); }, 2000);
});
}
const hamburger = document.getElementById('hamburger');
const sidebar = document.getElementById('sidebar');
const overlay = document.getElementById('overlay');
hamburger.addEventListener('click', () => { sidebar.classList.toggle('open'); overlay.classList.toggle('visible'); });
overlay.addEventListener('click', () => { sidebar.classList.remove('open'); overlay.classList.remove('visible'); });
</script>
</body>
</html>
+411
View File
@@ -0,0 +1,411 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AAMOS API Documentation</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--navy: #0A2540;
--blue: #635BFF;
--blue-light: #7B74FF;
--blue-faint: #F0EFFF;
--text: #1a2332;
--text-muted: #5a6880;
--border: #e2e8f0;
--bg: #ffffff;
--bg-sidebar: #f8fafc;
--bg-code: #f1f5f9;
--success: #0ea472;
--warning: #f59e0b;
--danger: #ef4444;
--sidebar-w: 260px;
--header-h: 60px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', sans-serif; color: var(--text); background: var(--bg); font-size: 15px; line-height: 1.6; }
a { color: var(--blue); text-decoration: none; }
a:hover { text-decoration: underline; }
/* Header */
.header {
position: fixed; top: 0; left: 0; right: 0; height: var(--header-h);
background: var(--navy); display: flex; align-items: center;
padding: 0 24px; z-index: 100; gap: 16px;
}
.header-logo { display: flex; align-items: center; gap: 10px; color: #fff; font-weight: 700; font-size: 18px; }
.header-logo-mark {
width: 32px; height: 32px; background: var(--blue); border-radius: 8px;
display: flex; align-items: center; justify-content: center;
font-size: 14px; font-weight: 800; color: #fff;
}
.header-badge {
background: rgba(99,91,255,0.25); color: #a5a0ff;
font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 20px; letter-spacing: 0.05em;
}
.header-nav { margin-left: auto; display: flex; gap: 24px; align-items: center; }
.header-nav a { color: rgba(255,255,255,0.75); font-size: 14px; font-weight: 500; }
.header-nav a:hover { color: #fff; text-decoration: none; }
.btn-primary {
background: var(--blue); color: #fff; padding: 8px 18px; border-radius: 8px;
font-size: 13px; font-weight: 600; border: none; cursor: pointer;
}
.hamburger { display: none; background: none; border: none; color: #fff; cursor: pointer; padding: 4px; }
/* Layout */
.layout { display: flex; margin-top: var(--header-h); min-height: calc(100vh - var(--header-h)); }
/* Sidebar */
.sidebar {
width: var(--sidebar-w); background: var(--bg-sidebar); border-right: 1px solid var(--border);
position: fixed; top: var(--header-h); bottom: 0; overflow-y: auto; padding: 24px 0;
transition: transform 0.25s ease;
}
.sidebar-section { margin-bottom: 8px; }
.sidebar-label {
font-size: 11px; font-weight: 700; letter-spacing: 0.08em; color: var(--text-muted);
padding: 8px 20px 4px; text-transform: uppercase;
}
.sidebar-link {
display: flex; align-items: center; gap: 8px; padding: 7px 20px;
color: var(--text-muted); font-size: 13.5px; font-weight: 500;
transition: all 0.15s; border-left: 3px solid transparent;
}
.sidebar-link:hover { color: var(--navy); background: var(--blue-faint); text-decoration: none; }
.sidebar-link.active { color: var(--blue); background: var(--blue-faint); border-left-color: var(--blue); }
.sidebar-link .icon { width: 16px; height: 16px; flex-shrink: 0; opacity: 0.7; }
/* Main */
.main { margin-left: var(--sidebar-w); flex: 1; padding: 48px 56px; max-width: calc(860px + var(--sidebar-w)); }
/* Hero */
.hero {
background: linear-gradient(135deg, var(--navy) 0%, #1a3a5c 100%);
border-radius: 16px; padding: 48px; margin-bottom: 48px; color: #fff;
}
.hero-eyebrow { font-size: 12px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: #a5a0ff; margin-bottom: 12px; }
.hero h1 { font-size: 36px; font-weight: 800; line-height: 1.2; margin-bottom: 16px; }
.hero p { font-size: 16px; color: rgba(255,255,255,0.75); max-width: 560px; }
.hero-base-url {
margin-top: 24px; background: rgba(0,0,0,0.3); border-radius: 10px;
padding: 14px 20px; display: inline-flex; align-items: center; gap: 12px;
font-family: 'JetBrains Mono', monospace; font-size: 14px;
}
.hero-base-url .label { font-family: 'Inter', sans-serif; color: rgba(255,255,255,0.5); font-size: 12px; }
/* Quick start */
.section-title { font-size: 22px; font-weight: 700; color: var(--navy); margin-bottom: 8px; }
.section-desc { color: var(--text-muted); margin-bottom: 28px; }
.steps { display: flex; flex-direction: column; gap: 0; }
.step {
display: flex; gap: 20px; position: relative;
padding-bottom: 32px;
}
.step:last-child { padding-bottom: 0; }
.step-num {
width: 36px; height: 36px; border-radius: 50%; background: var(--blue); color: #fff;
font-weight: 700; font-size: 14px; display: flex; align-items: center; justify-content: center;
flex-shrink: 0; position: relative; z-index: 1;
}
.step::before {
content: ''; position: absolute; left: 17px; top: 36px; bottom: 0;
width: 2px; background: var(--border);
}
.step:last-child::before { display: none; }
.step-body { flex: 1; padding-top: 6px; }
.step-body h3 { font-size: 16px; font-weight: 600; color: var(--navy); margin-bottom: 6px; }
.step-body p { color: var(--text-muted); font-size: 14px; margin-bottom: 12px; }
/* Code block */
.code-wrap { position: relative; margin: 12px 0; }
.code-lang {
position: absolute; top: 10px; right: 44px;
font-size: 11px; font-weight: 600; color: var(--text-muted); font-family: 'Inter', sans-serif;
text-transform: uppercase; letter-spacing: 0.05em;
}
.copy-btn {
position: absolute; top: 8px; right: 10px; background: rgba(255,255,255,0.1);
border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.7);
border-radius: 6px; padding: 4px 8px; font-size: 11px; cursor: pointer;
font-family: 'Inter', sans-serif; font-weight: 500; transition: all 0.15s;
}
.copy-btn:hover { background: rgba(255,255,255,0.2); color: #fff; }
.copy-btn.copied { color: #4ade80; border-color: #4ade80; }
pre {
background: #0f1923; color: #e2e8f0; border-radius: 10px;
padding: 18px 20px; overflow-x: auto; font-family: 'JetBrains Mono', monospace;
font-size: 13px; line-height: 1.7;
}
code { font-family: 'JetBrains Mono', monospace; }
.inline-code {
background: var(--bg-code); color: #c2410c; padding: 2px 6px;
border-radius: 4px; font-size: 13px; font-family: 'JetBrains Mono', monospace;
}
/* Token highlight */
.tok-kw { color: #c792ea; }
.tok-str { color: #c3e88d; }
.tok-num { color: #f78c6c; }
.tok-cmt { color: #546e7a; }
.tok-url { color: #80cbc4; }
.tok-key { color: #89ddff; }
.tok-bool { color: #ff5572; }
.tok-method { color: #ffcb6b; font-weight: 600; }
.tok-path { color: #80cbc4; }
/* API cards */
.api-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 20px; margin-top: 8px; }
.api-card {
border: 1px solid var(--border); border-radius: 12px; padding: 24px;
transition: all 0.2s; display: block; color: inherit;
}
.api-card:hover { border-color: var(--blue); box-shadow: 0 4px 20px rgba(99,91,255,0.12); text-decoration: none; transform: translateY(-2px); }
.api-card-icon {
width: 44px; height: 44px; border-radius: 10px; background: var(--blue-faint);
display: flex; align-items: center; justify-content: center;
margin-bottom: 16px; font-size: 20px;
}
.api-card h3 { font-size: 16px; font-weight: 700; color: var(--navy); margin-bottom: 6px; }
.api-card p { font-size: 13px; color: var(--text-muted); line-height: 1.5; }
.api-card-arrow { margin-top: 16px; color: var(--blue); font-size: 13px; font-weight: 600; }
/* Divider */
.divider { border: none; border-top: 1px solid var(--border); margin: 40px 0; }
/* Auth box */
.info-box {
background: var(--blue-faint); border: 1px solid #d4d0ff; border-radius: 10px;
padding: 16px 20px; display: flex; gap: 12px; margin: 20px 0;
}
.info-box.warning { background: #fffbeb; border-color: #fde68a; }
.info-box-icon { font-size: 18px; flex-shrink: 0; }
.info-box-body { font-size: 13.5px; color: var(--text); }
.info-box-body strong { color: var(--navy); }
/* Responsive */
@media (max-width: 768px) {
.sidebar { transform: translateX(-100%); z-index: 50; }
.sidebar.open { transform: translateX(0); }
.main { margin-left: 0; padding: 24px 20px; }
.hero { padding: 28px; }
.hero h1 { font-size: 26px; }
.hamburger { display: flex; }
.api-grid { grid-template-columns: 1fr; }
.header-nav { display: none; }
.overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 40; }
.overlay.visible { display: block; }
}
</style>
</head>
<body>
<header class="header">
<button class="hamburger" id="hamburger" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"><rect y="4" width="22" height="2" rx="1" fill="white"/><rect y="10" width="22" height="2" rx="1" fill="white"/><rect y="16" width="22" height="2" rx="1" fill="white"/></svg>
</button>
<a href="/docs/" class="header-logo" style="text-decoration:none">
<div class="header-logo-mark">A</div>
AAMOS
</a>
<span class="header-badge">API DOCS</span>
<nav class="header-nav">
<a href="https://aamos.ai">Home</a>
<a href="/docs/">Docs</a>
<a href="https://aamos.ai/signup/" class="btn-primary">Get API Key</a>
</nav>
</header>
<div class="overlay" id="overlay"></div>
<div class="layout">
<nav class="sidebar" id="sidebar">
<div class="sidebar-section">
<div class="sidebar-label">Getting Started</div>
<a href="/docs/" class="sidebar-link active">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h12v2H2zm0 4h12v2H2zm0 4h8v2H2z"/></svg>
Overview
</a>
<a href="/docs/authentication/" class="sidebar-link">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>
Authentication
</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">APIs</div>
<a href="/docs/vims/" class="sidebar-link">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M1 3h14v2H1zm2 4h10v2H3zm2 4h6v2H5z"/></svg>
VIMS
</a>
<a href="/docs/reality-alerts/" class="sidebar-link">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1L1 14h14L8 1zm0 3l5 9H3l5-9zm-1 3v3h2V7H7zm0 4v2h2v-2H7z"/></svg>
Reality Alerts
</a>
<a href="/docs/kyz/" class="sidebar-link">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>
KYZ
</a>
<a href="/docs/modules/" class="sidebar-link">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h5v5H2zm7 0h5v5H9zm-7 7h5v5H2zm7 0h5v5H9z"/></svg>
AAMOS Modules
</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">Resources</div>
<a href="https://aamos.ai" class="sidebar-link">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0a8 8 0 100 16A8 8 0 008 0zm0 2a6 6 0 010 12A6 6 0 018 2zm0 2a4 4 0 100 8 4 4 0 000-8z"/></svg>
Website
</a>
<a href="https://aamos.ai/signup/" class="sidebar-link">
<svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm5 11H3a1 1 0 00-1 1v2h14v-2a1 1 0 00-1-1z"/></svg>
Sign Up
</a>
</div>
</nav>
<main class="main">
<div class="hero">
<div class="hero-eyebrow">Developer Documentation</div>
<h1>AAMOS API Documentation</h1>
<p>Build powerful applications with real-time visual intelligence, identity verification, and situational awareness APIs.</p>
<div class="hero-base-url">
<span class="label">Base URL</span>
<span>https://api.aamos.ai/v1</span>
</div>
</div>
<section>
<h2 class="section-title">Quick Start</h2>
<p class="section-desc">Get up and running with the AAMOS API in three steps.</p>
<div class="steps">
<div class="step">
<div class="step-num">1</div>
<div class="step-body">
<h3>Get your API key</h3>
<p>Sign up at <a href="https://aamos.ai/signup/">aamos.ai/signup</a> and create an API key from your dashboard. Keys follow the format <code class="inline-code">ak_live_...</code></p>
</div>
</div>
<div class="step">
<div class="step-num">2</div>
<div class="step-body">
<h3>Make your first call</h3>
<p>Pass your key in the <code class="inline-code">Authorization</code> header on every request.</p>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">https://api.aamos.ai/v1/vims/objects</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
</div>
</div>
<div class="step">
<div class="step-num">3</div>
<div class="step-body">
<h3>Handle the response</h3>
<p>All endpoints return JSON. Check the <code class="inline-code">HTTP status code</code> — 2xx means success, 4xx/5xx means error.</p>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"objects"</span>: [
{
<span class="tok-key">"object_id"</span>: <span class="tok-str">"obj_abc123"</span>,
<span class="tok-key">"baseline_count"</span>: <span class="tok-num">3</span>,
<span class="tok-key">"last_analysis"</span>: <span class="tok-str">"2025-01-15T10:30:00Z"</span>
}
]
}</pre>
</div>
</div>
</div>
</div>
</section>
<hr class="divider">
<section>
<h2 class="section-title">Authentication</h2>
<p class="section-desc">All requests must include your API key in the Authorization header.</p>
<div class="info-box">
<span class="info-box-icon">🔑</span>
<div class="info-box-body"><strong>Authorization: Bearer ak_live_...</strong><br>Include this header in every API request. Keep your key secret — never expose it in client-side code.</div>
</div>
<a href="/docs/authentication/" style="font-weight:600;font-size:14px;">View full authentication docs →</a>
</section>
<hr class="divider">
<section>
<h2 class="section-title">API Reference</h2>
<p class="section-desc">Explore all available AAMOS APIs.</p>
<div class="api-grid">
<a href="/docs/vims/" class="api-card">
<div class="api-card-icon">🔍</div>
<h3>VIMS</h3>
<p>Visual Integrity Monitoring System. Detect changes, anomalies, and deviations in monitored objects using computer vision.</p>
<div class="api-card-arrow">Explore VIMS →</div>
</a>
<a href="/docs/reality-alerts/" class="api-card">
<div class="api-card-icon">🚨</div>
<h3>Reality Alerts</h3>
<p>Subscribe to real-world event streams and receive webhook notifications when conditions match your criteria.</p>
<div class="api-card-arrow">Explore Reality Alerts →</div>
</a>
<a href="/docs/kyz/" class="api-card">
<div class="api-card-icon">🪪</div>
<h3>KYZ</h3>
<p>Know Your Zone — identity verification with liveness detection, document scanning, and hosted or API flow options.</p>
<div class="api-card-arrow">Explore KYZ →</div>
</a>
<a href="/docs/modules/" class="api-card">
<div class="api-card-icon">🧩</div>
<h3>AAMOS Modules</h3>
<p>Incident management and deviation detection APIs for operational intelligence and asset monitoring workflows.</p>
<div class="api-card-arrow">Explore Modules →</div>
</a>
</div>
</section>
<hr class="divider">
<section>
<h2 class="section-title">Base URL &amp; Versioning</h2>
<p class="section-desc">The current API version is <strong>v1</strong>. All endpoints are prefixed with:</p>
<div class="code-wrap">
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>https://api.aamos.ai/v1</pre>
</div>
<div class="info-box warning" style="margin-top:20px">
<span class="info-box-icon">⚠️</span>
<div class="info-box-body"><strong>API Versioning:</strong> We will notify you before introducing breaking changes. Minor additions (new fields, new endpoints) may be added without a version bump.</div>
</div>
</section>
</main>
</div>
<script>
function copyCode(btn) {
const pre = btn.closest('.code-wrap').querySelector('pre');
const text = pre.innerText || pre.textContent;
navigator.clipboard.writeText(text).then(() => {
btn.textContent = 'Copied!';
btn.classList.add('copied');
setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('copied'); }, 2000);
});
}
const hamburger = document.getElementById('hamburger');
const sidebar = document.getElementById('sidebar');
const overlay = document.getElementById('overlay');
hamburger.addEventListener('click', () => {
sidebar.classList.toggle('open');
overlay.classList.toggle('visible');
});
overlay.addEventListener('click', () => {
sidebar.classList.remove('open');
overlay.classList.remove('visible');
});
</script>
</body>
</html>
+318
View File
@@ -0,0 +1,318 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>KYZ API — AAMOS API Docs</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--navy: #0A2540; --blue: #635BFF; --blue-faint: #F0EFFF;
--text: #1a2332; --text-muted: #5a6880; --border: #e2e8f0;
--bg: #ffffff; --bg-sidebar: #f8fafc; --bg-code: #f1f5f9;
--sidebar-w: 260px; --header-h: 60px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', sans-serif; color: var(--text); background: var(--bg); font-size: 15px; line-height: 1.6; }
a { color: var(--blue); text-decoration: none; } a:hover { text-decoration: underline; }
.header { position: fixed; top: 0; left: 0; right: 0; height: var(--header-h); background: var(--navy); display: flex; align-items: center; padding: 0 24px; z-index: 100; gap: 16px; }
.header-logo { display: flex; align-items: center; gap: 10px; color: #fff; font-weight: 700; font-size: 18px; text-decoration: none; }
.header-logo-mark { width: 32px; height: 32px; background: var(--blue); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 800; color: #fff; }
.header-badge { background: rgba(99,91,255,0.25); color: #a5a0ff; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 20px; letter-spacing: 0.05em; }
.header-nav { margin-left: auto; display: flex; gap: 24px; align-items: center; }
.header-nav a { color: rgba(255,255,255,0.75); font-size: 14px; font-weight: 500; }
.header-nav a:hover { color: #fff; text-decoration: none; }
.btn-primary { background: var(--blue); color: #fff; padding: 8px 18px; border-radius: 8px; font-size: 13px; font-weight: 600; }
.hamburger { display: none; background: none; border: none; color: #fff; cursor: pointer; padding: 4px; }
.layout { display: flex; margin-top: var(--header-h); min-height: calc(100vh - var(--header-h)); }
.sidebar { width: var(--sidebar-w); background: var(--bg-sidebar); border-right: 1px solid var(--border); position: fixed; top: var(--header-h); bottom: 0; overflow-y: auto; padding: 24px 0; transition: transform 0.25s ease; }
.sidebar-section { margin-bottom: 8px; }
.sidebar-label { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; color: var(--text-muted); padding: 8px 20px 4px; text-transform: uppercase; }
.sidebar-link { display: flex; align-items: center; gap: 8px; padding: 7px 20px; color: var(--text-muted); font-size: 13.5px; font-weight: 500; transition: all 0.15s; border-left: 3px solid transparent; }
.sidebar-link:hover { color: var(--navy); background: var(--blue-faint); text-decoration: none; }
.sidebar-link.active { color: var(--blue); background: var(--blue-faint); border-left-color: var(--blue); }
.sidebar-link .icon { width: 16px; height: 16px; flex-shrink: 0; opacity: 0.7; }
.main { margin-left: var(--sidebar-w); flex: 1; padding: 48px 56px; max-width: calc(900px + var(--sidebar-w)); }
.page-header { margin-bottom: 40px; }
.breadcrumb { font-size: 13px; color: var(--text-muted); margin-bottom: 12px; }
.breadcrumb a { color: var(--text-muted); } .breadcrumb a:hover { color: var(--blue); }
h1 { font-size: 32px; font-weight: 800; color: var(--navy); margin-bottom: 12px; }
.page-desc { font-size: 16px; color: var(--text-muted); }
h2 { font-size: 20px; font-weight: 700; color: var(--navy); margin: 40px 0 14px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
h3 { font-size: 12px; font-weight: 600; color: var(--text-muted); margin: 16px 0 8px; text-transform: uppercase; letter-spacing: 0.06em; }
p { color: var(--text-muted); margin-bottom: 12px; }
.endpoint-card { border: 1px solid var(--border); border-radius: 12px; margin: 24px 0; overflow: hidden; }
.endpoint-header { display: flex; align-items: center; gap: 12px; padding: 18px 24px; background: var(--bg-sidebar); border-bottom: 1px solid var(--border); }
.method-badge { font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 700; padding: 4px 12px; border-radius: 6px; }
.method-post { background: #dcfce7; color: #15803d; }
.method-get { background: #dbeafe; color: #1d4ed8; }
.endpoint-path { font-family: 'JetBrains Mono', monospace; font-size: 14px; color: var(--navy); font-weight: 500; }
.endpoint-body { padding: 24px; }
.endpoint-desc { color: var(--text-muted); font-size: 14px; margin-bottom: 20px; }
.params-table { width: 100%; border-collapse: collapse; font-size: 13.5px; margin: 8px 0 20px; }
.params-table th { text-align: left; padding: 8px 12px; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; color: var(--text-muted); border-bottom: 2px solid var(--border); text-transform: uppercase; }
.params-table td { padding: 10px 12px; border-bottom: 1px solid var(--border); vertical-align: top; }
.params-table tr:last-child td { border-bottom: none; }
.param-name { font-family: 'JetBrains Mono', monospace; color: var(--navy); font-size: 13px; }
.param-type { font-family: 'JetBrains Mono', monospace; color: var(--blue); font-size: 12px; }
.param-req { display: inline-block; background: #fef3c7; color: #92400e; font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 4px; text-transform: uppercase; }
.param-opt { display: inline-block; background: var(--bg-code); color: var(--text-muted); font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 4px; text-transform: uppercase; }
.param-desc { color: var(--text-muted); }
.code-wrap { position: relative; margin: 12px 0; }
.code-lang { position: absolute; top: 10px; right: 44px; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.4); text-transform: uppercase; letter-spacing: 0.05em; font-family: 'Inter', sans-serif; }
.copy-btn { position: absolute; top: 8px; right: 10px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.7); border-radius: 6px; padding: 4px 8px; font-size: 11px; cursor: pointer; font-family: 'Inter', sans-serif; font-weight: 500; transition: all 0.15s; }
.copy-btn:hover { background: rgba(255,255,255,0.2); color: #fff; }
.copy-btn.copied { color: #4ade80; border-color: #4ade80; }
pre { background: #0f1923; color: #e2e8f0; border-radius: 10px; padding: 18px 20px; overflow-x: auto; font-family: 'JetBrains Mono', monospace; font-size: 13px; line-height: 1.7; }
code { font-family: 'JetBrains Mono', monospace; }
.inline-code { background: var(--bg-code); color: #c2410c; padding: 2px 6px; border-radius: 4px; font-size: 13px; font-family: 'JetBrains Mono', monospace; }
.tok-kw { color: #c792ea; } .tok-str { color: #c3e88d; } .tok-num { color: #f78c6c; } .tok-cmt { color: #546e7a; }
.tok-url { color: #80cbc4; } .tok-key { color: #89ddff; } .tok-bool { color: #ff5572; }
.info-box { background: var(--blue-faint); border: 1px solid #d4d0ff; border-radius: 10px; padding: 16px 20px; display: flex; gap: 12px; margin: 20px 0; }
.info-box.warning { background: #fffbeb; border-color: #fde68a; }
.info-box-icon { font-size: 18px; flex-shrink: 0; }
.info-box-body { font-size: 13.5px; color: var(--text); }
.info-box-body strong { color: var(--navy); }
/* Flow comparison */
.flow-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 20px 0; }
.flow-card { border: 1px solid var(--border); border-radius: 10px; padding: 20px; }
.flow-card h4 { font-size: 15px; font-weight: 700; color: var(--navy); margin-bottom: 8px; }
.flow-card p { font-size: 13px; }
.flow-tag { display: inline-block; padding: 2px 10px; border-radius: 20px; font-size: 11px; font-weight: 700; margin-bottom: 10px; }
.flow-hosted { background: var(--blue-faint); color: var(--blue); }
.flow-api { background: #dcfce7; color: #15803d; }
@media (max-width: 768px) {
.sidebar { transform: translateX(-100%); z-index: 50; }
.sidebar.open { transform: translateX(0); }
.main { margin-left: 0; padding: 24px 20px; }
.hamburger { display: flex; }
.header-nav { display: none; }
.overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 40; }
.overlay.visible { display: block; }
.flow-grid { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<header class="header">
<button class="hamburger" id="hamburger" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"><rect y="4" width="22" height="2" rx="1" fill="white"/><rect y="10" width="22" height="2" rx="1" fill="white"/><rect y="16" width="22" height="2" rx="1" fill="white"/></svg>
</button>
<a href="/docs/" class="header-logo"><div class="header-logo-mark">A</div>AAMOS</a>
<span class="header-badge">API DOCS</span>
<nav class="header-nav">
<a href="https://aamos.ai">Home</a>
<a href="/docs/">Docs</a>
<a href="https://aamos.ai/signup/" class="btn-primary">Get API Key</a>
</nav>
</header>
<div class="overlay" id="overlay"></div>
<div class="layout">
<nav class="sidebar" id="sidebar">
<div class="sidebar-section">
<div class="sidebar-label">Getting Started</div>
<a href="/docs/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h12v2H2zm0 4h12v2H2zm0 4h8v2H2z"/></svg>Overview</a>
<a href="/docs/authentication/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>Authentication</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">APIs</div>
<a href="/docs/vims/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M1 3h14v2H1zm2 4h10v2H3zm2 4h6v2H5z"/></svg>VIMS</a>
<a href="/docs/reality-alerts/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1L1 14h14L8 1zm0 3l5 9H3l5-9zm-1 3v3h2V7H7zm0 4v2h2v-2H7z"/></svg>Reality Alerts</a>
<a href="/docs/kyz/" class="sidebar-link active"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>KYZ</a>
<a href="/docs/modules/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h5v5H2zm7 0h5v5H9zm-7 7h5v5H2zm7 0h5v5H9z"/></svg>AAMOS Modules</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">On this page</div>
<a href="#flows" class="sidebar-link" style="font-size:12.5px">Verification Flows</a>
<a href="#create-session" class="sidebar-link" style="font-size:12.5px">Create Session</a>
<a href="#get-session" class="sidebar-link" style="font-size:12.5px">Get Session</a>
<a href="#submit" class="sidebar-link" style="font-size:12.5px">Submit Documents</a>
</div>
</nav>
<main class="main">
<div class="page-header">
<div class="breadcrumb"><a href="/docs/">Docs</a> / KYZ API</div>
<h1>KYZ API Reference</h1>
<p class="page-desc">Know Your Zone — identity verification with liveness detection, document scanning, and flexible hosted or API-native flows.</p>
</div>
<div class="info-box">
<span class="info-box-icon">📍</span>
<div class="info-box-body"><strong>Base path:</strong> <code class="inline-code">https://api.aamos.ai/v1/kyz/</code></div>
</div>
<h2 id="flows">Verification Flows</h2>
<p>KYZ supports two verification flows. Choose based on your integration needs:</p>
<div class="flow-grid">
<div class="flow-card">
<span class="flow-tag flow-hosted">Hosted</span>
<h4>Hosted Flow</h4>
<p>Redirect your user to a AAMOS-hosted verification page. No frontend work required. Best for quick integration and compliance.</p>
</div>
<div class="flow-card">
<span class="flow-tag flow-api">API Flow</span>
<h4>API Flow</h4>
<p>Submit documents and selfies programmatically via multipart upload. Full control over UX. Best for custom verification experiences.</p>
</div>
</div>
<h2 id="create-session">POST /v1/kyz/sessions</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/kyz/sessions</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Create a new verification session. Returns a session ID and, for hosted flow, a URL to redirect the user to.</p>
<h3>Request — application/json</h3>
<table class="params-table">
<thead><tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">user_ref</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">Your internal user identifier. Used to correlate results back to your system.</td></tr>
<tr><td class="param-name">flow</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">Verification flow: <code class="inline-code">hosted</code> or <code class="inline-code">api</code>.</td></tr>
<tr><td class="param-name">redirect_url</td><td class="param-type">string</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Where to redirect after hosted flow completes. Required when flow=hosted.</td></tr>
<tr><td class="param-name">webhook_url</td><td class="param-type">string</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Receive a POST notification when verification is complete.</td></tr>
</tbody>
</table>
<h3>Example — Hosted Flow</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/kyz/sessions</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-H <span class="tok-str">"Content-Type: application/json"</span> \
-d <span class="tok-str">'{
"user_ref": "user_123456",
"flow": "hosted",
"redirect_url": "https://your-app.example.com/verification-complete",
"webhook_url": "https://your-app.example.com/hooks/kyz"
}'</span></pre>
</div>
<h3>Response — 201 Created</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"session_id"</span>: <span class="tok-str">"kyz_5e2a8f1c7d"</span>,
<span class="tok-key">"hosted_url"</span>: <span class="tok-str">"https://verify.aamos.ai/kyz_5e2a8f1c7d"</span>,
<span class="tok-key">"expires_at"</span>: <span class="tok-str">"2025-01-15T11:00:00Z"</span>
}</pre>
</div>
<p>For hosted flow, redirect the user to <code class="inline-code">hosted_url</code>. The session expires after 30 minutes.</p>
</div>
</div>
<h2 id="get-session">GET /v1/kyz/sessions/:session_id</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-get">GET</span>
<span class="endpoint-path">/v1/kyz/sessions/:session_id</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Retrieve the current status and result of a verification session.</p>
<h3>Path Parameters</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">session_id</td><td class="param-type">string</td><td class="param-desc">The session ID returned by POST /v1/kyz/sessions.</td></tr>
</tbody>
</table>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">https://api.aamos.ai/v1/kyz/sessions/kyz_5e2a8f1c7d</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"session_id"</span>: <span class="tok-str">"kyz_5e2a8f1c7d"</span>,
<span class="tok-key">"status"</span>: <span class="tok-str">"approved"</span>,
<span class="tok-key">"decision"</span>: <span class="tok-str">"approved"</span>,
<span class="tok-key">"confidence"</span>: <span class="tok-num">0.97</span>,
<span class="tok-key">"liveness"</span>: <span class="tok-bool">true</span>,
<span class="tok-key">"document_country"</span>: <span class="tok-str">"SE"</span>,
<span class="tok-key">"document_type"</span>: <span class="tok-str">"passport"</span>,
<span class="tok-key">"completed_at"</span>: <span class="tok-str">"2025-01-15T10:45:00Z"</span>
}</pre>
</div>
<h3>Session Status Values</h3>
<table class="params-table">
<thead><tr><th>Status</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">pending</td><td class="param-desc">Session created, awaiting user action.</td></tr>
<tr><td class="param-name">in_progress</td><td class="param-desc">User has started verification.</td></tr>
<tr><td class="param-name">processing</td><td class="param-desc">Documents submitted, verification in progress.</td></tr>
<tr><td class="param-name">approved</td><td class="param-desc">Verification successful.</td></tr>
<tr><td class="param-name">rejected</td><td class="param-desc">Verification failed — document invalid, liveness failure, or fraud signal.</td></tr>
<tr><td class="param-name">expired</td><td class="param-desc">Session expired before completion.</td></tr>
</tbody>
</table>
</div>
</div>
<h2 id="submit">POST /v1/kyz/sessions/:session_id/submit</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/kyz/sessions/:session_id/submit</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Submit identity documents and selfie for API-flow verification. Only available when the session was created with <code class="inline-code">flow: "api"</code>.</p>
<div class="info-box warning">
<span class="info-box-icon">⚠️</span>
<div class="info-box-body"><strong>API flow only.</strong> This endpoint returns <code class="inline-code">403 Forbidden</code> for sessions created with <code class="inline-code">flow: "hosted"</code>.</div>
</div>
<h3>Request — multipart/form-data</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">id_front</td><td class="param-type">file</td><td><span class="param-req">Required</span></td><td class="param-desc">Front of the identity document. JPEG or PNG. Max 10 MB.</td></tr>
<tr><td class="param-name">id_back</td><td class="param-type">file</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Back of the identity document. Required for most national ID cards.</td></tr>
<tr><td class="param-name">selfie</td><td class="param-type">file</td><td><span class="param-req">Required</span></td><td class="param-desc">Live selfie photo for liveness and biometric matching. JPEG or PNG.</td></tr>
</tbody>
</table>
<h3>Example Request</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/kyz/sessions/kyz_5e2a8f1c7d/submit</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-F <span class="tok-str">"id_front=@/path/to/passport_front.jpg"</span> \
-F <span class="tok-str">"id_back=@/path/to/passport_back.jpg"</span> \
-F <span class="tok-str">"selfie=@/path/to/selfie.jpg"</span></pre>
</div>
<h3>Response — 202 Accepted</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"session_id"</span>: <span class="tok-str">"kyz_5e2a8f1c7d"</span>,
<span class="tok-key">"status"</span>: <span class="tok-str">"processing"</span>,
<span class="tok-key">"message"</span>: <span class="tok-str">"Documents received. Verification will complete in 10-30 seconds."</span>
}</pre>
</div>
<p>Poll <code class="inline-code">GET /v1/kyz/sessions/:session_id</code> or wait for your webhook to receive the final result.</p>
</div>
</div>
</main>
</div>
<script>
function copyCode(btn) {
const pre = btn.closest('.code-wrap').querySelector('pre');
navigator.clipboard.writeText(pre.innerText || pre.textContent).then(() => {
btn.textContent = 'Copied!'; btn.classList.add('copied');
setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('copied'); }, 2000);
});
}
const hamburger = document.getElementById('hamburger');
const sidebar = document.getElementById('sidebar');
const overlay = document.getElementById('overlay');
hamburger.addEventListener('click', () => { sidebar.classList.toggle('open'); overlay.classList.toggle('visible'); });
overlay.addEventListener('click', () => { sidebar.classList.remove('open'); overlay.classList.remove('visible'); });
</script>
</body>
</html>
+428
View File
@@ -0,0 +1,428 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AAMOS Modules — API Docs</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--navy: #0A2540; --blue: #635BFF; --blue-faint: #F0EFFF;
--text: #1a2332; --text-muted: #5a6880; --border: #e2e8f0;
--bg: #ffffff; --bg-sidebar: #f8fafc; --bg-code: #f1f5f9;
--sidebar-w: 260px; --header-h: 60px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', sans-serif; color: var(--text); background: var(--bg); font-size: 15px; line-height: 1.6; }
a { color: var(--blue); text-decoration: none; } a:hover { text-decoration: underline; }
.header { position: fixed; top: 0; left: 0; right: 0; height: var(--header-h); background: var(--navy); display: flex; align-items: center; padding: 0 24px; z-index: 100; gap: 16px; }
.header-logo { display: flex; align-items: center; gap: 10px; color: #fff; font-weight: 700; font-size: 18px; text-decoration: none; }
.header-logo-mark { width: 32px; height: 32px; background: var(--blue); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 800; color: #fff; }
.header-badge { background: rgba(99,91,255,0.25); color: #a5a0ff; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 20px; letter-spacing: 0.05em; }
.header-nav { margin-left: auto; display: flex; gap: 24px; align-items: center; }
.header-nav a { color: rgba(255,255,255,0.75); font-size: 14px; font-weight: 500; }
.header-nav a:hover { color: #fff; text-decoration: none; }
.btn-primary { background: var(--blue); color: #fff; padding: 8px 18px; border-radius: 8px; font-size: 13px; font-weight: 600; }
.hamburger { display: none; background: none; border: none; color: #fff; cursor: pointer; padding: 4px; }
.layout { display: flex; margin-top: var(--header-h); min-height: calc(100vh - var(--header-h)); }
.sidebar { width: var(--sidebar-w); background: var(--bg-sidebar); border-right: 1px solid var(--border); position: fixed; top: var(--header-h); bottom: 0; overflow-y: auto; padding: 24px 0; transition: transform 0.25s ease; }
.sidebar-section { margin-bottom: 8px; }
.sidebar-label { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; color: var(--text-muted); padding: 8px 20px 4px; text-transform: uppercase; }
.sidebar-link { display: flex; align-items: center; gap: 8px; padding: 7px 20px; color: var(--text-muted); font-size: 13.5px; font-weight: 500; transition: all 0.15s; border-left: 3px solid transparent; }
.sidebar-link:hover { color: var(--navy); background: var(--blue-faint); text-decoration: none; }
.sidebar-link.active { color: var(--blue); background: var(--blue-faint); border-left-color: var(--blue); }
.sidebar-link .icon { width: 16px; height: 16px; flex-shrink: 0; opacity: 0.7; }
.sidebar-indent { padding-left: 36px !important; font-size: 12.5px !important; }
.main { margin-left: var(--sidebar-w); flex: 1; padding: 48px 56px; max-width: calc(900px + var(--sidebar-w)); }
.page-header { margin-bottom: 40px; }
.breadcrumb { font-size: 13px; color: var(--text-muted); margin-bottom: 12px; }
.breadcrumb a { color: var(--text-muted); } .breadcrumb a:hover { color: var(--blue); }
h1 { font-size: 32px; font-weight: 800; color: var(--navy); margin-bottom: 12px; }
.page-desc { font-size: 16px; color: var(--text-muted); }
h2 { font-size: 22px; font-weight: 800; color: var(--navy); margin: 48px 0 6px; }
.module-divider { border: none; height: 3px; background: linear-gradient(90deg, var(--blue), transparent); border-radius: 4px; margin: 0 0 24px; }
h3 { font-size: 12px; font-weight: 600; color: var(--text-muted); margin: 16px 0 8px; text-transform: uppercase; letter-spacing: 0.06em; }
p { color: var(--text-muted); margin-bottom: 12px; }
.endpoint-card { border: 1px solid var(--border); border-radius: 12px; margin: 20px 0; overflow: hidden; }
.endpoint-header { display: flex; align-items: center; gap: 12px; padding: 18px 24px; background: var(--bg-sidebar); border-bottom: 1px solid var(--border); }
.method-badge { font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 700; padding: 4px 12px; border-radius: 6px; }
.method-post { background: #dcfce7; color: #15803d; }
.method-get { background: #dbeafe; color: #1d4ed8; }
.method-put { background: #fff7ed; color: #d97706; }
.endpoint-path { font-family: 'JetBrains Mono', monospace; font-size: 14px; color: var(--navy); font-weight: 500; }
.endpoint-body { padding: 24px; }
.endpoint-desc { color: var(--text-muted); font-size: 14px; margin-bottom: 20px; }
.params-table { width: 100%; border-collapse: collapse; font-size: 13.5px; margin: 8px 0 20px; }
.params-table th { text-align: left; padding: 8px 12px; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; color: var(--text-muted); border-bottom: 2px solid var(--border); text-transform: uppercase; }
.params-table td { padding: 10px 12px; border-bottom: 1px solid var(--border); vertical-align: top; }
.params-table tr:last-child td { border-bottom: none; }
.param-name { font-family: 'JetBrains Mono', monospace; color: var(--navy); font-size: 13px; }
.param-type { font-family: 'JetBrains Mono', monospace; color: var(--blue); font-size: 12px; }
.param-req { display: inline-block; background: #fef3c7; color: #92400e; font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 4px; text-transform: uppercase; }
.param-opt { display: inline-block; background: var(--bg-code); color: var(--text-muted); font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 4px; text-transform: uppercase; }
.param-desc { color: var(--text-muted); }
.code-wrap { position: relative; margin: 12px 0; }
.code-lang { position: absolute; top: 10px; right: 44px; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.4); text-transform: uppercase; letter-spacing: 0.05em; font-family: 'Inter', sans-serif; }
.copy-btn { position: absolute; top: 8px; right: 10px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.7); border-radius: 6px; padding: 4px 8px; font-size: 11px; cursor: pointer; font-family: 'Inter', sans-serif; font-weight: 500; transition: all 0.15s; }
.copy-btn:hover { background: rgba(255,255,255,0.2); color: #fff; }
.copy-btn.copied { color: #4ade80; border-color: #4ade80; }
pre { background: #0f1923; color: #e2e8f0; border-radius: 10px; padding: 18px 20px; overflow-x: auto; font-family: 'JetBrains Mono', monospace; font-size: 13px; line-height: 1.7; }
code { font-family: 'JetBrains Mono', monospace; }
.inline-code { background: var(--bg-code); color: #c2410c; padding: 2px 6px; border-radius: 4px; font-size: 13px; font-family: 'JetBrains Mono', monospace; }
.tok-kw { color: #c792ea; } .tok-str { color: #c3e88d; } .tok-num { color: #f78c6c; } .tok-cmt { color: #546e7a; }
.tok-url { color: #80cbc4; } .tok-key { color: #89ddff; } .tok-bool { color: #ff5572; }
.info-box { background: var(--blue-faint); border: 1px solid #d4d0ff; border-radius: 10px; padding: 16px 20px; display: flex; gap: 12px; margin: 20px 0; }
.info-box-icon { font-size: 18px; flex-shrink: 0; }
.info-box-body { font-size: 13.5px; color: var(--text); }
.info-box-body strong { color: var(--navy); }
@media (max-width: 768px) {
.sidebar { transform: translateX(-100%); z-index: 50; }
.sidebar.open { transform: translateX(0); }
.main { margin-left: 0; padding: 24px 20px; }
.hamburger { display: flex; }
.header-nav { display: none; }
.overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 40; }
.overlay.visible { display: block; }
}
</style>
</head>
<body>
<header class="header">
<button class="hamburger" id="hamburger" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"><rect y="4" width="22" height="2" rx="1" fill="white"/><rect y="10" width="22" height="2" rx="1" fill="white"/><rect y="16" width="22" height="2" rx="1" fill="white"/></svg>
</button>
<a href="/docs/" class="header-logo"><div class="header-logo-mark">A</div>AAMOS</a>
<span class="header-badge">API DOCS</span>
<nav class="header-nav">
<a href="https://aamos.ai">Home</a>
<a href="/docs/">Docs</a>
<a href="https://aamos.ai/signup/" class="btn-primary">Get API Key</a>
</nav>
</header>
<div class="overlay" id="overlay"></div>
<div class="layout">
<nav class="sidebar" id="sidebar">
<div class="sidebar-section">
<div class="sidebar-label">Getting Started</div>
<a href="/docs/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h12v2H2zm0 4h12v2H2zm0 4h8v2H2z"/></svg>Overview</a>
<a href="/docs/authentication/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>Authentication</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">APIs</div>
<a href="/docs/vims/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M1 3h14v2H1zm2 4h10v2H3zm2 4h6v2H5z"/></svg>VIMS</a>
<a href="/docs/reality-alerts/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1L1 14h14L8 1zm0 3l5 9H3l5-9zm-1 3v3h2V7H7zm0 4v2h2v-2H7z"/></svg>Reality Alerts</a>
<a href="/docs/kyz/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>KYZ</a>
<a href="/docs/modules/" class="sidebar-link active"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h5v5H2zm7 0h5v5H9zm-7 7h5v5H2zm7 0h5v5H9z"/></svg>AAMOS Modules</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">On this page</div>
<a href="#incident" class="sidebar-link" style="font-size:12.5px">Incident API</a>
<a href="#incident-create" class="sidebar-link sidebar-indent">Create Incident</a>
<a href="#incident-list" class="sidebar-link sidebar-indent">List Incidents</a>
<a href="#incident-status" class="sidebar-link sidebar-indent">Update Status</a>
<a href="#incident-comment" class="sidebar-link sidebar-indent">Add Comment</a>
<a href="#deviation" class="sidebar-link" style="font-size:12.5px">Deviation API</a>
<a href="#deviation-compare" class="sidebar-link sidebar-indent">Compare</a>
<a href="#deviation-baseline" class="sidebar-link sidebar-indent">Set Baseline</a>
</div>
</nav>
<main class="main">
<div class="page-header">
<div class="breadcrumb"><a href="/docs/">Docs</a> / AAMOS Modules</div>
<h1>AAMOS Modules Reference</h1>
<p class="page-desc">Incident management and deviation detection APIs for operational intelligence and asset monitoring workflows.</p>
</div>
<!-- INCIDENT API -->
<h2 id="incident">Incident API</h2>
<div class="module-divider"></div>
<div class="info-box">
<span class="info-box-icon">🚨</span>
<div class="info-box-body"><strong>Base path:</strong> <code class="inline-code">https://api.aamos.ai/v1/incident/</code> — Manage operational incidents with full lifecycle tracking, SLA enforcement, and team workflows.</div>
</div>
<div class="endpoint-card" id="incident-create">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/incident/incidents</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Create a new incident. The system automatically assigns an SLA deadline based on priority level.</p>
<h3>Request — application/json</h3>
<table class="params-table">
<thead><tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">title</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">Short, descriptive title for the incident.</td></tr>
<tr><td class="param-name">priority</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">One of: <code class="inline-code">critical</code>, <code class="inline-code">high</code>, <code class="inline-code">medium</code>, <code class="inline-code">low</code>.</td></tr>
<tr><td class="param-name">source</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">Origin system or sensor that triggered the incident (e.g. <code class="inline-code">vims</code>, <code class="inline-code">reality-alerts</code>, <code class="inline-code">manual</code>).</td></tr>
<tr><td class="param-name">assignee_group</td><td class="param-type">string</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Team or group responsible for resolution.</td></tr>
<tr><td class="param-name">description</td><td class="param-type">string</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Detailed description of the incident.</td></tr>
</tbody>
</table>
<h3>Example Request</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/incident/incidents</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-H <span class="tok-str">"Content-Type: application/json"</span> \
-d <span class="tok-str">'{
"title": "Unauthorized access detected at Site A",
"priority": "high",
"source": "vims",
"assignee_group": "security-ops",
"description": "VIMS analysis detected structural change at front gate. Change score: 0.74."
}'</span></pre>
</div>
<h3>Response — 201 Created</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"incident_id"</span>: <span class="tok-str">"inc_4b7e2f9a1c"</span>,
<span class="tok-key">"status"</span>: <span class="tok-str">"open"</span>,
<span class="tok-key">"priority"</span>: <span class="tok-str">"high"</span>,
<span class="tok-key">"sla_deadline"</span>: <span class="tok-str">"2025-01-15T14:30:00Z"</span>,
<span class="tok-key">"created_at"</span>: <span class="tok-str">"2025-01-15T10:30:00Z"</span>
}</pre>
</div>
</div>
</div>
<div class="endpoint-card" id="incident-list">
<div class="endpoint-header">
<span class="method-badge method-get">GET</span>
<span class="endpoint-path">/v1/incident/incidents</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">List incidents with optional filtering by status, priority, and pagination.</p>
<h3>Query Parameters</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">status</td><td class="param-type">string</td><td class="param-desc">Filter: <code class="inline-code">open</code>, <code class="inline-code">investigating</code>, <code class="inline-code">resolved</code>, <code class="inline-code">closed</code>.</td></tr>
<tr><td class="param-name">priority</td><td class="param-type">string</td><td class="param-desc">Filter: <code class="inline-code">critical</code>, <code class="inline-code">high</code>, <code class="inline-code">medium</code>, <code class="inline-code">low</code>.</td></tr>
<tr><td class="param-name">page</td><td class="param-type">integer</td><td class="param-desc">Page number (default: 1). 50 results per page.</td></tr>
</tbody>
</table>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">"https://api.aamos.ai/v1/incident/incidents?status=open&priority=high"</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"incidents"</span>: [
{
<span class="tok-key">"incident_id"</span>: <span class="tok-str">"inc_4b7e2f9a1c"</span>,
<span class="tok-key">"title"</span>: <span class="tok-str">"Unauthorized access detected at Site A"</span>,
<span class="tok-key">"status"</span>: <span class="tok-str">"open"</span>,
<span class="tok-key">"priority"</span>: <span class="tok-str">"high"</span>,
<span class="tok-key">"sla_deadline"</span>: <span class="tok-str">"2025-01-15T14:30:00Z"</span>,
<span class="tok-key">"created_at"</span>: <span class="tok-str">"2025-01-15T10:30:00Z"</span>
}
],
<span class="tok-key">"total"</span>: <span class="tok-num">1</span>,
<span class="tok-key">"page"</span>: <span class="tok-num">1</span>
}</pre>
</div>
</div>
</div>
<div class="endpoint-card" id="incident-status">
<div class="endpoint-header">
<span class="method-badge method-put">PUT</span>
<span class="endpoint-path">/v1/incident/incidents/:id/status</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Update the status of an incident through its lifecycle.</p>
<h3>Request — application/json</h3>
<table class="params-table">
<thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">status</td><td class="param-type">string</td><td class="param-desc">New status: <code class="inline-code">open</code><code class="inline-code">investigating</code><code class="inline-code">resolved</code><code class="inline-code">closed</code>.</td></tr>
</tbody>
</table>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X PUT <span class="tok-str">https://api.aamos.ai/v1/incident/incidents/inc_4b7e2f9a1c/status</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-H <span class="tok-str">"Content-Type: application/json"</span> \
-d <span class="tok-str">'{ "status": "investigating" }'</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"incident_id"</span>: <span class="tok-str">"inc_4b7e2f9a1c"</span>,
<span class="tok-key">"status"</span>: <span class="tok-str">"investigating"</span>,
<span class="tok-key">"updated_at"</span>: <span class="tok-str">"2025-01-15T11:15:00Z"</span>
}</pre>
</div>
</div>
</div>
<div class="endpoint-card" id="incident-comment">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/incident/incidents/:id/comments</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Add a comment to an incident for audit trail and team communication.</p>
<h3>Request — application/json</h3>
<table class="params-table">
<thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">text</td><td class="param-type">string</td><td class="param-desc">The comment text. Markdown supported.</td></tr>
</tbody>
</table>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/incident/incidents/inc_4b7e2f9a1c/comments</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-H <span class="tok-str">"Content-Type: application/json"</span> \
-d <span class="tok-str">'{ "text": "On-site team dispatched. ETA 20 minutes." }'</span></pre>
</div>
<h3>Response — 201 Created</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"comment_id"</span>: <span class="tok-str">"cmt_2e8a5f1b3d"</span>,
<span class="tok-key">"incident_id"</span>: <span class="tok-str">"inc_4b7e2f9a1c"</span>,
<span class="tok-key">"text"</span>: <span class="tok-str">"On-site team dispatched. ETA 20 minutes."</span>,
<span class="tok-key">"created_at"</span>: <span class="tok-str">"2025-01-15T11:20:00Z"</span>
}</pre>
</div>
</div>
</div>
<!-- DEVIATION API -->
<h2 id="deviation" style="margin-top: 60px">Deviation API</h2>
<div class="module-divider"></div>
<div class="info-box">
<span class="info-box-icon">📐</span>
<div class="info-box-body"><strong>Base path:</strong> <code class="inline-code">https://api.aamos.ai/v1/deviation/</code> — Detect visual deviations in assets against registered baselines, with configurable thresholds and region-level analysis.</div>
</div>
<div class="endpoint-card" id="deviation-compare">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/deviation/compare</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Compare an image against the registered baseline for an asset. Returns a deviation score, change classification, and actionable recommendation.</p>
<h3>Request — multipart/form-data</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">image</td><td class="param-type">file</td><td><span class="param-req">Required</span></td><td class="param-desc">Current image of the asset. JPEG, PNG, or WebP. Max 10 MB.</td></tr>
<tr><td class="param-name">asset_id</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">Your unique identifier for the asset being compared.</td></tr>
<tr><td class="param-name">threshold</td><td class="param-type">float</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Deviation threshold (0.01.0) above which changes are flagged. Default: <code class="inline-code">0.3</code>.</td></tr>
</tbody>
</table>
<h3>Example Request</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/deviation/compare</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-F <span class="tok-str">"image=@/path/to/asset_current.jpg"</span> \
-F <span class="tok-str">"asset_id=rack-server-b2"</span> \
-F <span class="tok-str">"threshold=0.25"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"asset_id"</span>: <span class="tok-str">"rack-server-b2"</span>,
<span class="tok-key">"deviation_score"</span>: <span class="tok-num">0.42</span>,
<span class="tok-key">"change_type"</span>: <span class="tok-str">"component_removal"</span>,
<span class="tok-key">"regions"</span>: [
{
<span class="tok-key">"bbox"</span>: [<span class="tok-num">200</span>, <span class="tok-num">150</span>, <span class="tok-num">450</span>, <span class="tok-num">320</span>],
<span class="tok-key">"deviation"</span>: <span class="tok-num">0.61</span>,
<span class="tok-key">"label"</span>: <span class="tok-str">"Missing hardware component (slot 4)"</span>
}
],
<span class="tok-key">"recommend_action"</span>: <span class="tok-str">"immediate_review"</span>,
<span class="tok-key">"analyzed_at"</span>: <span class="tok-str">"2025-01-15T10:30:00Z"</span>
}</pre>
</div>
<h3>Recommended Actions</h3>
<table class="params-table">
<thead><tr><th>Value</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">none</td><td class="param-desc">No action needed. Deviation within expected range.</td></tr>
<tr><td class="param-name">monitor</td><td class="param-desc">Minor deviation detected. Continue monitoring.</td></tr>
<tr><td class="param-name">review</td><td class="param-desc">Deviation above threshold. Schedule a review.</td></tr>
<tr><td class="param-name">immediate_review</td><td class="param-desc">Significant deviation. Requires immediate attention.</td></tr>
</tbody>
</table>
</div>
</div>
<div class="endpoint-card" id="deviation-baseline">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/deviation/baseline</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Register or update the baseline image for an asset. The baseline is the reference state used for all future comparisons.</p>
<h3>Request — multipart/form-data</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">asset_id</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">Your unique identifier for the asset. Created if new.</td></tr>
<tr><td class="param-name">image</td><td class="param-type">file</td><td><span class="param-req">Required</span></td><td class="param-desc">The reference (baseline) image. JPEG, PNG, or WebP.</td></tr>
</tbody>
</table>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/deviation/baseline</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-F <span class="tok-str">"asset_id=rack-server-b2"</span> \
-F <span class="tok-str">"image=@/path/to/rack_baseline.jpg"</span></pre>
</div>
<h3>Response — 201 Created</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"baseline_id"</span>: <span class="tok-str">"dbl_6f3c8e2a9d"</span>,
<span class="tok-key">"asset_id"</span>: <span class="tok-str">"rack-server-b2"</span>,
<span class="tok-key">"created_at"</span>: <span class="tok-str">"2025-01-15T09:00:00Z"</span>
}</pre>
</div>
</div>
</div>
</main>
</div>
<script>
function copyCode(btn) {
const pre = btn.closest('.code-wrap').querySelector('pre');
navigator.clipboard.writeText(pre.innerText || pre.textContent).then(() => {
btn.textContent = 'Copied!'; btn.classList.add('copied');
setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('copied'); }, 2000);
});
}
const hamburger = document.getElementById('hamburger');
const sidebar = document.getElementById('sidebar');
const overlay = document.getElementById('overlay');
hamburger.addEventListener('click', () => { sidebar.classList.toggle('open'); overlay.classList.toggle('visible'); });
overlay.addEventListener('click', () => { sidebar.classList.remove('open'); overlay.classList.remove('visible'); });
</script>
</body>
</html>
@@ -0,0 +1,373 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reality Alerts API — AAMOS API Docs</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--navy: #0A2540; --blue: #635BFF; --blue-faint: #F0EFFF;
--text: #1a2332; --text-muted: #5a6880; --border: #e2e8f0;
--bg: #ffffff; --bg-sidebar: #f8fafc; --bg-code: #f1f5f9;
--sidebar-w: 260px; --header-h: 60px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', sans-serif; color: var(--text); background: var(--bg); font-size: 15px; line-height: 1.6; }
a { color: var(--blue); text-decoration: none; } a:hover { text-decoration: underline; }
.header { position: fixed; top: 0; left: 0; right: 0; height: var(--header-h); background: var(--navy); display: flex; align-items: center; padding: 0 24px; z-index: 100; gap: 16px; }
.header-logo { display: flex; align-items: center; gap: 10px; color: #fff; font-weight: 700; font-size: 18px; text-decoration: none; }
.header-logo-mark { width: 32px; height: 32px; background: var(--blue); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 800; color: #fff; }
.header-badge { background: rgba(99,91,255,0.25); color: #a5a0ff; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 20px; letter-spacing: 0.05em; }
.header-nav { margin-left: auto; display: flex; gap: 24px; align-items: center; }
.header-nav a { color: rgba(255,255,255,0.75); font-size: 14px; font-weight: 500; }
.header-nav a:hover { color: #fff; text-decoration: none; }
.btn-primary { background: var(--blue); color: #fff; padding: 8px 18px; border-radius: 8px; font-size: 13px; font-weight: 600; }
.hamburger { display: none; background: none; border: none; color: #fff; cursor: pointer; padding: 4px; }
.layout { display: flex; margin-top: var(--header-h); min-height: calc(100vh - var(--header-h)); }
.sidebar { width: var(--sidebar-w); background: var(--bg-sidebar); border-right: 1px solid var(--border); position: fixed; top: var(--header-h); bottom: 0; overflow-y: auto; padding: 24px 0; transition: transform 0.25s ease; }
.sidebar-section { margin-bottom: 8px; }
.sidebar-label { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; color: var(--text-muted); padding: 8px 20px 4px; text-transform: uppercase; }
.sidebar-link { display: flex; align-items: center; gap: 8px; padding: 7px 20px; color: var(--text-muted); font-size: 13.5px; font-weight: 500; transition: all 0.15s; border-left: 3px solid transparent; }
.sidebar-link:hover { color: var(--navy); background: var(--blue-faint); text-decoration: none; }
.sidebar-link.active { color: var(--blue); background: var(--blue-faint); border-left-color: var(--blue); }
.sidebar-link .icon { width: 16px; height: 16px; flex-shrink: 0; opacity: 0.7; }
.main { margin-left: var(--sidebar-w); flex: 1; padding: 48px 56px; max-width: calc(900px + var(--sidebar-w)); }
.page-header { margin-bottom: 40px; }
.breadcrumb { font-size: 13px; color: var(--text-muted); margin-bottom: 12px; }
.breadcrumb a { color: var(--text-muted); } .breadcrumb a:hover { color: var(--blue); }
h1 { font-size: 32px; font-weight: 800; color: var(--navy); margin-bottom: 12px; }
.page-desc { font-size: 16px; color: var(--text-muted); }
h2 { font-size: 20px; font-weight: 700; color: var(--navy); margin: 40px 0 14px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
h3 { font-size: 12px; font-weight: 600; color: var(--text-muted); margin: 16px 0 8px; text-transform: uppercase; letter-spacing: 0.06em; }
p { color: var(--text-muted); margin-bottom: 12px; }
.divider { border: none; border-top: 1px solid var(--border); margin: 40px 0; }
.endpoint-card { border: 1px solid var(--border); border-radius: 12px; margin: 24px 0; overflow: hidden; }
.endpoint-header { display: flex; align-items: center; gap: 12px; padding: 18px 24px; background: var(--bg-sidebar); border-bottom: 1px solid var(--border); }
.method-badge { font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 700; padding: 4px 12px; border-radius: 6px; }
.method-post { background: #dcfce7; color: #15803d; }
.method-get { background: #dbeafe; color: #1d4ed8; }
.method-delete { background: #fff5f5; color: #dc2626; }
.endpoint-path { font-family: 'JetBrains Mono', monospace; font-size: 14px; color: var(--navy); font-weight: 500; }
.endpoint-body { padding: 24px; }
.endpoint-desc { color: var(--text-muted); font-size: 14px; margin-bottom: 20px; }
.params-table { width: 100%; border-collapse: collapse; font-size: 13.5px; margin: 8px 0 20px; }
.params-table th { text-align: left; padding: 8px 12px; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; color: var(--text-muted); border-bottom: 2px solid var(--border); text-transform: uppercase; }
.params-table td { padding: 10px 12px; border-bottom: 1px solid var(--border); vertical-align: top; }
.params-table tr:last-child td { border-bottom: none; }
.param-name { font-family: 'JetBrains Mono', monospace; color: var(--navy); font-size: 13px; }
.param-type { font-family: 'JetBrains Mono', monospace; color: var(--blue); font-size: 12px; }
.param-req { display: inline-block; background: #fef3c7; color: #92400e; font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 4px; text-transform: uppercase; }
.param-opt { display: inline-block; background: var(--bg-code); color: var(--text-muted); font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 4px; text-transform: uppercase; }
.param-desc { color: var(--text-muted); }
.code-wrap { position: relative; margin: 12px 0; }
.code-lang { position: absolute; top: 10px; right: 44px; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.4); text-transform: uppercase; letter-spacing: 0.05em; font-family: 'Inter', sans-serif; }
.copy-btn { position: absolute; top: 8px; right: 10px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.7); border-radius: 6px; padding: 4px 8px; font-size: 11px; cursor: pointer; font-family: 'Inter', sans-serif; font-weight: 500; transition: all 0.15s; }
.copy-btn:hover { background: rgba(255,255,255,0.2); color: #fff; }
.copy-btn.copied { color: #4ade80; border-color: #4ade80; }
pre { background: #0f1923; color: #e2e8f0; border-radius: 10px; padding: 18px 20px; overflow-x: auto; font-family: 'JetBrains Mono', monospace; font-size: 13px; line-height: 1.7; }
code { font-family: 'JetBrains Mono', monospace; }
.inline-code { background: var(--bg-code); color: #c2410c; padding: 2px 6px; border-radius: 4px; font-size: 13px; font-family: 'JetBrains Mono', monospace; }
.tok-kw { color: #c792ea; } .tok-str { color: #c3e88d; } .tok-num { color: #f78c6c; } .tok-cmt { color: #546e7a; }
.tok-url { color: #80cbc4; } .tok-key { color: #89ddff; } .tok-bool { color: #ff5572; }
.info-box { background: var(--blue-faint); border: 1px solid #d4d0ff; border-radius: 10px; padding: 16px 20px; display: flex; gap: 12px; margin: 20px 0; }
.info-box.warning { background: #fffbeb; border-color: #fde68a; }
.info-box-icon { font-size: 18px; flex-shrink: 0; }
.info-box-body { font-size: 13.5px; color: var(--text); }
.info-box-body strong { color: var(--navy); }
@media (max-width: 768px) {
.sidebar { transform: translateX(-100%); z-index: 50; }
.sidebar.open { transform: translateX(0); }
.main { margin-left: 0; padding: 24px 20px; }
.hamburger { display: flex; }
.header-nav { display: none; }
.overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 40; }
.overlay.visible { display: block; }
}
</style>
</head>
<body>
<header class="header">
<button class="hamburger" id="hamburger" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"><rect y="4" width="22" height="2" rx="1" fill="white"/><rect y="10" width="22" height="2" rx="1" fill="white"/><rect y="16" width="22" height="2" rx="1" fill="white"/></svg>
</button>
<a href="/docs/" class="header-logo"><div class="header-logo-mark">A</div>AAMOS</a>
<span class="header-badge">API DOCS</span>
<nav class="header-nav">
<a href="https://aamos.ai">Home</a>
<a href="/docs/">Docs</a>
<a href="https://aamos.ai/signup/" class="btn-primary">Get API Key</a>
</nav>
</header>
<div class="overlay" id="overlay"></div>
<div class="layout">
<nav class="sidebar" id="sidebar">
<div class="sidebar-section">
<div class="sidebar-label">Getting Started</div>
<a href="/docs/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h12v2H2zm0 4h12v2H2zm0 4h8v2H2z"/></svg>Overview</a>
<a href="/docs/authentication/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>Authentication</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">APIs</div>
<a href="/docs/vims/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M1 3h14v2H1zm2 4h10v2H3zm2 4h6v2H5z"/></svg>VIMS</a>
<a href="/docs/reality-alerts/" class="sidebar-link active"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1L1 14h14L8 1zm0 3l5 9H3l5-9zm-1 3v3h2V7H7zm0 4v2h2v-2H7z"/></svg>Reality Alerts</a>
<a href="/docs/kyz/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>KYZ</a>
<a href="/docs/modules/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h5v5H2zm7 0h5v5H9zm-7 7h5v5H2zm7 0h5v5H9z"/></svg>AAMOS Modules</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">On this page</div>
<a href="#create-sub" class="sidebar-link" style="font-size:12.5px">Create Subscription</a>
<a href="#list-subs" class="sidebar-link" style="font-size:12.5px">List Subscriptions</a>
<a href="#delete-sub" class="sidebar-link" style="font-size:12.5px">Delete Subscription</a>
<a href="#list-alerts" class="sidebar-link" style="font-size:12.5px">List Alerts</a>
<a href="#get-alert" class="sidebar-link" style="font-size:12.5px">Get Alert</a>
</div>
</nav>
<main class="main">
<div class="page-header">
<div class="breadcrumb"><a href="/docs/">Docs</a> / Reality Alerts API</div>
<h1>Reality Alerts API Reference</h1>
<p class="page-desc">Subscribe to real-world event streams and receive webhook notifications when conditions match your geographic and severity criteria.</p>
</div>
<div class="info-box">
<span class="info-box-icon">📍</span>
<div class="info-box-body"><strong>Base path:</strong> <code class="inline-code">https://api.aamos.ai/v1/reality-alerts/</code></div>
</div>
<div class="info-box warning">
<span class="info-box-icon">🌍</span>
<div class="info-box-body"><strong>Webhook delivery:</strong> Your <code class="inline-code">webhook_url</code> must be publicly accessible and respond with <code class="inline-code">HTTP 200</code> within 5 seconds. Failed deliveries are retried up to 3 times with exponential backoff.</div>
</div>
<h2 id="create-sub">POST /v1/reality-alerts/subscriptions</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/reality-alerts/subscriptions</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Create a new alert subscription. You will receive webhook notifications when real-world events matching your criteria are detected within the specified bounding box.</p>
<h3>Request — application/json</h3>
<table class="params-table">
<thead><tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">webhook_url</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">HTTPS URL to receive POST notifications when alerts trigger.</td></tr>
<tr><td class="param-name">categories</td><td class="param-type">string[]</td><td><span class="param-req">Required</span></td><td class="param-desc">Event categories to subscribe to. See category list below.</td></tr>
<tr><td class="param-name">bbox</td><td class="param-type">float[4]</td><td><span class="param-req">Required</span></td><td class="param-desc">Geographic bounding box: [west, south, east, north] in WGS84 decimal degrees.</td></tr>
<tr><td class="param-name">min_severity</td><td class="param-type">integer</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Minimum severity level (15). Default: 1 (all severities).</td></tr>
</tbody>
</table>
<h3>Alert Categories</h3>
<table class="params-table">
<thead><tr><th>Category</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">fire</td><td class="param-desc">Fire and wildfire events</td></tr>
<tr><td class="param-name">flood</td><td class="param-desc">Flooding and water events</td></tr>
<tr><td class="param-name">infrastructure</td><td class="param-desc">Infrastructure failures (power, roads, utilities)</td></tr>
<tr><td class="param-name">security</td><td class="param-desc">Security incidents and public safety events</td></tr>
<tr><td class="param-name">weather</td><td class="param-desc">Severe weather conditions</td></tr>
<tr><td class="param-name">environmental</td><td class="param-desc">Environmental events and hazards</td></tr>
</tbody>
</table>
<h3>Example Request</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/reality-alerts/subscriptions</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-H <span class="tok-str">"Content-Type: application/json"</span> \
-d <span class="tok-str">'{
"webhook_url": "https://your-app.example.com/hooks/alerts",
"categories": ["fire", "flood", "infrastructure"],
"bbox": [17.8, 59.2, 18.2, 59.4],
"min_severity": 3
}'</span></pre>
</div>
<h3>Response — 201 Created</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"subscription_id"</span>: <span class="tok-str">"sub_8c2f1a3e5b"</span>,
<span class="tok-key">"status"</span>: <span class="tok-str">"active"</span>,
<span class="tok-key">"webhook_url"</span>: <span class="tok-str">"https://your-app.example.com/hooks/alerts"</span>,
<span class="tok-key">"categories"</span>: [<span class="tok-str">"fire"</span>, <span class="tok-str">"flood"</span>, <span class="tok-str">"infrastructure"</span>],
<span class="tok-key">"bbox"</span>: [<span class="tok-num">17.8</span>, <span class="tok-num">59.2</span>, <span class="tok-num">18.2</span>, <span class="tok-num">59.4</span>],
<span class="tok-key">"min_severity"</span>: <span class="tok-num">3</span>,
<span class="tok-key">"created_at"</span>: <span class="tok-str">"2025-01-15T09:00:00Z"</span>
}</pre>
</div>
<h3>Webhook Payload Example</h3>
<p>When an alert triggers, your webhook receives a POST with this body:</p>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"event"</span>: <span class="tok-str">"alert.triggered"</span>,
<span class="tok-key">"subscription_id"</span>: <span class="tok-str">"sub_8c2f1a3e5b"</span>,
<span class="tok-key">"alert"</span>: {
<span class="tok-key">"alert_id"</span>: <span class="tok-str">"alt_9d1e7b4f2c"</span>,
<span class="tok-key">"category"</span>: <span class="tok-str">"fire"</span>,
<span class="tok-key">"severity"</span>: <span class="tok-num">4</span>,
<span class="tok-key">"title"</span>: <span class="tok-str">"Wildfire reported near monitored area"</span>,
<span class="tok-key">"location"</span>: { <span class="tok-key">"lat"</span>: <span class="tok-num">59.31</span>, <span class="tok-key">"lng"</span>: <span class="tok-num">18.05</span> },
<span class="tok-key">"detected_at"</span>: <span class="tok-str">"2025-01-15T11:00:00Z"</span>
}
}</pre>
</div>
</div>
</div>
<h2 id="list-subs">GET /v1/reality-alerts/subscriptions</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-get">GET</span>
<span class="endpoint-path">/v1/reality-alerts/subscriptions</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">List all active subscriptions for your API key.</p>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">https://api.aamos.ai/v1/reality-alerts/subscriptions</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"subscriptions"</span>: [
{
<span class="tok-key">"subscription_id"</span>: <span class="tok-str">"sub_8c2f1a3e5b"</span>,
<span class="tok-key">"status"</span>: <span class="tok-str">"active"</span>,
<span class="tok-key">"categories"</span>: [<span class="tok-str">"fire"</span>, <span class="tok-str">"flood"</span>],
<span class="tok-key">"created_at"</span>: <span class="tok-str">"2025-01-15T09:00:00Z"</span>
}
]
}</pre>
</div>
</div>
</div>
<h2 id="delete-sub">DELETE /v1/reality-alerts/subscriptions/:id</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-delete">DELETE</span>
<span class="endpoint-path">/v1/reality-alerts/subscriptions/:id</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Cancel and delete a subscription. You will stop receiving webhook notifications immediately.</p>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X DELETE <span class="tok-str">https://api.aamos.ai/v1/reality-alerts/subscriptions/sub_8c2f1a3e5b</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
<h3>Response — 204 No Content</h3>
<p>An empty <code class="inline-code">204</code> response confirms deletion.</p>
</div>
</div>
<h2 id="list-alerts">GET /v1/reality-alerts/alerts</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-get">GET</span>
<span class="endpoint-path">/v1/reality-alerts/alerts</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Query historical alerts matching your filters. Useful for backfill, auditing, or building dashboards.</p>
<h3>Query Parameters</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">from</td><td class="param-type">string</td><td><span class="param-opt">Optional</span></td><td class="param-desc">ISO 8601 timestamp. Filter alerts detected after this time.</td></tr>
<tr><td class="param-name">to</td><td class="param-type">string</td><td><span class="param-opt">Optional</span></td><td class="param-desc">ISO 8601 timestamp. Filter alerts detected before this time.</td></tr>
<tr><td class="param-name">category</td><td class="param-type">string</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Filter by alert category (e.g. <code class="inline-code">fire</code>, <code class="inline-code">flood</code>).</td></tr>
<tr><td class="param-name">min_severity</td><td class="param-type">integer</td><td><span class="param-opt">Optional</span></td><td class="param-desc">Minimum severity level (15).</td></tr>
</tbody>
</table>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">"https://api.aamos.ai/v1/reality-alerts/alerts?from=2025-01-01T00:00:00Z&category=fire&min_severity=3"</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"alerts"</span>: [
{
<span class="tok-key">"alert_id"</span>: <span class="tok-str">"alt_9d1e7b4f2c"</span>,
<span class="tok-key">"category"</span>: <span class="tok-str">"fire"</span>,
<span class="tok-key">"severity"</span>: <span class="tok-num">4</span>,
<span class="tok-key">"title"</span>: <span class="tok-str">"Wildfire reported near monitored area"</span>,
<span class="tok-key">"location"</span>: { <span class="tok-key">"lat"</span>: <span class="tok-num">59.31</span>, <span class="tok-key">"lng"</span>: <span class="tok-num">18.05</span> },
<span class="tok-key">"detected_at"</span>: <span class="tok-str">"2025-01-15T11:00:00Z"</span>
}
],
<span class="tok-key">"total"</span>: <span class="tok-num">1</span>
}</pre>
</div>
</div>
</div>
<h2 id="get-alert">GET /v1/reality-alerts/alerts/:alert_id</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-get">GET</span>
<span class="endpoint-path">/v1/reality-alerts/alerts/:alert_id</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Retrieve the full details of a specific alert by ID, including enriched metadata.</p>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">https://api.aamos.ai/v1/reality-alerts/alerts/alt_9d1e7b4f2c</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"alert_id"</span>: <span class="tok-str">"alt_9d1e7b4f2c"</span>,
<span class="tok-key">"category"</span>: <span class="tok-str">"fire"</span>,
<span class="tok-key">"severity"</span>: <span class="tok-num">4</span>,
<span class="tok-key">"title"</span>: <span class="tok-str">"Wildfire reported near monitored area"</span>,
<span class="tok-key">"description"</span>: <span class="tok-str">"Active fire detected within your subscription area. Estimated spread: 2.3 km²."</span>,
<span class="tok-key">"location"</span>: {
<span class="tok-key">"lat"</span>: <span class="tok-num">59.31</span>,
<span class="tok-key">"lng"</span>: <span class="tok-num">18.05</span>,
<span class="tok-key">"radius_m"</span>: <span class="tok-num">800</span>
},
<span class="tok-key">"sources"</span>: [<span class="tok-str">"satellite"</span>, <span class="tok-str">"sensor_network"</span>],
<span class="tok-key">"detected_at"</span>: <span class="tok-str">"2025-01-15T11:00:00Z"</span>,
<span class="tok-key">"updated_at"</span>: <span class="tok-str">"2025-01-15T11:45:00Z"</span>,
<span class="tok-key">"status"</span>: <span class="tok-str">"active"</span>
}</pre>
</div>
</div>
</div>
</main>
</div>
<script>
function copyCode(btn) {
const pre = btn.closest('.code-wrap').querySelector('pre');
navigator.clipboard.writeText(pre.innerText || pre.textContent).then(() => {
btn.textContent = 'Copied!'; btn.classList.add('copied');
setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('copied'); }, 2000);
});
}
const hamburger = document.getElementById('hamburger');
const sidebar = document.getElementById('sidebar');
const overlay = document.getElementById('overlay');
hamburger.addEventListener('click', () => { sidebar.classList.toggle('open'); overlay.classList.toggle('visible'); });
overlay.addEventListener('click', () => { sidebar.classList.remove('open'); overlay.classList.remove('visible'); });
</script>
</body>
</html>
+348
View File
@@ -0,0 +1,348 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VIMS API — AAMOS API Docs</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--navy: #0A2540; --blue: #635BFF; --blue-faint: #F0EFFF;
--text: #1a2332; --text-muted: #5a6880; --border: #e2e8f0;
--bg: #ffffff; --bg-sidebar: #f8fafc; --bg-code: #f1f5f9;
--sidebar-w: 260px; --header-h: 60px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Inter', sans-serif; color: var(--text); background: var(--bg); font-size: 15px; line-height: 1.6; }
a { color: var(--blue); text-decoration: none; } a:hover { text-decoration: underline; }
.header { position: fixed; top: 0; left: 0; right: 0; height: var(--header-h); background: var(--navy); display: flex; align-items: center; padding: 0 24px; z-index: 100; gap: 16px; }
.header-logo { display: flex; align-items: center; gap: 10px; color: #fff; font-weight: 700; font-size: 18px; text-decoration: none; }
.header-logo-mark { width: 32px; height: 32px; background: var(--blue); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 800; color: #fff; }
.header-badge { background: rgba(99,91,255,0.25); color: #a5a0ff; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 20px; letter-spacing: 0.05em; }
.header-nav { margin-left: auto; display: flex; gap: 24px; align-items: center; }
.header-nav a { color: rgba(255,255,255,0.75); font-size: 14px; font-weight: 500; }
.header-nav a:hover { color: #fff; text-decoration: none; }
.btn-primary { background: var(--blue); color: #fff; padding: 8px 18px; border-radius: 8px; font-size: 13px; font-weight: 600; }
.hamburger { display: none; background: none; border: none; color: #fff; cursor: pointer; padding: 4px; }
.layout { display: flex; margin-top: var(--header-h); min-height: calc(100vh - var(--header-h)); }
.sidebar { width: var(--sidebar-w); background: var(--bg-sidebar); border-right: 1px solid var(--border); position: fixed; top: var(--header-h); bottom: 0; overflow-y: auto; padding: 24px 0; transition: transform 0.25s ease; }
.sidebar-section { margin-bottom: 8px; }
.sidebar-label { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; color: var(--text-muted); padding: 8px 20px 4px; text-transform: uppercase; }
.sidebar-link { display: flex; align-items: center; gap: 8px; padding: 7px 20px; color: var(--text-muted); font-size: 13.5px; font-weight: 500; transition: all 0.15s; border-left: 3px solid transparent; }
.sidebar-link:hover { color: var(--navy); background: var(--blue-faint); text-decoration: none; }
.sidebar-link.active { color: var(--blue); background: var(--blue-faint); border-left-color: var(--blue); }
.sidebar-link .icon { width: 16px; height: 16px; flex-shrink: 0; opacity: 0.7; }
.main { margin-left: var(--sidebar-w); flex: 1; padding: 48px 56px; max-width: calc(900px + var(--sidebar-w)); }
.page-header { margin-bottom: 40px; }
.breadcrumb { font-size: 13px; color: var(--text-muted); margin-bottom: 12px; }
.breadcrumb a { color: var(--text-muted); } .breadcrumb a:hover { color: var(--blue); }
h1 { font-size: 32px; font-weight: 800; color: var(--navy); margin-bottom: 12px; }
.page-desc { font-size: 16px; color: var(--text-muted); }
h2 { font-size: 20px; font-weight: 700; color: var(--navy); margin: 40px 0 14px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
h3 { font-size: 15px; font-weight: 600; color: var(--text-muted); margin: 16px 0 8px; text-transform: uppercase; letter-spacing: 0.06em; font-size: 12px; }
p { color: var(--text-muted); margin-bottom: 12px; }
.divider { border: none; border-top: 1px solid var(--border); margin: 40px 0; }
/* Endpoint card */
.endpoint-card { border: 1px solid var(--border); border-radius: 12px; margin: 24px 0; overflow: hidden; }
.endpoint-header { display: flex; align-items: center; gap: 12px; padding: 18px 24px; background: var(--bg-sidebar); border-bottom: 1px solid var(--border); }
.method-badge { font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 700; padding: 4px 12px; border-radius: 6px; }
.method-post { background: #dcfce7; color: #15803d; }
.method-get { background: #dbeafe; color: #1d4ed8; }
.method-delete { background: #fff5f5; color: #dc2626; }
.method-put { background: #fff7ed; color: #d97706; }
.endpoint-path { font-family: 'JetBrains Mono', monospace; font-size: 14px; color: var(--navy); font-weight: 500; }
.endpoint-body { padding: 24px; }
.endpoint-desc { color: var(--text-muted); font-size: 14px; margin-bottom: 20px; }
/* Params table */
.params-table { width: 100%; border-collapse: collapse; font-size: 13.5px; margin: 8px 0 20px; }
.params-table th { text-align: left; padding: 8px 12px; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; color: var(--text-muted); border-bottom: 2px solid var(--border); text-transform: uppercase; }
.params-table td { padding: 10px 12px; border-bottom: 1px solid var(--border); vertical-align: top; }
.params-table tr:last-child td { border-bottom: none; }
.param-name { font-family: 'JetBrains Mono', monospace; color: var(--navy); font-size: 13px; }
.param-type { font-family: 'JetBrains Mono', monospace; color: var(--blue); font-size: 12px; }
.param-req { display: inline-block; background: #fef3c7; color: #92400e; font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 4px; text-transform: uppercase; }
.param-opt { display: inline-block; background: var(--bg-code); color: var(--text-muted); font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 4px; text-transform: uppercase; }
.param-desc { color: var(--text-muted); }
/* Code */
.code-wrap { position: relative; margin: 12px 0; }
.code-lang { position: absolute; top: 10px; right: 44px; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.4); text-transform: uppercase; letter-spacing: 0.05em; font-family: 'Inter', sans-serif; }
.copy-btn { position: absolute; top: 8px; right: 10px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.7); border-radius: 6px; padding: 4px 8px; font-size: 11px; cursor: pointer; font-family: 'Inter', sans-serif; font-weight: 500; transition: all 0.15s; }
.copy-btn:hover { background: rgba(255,255,255,0.2); color: #fff; }
.copy-btn.copied { color: #4ade80; border-color: #4ade80; }
pre { background: #0f1923; color: #e2e8f0; border-radius: 10px; padding: 18px 20px; overflow-x: auto; font-family: 'JetBrains Mono', monospace; font-size: 13px; line-height: 1.7; }
code { font-family: 'JetBrains Mono', monospace; }
.inline-code { background: var(--bg-code); color: #c2410c; padding: 2px 6px; border-radius: 4px; font-size: 13px; font-family: 'JetBrains Mono', monospace; }
.tok-kw { color: #c792ea; } .tok-str { color: #c3e88d; } .tok-num { color: #f78c6c; } .tok-cmt { color: #546e7a; }
.tok-url { color: #80cbc4; } .tok-key { color: #89ddff; } .tok-bool { color: #ff5572; }
.tok-method { color: #ffcb6b; font-weight: 600; } .tok-path { color: #80cbc4; }
.info-box { background: var(--blue-faint); border: 1px solid #d4d0ff; border-radius: 10px; padding: 16px 20px; display: flex; gap: 12px; margin: 20px 0; }
.info-box-icon { font-size: 18px; flex-shrink: 0; }
.info-box-body { font-size: 13.5px; color: var(--text); }
.info-box-body strong { color: var(--navy); }
@media (max-width: 768px) {
.sidebar { transform: translateX(-100%); z-index: 50; }
.sidebar.open { transform: translateX(0); }
.main { margin-left: 0; padding: 24px 20px; }
.hamburger { display: flex; }
.header-nav { display: none; }
.overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 40; }
.overlay.visible { display: block; }
.endpoint-header { flex-wrap: wrap; }
}
</style>
</head>
<body>
<header class="header">
<button class="hamburger" id="hamburger" aria-label="Menu">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"><rect y="4" width="22" height="2" rx="1" fill="white"/><rect y="10" width="22" height="2" rx="1" fill="white"/><rect y="16" width="22" height="2" rx="1" fill="white"/></svg>
</button>
<a href="/docs/" class="header-logo"><div class="header-logo-mark">A</div>AAMOS</a>
<span class="header-badge">API DOCS</span>
<nav class="header-nav">
<a href="https://aamos.ai">Home</a>
<a href="/docs/">Docs</a>
<a href="https://aamos.ai/signup/" class="btn-primary">Get API Key</a>
</nav>
</header>
<div class="overlay" id="overlay"></div>
<div class="layout">
<nav class="sidebar" id="sidebar">
<div class="sidebar-section">
<div class="sidebar-label">Getting Started</div>
<a href="/docs/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h12v2H2zm0 4h12v2H2zm0 4h8v2H2z"/></svg>Overview</a>
<a href="/docs/authentication/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>Authentication</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">APIs</div>
<a href="/docs/vims/" class="sidebar-link active"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M1 3h14v2H1zm2 4h10v2H3zm2 4h6v2H5z"/></svg>VIMS</a>
<a href="/docs/reality-alerts/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1L1 14h14L8 1zm0 3l5 9H3l5-9zm-1 3v3h2V7H7zm0 4v2h2v-2H7z"/></svg>Reality Alerts</a>
<a href="/docs/kyz/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1a4 4 0 110 8A4 4 0 018 1zm0 10c-4 0-7 2-7 3v1h14v-1c0-1-3-3-7-3z"/></svg>KYZ</a>
<a href="/docs/modules/" class="sidebar-link"><svg class="icon" viewBox="0 0 16 16" fill="currentColor"><path d="M2 2h5v5H2zm7 0h5v5H9zm-7 7h5v5H2zm7 0h5v5H9z"/></svg>AAMOS Modules</a>
</div>
<div class="sidebar-section">
<div class="sidebar-label">On this page</div>
<a href="#analyze" class="sidebar-link" style="font-size:12.5px">Analyze Image</a>
<a href="#baseline" class="sidebar-link" style="font-size:12.5px">Set Baseline</a>
<a href="#list-objects" class="sidebar-link" style="font-size:12.5px">List Objects</a>
<a href="#get-analysis" class="sidebar-link" style="font-size:12.5px">Get Analysis</a>
</div>
</nav>
<main class="main">
<div class="page-header">
<div class="breadcrumb"><a href="/docs/">Docs</a> / VIMS API</div>
<h1>VIMS API Reference</h1>
<p class="page-desc">Visual Integrity Monitoring System — detect changes, anomalies, and deviations in monitored objects using computer vision.</p>
</div>
<div class="info-box">
<span class="info-box-icon">📍</span>
<div class="info-box-body"><strong>Base path:</strong> All VIMS endpoints are under <code class="inline-code">https://api.aamos.ai/v1/vims/</code></div>
</div>
<h2 id="analyze">POST /v1/vims/analyze</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/vims/analyze</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Analyze an image for changes against the registered baseline for a given object. Returns a change score, risk level, and detected anomalies. The baseline is automatically updated if drift is within acceptable thresholds.</p>
<h3>Request — multipart/form-data</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">image</td><td class="param-type">file</td><td><span class="param-req">Required</span></td><td class="param-desc">The image to analyze. Accepted formats: JPEG, PNG, WebP. Max 10 MB.</td></tr>
<tr><td class="param-name">object_id</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">Your unique identifier for the monitored object. Must have an existing baseline.</td></tr>
<tr><td class="param-name">lat</td><td class="param-type">float</td><td><span class="param-opt">Optional</span></td><td class="param-desc">GPS latitude of the image capture location.</td></tr>
<tr><td class="param-name">lng</td><td class="param-type">float</td><td><span class="param-opt">Optional</span></td><td class="param-desc">GPS longitude of the image capture location.</td></tr>
</tbody>
</table>
<h3>Example Request</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/vims/analyze</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-F <span class="tok-str">"image=@/path/to/photo.jpg"</span> \
-F <span class="tok-str">"object_id=site-front-gate"</span> \
-F <span class="tok-str">"lat=59.3293"</span> \
-F <span class="tok-str">"lng=18.0686"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"analysis_id"</span>: <span class="tok-str">"an_7f3a9b2c1d"</span>,
<span class="tok-key">"object_id"</span>: <span class="tok-str">"site-front-gate"</span>,
<span class="tok-key">"change_detected"</span>: <span class="tok-bool">true</span>,
<span class="tok-key">"change_score"</span>: <span class="tok-num">0.74</span>,
<span class="tok-key">"risk_level"</span>: <span class="tok-str">"high"</span>,
<span class="tok-key">"detections"</span>: [
{
<span class="tok-key">"type"</span>: <span class="tok-str">"structural_change"</span>,
<span class="tok-key">"confidence"</span>: <span class="tok-num">0.91</span>,
<span class="tok-key">"bbox"</span>: [<span class="tok-num">120</span>, <span class="tok-num">45</span>, <span class="tok-num">380</span>, <span class="tok-num">290</span>],
<span class="tok-key">"label"</span>: <span class="tok-str">"Gate damage detected"</span>
}
],
<span class="tok-key">"baseline_updated"</span>: <span class="tok-bool">false</span>,
<span class="tok-key">"analyzed_at"</span>: <span class="tok-str">"2025-01-15T10:30:00Z"</span>
}</pre>
</div>
<h3>Risk Levels</h3>
<p>The <code class="inline-code">risk_level</code> field reflects the severity of detected change:</p>
<table class="params-table">
<thead><tr><th>Value</th><th>change_score range</th><th>Meaning</th></tr></thead>
<tbody>
<tr><td class="param-name">none</td><td class="param-type">0.0 0.1</td><td class="param-desc">No meaningful change detected.</td></tr>
<tr><td class="param-name">low</td><td class="param-type">0.1 0.3</td><td class="param-desc">Minor variation, within expected range.</td></tr>
<tr><td class="param-name">medium</td><td class="param-type">0.3 0.6</td><td class="param-desc">Notable change, review recommended.</td></tr>
<tr><td class="param-name">high</td><td class="param-type">0.6 1.0</td><td class="param-desc">Significant change, immediate review required.</td></tr>
</tbody>
</table>
</div>
</div>
<h2 id="baseline">POST /v1/vims/baseline</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-post">POST</span>
<span class="endpoint-path">/v1/vims/baseline</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Register a new baseline image for an object. The baseline is the reference state used for all subsequent analyze calls. You can update baselines as needed.</p>
<h3>Request — multipart/form-data</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">object_id</td><td class="param-type">string</td><td><span class="param-req">Required</span></td><td class="param-desc">Your unique identifier for this object. Will be created if it doesn't exist.</td></tr>
<tr><td class="param-name">image</td><td class="param-type">file</td><td><span class="param-req">Required</span></td><td class="param-desc">The baseline image. JPEG, PNG, or WebP. Max 10 MB.</td></tr>
</tbody>
</table>
<h3>Example Request</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> -X POST <span class="tok-str">https://api.aamos.ai/v1/vims/baseline</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span> \
-F <span class="tok-str">"object_id=site-front-gate"</span> \
-F <span class="tok-str">"image=@/path/to/baseline.jpg"</span></pre>
</div>
<h3>Response — 201 Created</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"baseline_id"</span>: <span class="tok-str">"bl_3d8e1f7a9b"</span>,
<span class="tok-key">"object_id"</span>: <span class="tok-str">"site-front-gate"</span>,
<span class="tok-key">"created_at"</span>: <span class="tok-str">"2025-01-15T09:00:00Z"</span>
}</pre>
</div>
</div>
</div>
<h2 id="list-objects">GET /v1/vims/objects</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-get">GET</span>
<span class="endpoint-path">/v1/vims/objects</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">List all monitored objects registered under your API key, with their baseline count and last analysis timestamp.</p>
<h3>Example Request</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">https://api.aamos.ai/v1/vims/objects</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"objects"</span>: [
{
<span class="tok-key">"object_id"</span>: <span class="tok-str">"site-front-gate"</span>,
<span class="tok-key">"baseline_count"</span>: <span class="tok-num">3</span>,
<span class="tok-key">"last_analysis"</span>: <span class="tok-str">"2025-01-15T10:30:00Z"</span>
},
{
<span class="tok-key">"object_id"</span>: <span class="tok-str">"server-rack-a1"</span>,
<span class="tok-key">"baseline_count"</span>: <span class="tok-num">1</span>,
<span class="tok-key">"last_analysis"</span>: <span class="tok-str">"2025-01-14T14:15:00Z"</span>
}
]
}</pre>
</div>
</div>
</div>
<h2 id="get-analysis">GET /v1/vims/analysis/:analysis_id</h2>
<div class="endpoint-card">
<div class="endpoint-header">
<span class="method-badge method-get">GET</span>
<span class="endpoint-path">/v1/vims/analysis/:analysis_id</span>
</div>
<div class="endpoint-body">
<p class="endpoint-desc">Retrieve the full details of a previously completed analysis by its ID.</p>
<h3>Path Parameters</h3>
<table class="params-table">
<thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead>
<tbody>
<tr><td class="param-name">analysis_id</td><td class="param-type">string</td><td class="param-desc">The analysis ID returned by <code class="inline-code">POST /v1/vims/analyze</code>.</td></tr>
</tbody>
</table>
<h3>Example Request</h3>
<div class="code-wrap">
<span class="code-lang">bash</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre><span class="tok-kw">curl</span> <span class="tok-str">https://api.aamos.ai/v1/vims/analysis/an_7f3a9b2c1d</span> \
-H <span class="tok-str">"Authorization: Bearer ak_live_YOUR_KEY"</span></pre>
</div>
<h3>Response — 200 OK</h3>
<div class="code-wrap">
<span class="code-lang">json</span>
<button class="copy-btn" onclick="copyCode(this)">Copy</button>
<pre>{
<span class="tok-key">"analysis_id"</span>: <span class="tok-str">"an_7f3a9b2c1d"</span>,
<span class="tok-key">"object_id"</span>: <span class="tok-str">"site-front-gate"</span>,
<span class="tok-key">"change_detected"</span>: <span class="tok-bool">true</span>,
<span class="tok-key">"change_score"</span>: <span class="tok-num">0.74</span>,
<span class="tok-key">"risk_level"</span>: <span class="tok-str">"high"</span>,
<span class="tok-key">"detections"</span>: [
{
<span class="tok-key">"type"</span>: <span class="tok-str">"structural_change"</span>,
<span class="tok-key">"confidence"</span>: <span class="tok-num">0.91</span>,
<span class="tok-key">"bbox"</span>: [<span class="tok-num">120</span>, <span class="tok-num">45</span>, <span class="tok-num">380</span>, <span class="tok-num">290</span>],
<span class="tok-key">"label"</span>: <span class="tok-str">"Gate damage detected"</span>
}
],
<span class="tok-key">"baseline_updated"</span>: <span class="tok-bool">false</span>,
<span class="tok-key">"baseline_id"</span>: <span class="tok-str">"bl_3d8e1f7a9b"</span>,
<span class="tok-key">"image_url"</span>: <span class="tok-str">"https://storage.aamos.ai/analyses/an_7f3a9b2c1d.jpg"</span>,
<span class="tok-key">"analyzed_at"</span>: <span class="tok-str">"2025-01-15T10:30:00Z"</span>
}</pre>
</div>
</div>
</div>
</main>
</div>
<script>
function copyCode(btn) {
const pre = btn.closest('.code-wrap').querySelector('pre');
navigator.clipboard.writeText(pre.innerText || pre.textContent).then(() => {
btn.textContent = 'Copied!'; btn.classList.add('copied');
setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('copied'); }, 2000);
});
}
const hamburger = document.getElementById('hamburger');
const sidebar = document.getElementById('sidebar');
const overlay = document.getElementById('overlay');
hamburger.addEventListener('click', () => { sidebar.classList.toggle('open'); overlay.classList.toggle('visible'); });
overlay.addEventListener('click', () => { sidebar.classList.remove('open'); overlay.classList.remove('visible'); });
</script>
</body>
</html>
+367
View File
@@ -0,0 +1,367 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AAMOS — Infrastructure Intelligence APIs</title>
<meta name="description" content="API-first infrastructure intelligence. Visual monitoring, real-world alerts, identity verification, and enterprise modules — all developer-ready.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--navy: #0A2540;
--blue: #635BFF;
--blue-light: #7B74FF;
--gray-50: #F8FAFC;
--gray-100: #F1F5F9;
--gray-200: #E2E8F0;
--gray-400: #94A3B8;
--gray-600: #475569;
--gray-800: #1E293B;
--white: #FFFFFF;
--font: 'Inter', system-ui, -apple-system, sans-serif;
}
body { font-family: var(--font); background: var(--white); color: var(--gray-800); line-height: 1.6; }
a { color: inherit; text-decoration: none; }
/* NAV */
nav {
position: sticky; top: 0; z-index: 100;
background: rgba(255,255,255,0.95);
backdrop-filter: blur(8px);
border-bottom: 1px solid var(--gray-200);
padding: 0 24px;
height: 60px;
display: flex; align-items: center; justify-content: space-between;
}
.nav-logo { font-size: 18px; font-weight: 700; color: var(--navy); letter-spacing: -0.5px; }
.nav-logo span { color: var(--blue); }
.nav-links { display: flex; align-items: center; gap: 8px; }
.nav-links a { font-size: 14px; font-weight: 500; color: var(--gray-600); padding: 8px 12px; border-radius: 8px; transition: background 0.15s; }
.nav-links a:hover { background: var(--gray-100); color: var(--gray-800); }
.btn-nav {
background: var(--navy); color: var(--white) !important;
padding: 8px 16px !important; border-radius: 8px; font-weight: 600;
font-size: 14px; transition: background 0.15s;
}
.btn-nav:hover { background: var(--blue) !important; }
@media(max-width:600px) { .nav-links a:not(.btn-nav) { display: none; } }
/* HERO */
.hero {
background: linear-gradient(135deg, var(--navy) 0%, #1a3a60 100%);
color: var(--white);
padding: 80px 24px 72px;
text-align: center;
}
.hero-badge {
display: inline-block;
background: rgba(99,91,255,0.25);
color: #a5b4fc;
border: 1px solid rgba(99,91,255,0.4);
border-radius: 100px;
padding: 4px 14px;
font-size: 12px;
font-weight: 600;
letter-spacing: 0.05em;
text-transform: uppercase;
margin-bottom: 24px;
}
.hero h1 {
font-size: clamp(32px, 6vw, 52px);
font-weight: 700;
letter-spacing: -1.5px;
line-height: 1.1;
margin-bottom: 20px;
max-width: 700px;
margin-left: auto;
margin-right: auto;
}
.hero p {
font-size: clamp(16px, 2.5vw, 18px);
color: rgba(255,255,255,0.75);
max-width: 520px;
margin: 0 auto 36px;
}
.hero-ctas { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }
.btn-primary {
background: var(--blue); color: var(--white);
padding: 14px 28px; border-radius: 10px;
font-size: 15px; font-weight: 600;
transition: background 0.15s, transform 0.1s;
display: inline-block;
}
.btn-primary:hover { background: var(--blue-light); transform: translateY(-1px); }
.btn-secondary {
background: rgba(255,255,255,0.1); color: var(--white);
border: 1px solid rgba(255,255,255,0.25);
padding: 14px 28px; border-radius: 10px;
font-size: 15px; font-weight: 600;
transition: background 0.15s;
display: inline-block;
}
.btn-secondary:hover { background: rgba(255,255,255,0.18); }
/* CODE PEEK */
.code-peek {
background: rgba(0,0,0,0.35);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 12px;
padding: 20px 24px;
max-width: 540px;
margin: 48px auto 0;
text-align: left;
font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 13px;
line-height: 1.7;
color: rgba(255,255,255,0.85);
overflow-x: auto;
}
.code-peek .kw { color: #a5b4fc; }
.code-peek .str { color: #86efac; }
.code-peek .cm { color: rgba(255,255,255,0.4); }
/* TRUST */
.trust {
background: var(--gray-50);
border-bottom: 1px solid var(--gray-200);
padding: 16px 24px;
text-align: center;
font-size: 13px;
color: var(--gray-400);
font-weight: 500;
letter-spacing: 0.02em;
}
/* PRODUCTS */
.products { padding: 72px 24px; max-width: 1100px; margin: 0 auto; }
.section-label {
font-size: 12px; font-weight: 700; color: var(--blue);
letter-spacing: 0.1em; text-transform: uppercase;
margin-bottom: 12px;
}
.section-title {
font-size: clamp(24px, 4vw, 36px);
font-weight: 700; letter-spacing: -0.8px;
color: var(--navy); margin-bottom: 8px;
}
.section-sub { font-size: 16px; color: var(--gray-600); margin-bottom: 48px; max-width: 480px; }
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 20px;
}
.product-card {
background: var(--white);
border: 1px solid var(--gray-200);
border-radius: 16px;
padding: 28px 24px;
transition: box-shadow 0.2s, transform 0.2s, border-color 0.2s;
display: flex; flex-direction: column;
}
.product-card:hover {
box-shadow: 0 8px 32px rgba(10,37,64,0.1);
transform: translateY(-2px);
border-color: var(--blue);
}
.product-icon {
width: 44px; height: 44px;
background: linear-gradient(135deg, var(--blue) 0%, #4f46e5 100%);
border-radius: 12px;
display: flex; align-items: center; justify-content: center;
margin-bottom: 20px;
}
.product-icon svg { width: 22px; height: 22px; fill: none; stroke: white; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.product-tag {
font-size: 11px; font-weight: 700;
color: var(--blue);
background: rgba(99,91,255,0.08);
border-radius: 4px;
padding: 2px 8px;
display: inline-block;
margin-bottom: 8px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.product-card h3 { font-size: 18px; font-weight: 700; color: var(--navy); margin-bottom: 8px; }
.product-card p { font-size: 14px; color: var(--gray-600); flex: 1; margin-bottom: 20px; }
.card-link {
font-size: 14px; font-weight: 600; color: var(--blue);
display: flex; align-items: center; gap: 4px;
transition: gap 0.15s;
}
.product-card:hover .card-link { gap: 8px; }
/* HOW IT WORKS */
.how { background: var(--gray-50); padding: 72px 24px; }
.how-inner { max-width: 900px; margin: 0 auto; }
.steps { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 24px; margin-top: 48px; }
.step { display: flex; flex-direction: column; }
.step-num {
font-size: 13px; font-weight: 700; color: var(--blue);
margin-bottom: 12px;
background: rgba(99,91,255,0.1);
width: 28px; height: 28px; border-radius: 8px;
display: flex; align-items: center; justify-content: center;
}
.step h4 { font-size: 15px; font-weight: 700; color: var(--navy); margin-bottom: 6px; }
.step p { font-size: 14px; color: var(--gray-600); }
/* CTA BOTTOM */
.cta-bottom {
background: var(--navy);
color: var(--white);
padding: 72px 24px;
text-align: center;
}
.cta-bottom h2 { font-size: clamp(24px, 4vw, 36px); font-weight: 700; letter-spacing: -0.8px; margin-bottom: 16px; }
.cta-bottom p { color: rgba(255,255,255,0.7); font-size: 16px; margin-bottom: 32px; max-width: 420px; margin-left: auto; margin-right: auto; }
.cta-bottom .btn-primary { font-size: 16px; padding: 16px 32px; }
/* FOOTER */
footer {
border-top: 1px solid var(--gray-200);
padding: 24px;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 12px;
font-size: 13px;
color: var(--gray-400);
}
footer a { color: var(--gray-400); transition: color 0.15s; }
footer a:hover { color: var(--gray-800); }
.footer-links { display: flex; gap: 20px; }
</style>
</head>
<body>
<nav>
<a href="/" class="nav-logo">A<span>AMOS</span></a>
<div class="nav-links">
<a href="#products">Products</a>
<a href="#">Docs</a>
<a href="#" class="btn-nav">Get API key</a>
</div>
</nav>
<section class="hero">
<div class="hero-badge">API Platform — by Landvex</div>
<h1>We built it for ourselves.<br>Now you can use it too.</h1>
<p>300+ microservices powering Landvex's infrastructure operations. The best ones — available as clean REST APIs for your stack.</p>
<div class="hero-ctas">
<a href="#" class="btn-primary">Get API key</a>
<a href="#" class="btn-secondary">View docs</a>
</div>
<div class="code-peek">
<span class="cm"># Analyze an image for infrastructure changes</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/vims/analyze \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer &lt;YOUR_KEY&gt;"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"image=@inspection.jpg"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"object_id=bridge-e4-north"</span>
</div>
</section>
<div class="trust">
Battle-tested in production at Landvex &nbsp;·&nbsp; Used by infrastructure operators, municipalities, and insurers across Europe
</div>
<section class="products" id="products">
<div class="section-label">Products</div>
<h2 class="section-title">Four APIs. One platform.</h2>
<p class="section-sub">Pick what you need. Integrate in hours, not months.</p>
<div class="product-grid">
<a href="/vims/" class="product-card">
<div class="product-icon">
<svg viewBox="0 0 24 24"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
</div>
<span class="product-tag">Vision AI</span>
<h3>VIMS API</h3>
<p>Visual infrastructure monitoring. Submit images, get AI-powered change detection, baselines, and risk scores.</p>
<span class="card-link">Learn more →</span>
</a>
<a href="/reality-alerts/" class="product-card">
<div class="product-icon">
<svg viewBox="0 0 24 24"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
</div>
<span class="product-tag">Real-world data</span>
<h3>Reality Alerts API</h3>
<p>AI-verified field observations from Zoomers on the ground, automatically routed to the right recipient.</p>
<span class="card-link">Learn more →</span>
</a>
<a href="/kyz/" class="product-card">
<div class="product-icon">
<svg viewBox="0 0 24 24"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
</div>
<span class="product-tag">Identity</span>
<h3>KYZ</h3>
<p>Know Your Zoomer. ID document scanning, selfie liveness detection, and verification — built for the gig economy.</p>
<span class="card-link">Learn more →</span>
</a>
<a href="/modules/" class="product-card">
<div class="product-icon">
<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>
</div>
<span class="product-tag">Enterprise</span>
<h3>AAMOS Modules</h3>
<p>Production-grade incident management and AI image deviation engine — drop into your stack via REST API.</p>
<span class="card-link">Learn more →</span>
</a>
</div>
</section>
<section class="how">
<div class="how-inner">
<div class="section-label">How it works</div>
<h2 class="section-title">Integrate in minutes.</h2>
<div class="steps">
<div class="step">
<div class="step-num">1</div>
<h4>Get your API key</h4>
<p>Sign up, generate a key, and you're ready. No sales call required.</p>
</div>
<div class="step">
<div class="step-num">2</div>
<h4>Call the API</h4>
<p>Standard REST with JSON responses. SDKs for Node, Python, and Go coming soon.</p>
</div>
<div class="step">
<div class="step-num">3</div>
<h4>Get intelligence</h4>
<p>Detections, alerts, verifications, and deviation scores — structured and ready for your system.</p>
</div>
<div class="step">
<div class="step-num">4</div>
<h4>Scale confidently</h4>
<p>Start on Free, upgrade as you grow. Enterprise plans for volume and SLA requirements.</p>
</div>
</div>
</div>
</section>
<section class="cta-bottom">
<h2>Ready to build?</h2>
<p>Get your API key and start integrating today. Free tier included.</p>
<a href="#" class="btn-primary">Get API key — it's free</a>
</section>
<footer>
<span>© 2026 AAMOS / Landvex AB</span>
<div class="footer-links">
<a href="#">Privacy</a>
<a href="#">Terms</a>
<a href="#">Status</a>
<a href="#">Contact</a>
</div>
</footer>
</body>
</html>
+255
View File
@@ -0,0 +1,255 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>KYZ — Identity Verification API | AAMOS</title>
<meta name="description" content="Know Your Zoomer. ID document scanning, selfie liveness detection, and verification — built for gig platforms, marketplaces, and fintech.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--navy: #0A2540; --blue: #635BFF; --blue-light: #7B74FF;
--gray-50: #F8FAFC; --gray-100: #F1F5F9; --gray-200: #E2E8F0;
--gray-400: #94A3B8; --gray-600: #475569; --gray-800: #1E293B; --white: #FFFFFF;
--font: 'Inter', system-ui, -apple-system, sans-serif;
}
body { font-family: var(--font); background: var(--white); color: var(--gray-800); line-height: 1.6; }
a { color: inherit; text-decoration: none; }
nav {
position: sticky; top: 0; z-index: 100;
background: rgba(255,255,255,0.95); backdrop-filter: blur(8px);
border-bottom: 1px solid var(--gray-200);
padding: 0 24px; height: 60px;
display: flex; align-items: center; justify-content: space-between;
}
.nav-logo { font-size: 18px; font-weight: 700; color: var(--navy); }
.nav-logo span { color: var(--blue); }
.nav-back { font-size: 14px; color: var(--gray-600); }
.btn-nav { background: var(--navy); color: var(--white); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 14px; }
.hero {
background: linear-gradient(135deg, #0d1f3c 0%, #1a3a60 100%);
color: var(--white); padding: 72px 24px 64px; text-align: center;
}
.hero-badge {
display: inline-block; background: rgba(99,91,255,0.25); color: #a5b4fc;
border: 1px solid rgba(99,91,255,0.4); border-radius: 100px;
padding: 4px 14px; font-size: 12px; font-weight: 600;
letter-spacing: 0.05em; text-transform: uppercase; margin-bottom: 20px;
}
.hero h1 { font-size: clamp(28px, 5vw, 46px); font-weight: 700; letter-spacing: -1px; line-height: 1.1; margin-bottom: 16px; }
.hero p { font-size: 17px; color: rgba(255,255,255,0.75); max-width: 500px; margin: 0 auto 32px; }
.compare-strip {
display: flex; gap: 16px; justify-content: center; flex-wrap: wrap;
margin-top: 32px;
}
.compare-chip {
background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.15);
border-radius: 8px; padding: 8px 16px; font-size: 13px; color: rgba(255,255,255,0.6);
}
.compare-chip strong { color: white; }
.btn-primary { background: var(--blue); color: var(--white); padding: 14px 28px; border-radius: 10px; font-size: 15px; font-weight: 600; display: inline-block; transition: background 0.15s; }
.btn-primary:hover { background: var(--blue-light); }
.content { max-width: 860px; margin: 0 auto; padding: 64px 24px; }
.block { margin-bottom: 60px; }
.block-label { font-size: 12px; font-weight: 700; color: var(--blue); letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 12px; }
.block h2 { font-size: clamp(22px, 3.5vw, 30px); font-weight: 700; letter-spacing: -0.5px; color: var(--navy); margin-bottom: 24px; }
.feature-list { display: grid; gap: 16px; }
.feature-item { display: flex; gap: 16px; align-items: flex-start; padding: 20px; background: var(--gray-50); border-radius: 12px; border: 1px solid var(--gray-200); }
.feature-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); margin-top: 7px; flex-shrink: 0; }
.feature-item h4 { font-size: 15px; font-weight: 600; color: var(--navy); margin-bottom: 4px; }
.feature-item p { font-size: 14px; color: var(--gray-600); }
.flow-steps { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 16px; margin-bottom: 32px; }
.flow-step { background: var(--gray-50); border: 1px solid var(--gray-200); border-radius: 12px; padding: 20px 16px; text-align: center; }
.flow-num { font-size: 11px; font-weight: 700; color: var(--blue); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; }
.flow-step h4 { font-size: 14px; font-weight: 600; color: var(--navy); margin-bottom: 4px; }
.flow-step p { font-size: 12px; color: var(--gray-400); }
.code-block {
background: var(--navy); border-radius: 14px; padding: 24px;
font-family: 'SF Mono', 'Fira Code', monospace; font-size: 13px;
line-height: 1.75; color: rgba(255,255,255,0.85); overflow-x: auto;
}
.code-block .kw { color: #a5b4fc; }
.code-block .str { color: #86efac; }
.code-block .cm { color: rgba(255,255,255,0.4); }
.code-block .num { color: #fcd34d; }
.pricing-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; }
.price-card { border: 1px solid var(--gray-200); border-radius: 16px; padding: 28px 24px; display: flex; flex-direction: column; }
.price-card.featured { border-color: var(--blue); box-shadow: 0 0 0 3px rgba(99,91,255,0.1); }
.price-tier { font-size: 13px; font-weight: 700; color: var(--blue); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; }
.price-amount { font-size: 32px; font-weight: 700; color: var(--navy); letter-spacing: -1px; }
.price-amount span { font-size: 15px; font-weight: 500; color: var(--gray-400); }
.price-desc { font-size: 13px; color: var(--gray-400); margin-top: 4px; margin-bottom: 20px; }
.price-features { list-style: none; display: flex; flex-direction: column; gap: 10px; flex: 1; margin-bottom: 24px; }
.price-features li { font-size: 14px; color: var(--gray-600); display: flex; align-items: center; gap: 8px; }
.price-features li::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.btn-outline { border: 1px solid var(--gray-200); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: var(--navy); text-align: center; display: block; transition: border-color 0.15s; }
.btn-outline:hover { border-color: var(--blue); }
.btn-filled { background: var(--blue); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: white; text-align: center; display: block; }
.cta-bottom { background: var(--navy); color: var(--white); padding: 64px 24px; text-align: center; }
.cta-bottom h2 { font-size: clamp(22px, 4vw, 32px); font-weight: 700; letter-spacing: -0.5px; margin-bottom: 14px; }
.cta-bottom p { color: rgba(255,255,255,0.7); font-size: 16px; margin-bottom: 28px; max-width: 400px; margin-left: auto; margin-right: auto; }
footer { border-top: 1px solid var(--gray-200); padding: 24px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; font-size: 13px; color: var(--gray-400); }
footer a { color: var(--gray-400); }
.footer-links { display: flex; gap: 20px; }
</style>
</head>
<body>
<nav>
<a href="/" class="nav-logo">A<span>AMOS</span></a>
<a href="/" class="nav-back">← All products</a>
<a href="#" class="btn-nav">Get API key</a>
</nav>
<section class="hero">
<div class="hero-badge">Identity</div>
<h1>KYZ</h1>
<p>Know Your Zoomer. Identity verification built for the gig economy — ID scanning, selfie liveness, and instant decisions.</p>
<a href="#" class="btn-primary">Get API key — free tier included</a>
<div class="compare-strip">
<div class="compare-chip">Alternative to <strong>Onfido</strong></div>
<div class="compare-chip">Alternative to <strong>Jumio</strong></div>
<div class="compare-chip">Alternative to <strong>Stripe Identity</strong></div>
</div>
</section>
<div class="content">
<div class="block">
<div class="block-label">Verification flow</div>
<h2>Three steps. One decision. Fully automated.</h2>
<div class="flow-steps">
<div class="flow-step">
<div class="flow-num">Step 1</div>
<h4>ID capture</h4>
<p>Passport, national ID, or driver's license — front and back</p>
</div>
<div class="flow-step">
<div class="flow-num">Step 2</div>
<h4>Selfie + liveness</h4>
<p>Face match against ID, active liveness detection</p>
</div>
<div class="flow-step">
<div class="flow-num">Step 3</div>
<h4>Decision</h4>
<p>Pass / Fail / Review — with confidence score and reason</p>
</div>
</div>
<div class="feature-list">
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Document scanning</h4>
<p>Passport MRZ parsing, ID chip detection, expiry validation, and forgery signals — across 190+ countries.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Selfie liveness detection</h4>
<p>Active liveness check — defeats printed photos, screens, and deepfakes. 3-2-1 countdown with face guidance.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Hosted flow or API-only</h4>
<p>Use our pre-built mobile-optimized verification UI, or call the API directly with your own interface.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>GDPR compliant</h4>
<p>Data processed in EU. Configurable retention. Audit log for every verification. DAC7 reporting compatible.</p>
</div>
</div>
</div>
</div>
<div class="block">
<div class="block-label">API example</div>
<h2>Create a session. Get a decision.</h2>
<div class="code-block">
<span class="cm"># Create a verification session</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/kyz/sessions \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer ***"</span> \<br>
&nbsp;&nbsp;-H <span class="str">"Content-Type: application/json"</span> \<br>
&nbsp;&nbsp;-d '{<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"user_ref"</span>: <span class="str">"usr_abc123"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"flow"</span>: <span class="str">"hosted"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"redirect_url"</span>: <span class="str">"https://yourapp.com/verified"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"webhook_url"</span>: <span class="str">"https://yourapp.com/webhooks/kyz"</span><br>
&nbsp;&nbsp;}'<br><br>
<span class="cm"># Response — send hosted_url to your user</span><br>
{<br>
&nbsp;&nbsp;<span class="str">"session_id"</span>: <span class="str">"kyz_s1a2b3c"</span>,<br>
&nbsp;&nbsp;<span class="str">"hosted_url"</span>: <span class="str">"https://verify.aamos.ai/s/s1a2b3c"</span>,<br>
&nbsp;&nbsp;<span class="str">"expires_at"</span>: <span class="str">"2026-07-11T12:00:00Z"</span><br>
}<br><br>
<span class="cm"># Webhook on completion</span><br>
{<br>
&nbsp;&nbsp;<span class="str">"session_id"</span>: <span class="str">"kyz_s1a2b3c"</span>,<br>
&nbsp;&nbsp;<span class="str">"decision"</span>: <span class="str">"pass"</span>,<br>
&nbsp;&nbsp;<span class="str">"confidence"</span>: <span class="num">0.97</span>,<br>
&nbsp;&nbsp;<span class="str">"liveness"</span>: <span class="kw">true</span>,<br>
&nbsp;&nbsp;<span class="str">"document_country"</span>: <span class="str">"SE"</span>,<br>
&nbsp;&nbsp;<span class="str">"document_type"</span>: <span class="str">"passport"</span><br>
}
</div>
</div>
<div class="block">
<div class="block-label">Pricing</div>
<h2>Pay per verification. No monthly minimums.</h2>
<div class="pricing-grid">
<div class="price-card">
<div class="price-tier">Starter</div>
<div class="price-amount">$0.50 <span>/verification</span></div>
<div class="price-desc">Up to 999 verifications / month</div>
<ul class="price-features">
<li>Hosted verification flow</li>
<li>ID + selfie + liveness</li>
<li>Webhook results</li>
<li>190+ countries</li>
<li>Community support</li>
</ul>
<a href="#" class="btn-outline">Get started</a>
</div>
<div class="price-card featured">
<div class="price-tier">Pro</div>
<div class="price-amount">$0.30 <span>/verification</span></div>
<div class="price-desc">1,000+ verifications / month</div>
<ul class="price-features">
<li>Everything in Starter</li>
<li>API-only mode</li>
<li>Custom branding</li>
<li>Audit log export</li>
<li>Priority support</li>
<li>99.9% SLA</li>
</ul>
<a href="#" class="btn-filled">Get started</a>
</div>
<div class="price-card">
<div class="price-tier">Enterprise</div>
<div class="price-amount">Custom</div>
<div class="price-desc">Volume pricing + dedicated SLA</div>
<ul class="price-features">
<li>Custom pricing at scale</li>
<li>On-premise option</li>
<li>Custom liveness models</li>
<li>Dedicated account manager</li>
<li>SLA to 99.99%</li>
</ul>
<a href="mailto:sales@aamos.ai" class="btn-outline">Contact sales</a>
</div>
</div>
</div>
</div>
<section class="cta-bottom">
<h2>Ready to verify your users?</h2>
<p>Start with $0.50 per verification. No commitment, no monthly minimum.</p>
<a href="#" class="btn-primary">Get API key</a>
</section>
<footer>
<span>© 2026 AAMOS / Landvex AB</span>
<div class="footer-links"><a href="#">Privacy</a><a href="#">Terms</a><a href="/">Home</a></div>
</footer>
</body>
</html>
+260
View File
@@ -0,0 +1,260 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AAMOS Modules — Enterprise APIs | AAMOS</title>
<meta name="description" content="Production-grade enterprise modules from AAMOS — Incident Management and AI Image Deviation Engine. Battle-tested at scale. Available as REST APIs.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--navy: #0A2540; --blue: #635BFF; --blue-light: #7B74FF;
--gray-50: #F8FAFC; --gray-100: #F1F5F9; --gray-200: #E2E8F0;
--gray-400: #94A3B8; --gray-600: #475569; --gray-800: #1E293B; --white: #FFFFFF;
--font: 'Inter', system-ui, -apple-system, sans-serif;
}
body { font-family: var(--font); background: var(--white); color: var(--gray-800); line-height: 1.6; }
a { color: inherit; text-decoration: none; }
nav {
position: sticky; top: 0; z-index: 100;
background: rgba(255,255,255,0.95); backdrop-filter: blur(8px);
border-bottom: 1px solid var(--gray-200);
padding: 0 24px; height: 60px;
display: flex; align-items: center; justify-content: space-between;
}
.nav-logo { font-size: 18px; font-weight: 700; color: var(--navy); }
.nav-logo span { color: var(--blue); }
.nav-back { font-size: 14px; color: var(--gray-600); }
.btn-nav { background: var(--navy); color: var(--white); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 14px; }
.hero {
background: linear-gradient(135deg, #0d1f3c 0%, #1a3a60 100%);
color: var(--white); padding: 72px 24px 64px; text-align: center;
}
.hero-badge {
display: inline-block; background: rgba(99,91,255,0.25); color: #a5b4fc;
border: 1px solid rgba(99,91,255,0.4); border-radius: 100px;
padding: 4px 14px; font-size: 12px; font-weight: 600;
letter-spacing: 0.05em; text-transform: uppercase; margin-bottom: 20px;
}
.hero h1 { font-size: clamp(28px, 5vw, 46px); font-weight: 700; letter-spacing: -1px; line-height: 1.1; margin-bottom: 16px; }
.hero p { font-size: 17px; color: rgba(255,255,255,0.75); max-width: 540px; margin: 0 auto 32px; }
.origin-strip {
display: inline-flex; align-items: center; gap: 10px;
background: rgba(255,255,255,0.07); border: 1px solid rgba(255,255,255,0.12);
border-radius: 10px; padding: 12px 20px; margin-top: 28px;
font-size: 13px; color: rgba(255,255,255,0.65); max-width: 480px;
}
.origin-dot { width: 8px; height: 8px; border-radius: 50%; background: #4ade80; flex-shrink: 0; }
.btn-primary { background: var(--blue); color: var(--white); padding: 14px 28px; border-radius: 10px; font-size: 15px; font-weight: 600; display: inline-block; transition: background 0.15s; }
.btn-primary:hover { background: var(--blue-light); }
.content { max-width: 860px; margin: 0 auto; padding: 64px 24px; }
.block { margin-bottom: 60px; }
.block-label { font-size: 12px; font-weight: 700; color: var(--blue); letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 12px; }
.block h2 { font-size: clamp(22px, 3.5vw, 30px); font-weight: 700; letter-spacing: -0.5px; color: var(--navy); margin-bottom: 24px; }
.module-cards { display: grid; gap: 20px; }
.module-card {
border: 1px solid var(--gray-200); border-radius: 16px; padding: 28px 24px;
background: var(--white);
}
.module-header { display: flex; align-items: center; gap: 16px; margin-bottom: 16px; }
.module-icon {
width: 44px; height: 44px; border-radius: 12px; flex-shrink: 0;
background: linear-gradient(135deg, var(--blue) 0%, #4f46e5 100%);
display: flex; align-items: center; justify-content: center;
}
.module-icon svg { width: 22px; height: 22px; fill: none; stroke: white; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.module-name { font-size: 18px; font-weight: 700; color: var(--navy); }
.module-tag { font-size: 11px; font-weight: 600; color: var(--blue); background: rgba(99,91,255,0.08); border-radius: 4px; padding: 2px 8px; }
.module-desc { font-size: 15px; color: var(--gray-600); margin-bottom: 20px; }
.module-features { list-style: none; display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; }
.module-features li { font-size: 14px; color: var(--gray-600); display: flex; align-items: center; gap: 8px; }
.module-features li::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.code-block {
background: var(--navy); border-radius: 14px; padding: 24px;
font-family: 'SF Mono', 'Fira Code', monospace; font-size: 13px;
line-height: 1.75; color: rgba(255,255,255,0.85); overflow-x: auto;
margin-top: 20px;
}
.code-block .kw { color: #a5b4fc; }
.code-block .str { color: #86efac; }
.code-block .cm { color: rgba(255,255,255,0.4); }
.code-block .num { color: #fcd34d; }
.pricing-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; }
.price-card { border: 1px solid var(--gray-200); border-radius: 16px; padding: 28px 24px; display: flex; flex-direction: column; }
.price-card.featured { border-color: var(--blue); box-shadow: 0 0 0 3px rgba(99,91,255,0.1); }
.price-tier { font-size: 13px; font-weight: 700; color: var(--blue); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; }
.price-amount { font-size: 32px; font-weight: 700; color: var(--navy); letter-spacing: -1px; }
.price-amount span { font-size: 15px; font-weight: 500; color: var(--gray-400); }
.price-desc { font-size: 13px; color: var(--gray-400); margin-top: 4px; margin-bottom: 20px; }
.price-features { list-style: none; display: flex; flex-direction: column; gap: 10px; flex: 1; margin-bottom: 24px; }
.price-features li { font-size: 14px; color: var(--gray-600); display: flex; align-items: center; gap: 8px; }
.price-features li::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.btn-outline { border: 1px solid var(--gray-200); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: var(--navy); text-align: center; display: block; transition: border-color 0.15s; }
.btn-outline:hover { border-color: var(--blue); }
.btn-filled { background: var(--blue); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: white; text-align: center; display: block; }
.cta-bottom { background: var(--navy); color: var(--white); padding: 64px 24px; text-align: center; }
.cta-bottom h2 { font-size: clamp(22px, 4vw, 32px); font-weight: 700; letter-spacing: -0.5px; margin-bottom: 14px; }
.cta-bottom p { color: rgba(255,255,255,0.7); font-size: 16px; margin-bottom: 28px; max-width: 440px; margin-left: auto; margin-right: auto; }
footer { border-top: 1px solid var(--gray-200); padding: 24px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; font-size: 13px; color: var(--gray-400); }
footer a { color: var(--gray-400); }
.footer-links { display: flex; gap: 20px; }
</style>
</head>
<body>
<nav>
<a href="/" class="nav-logo">A<span>AMOS</span></a>
<a href="/" class="nav-back">← All products</a>
<a href="#" class="btn-nav">Get API key</a>
</nav>
<section class="hero">
<div class="hero-badge">Enterprise</div>
<h1>AAMOS Modules</h1>
<p>Enterprise-grade modules from our own production stack. Battle-tested across 300+ microservices. Available as clean REST APIs.</p>
<a href="#" class="btn-primary">Get API key — free tier included</a>
<div>
<div class="origin-strip">
<div class="origin-dot"></div>
These modules run Landvex's own operations. You're buying the same infrastructure we run on.
</div>
</div>
</section>
<div class="content">
<div class="block">
<div class="block-label">Available modules</div>
<h2>Two modules. Production-ready today.</h2>
<div class="module-cards">
<div class="module-card">
<div class="module-header">
<div class="module-icon">
<svg viewBox="0 0 24 24"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
</div>
<div>
<div class="module-tag">Incident Management</div>
<div class="module-name">Incident API</div>
</div>
</div>
<p class="module-desc">Structured incident lifecycle management — from detection to resolution. Full API with webhook events, priority queuing, assignment, and audit trail.</p>
<ul class="module-features">
<li>Create and track incidents</li>
<li>Priority levels + SLA timers</li>
<li>Assignment and ownership</li>
<li>Status transitions + webhooks</li>
<li>Comment threads</li>
<li>Full audit log</li>
<li>Integrates with any ticketing system</li>
<li>REST + webhook delivery</li>
</ul>
<div class="code-block">
<span class="cm"># Create an incident</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/incident/incidents \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer ***"</span> \<br>
&nbsp;&nbsp;-d '{<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"title"</span>: <span class="str">"Water leak detected — Block 4B"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"priority"</span>: <span class="str">"high"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"source"</span>: <span class="str">"vims-api"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"assignee_group"</span>: <span class="str">"maintenance-east"</span><br>
&nbsp;&nbsp;}'<br><br>
{ <span class="str">"incident_id"</span>: <span class="str">"inc_7f3a9b"</span>, <span class="str">"status"</span>: <span class="str">"open"</span>, <span class="str">"sla_deadline"</span>: <span class="str">"..."</span> }
</div>
</div>
<div class="module-card">
<div class="module-header">
<div class="module-icon">
<svg viewBox="0 0 24 24"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M9 21V9"/></svg>
</div>
<div>
<div class="module-tag">Vision AI</div>
<div class="module-name">AI Image Deviation Engine</div>
</div>
</div>
<p class="module-desc">Submit any image against a stored baseline — get back a structured deviation report. Pixel-level and semantic analysis. Designed for quality control, inspection workflows, and asset monitoring.</p>
<ul class="module-features">
<li>Baseline storage per asset ID</li>
<li>Deviation score (01)</li>
<li>Semantic change classification</li>
<li>Region-of-interest masks</li>
<li>Batch processing</li>
<li>Confidence thresholds</li>
<li>Works on any image type</li>
<li>Integrates with VIMS API</li>
</ul>
<div class="code-block">
<span class="cm"># Compare image to stored baseline</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/deviation/compare \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer ***"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"image=@current.jpg"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"asset_id=warehouse-roof-7"</span><br><br>
{<br>
&nbsp;&nbsp;<span class="str">"asset_id"</span>: <span class="str">"warehouse-roof-7"</span>,<br>
&nbsp;&nbsp;<span class="str">"deviation_score"</span>: <span class="num">0.63</span>,<br>
&nbsp;&nbsp;<span class="str">"change_type"</span>: <span class="str">"structural"</span>,<br>
&nbsp;&nbsp;<span class="str">"regions"</span>: [{ <span class="str">"label"</span>: <span class="str">"crack"</span>, <span class="str">"area_pct"</span>: <span class="num">4.2</span> }],<br>
&nbsp;&nbsp;<span class="str">"recommend_action"</span>: <span class="str">"schedule_inspection"</span><br>
}
</div>
</div>
</div>
</div>
<div class="block">
<div class="block-label">Pricing</div>
<h2>One plan. Both modules included.</h2>
<div class="pricing-grid">
<div class="price-card">
<div class="price-tier">Starter</div>
<div class="price-amount">$199 <span>/mo</span></div>
<div class="price-desc">Both modules included</div>
<ul class="price-features">
<li>500 incidents / month</li>
<li>1,000 deviation analyses / month</li>
<li>Webhook events</li>
<li>Email support</li>
</ul>
<a href="#" class="btn-outline">Get started</a>
</div>
<div class="price-card featured">
<div class="price-tier">Pro</div>
<div class="price-amount">$799 <span>/mo</span></div>
<div class="price-desc">High volume + SLA</div>
<ul class="price-features">
<li>Unlimited incidents</li>
<li>50,000 deviation analyses / month</li>
<li>Custom asset models</li>
<li>Priority support</li>
<li>99.9% SLA</li>
<li>Audit export</li>
</ul>
<a href="#" class="btn-filled">Get started</a>
</div>
<div class="price-card">
<div class="price-tier">Enterprise</div>
<div class="price-amount">Custom</div>
<div class="price-desc">Volume + dedicated infra</div>
<ul class="price-features">
<li>Unlimited everything</li>
<li>On-premise option</li>
<li>Custom model training</li>
<li>SLA to 99.99%</li>
<li>Dedicated account manager</li>
</ul>
<a href="mailto:sales@aamos.ai" class="btn-outline">Contact sales</a>
</div>
</div>
</div>
</div>
<section class="cta-bottom">
<h2>Ready to integrate enterprise-grade modules?</h2>
<p>Start with Starter. We're running these in production — so you don't have to prove they work.</p>
<a href="#" class="btn-primary">Get API key</a>
</section>
<footer>
<span>© 2026 AAMOS / Landvex AB</span>
<div class="footer-links"><a href="#">Privacy</a><a href="#">Terms</a><a href="/">Home</a></div>
</footer>
</body>
</html>
+213
View File
@@ -0,0 +1,213 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reality Alerts API — AI-Verified Field Intelligence | AAMOS</title>
<meta name="description" content="Real-world observations from the field, AI-verified and automatically routed. REST API for municipalities, insurers, and utilities.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--navy: #0A2540; --blue: #635BFF; --blue-light: #7B74FF;
--gray-50: #F8FAFC; --gray-100: #F1F5F9; --gray-200: #E2E8F0;
--gray-400: #94A3B8; --gray-600: #475569; --gray-800: #1E293B; --white: #FFFFFF;
--font: 'Inter', system-ui, -apple-system, sans-serif;
}
body { font-family: var(--font); background: var(--white); color: var(--gray-800); line-height: 1.6; }
a { color: inherit; text-decoration: none; }
nav {
position: sticky; top: 0; z-index: 100;
background: rgba(255,255,255,0.95); backdrop-filter: blur(8px);
border-bottom: 1px solid var(--gray-200);
padding: 0 24px; height: 60px;
display: flex; align-items: center; justify-content: space-between;
}
.nav-logo { font-size: 18px; font-weight: 700; color: var(--navy); }
.nav-logo span { color: var(--blue); }
.nav-back { font-size: 14px; color: var(--gray-600); }
.btn-nav { background: var(--navy); color: var(--white); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 14px; }
.hero {
background: linear-gradient(135deg, #0d1f3c 0%, #1a3a60 100%);
color: var(--white); padding: 72px 24px 64px; text-align: center;
}
.hero-badge {
display: inline-block; background: rgba(99,91,255,0.25); color: #a5b4fc;
border: 1px solid rgba(99,91,255,0.4); border-radius: 100px;
padding: 4px 14px; font-size: 12px; font-weight: 600;
letter-spacing: 0.05em; text-transform: uppercase; margin-bottom: 20px;
}
.hero h1 { font-size: clamp(28px, 5vw, 46px); font-weight: 700; letter-spacing: -1px; line-height: 1.1; margin-bottom: 16px; }
.hero p { font-size: 17px; color: rgba(255,255,255,0.75); max-width: 500px; margin: 0 auto 32px; }
.btn-primary { background: var(--blue); color: var(--white); padding: 14px 28px; border-radius: 10px; font-size: 15px; font-weight: 600; display: inline-block; transition: background 0.15s; }
.btn-primary:hover { background: var(--blue-light); }
.content { max-width: 860px; margin: 0 auto; padding: 64px 24px; }
.block { margin-bottom: 60px; }
.block-label { font-size: 12px; font-weight: 700; color: var(--blue); letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 12px; }
.block h2 { font-size: clamp(22px, 3.5vw, 30px); font-weight: 700; letter-spacing: -0.5px; color: var(--navy); margin-bottom: 24px; }
.feature-list { display: grid; gap: 16px; }
.feature-item { display: flex; gap: 16px; align-items: flex-start; padding: 20px; background: var(--gray-50); border-radius: 12px; border: 1px solid var(--gray-200); }
.feature-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); margin-top: 7px; flex-shrink: 0; }
.feature-item h4 { font-size: 15px; font-weight: 600; color: var(--navy); margin-bottom: 4px; }
.feature-item p { font-size: 14px; color: var(--gray-600); }
.code-block {
background: var(--navy); border-radius: 14px; padding: 24px;
font-family: 'SF Mono', 'Fira Code', monospace; font-size: 13px;
line-height: 1.75; color: rgba(255,255,255,0.85); overflow-x: auto;
}
.code-block .kw { color: #a5b4fc; }
.code-block .str { color: #86efac; }
.code-block .cm { color: rgba(255,255,255,0.4); }
.code-block .num { color: #fcd34d; }
.pricing-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; }
.price-card { border: 1px solid var(--gray-200); border-radius: 16px; padding: 28px 24px; display: flex; flex-direction: column; }
.price-card.featured { border-color: var(--blue); box-shadow: 0 0 0 3px rgba(99,91,255,0.1); }
.price-tier { font-size: 13px; font-weight: 700; color: var(--blue); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; }
.price-amount { font-size: 32px; font-weight: 700; color: var(--navy); letter-spacing: -1px; }
.price-amount span { font-size: 15px; font-weight: 500; color: var(--gray-400); }
.price-desc { font-size: 13px; color: var(--gray-400); margin-top: 4px; margin-bottom: 20px; }
.price-features { list-style: none; display: flex; flex-direction: column; gap: 10px; flex: 1; margin-bottom: 24px; }
.price-features li { font-size: 14px; color: var(--gray-600); display: flex; align-items: center; gap: 8px; }
.price-features li::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.btn-outline { border: 1px solid var(--gray-200); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: var(--navy); text-align: center; display: block; transition: border-color 0.15s; }
.btn-outline:hover { border-color: var(--blue); }
.btn-filled { background: var(--blue); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: white; text-align: center; display: block; }
.cta-bottom { background: var(--navy); color: var(--white); padding: 64px 24px; text-align: center; }
.cta-bottom h2 { font-size: clamp(22px, 4vw, 32px); font-weight: 700; letter-spacing: -0.5px; margin-bottom: 14px; }
.cta-bottom p { color: rgba(255,255,255,0.7); font-size: 16px; margin-bottom: 28px; max-width: 400px; margin-left: auto; margin-right: auto; }
footer { border-top: 1px solid var(--gray-200); padding: 24px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; font-size: 13px; color: var(--gray-400); }
footer a { color: var(--gray-400); }
.footer-links { display: flex; gap: 20px; }
</style>
</head>
<body>
<nav>
<a href="/" class="nav-logo">A<span>AMOS</span></a>
<a href="/" class="nav-back">← All products</a>
<a href="#" class="btn-nav">Get API key</a>
</nav>
<section class="hero">
<div class="hero-badge">Real-world data</div>
<h1>Reality Alerts API</h1>
<p>Real-world alerts, verified by AI, routed automatically. Field intelligence delivered to your systems in real time.</p>
<a href="#" class="btn-primary">Get API key — free tier included</a>
</section>
<div class="content">
<div class="block">
<div class="block-label">What it does</div>
<h2>Ground truth from the field. AI-verified before it reaches you.</h2>
<div class="feature-list">
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>AI-verified observations</h4>
<p>Every alert submitted by a field observer is validated by our AI — image quality, metadata consistency, liveness — before it reaches your endpoint.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Automatic routing</h4>
<p>Alerts are matched to the responsible owner based on geolocation, category, and asset registry. No manual dispatch required.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Severity scoring</h4>
<p>Each alert carries a severity score (01), category tags, and estimated urgency — ready to plug into your incident or ticketing system.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Webhook delivery</h4>
<p>Configure your endpoint once. Alerts arrive as structured JSON payloads the moment they pass verification — no polling required.</p>
</div>
</div>
</div>
</div>
<div class="block">
<div class="block-label">API example</div>
<h2>Subscribe to alerts. Receive verified reality.</h2>
<div class="code-block">
<span class="cm"># Register your webhook endpoint</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/reality-alerts/subscriptions \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer ***"</span> \<br>
&nbsp;&nbsp;-H <span class="str">"Content-Type: application/json"</span> \<br>
&nbsp;&nbsp;-d '{<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"webhook_url"</span>: <span class="str">"https://yourapp.com/webhooks/alerts"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"categories"</span>: [<span class="str">"infrastructure"</span>, <span class="str">"flooding"</span>, <span class="str">"damage"</span>],<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"bbox"</span>: [<span class="num">17.8</span>, <span class="num">59.2</span>, <span class="num">18.3</span>, <span class="num">59.5</span>]<br>
&nbsp;&nbsp;}'<br><br>
<span class="cm"># Incoming webhook payload (verified alert)</span><br>
{<br>
&nbsp;&nbsp;<span class="str">"alert_id"</span>: <span class="str">"alt_9x8y7z"</span>,<br>
&nbsp;&nbsp;<span class="str">"category"</span>: <span class="str">"infrastructure"</span>,<br>
&nbsp;&nbsp;<span class="str">"subcategory"</span>: <span class="str">"road_damage"</span>,<br>
&nbsp;&nbsp;<span class="str">"severity"</span>: <span class="num">0.87</span>,<br>
&nbsp;&nbsp;<span class="str">"verified"</span>: <span class="kw">true</span>,<br>
&nbsp;&nbsp;<span class="str">"lat"</span>: <span class="num">59.3341</span>, <span class="str">"lng"</span>: <span class="num">18.0632</span>,<br>
&nbsp;&nbsp;<span class="str">"image_url"</span>: <span class="str">"https://cdn.aamos.ai/..."</span>,<br>
&nbsp;&nbsp;<span class="str">"responsible_entity"</span>: <span class="str">"Stockholm municipality"</span>,<br>
&nbsp;&nbsp;<span class="str">"observed_at"</span>: <span class="str">"2026-07-11T09:14:02Z"</span><br>
}
</div>
</div>
<div class="block">
<div class="block-label">Pricing</div>
<h2>Pay for verified alerts. Not noise.</h2>
<div class="pricing-grid">
<div class="price-card">
<div class="price-tier">Free</div>
<div class="price-amount">$0 <span>/mo</span></div>
<div class="price-desc">50 verified alerts / month</div>
<ul class="price-features">
<li>50 alerts / month</li>
<li>Webhook delivery</li>
<li>All categories</li>
<li>Community support</li>
</ul>
<a href="#" class="btn-outline">Get started</a>
</div>
<div class="price-card featured">
<div class="price-tier">Starter</div>
<div class="price-amount">$149 <span>/mo</span></div>
<div class="price-desc">2,000 verified alerts / month</div>
<ul class="price-features">
<li>2,000 alerts / month</li>
<li>Geographic bounding box filter</li>
<li>Category + severity filters</li>
<li>Asset registry integration</li>
<li>Email support</li>
</ul>
<a href="#" class="btn-filled">Get started</a>
</div>
<div class="price-card">
<div class="price-tier">Pro</div>
<div class="price-amount">$699 <span>/mo</span></div>
<div class="price-desc">Unlimited alerts + SLA</div>
<ul class="price-features">
<li>Unlimited alerts</li>
<li>Custom routing rules</li>
<li>Priority queue</li>
<li>99.9% SLA</li>
<li>Dedicated support</li>
</ul>
<a href="#" class="btn-outline">Get started</a>
</div>
</div>
</div>
</div>
<section class="cta-bottom">
<h2>Ready to receive verified field intelligence?</h2>
<p>Set up your webhook. Start receiving alerts in minutes.</p>
<a href="#" class="btn-primary">Get API key</a>
</section>
<footer>
<span>© 2026 AAMOS / Landvex AB</span>
<div class="footer-links"><a href="#">Privacy</a><a href="#">Terms</a><a href="/">Home</a></div>
</footer>
</body>
</html>
+238
View File
@@ -0,0 +1,238 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VIMS API — Visual Infrastructure Monitoring | AAMOS</title>
<meta name="description" content="AI-powered visual infrastructure monitoring API. Submit images, detect changes, classify risk — before problems become incidents.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--navy: #0A2540; --blue: #635BFF; --blue-light: #7B74FF;
--gray-50: #F8FAFC; --gray-100: #F1F5F9; --gray-200: #E2E8F0;
--gray-400: #94A3B8; --gray-600: #475569; --gray-800: #1E293B; --white: #FFFFFF;
--font: 'Inter', system-ui, -apple-system, sans-serif;
}
body { font-family: var(--font); background: var(--white); color: var(--gray-800); line-height: 1.6; }
a { color: inherit; text-decoration: none; }
nav {
position: sticky; top: 0; z-index: 100;
background: rgba(255,255,255,0.95); backdrop-filter: blur(8px);
border-bottom: 1px solid var(--gray-200);
padding: 0 24px; height: 60px;
display: flex; align-items: center; justify-content: space-between;
}
.nav-logo { font-size: 18px; font-weight: 700; color: var(--navy); }
.nav-logo span { color: var(--blue); }
.nav-back { font-size: 14px; color: var(--gray-600); display: flex; align-items: center; gap: 6px; }
.btn-nav { background: var(--navy); color: var(--white); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 14px; }
.hero {
background: linear-gradient(135deg, var(--navy) 0%, #1a3a60 100%);
color: var(--white); padding: 72px 24px 64px; text-align: center;
}
.hero-badge {
display: inline-block; background: rgba(99,91,255,0.25); color: #a5b4fc;
border: 1px solid rgba(99,91,255,0.4); border-radius: 100px;
padding: 4px 14px; font-size: 12px; font-weight: 600;
letter-spacing: 0.05em; text-transform: uppercase; margin-bottom: 20px;
}
.hero h1 { font-size: clamp(28px, 5vw, 46px); font-weight: 700; letter-spacing: -1px; line-height: 1.1; margin-bottom: 16px; }
.hero p { font-size: 17px; color: rgba(255,255,255,0.75); max-width: 500px; margin: 0 auto 32px; }
.btn-primary { background: var(--blue); color: var(--white); padding: 14px 28px; border-radius: 10px; font-size: 15px; font-weight: 600; display: inline-block; transition: background 0.15s; }
.btn-primary:hover { background: var(--blue-light); }
.content { max-width: 860px; margin: 0 auto; padding: 64px 24px; }
.block { margin-bottom: 60px; }
.block-label { font-size: 12px; font-weight: 700; color: var(--blue); letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 12px; }
.block h2 { font-size: clamp(22px, 3.5vw, 30px); font-weight: 700; letter-spacing: -0.5px; color: var(--navy); margin-bottom: 24px; }
.feature-list { display: grid; gap: 16px; }
.feature-item { display: flex; gap: 16px; align-items: flex-start; padding: 20px; background: var(--gray-50); border-radius: 12px; border: 1px solid var(--gray-200); }
.feature-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--blue); margin-top: 7px; flex-shrink: 0; }
.feature-item h4 { font-size: 15px; font-weight: 600; color: var(--navy); margin-bottom: 4px; }
.feature-item p { font-size: 14px; color: var(--gray-600); }
.code-block {
background: var(--navy); border-radius: 14px; padding: 24px;
font-family: 'SF Mono', 'Fira Code', monospace; font-size: 13px;
line-height: 1.75; color: rgba(255,255,255,0.85); overflow-x: auto;
}
.code-block .kw { color: #a5b4fc; }
.code-block .str { color: #86efac; }
.code-block .cm { color: rgba(255,255,255,0.4); }
.code-block .num { color: #fcd34d; }
.code-tabs { display: flex; gap: 8px; margin-bottom: 16px; }
.tab { font-size: 12px; font-weight: 600; padding: 6px 12px; border-radius: 6px; background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.6); cursor: pointer; }
.tab.active { background: var(--blue); color: white; }
.pricing-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; }
.price-card {
border: 1px solid var(--gray-200); border-radius: 16px; padding: 28px 24px;
display: flex; flex-direction: column;
}
.price-card.featured { border-color: var(--blue); box-shadow: 0 0 0 3px rgba(99,91,255,0.1); }
.price-tier { font-size: 13px; font-weight: 700; color: var(--blue); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; }
.price-amount { font-size: 32px; font-weight: 700; color: var(--navy); letter-spacing: -1px; }
.price-amount span { font-size: 15px; font-weight: 500; color: var(--gray-400); }
.price-desc { font-size: 13px; color: var(--gray-400); margin-top: 4px; margin-bottom: 20px; }
.price-features { list-style: none; display: flex; flex-direction: column; gap: 10px; flex: 1; margin-bottom: 24px; }
.price-features li { font-size: 14px; color: var(--gray-600); display: flex; align-items: center; gap: 8px; }
.price-features li::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.btn-outline { border: 1px solid var(--gray-200); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: var(--navy); text-align: center; display: block; transition: border-color 0.15s, background 0.15s; }
.btn-outline:hover { border-color: var(--blue); background: rgba(99,91,255,0.05); }
.btn-filled { background: var(--blue); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: white; text-align: center; display: block; }
.cta-bottom { background: var(--navy); color: var(--white); padding: 64px 24px; text-align: center; }
.cta-bottom h2 { font-size: clamp(22px, 4vw, 32px); font-weight: 700; letter-spacing: -0.5px; margin-bottom: 14px; }
.cta-bottom p { color: rgba(255,255,255,0.7); font-size: 16px; margin-bottom: 28px; max-width: 400px; margin-left: auto; margin-right: auto; }
footer { border-top: 1px solid var(--gray-200); padding: 24px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; font-size: 13px; color: var(--gray-400); }
footer a { color: var(--gray-400); }
.footer-links { display: flex; gap: 20px; }
</style>
</head>
<body>
<nav>
<a href="/" class="nav-logo">A<span>AMOS</span></a>
<a href="/" class="nav-back">← All products</a>
<a href="#" class="btn-nav">Get API key</a>
</nav>
<section class="hero">
<div class="hero-badge">Vision AI</div>
<h1>VIMS API</h1>
<p>Visual intelligence for infrastructure. Detect changes before they become problems.</p>
<a href="#" class="btn-primary">Get API key — free tier included</a>
</section>
<div class="content">
<div class="block">
<div class="block-label">What it does</div>
<h2>AI-powered change detection for physical infrastructure.</h2>
<div class="feature-list">
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Baseline per object</h4>
<p>Submit images of any structure — bridge, facade, utility pole. VIMS builds a visual baseline per object ID and tracks it over time.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Change detection</h4>
<p>Every new submission is compared against the object's baseline. Pixel-level and semantic changes are detected and scored.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>Risk classification</h4>
<p>Changes are classified by severity — low, medium, high, critical — with structured metadata for downstream alerting and ticketing.</p>
</div>
</div>
<div class="feature-item">
<div class="feature-dot"></div>
<div>
<h4>AI object detection</h4>
<p>Identify specific defects: cracks, corrosion, water damage, vegetation intrusion, structural deformation.</p>
</div>
</div>
</div>
</div>
<div class="block">
<div class="block-label">API example</div>
<h2>One call. Structured intelligence back.</h2>
<div class="code-block">
<span class="cm"># Submit an image for analysis</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/vims/analyze \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer ak_live_xxxx"</span> \<br>
&nbsp;&nbsp;-H <span class="str">"Content-Type: multipart/form-data"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"image=@bridge_north.jpg"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"object_id=bridge-e4-north"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"lat=59.3293"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"lng=18.0686"</span><br><br>
<span class="cm"># Response</span><br>
{<br>
&nbsp;&nbsp;<span class="str">"object_id"</span>: <span class="str">"bridge-e4-north"</span>,<br>
&nbsp;&nbsp;<span class="str">"analysis_id"</span>: <span class="str">"an_1a2b3c4d"</span>,<br>
&nbsp;&nbsp;<span class="str">"change_detected"</span>: <span class="kw">true</span>,<br>
&nbsp;&nbsp;<span class="str">"change_score"</span>: <span class="num">0.82</span>,<br>
&nbsp;&nbsp;<span class="str">"risk_level"</span>: <span class="str">"high"</span>,<br>
&nbsp;&nbsp;<span class="str">"detections"</span>: [<br>
&nbsp;&nbsp;&nbsp;&nbsp;{ <span class="str">"type"</span>: <span class="str">"crack"</span>, <span class="str">"confidence"</span>: <span class="num">0.94</span>, <span class="str">"bbox"</span>: [...] }<br>
&nbsp;&nbsp;],<br>
&nbsp;&nbsp;<span class="str">"baseline_updated"</span>: <span class="kw">false</span><br>
}
</div>
</div>
<div class="block">
<div class="block-label">Pricing</div>
<h2>Start free. Scale as you need.</h2>
<div class="pricing-grid">
<div class="price-card">
<div class="price-tier">Free</div>
<div class="price-amount">$0 <span>/mo</span></div>
<div class="price-desc">100 API calls per month</div>
<ul class="price-features">
<li>100 image analyses / month</li>
<li>Change detection</li>
<li>Risk classification</li>
<li>Community support</li>
</ul>
<a href="#" class="btn-outline">Get started</a>
</div>
<div class="price-card featured">
<div class="price-tier">Starter</div>
<div class="price-amount">$99 <span>/mo</span></div>
<div class="price-desc">10,000 API calls per month</div>
<ul class="price-features">
<li>10,000 image analyses / month</li>
<li>Baseline management</li>
<li>Webhook alerts</li>
<li>Email support</li>
<li>99.5% SLA</li>
</ul>
<a href="#" class="btn-filled">Get started</a>
</div>
<div class="price-card">
<div class="price-tier">Pro</div>
<div class="price-amount">$499 <span>/mo</span></div>
<div class="price-desc">100,000 API calls per month</div>
<ul class="price-features">
<li>100,000 image analyses / month</li>
<li>Custom object models</li>
<li>Priority support</li>
<li>99.9% SLA</li>
<li>Audit logs</li>
</ul>
<a href="#" class="btn-outline">Get started</a>
</div>
</div>
</div>
</div>
<section class="cta-bottom">
<h2>Ready to integrate VIMS?</h2>
<p>Start with the free tier. No credit card required.</p>
<a href="#" class="btn-primary">Get API key</a>
</section>
<footer>
<span>© 2026 AAMOS / Landvex AB</span>
<div class="footer-links">
<a href="#">Privacy</a>
<a href="#">Terms</a>
<a href="/">Home</a>
</div>
</footer>
</body>
</html>