Files
boc/backups/2026-07-12-1023/quixzoom-landing-prod/developer.html
T
Bernt 58ca4e68db 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
2026-07-12 12:41:35 +00:00

285 lines
12 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Developer API — Real-Time Field Data | quiXzoom</title>
<meta name="description" content="quiXzoom REST API documentation, webhooks, SDKs, and integration guides for developers. Build field intelligence into your applications.">
<link rel="canonical" href="https://www.quixzoom.com/developer">
<style>
:root {
--bg-dark: #f5f5f7;
--blue: #0066FF;
--blue-dark: #0052CC;
--blue-glow: rgba(0,102,255,0.10);
--text-dark: #1d1d1f;
--text-body: #3a3a3a;
--text-muted: #6e6e73;
--surface: #ffffff;
--surface-2: #f5f5f7;
--border: rgba(0,0,0,0.09);
--code-bg: #1d1d1f;
--code-text: #f5f5f7;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', sans-serif;
background: var(--bg-dark);
color: var(--text-dark);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.container { max-width: 1200px; margin: 0 auto; padding: 0 24px; }
/* Nav */
nav {
position: sticky; top: 0; z-index: 300;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(20px);
border-bottom: 1px solid var(--border);
}
.nav-inner { display: flex; align-items: center; justify-content: space-between; height: 64px; }
.nav-logo { font-size: 1.375rem; font-weight: 900; color: var(--text-dark); text-decoration: none; }
.nav-logo span { color: var(--blue); }
.nav-links { display: flex; gap: 32px; }
.nav-links a { color: var(--text-muted); text-decoration: none; font-weight: 500; transition: color 0.15s; }
.nav-links a:hover { color: var(--text-dark); }
.nav-links a.active { color: var(--blue); }
/* Hero */
.hero { padding: 80px 0 60px; text-align: center; background: var(--surface); }
.hero h1 { font-size: clamp(2rem, 5vw, 3.5rem); font-weight: 800; letter-spacing: -0.03em; line-height: 1.1; margin-bottom: 20px; }
.hero p { font-size: 1.25rem; color: var(--text-body); max-width: 640px; margin: 0 auto; }
/* API sections */
.api-section { padding: 60px 0; }
.section-title { text-align: center; margin-bottom: 48px; }
.section-title h2 { font-size: 2rem; font-weight: 700; margin-bottom: 12px; }
.section-title p { font-size: 1.1rem; color: var(--text-muted); }
.endpoint-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 24px; }
.endpoint-card {
background: var(--surface); border: 1px solid var(--border); border-radius: 16px; padding: 32px;
}
.endpoint-card .method {
display: inline-block; padding: 4px 10px; border-radius: 6px;
font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em;
margin-bottom: 12px;
}
.method.get { background: var(--blue-glow); color: var(--blue); }
.method.post { background: rgba(34,197,94,0.12); color: #16a34a; }
.method.patch { background: rgba(234,179,8,0.12); color: #ca8a04; }
.method.delete { background: rgba(239,68,68,0.12); color: #dc2626; }
.endpoint-card h4 { font-size: 1rem; font-weight: 600; font-family: 'SF Mono', Monaco, monospace; margin-bottom: 8px; color: var(--text-dark); }
.endpoint-card p { font-size: 0.9rem; color: var(--text-muted); line-height: 1.5; }
/* Code block */
.code-block {
background: var(--code-bg); color: var(--code-text);
border-radius: 12px; padding: 24px; overflow-x: auto;
font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace; font-size: 0.875rem; line-height: 1.6;
margin: 24px 0;
}
.code-block .comment { color: #6e6e73; }
.code-block .keyword { color: #ff7b72; }
.code-block .string { color: #a5d6ff; }
.code-block .num { color: #79c0ff; }
/* Features */
.features { padding: 40px 0; }
.feature-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; }
.feature-card {
background: var(--surface); border: 1px solid var(--border); border-radius: 20px; padding: 40px;
transition: transform 0.2s, box-shadow 0.2s;
}
.feature-card:hover { transform: translateY(-4px); box-shadow: 0 12px 40px rgba(0,0,0,0.08); }
.feature-icon { width: 48px; height: 48px; background: var(--blue-glow); border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; margin-bottom: 20px; }
.feature-card h3 { font-size: 1.25rem; font-weight: 700; margin-bottom: 12px; }
.feature-card p { font-size: 0.95rem; color: var(--text-muted); line-height: 1.6; }
/* CTA */
.cta {
background: var(--surface); border-top: 1px solid var(--border);
padding: 80px 0; text-align: center;
}
.cta h2 { font-size: 2.5rem; font-weight: 800; margin-bottom: 16px; }
.cta p { font-size: 1.1rem; color: var(--text-muted); margin-bottom: 32px; }
.btn {
display: inline-block; padding: 16px 32px;
background: var(--blue); color: #fff; border: none; border-radius: 12px;
font-size: 1rem; font-weight: 600; text-decoration: none;
cursor: pointer; transition: background 0.2s;
}
.btn:hover { background: var(--blue-dark); }
.btn-secondary {
display: inline-block; padding: 16px 32px;
background: transparent; color: var(--blue); border: 2px solid var(--blue); border-radius: 12px;
font-size: 1rem; font-weight: 600; text-decoration: none;
cursor: pointer; transition: all 0.2s; margin-left: 12px;
}
.btn-secondary:hover { background: var(--blue-glow); }
/* Footer */
footer { background: var(--surface); border-top: 1px solid var(--border); padding: 40px 0; }
.footer-inner { display: flex; justify-content: space-between; align-items: center; }
.footer-links { display: flex; gap: 24px; }
.footer-links a { color: var(--text-muted); text-decoration: none; font-size: 0.875rem; }
.footer-links a:hover { color: var(--text-dark); }
@media (max-width: 768px) {
.nav-links { display: none; }
.feature-grid { grid-template-columns: 1fr; }
.btn-secondary { margin-left: 0; margin-top: 12px; }
}
</style>
</head>
<body>
<nav>
<div class="container">
<div class="nav-inner">
<a href="/" class="nav-logo">qui<span>X</span>zoom</a>
<div class="nav-links">
<a href="/">Home</a>
<a href="/about">About</a>
<a href="/features">Features</a>
<a href="/how-it-works">How It Works</a>
<a href="/for-organisations">For Organisations</a>
<a href="/developer" class="active">Developer</a>
<a href="/support">Support</a>
</div>
</div>
</div>
</nav>
<section class="hero">
<div class="container">
<h1>Build with quiXzoom</h1>
<p>RESTful API, webhooks, and comprehensive documentation. Integrate field intelligence into your applications in minutes, not weeks.</p>
</div>
</section>
<section class="api-section">
<div class="container">
<div class="section-title">
<h2>API Reference</h2>
<p>Core endpoints for missions, submissions, and organisations</p>
</div>
<div class="endpoint-grid">
<div class="endpoint-card">
<span class="method get">GET</span>
<h4>/v1/missions</h4>
<p>List all missions for your organisation. Filter by status, location, date range, and campaign.</p>
</div>
<div class="endpoint-card">
<span class="method post">POST</span>
<h4>/v1/missions</h4>
<p>Create a new mission with requirements, geofences, deadlines, and payout settings.</p>
</div>
<div class="endpoint-card">
<span class="method get">GET</span>
<h4>/v1/missions/{id}</h4>
<p>Retrieve detailed mission information including progress, submissions, and analytics.</p>
</div>
<div class="endpoint-card">
<span class="method patch">PATCH</span>
<h4>/v1/missions/{id}</h4>
<p>Update mission parameters, extend deadlines, or modify requirements after launch.</p>
</div>
<div class="endpoint-card">
<span class="method get">GET</span>
<h4>/v1/submissions</h4>
<p>Fetch submissions with filtering by mission, status, quality score, and date.</p>
</div>
<div class="endpoint-card">
<span class="method post">POST</span>
<h4>/v1/submissions/{id}/approve</h4>
<p>Manually approve a submission that was flagged by AI review or requires human verification.</p>
</div>
<div class="endpoint-card">
<span class="method get">GET</span>
<h4>/v1/organisations/{id}/analytics</h4>
<p>Access aggregated analytics: mission completion rates, cost per data point, and quality trends.</p>
</div>
<div class="endpoint-card">
<span class="method get">GET</span>
<h4>/v1/zoomers</h4>
<p>List verified Zoomers in a geographic area with ratings, skills, and availability.</p>
</div>
</div>
<div class="code-block">
<span class="comment">// Create a mission</span>
<span class="keyword">const</span> mission = <span class="keyword">await</span> fetch(<span class="string">'https://api.quixzoom.com/v1/missions'</span>, {
method: <span class="string">'POST'</span>,
headers: {
<span class="string">'Authorization'</span>: <span class="string">'Bearer YOUR_API_KEY'</span>,
<span class="string">'Content-Type'</span>: <span class="string">'application/json'</span>
},
body: JSON.stringify({
title: <span class="string">'Street condition audit — Stockholm'</span>,
location: { lat: <span class="num">59.3293</span>, lng: <span class="num">18.0686</span>, radius: <span class="num">5000</span> },
requirements: [<span class="string">'photo_front'</span>, <span class="string">'photo_back'</span>, <span class="string">'condition_rating'</span>],
payout: { amount: <span class="num">150</span>, currency: <span class="string">'SEK'</span> },
deadline: <span class="string">'2026-07-15T23:59:59Z'</span>
})
});
</div>
</div>
</section>
<section class="features">
<div class="container">
<div class="section-title">
<h2>Developer tools</h2>
<p>Everything you need to integrate quiXzoom</p>
</div>
<div class="feature-grid">
<div class="feature-card">
<div class="feature-icon">📡</div>
<h3>Webhooks</h3>
<p>Subscribe to real-time events: mission completion, submission approval, quality flags, and payout confirmations. Reliable delivery with automatic retries.</p>
</div>
<div class="feature-card">
<div class="feature-icon">📚</div>
<h3>OpenAPI Spec</h3>
<p>Full OpenAPI 3.0 specification available for code generation, testing, and documentation. Import into Postman, Swagger, or your favourite API tool.</p>
</div>
<div class="feature-card">
<div class="feature-icon">🔑</div>
<h3>API Keys & OAuth 2.0</h3>
<p>Simple API key authentication for quick starts. OAuth 2.0 with PKCE for production applications. Fine-grained scopes and audit logging.</p>
</div>
<div class="feature-card">
<div class="feature-icon">🧪</div>
<h3>Sandbox Environment</h3>
<p>Test every endpoint in a fully isolated sandbox. Simulate Zoomer submissions, AI reviews, and payouts without touching production data.</p>
</div>
</div>
</div>
</section>
<section class="cta">
<div class="container">
<h2>Start building today</h2>
<p>Get your API keys and make your first request in under 5 minutes.</p>
<a href="/join" class="btn">Get API access</a>
<a href="mailto:dev@quixzoom.com" class="btn-secondary">Contact Developer Support</a>
</div>
</section>
<footer>
<div class="container">
<div class="footer-inner">
<div>© 2026 quiXzoom · Operated by Landvex AB</div>
<div class="footer-links">
<a href="/privacy">Privacy</a>
<a href="/terms">Terms</a>
<a href="/support">Support</a>
</div>
</div>
</div>
</footer>
</body>
</html>