<pclass="eyebrow">MULTI-TENANT API ACCESS CONTROL</p>
<h1>One key plane.<br><span>Every Go API.</span></h1>
<pclass="lede">Register applications, issue scoped keys, import OpenAPI contracts, and authorize requests without coupling identity logic to every service.</p>
<dialogid="app-dialog"><formid="app-form"><divclass="dialog-head"><h3>Register application</h3><buttontype="button"class="close">×</button></div><label>Tenant<selectname="tenant_id"class="tenant-select"required></select></label><label>Name<inputname="name"required></label><label>Slug<inputname="slug"requiredpattern="[a-z0-9][a-z0-9-]{1,62}"placeholder="guess"></label><label>Description<textareaname="description"></textarea></label><label>Allowed hosts <small>(one per line, empty allows all)</small><textareaname="allowed_hosts"placeholder="nmbs.guess.local"></textarea></label><buttontype="submit">Register application</button></form></dialog>
<dialogid="key-dialog"><formid="key-form"><divclass="dialog-head"><h3>Issue API key</h3><buttontype="button"class="close">×</button></div><label>Application<selectname="application_id"class="app-select"required></select></label><label>Key name<inputname="name"requiredplaceholder="production-gateway"></label><label>Expires at <small>(optional)</small><inputtype="datetime-local"name="expires_at"></label><buttontype="submit">Issue key</button></form></dialog>
<dialogid="contract-dialog"><formid="contract-form"><divclass="dialog-head"><h3>Import OpenAPI contract</h3><buttontype="button"class="close">×</button></div><label>Application<selectname="application_id"class="app-select"required></select></label><divclass="segmented"><label><inputtype="radio"name="source_type"value="document"checked> Paste</label><label><inputtype="radio"name="source_type"value="url"> Scan URL</label></div><label>Source URL <small>(optional when pasting)</small><inputtype="url"name="source_url"placeholder="https://service/openapi.json"></label><label>OpenAPI JSON or YAML<textareaname="document"rows="12"placeholder="openapi: 3.1.0 paths: ..."></textarea></label><buttontype="submit">Import contract</button></form></dialog>
<dialogid="client-dialog"><formid="client-form"><divclass="dialog-head"><h3>Configure client login</h3><buttontype="button"class="close">×</button></div><inputtype="hidden"name="application_id"><label>Client ID<inputname="client_id"readonly></label><label>Redirect URIs <small>(one exact callback URL per line)</small><textareaname="redirect_uris"rows="5"placeholder="https://nmbs.guess.local/auth/callback"required></textarea></label><pclass="muted">Saving rotates the client secret. Existing deployments must be updated immediately.</p><buttontype="submit">Save and rotate secret</button></form></dialog>
<dialogid="access-dialog"><formid="access-form"><divclass="dialog-head"><h3>Manage user access</h3><buttontype="button"class="close">×</button></div><inputtype="hidden"name="user_id"><inputtype="hidden"name="tenant_id"><inputtype="hidden"name="approval_mode"><labelid="approval-tenant-label"hidden>Tenant<selectname="approval_tenant_id"class="tenant-select"></select></label><label>Role<selectname="role"id="access-role"required></select></label><fieldset><legend>Applications</legend><divid="access-apps"class="check-list"></div></fieldset><buttontype="submit">Update access</button></form></dialog>
<dialogid="secret-dialog"><divclass="dialog-head"><h3id="secret-title">Secret issued</h3><buttontype="button"class="close">×</button></div><pid="secret-description">This secret is shown once. Copy it now.</p><divclass="secret"><codeid="new-secret"></code><buttonid="copy-secret"type="button">Copy</button></div></dialog>