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
285 lines
12 KiB
HTML
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>
|