{"id":307,"date":"2026-09-28T11:41:29","date_gmt":"2026-09-28T04:41:29","guid":{"rendered":"https:\/\/siteplore.com\/?page_id=307"},"modified":"2026-09-28T11:41:31","modified_gmt":"2026-09-28T04:41:31","slug":"documentation","status":"publish","type":"page","link":"https:\/\/siteplore.com\/index.php\/documentation\/","title":{"rendered":"Documentation"},"content":{"rendered":"\n<!--\n  Siteplore \u2014 Documentation page body\n  Paste this complete block into a WordPress Custom HTML block.\n  All CSS and JavaScript are scoped to #sp-documentation.\n-->\n\n<section id=\"sp-documentation\" class=\"spdoc\" aria-label=\"Siteplore documentation\">\n  <style>\n    #sp-documentation,\n    #sp-documentation * { box-sizing: border-box; }\n\n    #sp-documentation {\n      --doc-navy-950: #101a2d;\n      --doc-navy-900: #17243d;\n      --doc-navy-800: #223757;\n      --doc-blue-700: #1767ad;\n      --doc-blue-600: #2381cf;\n      --doc-blue-100: #dceeff;\n      --doc-sky-50: #f3f9ff;\n      --doc-yellow-500: #fdbd0d;\n      --doc-yellow-100: #fff0b9;\n      --doc-green-600: #13866f;\n      --doc-green-100: #dff6ee;\n      --doc-purple-600: #6f52b7;\n      --doc-purple-100: #eee8ff;\n      --doc-orange-600: #c56d1b;\n      --doc-orange-100: #fff0df;\n      --doc-ink: #142137;\n      --doc-muted: #5f6f86;\n      --doc-line: #dce5ef;\n      --doc-white: #ffffff;\n      --doc-shadow: 0 24px 70px rgba(16,34,62,.12);\n      color: var(--doc-ink);\n      background: var(--doc-white);\n      font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n      font-size: 16px;\n      line-height: 1.65;\n      overflow: hidden;\n    }\n\n    #sp-documentation a { color: inherit; }\n    #sp-documentation button,\n    #sp-documentation input,\n    #sp-documentation a { -webkit-tap-highlight-color: transparent; }\n    #sp-documentation svg { display: block; }\n\n    #sp-documentation .doc-shell { width: min(1180px, calc(100% - 40px)); margin-inline: auto; }\n    #sp-documentation .doc-eyebrow { display: inline-flex; align-items: center; gap: 10px; margin: 0 0 18px; color: var(--doc-blue-700); font-size: 12px; font-weight: 850; letter-spacing: .14em; line-height: 1.3; text-transform: uppercase; }\n    #sp-documentation .doc-eyebrow::before { width: 30px; height: 3px; border-radius: 999px; background: var(--doc-yellow-500); content: \"\"; }\n    #sp-documentation .doc-title { max-width: 850px; margin: 0; color: var(--doc-navy-950); font-size: clamp(36px,5.3vw,64px); font-weight: 850; letter-spacing: -.05em; line-height: 1.02; }\n    #sp-documentation .doc-section-title { max-width: 820px; margin: 0; color: var(--doc-navy-950); font-size: clamp(30px,4vw,46px); font-weight: 850; letter-spacing: -.04em; line-height: 1.1; }\n    #sp-documentation .doc-lead { max-width: 780px; margin: 20px 0 0; color: var(--doc-muted); font-size: 18px; }\n    #sp-documentation .doc-btn { display: inline-flex; min-height: 50px; align-items: center; justify-content: center; gap: 9px; padding: 12px 21px; border: 1px solid transparent; border-radius: 10px; font-size: 15px; font-weight: 850; line-height: 1.2; text-decoration: none; transition: transform .2s ease, background .2s ease, box-shadow .2s ease; }\n    #sp-documentation .doc-btn:hover { transform: translateY(-2px); }\n    #sp-documentation .doc-btn-primary { color: var(--doc-navy-950); background: var(--doc-yellow-500); box-shadow: 0 12px 30px rgba(253,189,13,.23); }\n    #sp-documentation .doc-btn-primary:hover { background: #ffc92d; }\n    #sp-documentation .doc-btn-secondary { color: #fff; border-color: rgba(255,255,255,.34); background: rgba(255,255,255,.06); }\n    #sp-documentation .doc-btn-secondary:hover { background: rgba(255,255,255,.12); }\n\n    \/* Hero *\/\n    #sp-documentation .doc-hero { position: relative; isolation: isolate; padding: 94px 0 82px; color: #fff; background: radial-gradient(circle at 86% 14%,rgba(35,129,207,.3),transparent 29%), radial-gradient(circle at 15% 90%,rgba(253,189,13,.13),transparent 25%), linear-gradient(130deg,var(--doc-navy-950),var(--doc-navy-800)); }\n    #sp-documentation .doc-hero::before { position: absolute; z-index: -1; inset: 0; opacity: .17; background-image: linear-gradient(rgba(255,255,255,.14) 1px,transparent 1px), linear-gradient(90deg,rgba(255,255,255,.14) 1px,transparent 1px); background-size: 44px 44px; mask-image: linear-gradient(to right,#000,transparent 76%); content: \"\"; }\n    #sp-documentation .doc-hero-grid { display: grid; align-items: center; gap: 62px; grid-template-columns: minmax(0,1.06fr) minmax(380px,.94fr); }\n    #sp-documentation .doc-hero .doc-eyebrow { color: #b9dcff; }\n    #sp-documentation .doc-hero .doc-title { color: #fff; }\n    #sp-documentation .doc-hero-copy { max-width: 720px; margin: 24px 0 0; color: #d8e5f2; font-size: clamp(17px,2vw,20px); }\n    #sp-documentation .doc-hero-copy strong { color: #fff; }\n    #sp-documentation .doc-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 34px; }\n\n    \/* Console visual *\/\n    #sp-documentation .doc-console { position: relative; overflow: hidden; border: 1px solid rgba(255,255,255,.19); border-radius: 21px; background: #0b1424; box-shadow: 0 40px 80px rgba(0,0,0,.26); }\n    #sp-documentation .doc-console::after { position: absolute; right: -46px; bottom: -55px; width: 150px; height: 150px; border: 28px solid rgba(253,189,13,.88); border-radius: 50%; content: \"\"; }\n    #sp-documentation .doc-console-bar { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 13px 16px; border-bottom: 1px solid rgba(255,255,255,.1); color: #bdd0e3; background: #121e32; font-size: 10px; font-weight: 800; }\n    #sp-documentation .doc-dots { display: flex; gap: 6px; }\n    #sp-documentation .doc-dots span { width: 8px; height: 8px; border-radius: 50%; background: #52708e; }\n    #sp-documentation .doc-dots span:first-child { background: var(--doc-yellow-500); }\n    #sp-documentation .doc-console-grid { display: grid; min-height: 365px; grid-template-columns: 132px 1fr; }\n    #sp-documentation .doc-side { padding: 17px 11px; border-right: 1px solid rgba(255,255,255,.08); background: #0f1a2b; }\n    #sp-documentation .doc-side-label { padding: 8px 9px; color: #6f87a1; font-size: 8px; font-weight: 900; letter-spacing: .1em; text-transform: uppercase; }\n    #sp-documentation .doc-side-item { display: flex; align-items: center; gap: 7px; margin-top: 4px; padding: 8px 9px; border-radius: 7px; color: #9eb1c4; font-size: 9px; font-weight: 700; }\n    #sp-documentation .doc-side-item.is-active { color: #fff; background: rgba(35,129,207,.22); }\n    #sp-documentation .doc-side-item::before { width: 6px; height: 6px; border-radius: 2px; background: #4d6b89; content: \"\"; }\n    #sp-documentation .doc-side-item.is-active::before { background: var(--doc-yellow-500); }\n    #sp-documentation .doc-console-main { position: relative; z-index: 2; padding: 24px; }\n    #sp-documentation .doc-console-main h2 { margin: 0; color: #fff; font-size: 20px; letter-spacing: -.02em; }\n    #sp-documentation .doc-console-main > p { margin: 6px 0 19px; color: #8299b0; font-size: 10px; }\n    #sp-documentation .doc-code { margin: 0; padding: 17px; overflow-x: auto; border: 1px solid rgba(255,255,255,.08); border-radius: 10px; color: #b9e4ff; background: #07101d; font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size: 9px; line-height: 1.72; white-space: pre; }\n    #sp-documentation .doc-code .k { color: #ffda6a; }\n    #sp-documentation .doc-code .s { color: #9ee7d4; }\n    #sp-documentation .doc-code .v { color: #b8c9ff; }\n    #sp-documentation .doc-success { display: flex; align-items: center; gap: 9px; margin-top: 13px; padding: 10px 12px; border: 1px solid rgba(54,215,177,.18); border-radius: 9px; color: #a9f0df; background: rgba(54,215,177,.07); font-size: 9px; font-weight: 750; }\n    #sp-documentation .doc-success::before { width: 8px; height: 8px; border-radius: 50%; background: #36d7b1; box-shadow: 0 0 0 4px rgba(54,215,177,.1); content: \"\"; }\n\n    \/* Audience band *\/\n    #sp-documentation .doc-audience-band { border-bottom: 1px solid var(--doc-line); background: #fff; }\n    #sp-documentation .doc-audience-grid { display: grid; grid-template-columns: repeat(4,1fr); }\n    #sp-documentation .doc-audience { position: relative; min-height: 134px; padding: 28px 25px; border-right: 1px solid var(--doc-line); text-decoration: none; }\n    #sp-documentation .doc-audience:first-child { border-left: 1px solid var(--doc-line); }\n    #sp-documentation .doc-audience::before { position: absolute; top: 0; left: 25px; width: 41px; height: 4px; border-radius: 0 0 999px 999px; background: var(--doc-yellow-500); content: \"\"; }\n    #sp-documentation .doc-audience span { display: block; color: var(--doc-blue-700); font-size: 9px; font-weight: 900; letter-spacing: .11em; text-transform: uppercase; }\n    #sp-documentation .doc-audience strong { display: block; margin-top: 7px; color: var(--doc-navy-950); font-size: 17px; line-height: 1.25; }\n    #sp-documentation .doc-audience p { margin: 7px 0 0; color: var(--doc-muted); font-size: 11px; line-height: 1.5; }\n\n    \/* Quick start *\/\n    #sp-documentation .doc-start { padding: 104px 0 94px; background: #fff; }\n    #sp-documentation .doc-start-head { display: grid; align-items: end; gap: 40px; grid-template-columns: 1fr auto; }\n    #sp-documentation .doc-start-note { max-width: 320px; padding: 15px 17px; border: 1px solid #cfe0ee; border-radius: 12px; color: #4e647c; background: var(--doc-sky-50); font-size: 11px; }\n    #sp-documentation .doc-start-note strong { display: block; margin-bottom: 4px; color: var(--doc-navy-900); font-size: 12px; }\n    #sp-documentation .doc-step-grid { display: grid; gap: 0; margin-top: 48px; grid-template-columns: repeat(5,1fr); }\n    #sp-documentation .doc-step { position: relative; min-height: 230px; padding: 27px 23px; border: 1px solid var(--doc-line); border-right: 0; background: #fff; }\n    #sp-documentation .doc-step:first-child { border-radius: 16px 0 0 16px; }\n    #sp-documentation .doc-step:last-child { border-right: 1px solid var(--doc-line); border-radius: 0 16px 16px 0; }\n    #sp-documentation .doc-step::after { position: absolute; z-index: 2; top: 46px; right: -12px; width: 24px; height: 24px; border-top: 1px solid var(--doc-line); border-right: 1px solid var(--doc-line); background: #fff; content: \"\"; transform: rotate(45deg); }\n    #sp-documentation .doc-step:last-child::after { display: none; }\n    #sp-documentation .doc-step-num { display: grid; width: 38px; height: 38px; place-items: center; border-radius: 10px; color: var(--doc-navy-950); background: var(--doc-yellow-500); font-size: 11px; font-weight: 900; }\n    #sp-documentation .doc-step h3 { margin: 17px 0 8px; color: var(--doc-navy-950); font-size: 17px; line-height: 1.25; }\n    #sp-documentation .doc-step p { margin: 0; color: var(--doc-muted); font-size: 11px; }\n\n    \/* Integration example *\/\n    #sp-documentation .doc-integration { padding: 94px 0; background: var(--doc-sky-50); }\n    #sp-documentation .doc-integration-grid { display: grid; align-items: center; gap: 60px; grid-template-columns: .85fr 1.15fr; }\n    #sp-documentation .doc-integration-list { display: grid; gap: 11px; margin-top: 28px; }\n    #sp-documentation .doc-integration-item { display: grid; gap: 12px; padding: 14px 15px; border: 1px solid #d6e3ee; border-radius: 11px; background: #fff; grid-template-columns: auto 1fr; }\n    #sp-documentation .doc-integration-item span:first-child { display: grid; width: 28px; height: 28px; place-items: center; border-radius: 8px; color: var(--doc-navy-950); background: var(--doc-yellow-500); font-size: 10px; font-weight: 900; }\n    #sp-documentation .doc-integration-item strong { display: block; color: var(--doc-navy-900); font-size: 12px; }\n    #sp-documentation .doc-integration-item small { display: block; margin-top: 2px; color: var(--doc-muted); font-size: 10px; }\n\n    #sp-documentation .doc-code-panel { overflow: hidden; border: 1px solid #243b57; border-radius: 17px; background: #091321; box-shadow: var(--doc-shadow); }\n    #sp-documentation .doc-code-tabs { display: flex; flex-wrap: wrap; gap: 5px; padding: 11px; border-bottom: 1px solid rgba(255,255,255,.09); background: #111e31; }\n    #sp-documentation .doc-code-tab { min-height: 34px; padding: 7px 12px; border: 0; border-radius: 7px; color: #8fa6bd; background: transparent; cursor: pointer; font: inherit; font-size: 10px; font-weight: 850; }\n    #sp-documentation .doc-code-tab[aria-selected=\"true\"] { color: #fff; background: rgba(35,129,207,.25); }\n    #sp-documentation .doc-code-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 17px 0; color: #788da5; font-size: 9px; }\n    #sp-documentation .doc-copy { padding: 6px 9px; border: 1px solid rgba(255,255,255,.14); border-radius: 7px; color: #b8c9d9; background: rgba(255,255,255,.05); cursor: pointer; font: inherit; font-size: 9px; font-weight: 800; }\n    #sp-documentation .doc-code-content { display: none; margin: 0; padding: 17px 18px 22px; overflow-x: auto; color: #b9e4ff; font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size: 11px; line-height: 1.7; white-space: pre; }\n    #sp-documentation .doc-code-content.is-active { display: block; }\n    #sp-documentation .doc-placeholder-note { margin: 13px 17px 17px; padding: 11px 12px; border: 1px solid rgba(253,189,13,.18); border-radius: 8px; color: #d7c47e; background: rgba(253,189,13,.06); font-size: 9px; }\n\n    \/* Documentation library *\/\n    #sp-documentation .doc-library { padding: 102px 0; background: #fff; }\n    #sp-documentation .doc-tools { display: grid; gap: 14px; margin-top: 38px; grid-template-columns: minmax(260px,.72fr) minmax(0,1.28fr); }\n    #sp-documentation .doc-search-wrap { position: relative; }\n    #sp-documentation .doc-search-icon { position: absolute; top: 50%; left: 15px; width: 19px; height: 19px; color: #708197; pointer-events: none; transform: translateY(-50%); }\n    #sp-documentation .doc-search { width: 100%; min-height: 46px; padding: 10px 14px 10px 43px; border: 1px solid #cbd9e7; border-radius: 11px; outline: none; color: var(--doc-ink); background: #fff; font: inherit; font-size: 13px; }\n    #sp-documentation .doc-search:focus { border-color: var(--doc-blue-600); box-shadow: 0 0 0 4px rgba(35,129,207,.12); }\n    #sp-documentation .doc-filters { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; }\n    #sp-documentation .doc-filter { min-height: 42px; padding: 9px 14px; border: 1px solid #cad8e7; border-radius: 999px; color: var(--doc-navy-800); background: #fff; cursor: pointer; font: inherit; font-size: 11px; font-weight: 850; transition: color .18s ease,background .18s ease,border-color .18s ease,transform .18s ease; }\n    #sp-documentation .doc-filter:hover { border-color: var(--doc-blue-600); transform: translateY(-1px); }\n    #sp-documentation .doc-filter[aria-pressed=\"true\"] { color: #fff; border-color: var(--doc-navy-900); background: var(--doc-navy-900); }\n    #sp-documentation .doc-results-meta { margin-top: 18px; color: var(--doc-muted); font-size: 12px; }\n    #sp-documentation .doc-card-grid { display: grid; gap: 21px; margin-top: 22px; grid-template-columns: repeat(3,minmax(0,1fr)); }\n    #sp-documentation .doc-card { display: flex; min-width: 0; min-height: 100%; flex-direction: column; padding: 24px; border: 1px solid var(--doc-line); border-radius: 17px; background: #fff; box-shadow: 0 12px 34px rgba(20,49,82,.07); transition: transform .22s ease,box-shadow .22s ease,border-color .22s ease; }\n    #sp-documentation .doc-card:hover { border-color: #b7cee4; box-shadow: 0 22px 50px rgba(20,49,82,.12); transform: translateY(-4px); }\n    #sp-documentation .doc-card[hidden] { display: none; }\n    #sp-documentation .doc-card-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n    #sp-documentation .doc-card-icon { display: grid; width: 46px; height: 46px; place-items: center; border-radius: 13px; color: var(--doc-blue-700); background: var(--doc-blue-100); }\n    #sp-documentation .doc-card-icon svg { width: 23px; height: 23px; }\n    #sp-documentation .doc-card[data-category=\"integration\"] .doc-card-icon { color: var(--doc-purple-600); background: var(--doc-purple-100); }\n    #sp-documentation .doc-card[data-category=\"monitoring\"] .doc-card-icon { color: var(--doc-green-600); background: var(--doc-green-100); }\n    #sp-documentation .doc-card[data-category=\"admin\"] .doc-card-icon { color: var(--doc-orange-600); background: var(--doc-orange-100); }\n    #sp-documentation .doc-card-type { padding: 5px 8px; border-radius: 999px; color: var(--doc-blue-700); background: #edf7ff; font-size: 8px; font-weight: 900; letter-spacing: .07em; text-transform: uppercase; }\n    #sp-documentation .doc-card h3 { margin: 19px 0 8px; color: var(--doc-navy-950); font-size: 20px; letter-spacing: -.025em; line-height: 1.24; }\n    #sp-documentation .doc-card > p { margin: 0; color: var(--doc-muted); font-size: 12px; }\n    #sp-documentation .doc-card ul { margin: 16px 0 0; padding: 14px 0 0; border-top: 1px solid #e9eff5; list-style: none; }\n    #sp-documentation .doc-card li { position: relative; margin-top: 5px; padding-left: 15px; color: var(--doc-muted); font-size: 10px; }\n    #sp-documentation .doc-card li::before { position: absolute; top: 7px; left: 1px; width: 5px; height: 5px; border-radius: 50%; background: var(--doc-yellow-500); content: \"\"; }\n    #sp-documentation .doc-card-link { display: inline-flex; align-items: center; gap: 6px; margin-top: auto; padding-top: 20px; color: var(--doc-blue-700); font-size: 11px; font-weight: 850; text-decoration: none; }\n    #sp-documentation .doc-card-link:hover { text-decoration: underline; text-underline-offset: 3px; }\n    #sp-documentation .doc-empty { display: none; margin-top: 24px; padding: 28px; border: 1px dashed #c2d2e1; border-radius: 14px; color: var(--doc-muted); background: var(--doc-sky-50); text-align: center; }\n    #sp-documentation .doc-empty.is-visible { display: block; }\n\n    \/* Customer stack *\/\n    #sp-documentation .doc-stack-section { padding: 96px 0; background: var(--doc-sky-50); }\n    #sp-documentation .doc-stack-grid { display: grid; align-items: center; gap: 58px; margin-top: 44px; grid-template-columns: 1.05fr .95fr; }\n    #sp-documentation .doc-stack-diagram { display: grid; gap: 11px; padding: 25px; border: 1px solid #d4e1ec; border-radius: 18px; background: #fff; box-shadow: 0 16px 38px rgba(20,49,82,.08); }\n    #sp-documentation .doc-stack-node { display: grid; align-items: center; gap: 13px; padding: 14px; border: 1px solid #dce6ef; border-radius: 11px; background: #f8fbfe; grid-template-columns: auto 1fr auto; }\n    #sp-documentation .doc-stack-node > span:first-child { display: grid; width: 34px; height: 34px; place-items: center; border-radius: 9px; color: var(--doc-navy-950); background: var(--doc-yellow-500); font-size: 10px; font-weight: 900; }\n    #sp-documentation .doc-stack-node strong { display: block; color: var(--doc-navy-950); font-size: 12px; }\n    #sp-documentation .doc-stack-node small { display: block; margin-top: 2px; color: var(--doc-muted); font-size: 9px; }\n    #sp-documentation .doc-stack-node code { padding: 5px 7px; border-radius: 6px; color: var(--doc-blue-700); background: #eaf5ff; font-family: ui-monospace,SFMono-Regular,Menlo,monospace; font-size: 8px; }\n    #sp-documentation .doc-capability-list { display: grid; gap: 12px; }\n    #sp-documentation .doc-capability { padding: 16px 17px; border: 1px solid #d8e3ee; border-radius: 12px; background: #fff; }\n    #sp-documentation .doc-capability strong { display: block; color: var(--doc-navy-950); font-size: 13px; }\n    #sp-documentation .doc-capability span { display: block; margin-top: 4px; color: var(--doc-muted); font-size: 11px; }\n\n    \/* CTA *\/\n    #sp-documentation .doc-cta { padding: 100px 0; background: #fff; }\n    #sp-documentation .doc-cta-box { position: relative; isolation: isolate; display: grid; align-items: center; gap: 40px; padding: 52px; overflow: hidden; border-radius: 24px; color: #fff; background: linear-gradient(120deg,var(--doc-navy-950),#234b74); box-shadow: var(--doc-shadow); grid-template-columns: 1fr auto; }\n    #sp-documentation .doc-cta-box::before { position: absolute; z-index: -1; top: -85px; right: -40px; width: 300px; height: 300px; border: 56px solid rgba(253,189,13,.9); border-radius: 50%; content: \"\"; }\n    #sp-documentation .doc-cta-box h2 { max-width: 720px; margin: 0; color: #fff; font-size: clamp(29px,4vw,43px); letter-spacing: -.035em; line-height: 1.1; }\n    #sp-documentation .doc-cta-box p { max-width: 700px; margin: 15px 0 0; color: #d3e2f1; }\n    #sp-documentation .doc-cta-actions { display: flex; min-width: 230px; flex-direction: column; gap: 10px; }\n    #sp-documentation .doc-cta-actions .doc-btn { width: 100%; }\n\n    #sp-documentation .doc-sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0,0,0,0) !important; white-space: nowrap !important; border: 0 !important; }\n\n    @media (max-width: 1040px) {\n      #sp-documentation .doc-hero-grid,\n      #sp-documentation .doc-integration-grid,\n      #sp-documentation .doc-stack-grid { grid-template-columns: 1fr; }\n      #sp-documentation .doc-console { max-width: 720px; }\n      #sp-documentation .doc-step-grid { gap: 12px; grid-template-columns: repeat(2,1fr); }\n      #sp-documentation .doc-step,\n      #sp-documentation .doc-step:first-child,\n      #sp-documentation .doc-step:last-child { border: 1px solid var(--doc-line); border-radius: 14px; }\n      #sp-documentation .doc-step::after { display: none; }\n      #sp-documentation .doc-card-grid { grid-template-columns: repeat(2,minmax(0,1fr)); }\n      #sp-documentation .doc-cta-box { grid-template-columns: 1fr; }\n      #sp-documentation .doc-cta-actions { min-width: 0; flex-direction: row; }\n    }\n\n    @media (max-width: 740px) {\n      #sp-documentation .doc-shell { width: min(100% - 28px,1180px); }\n      #sp-documentation .doc-hero { padding: 62px 0 58px; }\n      #sp-documentation .doc-console-grid { grid-template-columns: 1fr; }\n      #sp-documentation .doc-side { display: none; }\n      #sp-documentation .doc-audience-grid,\n      #sp-documentation .doc-step-grid,\n      #sp-documentation .doc-tools,\n      #sp-documentation .doc-card-grid { grid-template-columns: 1fr; }\n      #sp-documentation .doc-audience,\n      #sp-documentation .doc-audience:first-child { border: 0; border-top: 1px solid var(--doc-line); }\n      #sp-documentation .doc-audience:first-child { border-top: 0; }\n      #sp-documentation .doc-start,\n      #sp-documentation .doc-integration,\n      #sp-documentation .doc-library,\n      #sp-documentation .doc-stack-section { padding-block: 72px; }\n      #sp-documentation .doc-start-head { grid-template-columns: 1fr; }\n      #sp-documentation .doc-start-note { max-width: none; }\n      #sp-documentation .doc-filters { justify-content: flex-start; }\n      #sp-documentation .doc-stack-node { grid-template-columns: auto 1fr; }\n      #sp-documentation .doc-stack-node code { grid-column: 2; width: fit-content; }\n      #sp-documentation .doc-cta { padding-block: 72px; }\n      #sp-documentation .doc-cta-box { padding: 34px 24px; border-radius: 18px; }\n      #sp-documentation .doc-cta-actions { flex-direction: column; }\n    }\n\n    @media (prefers-reduced-motion: reduce) {\n      #sp-documentation *,\n      #sp-documentation *::before,\n      #sp-documentation *::after { scroll-behavior: auto !important; transition: none !important; }\n    }\n  <\/style>\n\n  <header class=\"doc-hero\">\n    <div class=\"doc-shell doc-hero-grid\">\n      <div>\n        <p class=\"doc-eyebrow\">Siteplore Documentation<\/p>\n        <h1 class=\"doc-title\">Build, connect and operate with confidence.<\/h1>\n        <p class=\"doc-hero-copy\">\n          Product and integration documentation for <strong>customer workspaces, edge gateways, device provisioning,\n          telemetry, APIs, dashboards, alerting, security and operations<\/strong>.\n        <\/p>\n        <div class=\"doc-actions\">\n          <a class=\"doc-btn doc-btn-primary\" href=\"#documentation-library\">Browse documentation <span aria-hidden=\"true\">\u2193<\/span><\/a>\n          <a class=\"doc-btn doc-btn-secondary\" href=\"#quick-start\">Start with Quick Start<\/a>\n        <\/div>\n      <\/div>\n\n      <div class=\"doc-console\" aria-label=\"Illustrative Siteplore documentation console\">\n        <div class=\"doc-console-bar\"><span class=\"doc-dots\"><span><\/span><span><\/span><span><\/span><\/span><span>docs.siteplore \/ telemetry<\/span><span>v1<\/span><\/div>\n        <div class=\"doc-console-grid\">\n          <aside class=\"doc-side\" aria-hidden=\"true\">\n            <div class=\"doc-side-label\">Documentation<\/div>\n            <div class=\"doc-side-item\">Overview<\/div>\n            <div class=\"doc-side-item\">Quick Start<\/div>\n            <div class=\"doc-side-item is-active\">Telemetry<\/div>\n            <div class=\"doc-side-item\">Devices<\/div>\n            <div class=\"doc-side-item\">Dashboards<\/div>\n            <div class=\"doc-side-item\">Alerts<\/div>\n            <div class=\"doc-side-item\">Security<\/div>\n          <\/aside>\n          <div class=\"doc-console-main\">\n            <h2>Send a telemetry observation<\/h2>\n            <p>Illustrative request envelope<\/p>\n            <pre class=\"doc-code\"><span class=\"k\">POST<\/span> \/api\/v1\/telemetry\nAuthorization: Bearer <span class=\"v\">&lt;device-token&gt;<\/span>\nContent-Type: application\/json\n\n{\n  <span class=\"s\">\"timestamp\"<\/span>: <span class=\"v\">\"2026-09-28T04:30:00Z\"<\/span>,\n  <span class=\"s\">\"device_id\"<\/span>: <span class=\"v\">\"RS-GW-001\"<\/span>,\n  <span class=\"s\">\"measurements\"<\/span>: {\n    <span class=\"s\">\"motor_current_a\"<\/span>: <span class=\"v\">18.6<\/span>,\n    <span class=\"s\">\"bearing_temp_c\"<\/span>: <span class=\"v\">62.4<\/span>\n  },\n  <span class=\"s\">\"quality\"<\/span>: <span class=\"v\">\"good\"<\/span>\n}<\/pre>\n            <div class=\"doc-success\">202 Accepted \u00b7 observation queued<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/header>\n\n  <nav class=\"doc-audience-band\" aria-label=\"Documentation by role\">\n    <div class=\"doc-shell doc-audience-grid\">\n      <a class=\"doc-audience\" href=\"#documentation-library\" data-jump-filter=\"devices\"><span>Field deployment<\/span><strong>Installer &amp; technician<\/strong><p>Connect, provision, commission and troubleshoot devices.<\/p><\/a>\n      <a class=\"doc-audience\" href=\"#documentation-library\" data-jump-filter=\"integration\"><span>System integration<\/span><strong>Integration engineer<\/strong><p>Use MQTT, HTTPS, APIs, schemas and data mapping.<\/p><\/a>\n      <a class=\"doc-audience\" href=\"#documentation-library\" data-jump-filter=\"monitoring\"><span>Daily operation<\/span><strong>Operator &amp; analyst<\/strong><p>Navigate dashboards, investigate alerts and record actions.<\/p><\/a>\n      <a class=\"doc-audience\" href=\"#documentation-library\" data-jump-filter=\"admin\"><span>Governance<\/span><strong>Administrator<\/strong><p>Manage access, customer stacks, retention and security.<\/p><\/a>\n    <\/div>\n  <\/nav>\n\n  <section class=\"doc-start\" id=\"quick-start\">\n    <div class=\"doc-shell\">\n      <div class=\"doc-start-head\">\n        <div>\n          <p class=\"doc-eyebrow\">Quick Start<\/p>\n          <h2 class=\"doc-section-title\">From a new customer workspace to trusted live data.<\/h2>\n          <p class=\"doc-lead\">Use the onboarding sequence to preserve ownership, naming, access control and data quality from the first device.<\/p>\n        <\/div>\n        <div class=\"doc-start-note\"><strong>Before beginning<\/strong>Confirm site ownership, network route, measurement list, device identity, units, sampling interval and responsible users.<\/div>\n      <\/div>\n\n      <div class=\"doc-step-grid\">\n        <article class=\"doc-step\"><span class=\"doc-step-num\">01<\/span><h3>Create the customer environment<\/h3><p>Define the customer, tenant, sites, user roles and dedicated monitoring workspace.<\/p><\/article>\n        <article class=\"doc-step\"><span class=\"doc-step-num\">02<\/span><h3>Register the site and assets<\/h3><p>Build an asset hierarchy with stable IDs, equipment names and operating context.<\/p><\/article>\n        <article class=\"doc-step\"><span class=\"doc-step-num\">03<\/span><h3>Provision device identity<\/h3><p>Issue scoped credentials, map the gateway and define permitted data operations.<\/p><\/article>\n        <article class=\"doc-step\"><span class=\"doc-step-num\">04<\/span><h3>Send and validate telemetry<\/h3><p>Verify timestamp, unit, scaling, quality, data gaps and end-to-end communication.<\/p><\/article>\n        <article class=\"doc-step\"><span class=\"doc-step-num\">05<\/span><h3>Enable dashboards and alerts<\/h3><p>Invite users, confirm visibility, test notifications and document response ownership.<\/p><\/article>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"doc-integration\">\n    <div class=\"doc-shell doc-integration-grid\">\n      <div>\n        <p class=\"doc-eyebrow\">Integration preview<\/p>\n        <h2 class=\"doc-section-title\">One measurement envelope, several transport options.<\/h2>\n        <p class=\"doc-lead\">Use issued tenant and device configuration as the authoritative source. The examples shown here are structural placeholders, not a final public API contract.<\/p>\n        <div class=\"doc-integration-list\">\n          <div class=\"doc-integration-item\"><span>01<\/span><div><strong>Stable identity<\/strong><small>Tenant, site, asset, device and measurement IDs remain unambiguous.<\/small><\/div><\/div>\n          <div class=\"doc-integration-item\"><span>02<\/span><div><strong>UTC timestamp<\/strong><small>Edge and server time handling is documented and verifiable.<\/small><\/div><\/div>\n          <div class=\"doc-integration-item\"><span>03<\/span><div><strong>Canonical units<\/strong><small>Values are scaled and converted consistently before analysis.<\/small><\/div><\/div>\n          <div class=\"doc-integration-item\"><span>04<\/span><div><strong>Quality state<\/strong><small>Missing, stale, uncertain or invalid measurements are not treated as good data.<\/small><\/div><\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"doc-code-panel\">\n        <div class=\"doc-code-tabs\" role=\"tablist\" aria-label=\"Telemetry integration examples\">\n          <button class=\"doc-code-tab\" type=\"button\" role=\"tab\" aria-selected=\"true\" data-code-tab=\"json\">JSON envelope<\/button>\n          <button class=\"doc-code-tab\" type=\"button\" role=\"tab\" aria-selected=\"false\" data-code-tab=\"mqtt\">MQTT pattern<\/button>\n          <button class=\"doc-code-tab\" type=\"button\" role=\"tab\" aria-selected=\"false\" data-code-tab=\"http\">HTTP pattern<\/button>\n        <\/div>\n        <div class=\"doc-code-top\"><span class=\"doc-code-name\">telemetry.json<\/span><button class=\"doc-copy\" type=\"button\">Copy example<\/button><\/div>\n        <pre class=\"doc-code-content is-active\" data-code-panel=\"json\">{\n  \"schema_version\": \"&lt;issued-version&gt;\",\n  \"timestamp\": \"2026-09-28T04:30:00Z\",\n  \"tenant_id\": \"&lt;tenant-id&gt;\",\n  \"device_id\": \"&lt;device-id&gt;\",\n  \"measurements\": {\n    \"parameter_name\": {\n      \"value\": 0.0,\n      \"unit\": \"&lt;canonical-unit&gt;\",\n      \"quality\": \"good\"\n    }\n  }\n}<\/pre>\n        <pre class=\"doc-code-content\" data-code-panel=\"mqtt\">Topic:\n&lt;issued-prefix&gt;\/&lt;tenant-id&gt;\/&lt;device-id&gt;\/telemetry\n\nRecommended client behaviour:\n\u2022 Use TLS and issued device credentials\n\u2022 Publish the approved payload schema\n\u2022 Buffer observations during connection loss\n\u2022 Preserve the original observation timestamp\n\u2022 Retry with bounded backoff<\/pre>\n        <pre class=\"doc-code-content\" data-code-panel=\"http\">POST https:\/\/&lt;issued-api-host&gt;\/api\/&lt;version&gt;\/telemetry\nAuthorization: Bearer &lt;device-token&gt;\nContent-Type: application\/json\nIdempotency-Key: &lt;unique-observation-id&gt;\n\n&lt;approved telemetry payload&gt;<\/pre>\n        <div class=\"doc-placeholder-note\">Replace every placeholder with the configuration issued for the customer environment. Do not copy illustrative routes or credentials into production.<\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"doc-library\" id=\"documentation-library\">\n    <div class=\"doc-shell\">\n      <p class=\"doc-eyebrow\">Documentation library<\/p>\n      <h2 class=\"doc-section-title\">Find documentation by implementation task.<\/h2>\n      <p class=\"doc-lead\">Search by device, protocol, platform function, user role or operating workflow.<\/p>\n\n      <div class=\"doc-tools\">\n        <label class=\"doc-search-wrap\">\n          <span class=\"doc-sr-only\">Search Siteplore documentation<\/span>\n          <svg class=\"doc-search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"m20 20-4-4\"\/><\/svg>\n          <input class=\"doc-search\" type=\"search\" placeholder=\"Search documentation\u2026\" autocomplete=\"off\">\n        <\/label>\n        <div class=\"doc-filters\" role=\"group\" aria-label=\"Filter documentation\">\n          <button class=\"doc-filter\" type=\"button\" data-filter=\"all\" aria-pressed=\"true\">All docs<\/button>\n          <button class=\"doc-filter\" type=\"button\" data-filter=\"start\" aria-pressed=\"false\">Getting started<\/button>\n          <button class=\"doc-filter\" type=\"button\" data-filter=\"devices\" aria-pressed=\"false\">Devices<\/button>\n          <button class=\"doc-filter\" type=\"button\" data-filter=\"integration\" aria-pressed=\"false\">Integration<\/button>\n          <button class=\"doc-filter\" type=\"button\" data-filter=\"monitoring\" aria-pressed=\"false\">Monitoring<\/button>\n          <button class=\"doc-filter\" type=\"button\" data-filter=\"admin\" aria-pressed=\"false\">Administration<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"doc-results-meta\" aria-live=\"polite\"><span class=\"doc-result-count\">12<\/span> documentation topics shown<\/div>\n\n      <div class=\"doc-card-grid\">\n        <article class=\"doc-card\" data-category=\"start\" data-search=\"platform overview architecture siteplore products rekasense powerwatch machineguard components\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\"\/><\/svg><\/span><span class=\"doc-card-type\">Overview<\/span><\/div>\n          <h3>Platform overview<\/h3><p>Understand Siteplore products, system boundaries, user roles and the flow from field measurement to operational action.<\/p>\n          <ul><li>Products and components<\/li><li>Reference architecture<\/li><li>Ownership and responsibilities<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/iot-monitoring\">Platform introduction \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"start\" data-search=\"tenant customer site asset hierarchy naming onboarding workspace quick start\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M4 20V7l8-4 8 4v13\"\/><path d=\"M8 20v-5h8v5M8 9h2m4 0h2\"\/><\/svg><\/span><span class=\"doc-card-type\">Quick Start<\/span><\/div>\n          <h3>Customer, site and asset setup<\/h3><p>Create a scalable tenant structure before onboarding devices and measurements.<\/p>\n          <ul><li>Customer and site hierarchy<\/li><li>Asset IDs and naming<\/li><li>Deployment ownership<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/customer-monitoring\">Customer monitoring \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"devices\" data-search=\"device provisioning gateway token credentials register serial number firmware metadata identity\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M6 3h12v18H6z\"\/><path d=\"M9 7h6M9 11h6M9 15h3\"\/><circle cx=\"15\" cy=\"16\" r=\"1\" fill=\"currentColor\"\/><\/svg><\/span><span class=\"doc-card-type\">Devices<\/span><\/div>\n          <h3>Device provisioning and identity<\/h3><p>Register gateways securely and associate each device with the correct customer, site and allowed scope.<\/p>\n          <ul><li>Device registration<\/li><li>Scoped credentials<\/li><li>Rotation and deactivation<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/edge-connectivity\">Edge &amp; connectivity \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"devices\" data-search=\"modbus rs485 io link registers scaling byte order polling sensor meter gateway mapping\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M5 6h14v12H5z\"\/><path d=\"M8 9v6m4-6v6m4-6v6M2 10h3m14 0h3M2 14h3m14 0h3\"\/><\/svg><\/span><span class=\"doc-card-type\">Field mapping<\/span><\/div>\n          <h3>Field protocol and register mapping<\/h3><p>Document addresses, data types, scaling, byte order, polling interval and invalid-value handling.<\/p>\n          <ul><li>RS485 and Modbus mapping<\/li><li>IO-Link process data<\/li><li>Scaling and validation<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/system-integration-commissioning\">Integration &amp; commissioning \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"integration\" data-search=\"telemetry schema timestamp unit quality metadata asset measurement data model payload\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><ellipse cx=\"12\" cy=\"5\" rx=\"7\" ry=\"3\"\/><path d=\"M5 5v6c0 1.7 3.1 3 7 3s7-1.3 7-3V5\"\/><path d=\"M5 11v6c0 1.7 3.1 3 7 3s7-1.3 7-3v-6\"\/><\/svg><\/span><span class=\"doc-card-type\">Schema<\/span><\/div>\n          <h3>Telemetry data model<\/h3><p>Structure observations with stable identifiers, UTC timestamps, canonical units, metadata and quality states.<\/p>\n          <ul><li>Measurement envelope<\/li><li>Units and timestamps<\/li><li>Quality and missing data<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/data-engineering-integration\">Data engineering \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"integration\" data-search=\"mqtt topic qos tls authentication reconnect keepalive store forward payload integration\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><circle cx=\"12\" cy=\"12\" r=\"2\"\/><path d=\"M7.8 7.8a6 6 0 0 0 0 8.4m8.4 0a6 6 0 0 0 0-8.4M4.9 4.9a10 10 0 0 0 0 14.2m14.2 0a10 10 0 0 0 0-14.2\"\/><\/svg><\/span><span class=\"doc-card-type\">MQTT<\/span><\/div>\n          <h3>MQTT telemetry integration<\/h3><p>Configure approved topics, payloads, TLS identity, reconnect behaviour and local buffering.<\/p>\n          <ul><li>Topic structure<\/li><li>Authentication and TLS<\/li><li>Reconnect and delivery behaviour<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/api-integrations\">API &amp; integrations \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"integration\" data-search=\"https rest api authentication bearer key idempotency retry response status integration\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M8 8 4 12l4 4m8-8 4 4-4 4m-5 3 2-14\"\/><\/svg><\/span><span class=\"doc-card-type\">API<\/span><\/div>\n          <h3>HTTPS and REST API integration<\/h3><p>Send authorized, idempotent requests and handle validation, retry, rate and response conditions safely.<\/p>\n          <ul><li>Authentication headers<\/li><li>Request and response lifecycle<\/li><li>Idempotency and retry<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/api-integrations\">API documentation \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"monitoring\" data-search=\"grafana customer stack dashboard variables panel time range annotations investigations ai assistant search\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M4 19V9m5 10V5m5 14v-7m5 7V3\"\/><path d=\"M3 21h18\"\/><\/svg><\/span><span class=\"doc-card-type\">Workspace<\/span><\/div>\n          <h3>Customer dashboards and analytics<\/h3><p>Navigate the dedicated customer stack, dashboards, time ranges, variables, annotations and investigations.<\/p>\n          <ul><li>Dashboard navigation<\/li><li>Variables and time ranges<\/li><li>Analysis and investigation workflow<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/dashboards-analytics\">Dashboards &amp; analytics \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"monitoring\" data-search=\"alerting notification watcher automation irm incident escalation acknowledgement closure snooze contact point\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M12 3a6 6 0 0 0-6 6v3l-2 3h16l-2-3V9a6 6 0 0 0-6-6Z\"\/><path d=\"M9.5 19h5\"\/><\/svg><\/span><span class=\"doc-card-type\">Alerts &amp; IRM<\/span><\/div>\n          <h3>Alerting and incident workflow<\/h3><p>Understand severity, notification routing, acknowledgement, escalation, investigation and closure records.<\/p>\n          <ul><li>Alert rules and contact points<\/li><li>Escalation and ownership<\/li><li>Evidence and closure<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/real-time-monitoring-alerts\">Alerts &amp; response \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"admin\" data-search=\"users roles access tenant permissions invite customer account least privilege audit security\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><circle cx=\"9\" cy=\"8\" r=\"4\"\/><path d=\"M3 21v-2a6 6 0 0 1 12 0v2M17 9h4m-2-2v4\"\/><\/svg><\/span><span class=\"doc-card-type\">Access<\/span><\/div>\n          <h3>User, role and access management<\/h3><p>Invite customer users and grant only the dashboards, data and administrative capabilities needed.<\/p>\n          <ul><li>User invitation<\/li><li>Role and permission boundaries<\/li><li>Access review and removal<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/customer-monitoring\">Customer access \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"admin\" data-search=\"security encryption credential key rotation retention backup audit log data governance customer stack\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M12 3 5 6v5c0 5 3 8 7 10 4-2 7-5 7-10V6l-7-3Z\"\/><path d=\"m9 12 2 2 4-5\"\/><\/svg><\/span><span class=\"doc-card-type\">Security<\/span><\/div>\n          <h3>Security and data governance<\/h3><p>Apply scoped credentials, encrypted transport, key rotation, retention, backup and auditable administration.<\/p>\n          <ul><li>Credential lifecycle<\/li><li>Encryption and segregation<\/li><li>Retention and auditability<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/data-engineering-integration\">Data governance \u2192<\/a>\n        <\/article>\n\n        <article class=\"doc-card\" data-category=\"admin\" data-search=\"troubleshooting offline device missing data stale timestamp scaling duplicate telemetry logs support diagnostics\">\n          <div class=\"doc-card-top\"><span class=\"doc-card-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"m14 7 3-3 3 3-3 3M10 17l-3 3-3-3 3-3\"\/><path d=\"M17 10c0 7-7 0-7 7M7 14c0-7 7 0 7-7\"\/><\/svg><\/span><span class=\"doc-card-type\">Operations<\/span><\/div>\n          <h3>Operations and troubleshooting<\/h3><p>Diagnose offline gateways, missing observations, stale timestamps, scaling errors and duplicate data.<\/p>\n          <ul><li>Connectivity diagnostics<\/li><li>Data-quality troubleshooting<\/li><li>Support evidence checklist<\/li><\/ul>\n          <a class=\"doc-card-link\" href=\"\/index.php\/training-support\">Training &amp; support \u2192<\/a>\n        <\/article>\n      <\/div>\n\n      <div class=\"doc-empty\" role=\"status\">No documentation topics match the selected category and search phrase. Try a broader term.<\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"doc-stack-section\">\n    <div class=\"doc-shell\">\n      <p class=\"doc-eyebrow\">Customer monitoring workspace<\/p>\n      <h2 class=\"doc-section-title\">A dedicated observability stack for each customer.<\/h2>\n      <p class=\"doc-lead\">Siteplore can provide a customer-specific Grafana Cloud environment and invite approved users into the stack assigned to their organization.<\/p>\n\n      <div class=\"doc-stack-grid\">\n        <div class=\"doc-stack-diagram\">\n          <div class=\"doc-stack-node\"><span>01<\/span><div><strong>Customer identity<\/strong><small>Approved organization, sites and users<\/small><\/div><code>&lt;customer&gt;<\/code><\/div>\n          <div class=\"doc-stack-node\"><span>02<\/span><div><strong>Dedicated monitoring stack<\/strong><small>Customer dashboards, access and operational views<\/small><\/div><code>&lt;customer&gt;.grafana.net<\/code><\/div>\n          <div class=\"doc-stack-node\"><span>03<\/span><div><strong>Siteplore data services<\/strong><small>Device ingestion, asset context and integrations<\/small><\/div><code>authorized services<\/code><\/div>\n          <div class=\"doc-stack-node\"><span>04<\/span><div><strong>Field systems<\/strong><small>Gateways, meters, sensors, PLC\/DCS and approved sources<\/small><\/div><code>read \/ publish<\/code><\/div>\n        <\/div>\n        <div class=\"doc-capability-list\">\n          <div class=\"doc-capability\"><strong>Dashboards &amp; analytics<\/strong><span>Operational views, trends, comparisons and customer-specific variables.<\/span><\/div>\n          <div class=\"doc-capability\"><strong>Alerts &amp; incident response<\/strong><span>Alerting, escalation, response ownership and incident records where configured.<\/span><\/div>\n          <div class=\"doc-capability\"><strong>Investigations &amp; search<\/strong><span>Explore related signals, recent changes and evidence around an event.<\/span><\/div>\n          <div class=\"doc-capability\"><strong>AI and machine-learning capabilities<\/strong><span>Assistant, forecasts, outlier detection and investigation support where available and enabled.<\/span><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"doc-cta\">\n    <div class=\"doc-shell\">\n      <div class=\"doc-cta-box\">\n        <div>\n          <h2>Need implementation-specific documentation?<\/h2>\n          <p>Customer deployments should receive an approved device list, measurement map, issued credentials, endpoint configuration, commissioning records, dashboard ownership and support route.<\/p>\n        <\/div>\n        <div class=\"doc-cta-actions\">\n          <a class=\"doc-btn doc-btn-primary\" href=\"\/index.php\/training-support\">Contact training &amp; support <span aria-hidden=\"true\">\u2192<\/span><\/a>\n          <a class=\"doc-btn doc-btn-secondary\" href=\"\/index.php\/technical-guides\">Technical guides<\/a>\n          <a class=\"doc-btn doc-btn-secondary\" href=\"\/index.php\/site-assessment-engineering\">Engineering assessment<\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <script>\n    (() => {\n      const root = document.getElementById('sp-documentation');\n      if (!root) return;\n\n      const filters = [...root.querySelectorAll('.doc-filter')];\n      const cards = [...root.querySelectorAll('.doc-card')];\n      const search = root.querySelector('.doc-search');\n      const count = root.querySelector('.doc-result-count');\n      const empty = root.querySelector('.doc-empty');\n      const roleLinks = [...root.querySelectorAll('[data-jump-filter]')];\n      const codeTabs = [...root.querySelectorAll('.doc-code-tab')];\n      const codePanels = [...root.querySelectorAll('.doc-code-content')];\n      const codeName = root.querySelector('.doc-code-name');\n      const copyButton = root.querySelector('.doc-copy');\n      let activeCategory = 'all';\n\n      const applyFilters = () => {\n        const query = (search.value || '').trim().toLowerCase();\n        let visible = 0;\n\n        cards.forEach((card) => {\n          const categoryMatch = activeCategory === 'all' || card.dataset.category === activeCategory;\n          const haystack = `${card.dataset.search || ''} ${card.textContent}`.toLowerCase();\n          const searchMatch = !query || haystack.includes(query);\n          card.hidden = !(categoryMatch && searchMatch);\n          if (!card.hidden) visible += 1;\n        });\n\n        count.textContent = String(visible);\n        empty.classList.toggle('is-visible', visible === 0);\n      };\n\n      const selectCategory = (category) => {\n        activeCategory = category;\n        filters.forEach((button) => button.setAttribute('aria-pressed', String(button.dataset.filter === category)));\n        applyFilters();\n      };\n\n      const selectCodeTab = (name) => {\n        codeTabs.forEach((button) => button.setAttribute('aria-selected', String(button.dataset.codeTab === name)));\n        codePanels.forEach((panel) => panel.classList.toggle('is-active', panel.dataset.codePanel === name));\n        codeName.textContent = name === 'json' ? 'telemetry.json' : name === 'mqtt' ? 'mqtt-pattern.txt' : 'http-pattern.txt';\n        copyButton.textContent = 'Copy example';\n      };\n\n      filters.forEach((button) => button.addEventListener('click', () => selectCategory(button.dataset.filter)));\n      search.addEventListener('input', applyFilters);\n      roleLinks.forEach((link) => link.addEventListener('click', () => selectCategory(link.dataset.jumpFilter)));\n      codeTabs.forEach((button) => button.addEventListener('click', () => selectCodeTab(button.dataset.codeTab)));\n\n      copyButton.addEventListener('click', async () => {\n        const active = root.querySelector('.doc-code-content.is-active');\n        try {\n          await navigator.clipboard.writeText(active.textContent.trim());\n          copyButton.textContent = 'Copied';\n        } catch (error) {\n          copyButton.textContent = 'Select & copy';\n        }\n      });\n    })();\n  <\/script>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>Siteplore Documentation Build, connect and operate with confidence. Product and integration documentation for customer workspaces, edge gateways, device provisioning, telemetry, APIs, dashboards, alerting, security and operations. Browse documentation \u2193 Start with Quick Start docs.siteplore \/ telemetryv1 Documentation Overview Quick Start Telemetry Devices Dashboards Alerts Security Send a telemetry observation Illustrative request envelope POST \/api\/v1\/telemetry Authorization: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-307","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/siteplore.com\/index.php\/wp-json\/wp\/v2\/pages\/307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/siteplore.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/siteplore.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/siteplore.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/siteplore.com\/index.php\/wp-json\/wp\/v2\/comments?post=307"}],"version-history":[{"count":1,"href":"https:\/\/siteplore.com\/index.php\/wp-json\/wp\/v2\/pages\/307\/revisions"}],"predecessor-version":[{"id":308,"href":"https:\/\/siteplore.com\/index.php\/wp-json\/wp\/v2\/pages\/307\/revisions\/308"}],"wp:attachment":[{"href":"https:\/\/siteplore.com\/index.php\/wp-json\/wp\/v2\/media?parent=307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}