{"openapi": "3.0.3", "info": {"title": "NOLAPSE API", "version": "1.0.0", "description": "Multi-tenant SSL/TLS certificate lifecycle API. Authenticate with a JWT (from /v1/auth/login) or an API key (`X-API-Key: pk_...` or `Authorization: Bearer pk_...`)."}, "servers": [{"url": "https://api.nolapse.io"}], "components": {"securitySchemes": {"bearerAuth": {"type": "http", "scheme": "bearer", "bearerFormat": "JWT"}, "apiKeyAuth": {"type": "apiKey", "in": "header", "name": "X-API-Key"}}}, "tags": [{"name": "Auth"}, {"name": "Domains"}, {"name": "Agents"}, {"name": "Certificates"}, {"name": "API Keys"}, {"name": "Account"}], "paths": {"/v1/auth/register": {"post": {"tags": ["Auth"], "summary": "Create an account + organization", "responses": {"200": {"description": "OK"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"email": {"type": "string"}, "password": {"type": "string"}}, "required": ["email", "password"]}}}}}}, "/v1/auth/login": {"post": {"tags": ["Auth"], "summary": "Log in \u2192 returns a JWT", "responses": {"200": {"description": "OK"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"email": {"type": "string"}, "password": {"type": "string"}}, "required": ["email", "password"]}}}}}}, "/v1/auth/forgot": {"post": {"tags": ["Auth"], "summary": "Request a password-reset email", "responses": {"200": {"description": "OK"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"email": {"type": "string"}}, "required": ["email"]}}}}}}, "/v1/auth/reset": {"post": {"tags": ["Auth"], "summary": "Set a new password with a reset token", "responses": {"200": {"description": "OK"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"token": {"type": "string"}, "password": {"type": "string"}}, "required": ["token", "password"]}}}}}}, "/v1/domains": {"get": {"tags": ["Domains"], "summary": "List domains", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}, "post": {"tags": ["Domains"], "summary": "Add a domain (issuer: acme|private)", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"fqdn": {"type": "string"}}, "required": ["fqdn"]}}}}}}, "/v1/domains/{id}/verify": {"post": {"tags": ["Domains"], "summary": "Verify domain ownership via DNS TXT", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}], "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "string"}}]}}, "/v1/agents": {"get": {"tags": ["Agents"], "summary": "List agents", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}, "post": {"tags": ["Agents"], "summary": "Create an agent \u2192 returns enroll token + install command", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"name": {"type": "string"}}, "required": ["name"]}}}}}}, "/v1/certificates": {"get": {"tags": ["Certificates"], "summary": "List issued certificates + expiry", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}}, "/v1/apikeys": {"get": {"tags": ["API Keys"], "summary": "List API keys (prefix only)", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}, "post": {"tags": ["API Keys"], "summary": "Create an API key (full key shown once)", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"name": {"type": "string"}}, "required": ["name"]}}}}}}, "/v1/apikeys/{id}/revoke": {"post": {"tags": ["API Keys"], "summary": "Revoke an API key", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}], "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "string"}}]}}, "/v1/summary": {"get": {"tags": ["Account"], "summary": "Dashboard summary (counts, expiring, online)", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}}, "/v1/trend": {"get": {"tags": ["Account"], "summary": "Daily snapshots for KPI trend/sparkline", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}}, "/v1/billing": {"get": {"tags": ["Account"], "summary": "Current plan + quota usage", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}}, "/v1/events": {"get": {"tags": ["Account"], "summary": "Recent activity events", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}}, "/v1/team": {"get": {"tags": ["Account"], "summary": "List team members", "responses": {"200": {"description": "OK"}}, "security": [{"bearerAuth": []}, {"apiKeyAuth": []}]}}}}