{"openapi": "3.1.0", "info": {"title": "Dakidarts\u00ae Headless CMS & SaaS Engine API", "version": "2026.3.0", "description": "Production REST API for headless page trees, bento blocks, appearance tokens, catalog products, and versioned releases.", "contact": {"email": "project@dakidarts.com", "name": "Dakidarts Engineering"}}, "servers": [{"url": "/", "description": "Current Origin"}], "paths": {"/api/v1/pages/": {"get": {"summary": "List all published pages", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["read"]}], "responses": {"200": {"description": "List of published pages"}}}}, "/api/v1/pages/{slug}/": {"get": {"summary": "Get structured block tree for a page", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["read"]}], "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Page block tree"}, "404": {"description": "Not Found"}}}}, "/api/v1/pages/{slug}/revisions/": {"get": {"summary": "List saved revisions for a page", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["read"]}], "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Revision list"}}}}, "/api/v1/pages/{slug}/diff/{r1}/{r2}/": {"get": {"summary": "Compare two page revisions", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["read"]}], "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string"}}, {"name": "r1", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "r2", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "Structural diff payload"}}}}, "/api/v1/pages/{slug}/rollback/{revision_id}/": {"post": {"summary": "Atomically roll back page to a revision", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["write"]}], "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string"}}, {"name": "revision_id", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "Rollback confirmation"}}}}, "/api/v1/blocks/{public_id}/": {"get": {"summary": "Headless rendered block HTML & CSS for embed SDK", "parameters": [{"name": "public_id", "in": "path", "required": true, "schema": {"type": "string"}}, {"name": "theme", "in": "query", "required": false, "schema": {"type": "string"}}], "responses": {"200": {"description": "Rendered block HTML and CSS tokens"}}}}, "/api/v1/catalog/": {"get": {"summary": "List entire API product portfolio", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["read"]}], "responses": {"200": {"description": "API Catalog portfolio grouped by family"}}}}, "/api/v1/themes/": {"get": {"summary": "List Appearance API themes and design tokens", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["read"]}], "responses": {"200": {"description": "Themes and design token registry"}}}}, "/api/v1/studio/license-check/": {"get": {"summary": "Retired legacy Numora Studio license-check endpoint", "description": "This CMS endpoint did not validate Numora Studio licenses. Current desktop builds authenticate through NumerologyAPI's dedicated tnsr_ channel. Its studio-status endpoint reports usage and is not a standalone license-check replacement.", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["read"]}], "responses": {"410": {"description": "Legacy endpoint retired; migration details are in the response body.", "content": {"application/json": {"schema": {"type": "object", "required": ["error", "message", "migration"], "properties": {"error": {"type": "string", "const": "endpoint_retired"}, "message": {"type": "string"}, "migration": {"type": "object", "required": ["authentication", "studio_status_url", "studio_status_purpose", "key_management_url"], "properties": {"authentication": {"type": "string"}, "studio_status_url": {"type": "string", "format": "uri"}, "studio_status_purpose": {"type": "string"}, "key_management_url": {"type": "string", "format": "uri"}}}}}}}}, "401": {"description": "Missing API credential."}, "403": {"description": "Invalid credential or missing read scope."}}}}, "/api/v1/services/": {"get": {"summary": "List active services", "security": [{"BearerAuth": []}, {"OAuthClientCredentials": ["read"]}], "responses": {"200": {"description": "Active services and their published service-page content"}}}}, "/api/v1/services/inquire/": {"post": {"summary": "Submit a service inquiry", "description": "Public endpoint. Limited to five submissions per client IP per hour.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["name", "email", "brief"], "anyOf": [{"required": ["service"]}, {"required": ["service_slug"]}], "properties": {"service": {"type": "string", "description": "Active service slug, code, or public ID."}, "service_slug": {"type": "string", "description": "Alias for service."}, "name": {"type": "string", "maxLength": 160}, "email": {"type": "string", "format": "email"}, "company": {"type": "string", "maxLength": 160}, "budget_range": {"type": "string", "enum": ["< $1k", "$1k \u2013 $5k", "$5k \u2013 $15k", "$15k+", "undecided"]}, "timeline": {"type": "string", "enum": ["asap", "1_month", "quarter", "flexible"]}, "preferred_contact": {"type": "string", "enum": ["email", "telegram", "cal"]}, "telegram_handle": {"type": "string", "maxLength": 80}, "reference_links": {"type": "string"}, "brief": {"type": "string"}}}}, "application/x-www-form-urlencoded": {"schema": {"type": "object", "required": ["name", "email", "brief"], "anyOf": [{"required": ["service"]}, {"required": ["service_slug"]}], "properties": {"service": {"type": "string"}, "service_slug": {"type": "string"}, "name": {"type": "string"}, "email": {"type": "string", "format": "email"}, "company": {"type": "string"}, "budget_range": {"type": "string"}, "timeline": {"type": "string"}, "preferred_contact": {"type": "string"}, "telegram_handle": {"type": "string"}, "reference_links": {"type": "string"}, "brief": {"type": "string"}}}}}}, "responses": {"201": {"description": "Inquiry received"}, "400": {"description": "Invalid JSON or invalid service-request fields"}, "405": {"description": "Method not allowed"}, "429": {"description": "Hourly rate limit exceeded"}}}}, "/api/v1/apis/{slug}/sdk/{lang}/": {"get": {"summary": "Download an API client SDK example", "description": "Public code export for direct-capable API products.", "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string"}}, {"name": "lang", "in": "path", "required": true, "schema": {"type": "string", "enum": ["python", "typescript", "ts", "javascript", "js"]}}], "responses": {"200": {"description": "SDK source code", "content": {"text/x-python": {}, "application/typescript": {}, "application/javascript": {}}}, "400": {"description": "Unsupported language"}, "404": {"description": "Unknown or non-direct API product"}}}}, "/api/v1/openapi.json": {"get": {"summary": "Retrieve this OpenAPI specification", "responses": {"200": {"description": "OpenAPI 3.1 specification", "content": {"application/json": {}}}}}}, "/oauth/token/": {"post": {"summary": "Issue a short-lived client-credentials bearer token", "description": "Authenticate with HTTP Basic using the OAuth client ID and secret. Form-body client_id/client_secret credentials remain supported for existing clients; do not send both methods in one request.", "requestBody": {"required": true, "content": {"application/x-www-form-urlencoded": {"schema": {"type": "object", "required": ["grant_type"], "properties": {"grant_type": {"type": "string", "example": "client_credentials"}, "client_id": {"type": "string"}, "client_secret": {"type": "string", "format": "password"}, "scope": {"type": "string", "example": "read write"}}}}}}, "responses": {"200": {"description": "Bearer token issued"}, "400": {"description": "Invalid grant or scope"}, "401": {"description": "Invalid client credentials"}}}}}, "components": {"securitySchemes": {"BearerAuth": {"type": "http", "scheme": "bearer", "bearerFormat": "dk_live_...", "description": "Provide a secret API key (dk_live_...) or OAuth access token (dko_live_...)."}, "OAuthClientCredentials": {"type": "oauth2", "flows": {"clientCredentials": {"tokenUrl": "/oauth/token/", "scopes": {"read": "Read platform resources", "write": "Mutate permitted resources"}}}}}}}