58ca4e68db
- 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
412 lines
18 KiB
HTML
412 lines
18 KiB
HTML
<!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 & 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>
|