{"openapi":"3.1.0","info":{"title":"index365 API","version":"1.0.0","description":"Audit intelligence for human teams and AI agents. Active Agency workspaces can start supported project scans, poll run status, and consume structured findings (agent result contract v2). Authenticate with a scoped API key from your dashboard: 'Authorization: Bearer i365_...'. Read endpoints are safe to call from agents; runs:write spends org credits.","contact":{"url":"https://index365.co/contact"}},"servers":[{"url":"https://index365.co"}],"security":[{"apiKey":[]}],"tags":[{"name":"introspection","description":"Key + tenancy diagnostics."},{"name":"projects","description":"Domain-anchored workspaces in your org."},{"name":"runs","description":"Audit runs: start, poll, inspect."},{"name":"findings","description":"Agent result contract v2 findings."},{"name":"reports","description":"Compact agent report context + PDF links."},{"name":"webhooks","description":"Event subscriptions (HMAC-signed deliveries)."}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Scoped API key created from an active Agency workspace in the dashboard (Settings -> API keys). Secrets start with i365_ and are shown once. Scopes: projects:read, runs:read, runs:write, findings:read, reports:read, webhooks:manage"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}},"AgentFinding":{"type":"object","description":"Agent result contract v2 finding. findingId is deterministic and stable for a given run.","required":["findingId","runId","category","status","severity","confidence","title","detail","evidence","affectedUrls","remediation","agentActions","humanUrl","createdAt","updatedAt"],"properties":{"findingId":{"type":"string","example":"f_1a2b3c4d5e6f7a8b"},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"status":{"type":"string","enum":["open","acknowledged","resolved","wont_fix"]},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"confidence":{"type":"string","enum":["high","medium","low"]},"title":{"type":"string"},"detail":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","required":["type","summary"],"properties":{"type":{"type":"string","enum":["page","file","check"]},"url":{"type":"string"},"summary":{"type":"string"}}}},"affectedUrls":{"type":"array","items":{"type":"string"}},"remediation":{"type":"string"},"agentActions":{"type":"array","items":{"type":"object","required":["type","description"],"properties":{"type":{"type":"string","enum":["remediation"]},"description":{"type":"string"}}}},"humanUrl":{"type":"string","description":"Dashboard view of the run for human teammates."},"source":{"type":"object","properties":{"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."}}},"AgentReportContext":{"type":"object","description":"Agent result contract v2 report context. Bounded orientation payload to read before paginating findings.","required":["schemaVersion","runId","projectId","url","score","scoreLabel","execSummary","severityCounts","findingsTotal","topFindings","foundation","pagesCrawled","scanMode","model","costUsd","createdAt","completedAt","humanUrl"],"properties":{"schemaVersion":{"type":"integer","example":2},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string","format":"uri"},"score":{"type":"integer","minimum":0,"maximum":100},"scoreLabel":{"type":"string","example":"Needs work"},"execSummary":{"type":"string"},"severityCounts":{"type":"object","required":["critical","high","medium","low","info"],"properties":{"critical":{"type":"integer","minimum":0},"high":{"type":"integer","minimum":0},"medium":{"type":"integer","minimum":0},"low":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0}}},"findingsTotal":{"type":"integer","minimum":0},"topFindings":{"type":"array","maxItems":10,"items":{"type":"object","required":["findingId","severity","category","title","remediation"],"properties":{"findingId":{"type":"string","example":"f_1a2b3c4d5e6f7a8b"},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"title":{"type":"string"},"remediation":{"type":"string"}}}},"foundation":{"type":"object","required":["sitemap","robotsTxt","llmsTxt"],"properties":{"sitemap":{"type":"object","required":["present","notes"],"properties":{"present":{"type":"boolean"},"notes":{"type":"string"}}},"robotsTxt":{"type":"object","required":["present","notes"],"properties":{"present":{"type":"boolean"},"notes":{"type":"string"}}},"llmsTxt":{"type":"object","required":["present","notes"],"properties":{"present":{"type":"boolean"},"notes":{"type":"string"}}}}},"checks":{"type":"object","description":"Structural check ledger for runs created after the ledger shipped. pass/fail/info summarize rows.","required":["pass","fail","info","rows"],"properties":{"pass":{"type":"integer","minimum":0},"fail":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0},"rows":{"type":"array","items":{"type":"object","description":"One structural probe row from the AI-readiness check ledger. info rows are emerging standards and are not score-penalizing.","required":["id","label","category","status","detail"],"properties":{"id":{"type":"string","example":"mcp-server-card"},"label":{"type":"string","example":"MCP server card"},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"status":{"type":"string","enum":["pass","fail","info"]},"detail":{"type":"string","example":"Not detected."}}}}}},"pagesCrawled":{"type":"integer","minimum":0},"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]},"costUsd":{"type":"number","minimum":0},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"humanUrl":{"type":"string","description":"Dashboard view of this exact run for human teammates."}}},"MarketingReportContext":{"type":"object","description":"Marketing Signal report context (product=marketing_signal). Stage scores replace the AI-Readiness foundation block; sourceCoverage names the evidence base (public_only until connected integrations launch).","required":["schemaVersion","product","runId","projectId","url","score","scoreLabel","execSummary","severityCounts","findingsTotal","stageScores","sourceCoverage","connectedSources","templatesAudited","topFindings","pagesCrawled","scanMode","model","costUsd","createdAt","completedAt","humanUrl"],"properties":{"schemaVersion":{"type":"integer","example":2},"product":{"type":"string","enum":["marketing_signal"]},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string","format":"uri"},"score":{"type":"integer","minimum":0,"maximum":100},"scoreLabel":{"type":"string","example":"Good"},"execSummary":{"type":"string"},"severityCounts":{"type":"object","required":["critical","high","medium","low","info"],"properties":{"critical":{"type":"integer","minimum":0},"high":{"type":"integer","minimum":0},"medium":{"type":"integer","minimum":0},"low":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0}}},"findingsTotal":{"type":"integer","minimum":0},"stageScores":{"type":"array","description":"The five funnel stages (find/trust/act/measure/improve), each 0-100 with check tallies. The overall score blends these at weights 20/20/25/25/10.","items":{"type":"object","required":["stage","score","checks_pass","checks_fail","finding_count","top_finding","confidence"],"properties":{"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."},"score":{"type":"integer","minimum":0,"maximum":100},"checks_pass":{"type":"integer","minimum":0},"checks_fail":{"type":"integer","minimum":0},"finding_count":{"type":"integer","minimum":0},"top_finding":{"type":["string","null"]},"confidence":{"type":"string","enum":["high","medium","low"],"description":"measure is capped at medium under public_only coverage: HTML proves a tag exists, never that the account behind it is configured correctly."}}}},"sourceCoverage":{"type":"string","enum":["public_only","connected"],"description":"Evidence base for this run. public_only = HTML-visible public signals."},"connectedSources":{"type":"array","items":{"type":"object","required":["provider","account_label","last_synced_at","freshness"],"properties":{"provider":{"type":"string"},"account_label":{"type":"string"},"last_synced_at":{"type":["string","null"],"format":"date-time"},"freshness":{"type":"string","enum":["fresh","stale","error"]}}}},"templatesAudited":{"type":"integer","minimum":0},"topFindings":{"type":"array","maxItems":10,"items":{"type":"object","required":["findingId","severity","category","stage","title","remediation"],"properties":{"findingId":{"type":"string","example":"f_1a2b3c4d5e6f7a8b"},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."},"title":{"type":"string"},"remediation":{"type":"string"}}}},"checks":{"type":"object","description":"Marketing check ledger summary (pass/fail/info) + rows.","required":["pass","fail","info","rows"],"properties":{"pass":{"type":"integer","minimum":0},"fail":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0},"rows":{"type":"array","items":{"type":"object","description":"One structural probe row from the AI-readiness check ledger. info rows are emerging standards and are not score-penalizing.","required":["id","label","category","status","detail"],"properties":{"id":{"type":"string","example":"mcp-server-card"},"label":{"type":"string","example":"MCP server card"},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"status":{"type":"string","enum":["pass","fail","info"]},"detail":{"type":"string","example":"Not detected."}}}}}},"pagesCrawled":{"type":"integer","minimum":0},"scanMode":{"type":["string","null"],"example":"paid_marketing_signal"},"model":{"type":["string","null"]},"costUsd":{"type":"number","minimum":0},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"humanUrl":{"type":"string","description":"Dashboard Marketing page view of this exact run for human teammates."}}},"IntegrationStatus":{"type":"object","description":"One connected-signal provider and its per-project status. Until the hosted OAuth broker launches, every provider reports connected=false with phase=planned.","required":["provider","label","phase","access","connected"],"properties":{"provider":{"type":"string","enum":["google_analytics","search_console","google_tag_manager","google_ads","meta_ads","linkedin_ads","hubspot"]},"label":{"type":"string","example":"Google Analytics 4"},"phase":{"type":"string","enum":["planned","beta","available"]},"access":{"type":"string","enum":["read_only"]},"connected":{"type":"boolean"},"readScopeSummary":{"type":"string"},"valueSummary":{"type":"string"}}},"Run":{"type":"object","description":"Run status + summary. score/severityCounts are null until status=completed.","properties":{"schemaVersion":{"type":"integer","example":2},"product":{"type":"string","enum":["ai_readiness","marketing_signal"]},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["pending","running","completed","failed","failed_auto_credit","refunded"]},"progressPct":{"type":"integer","minimum":0,"maximum":100},"currentStep":{"type":["string","null"]},"url":{"type":"string"},"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]},"costUsd":{"type":"number"},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"score":{"type":["integer","null"],"minimum":0,"maximum":100},"severityCounts":{"type":["object","null"],"additionalProperties":{"type":"integer"}},"findingsTotal":{"type":["integer","null"]},"humanUrl":{"type":"string"},"links":{"type":"object","properties":{"self":{"type":"string"},"findings":{"type":"string"},"report":{"type":"string"},"pdf":{"type":["string","null"],"description":"null for Marketing Signal runs (no PDF render in v1)."}}}}}}},"paths":{"/api/v1/me":{"get":{"operationId":"get_key_context","tags":["introspection"],"summary":"Introspect the calling key","description":"Use first in any session to confirm auth works and learn the key's org, project pin, scopes, and contract version. Works with any valid key regardless of scopes.","responses":{"200":{"description":"Key context.","content":{"application/json":{"example":{"keyPrefix":"i365_a1b2c3d","keyName":"ci-readonly","organizationId":"5b8f6f3a-0000-0000-0000-000000000000","organizationName":"Acme","organizationSlug":"acme","projectId":null,"scopes":["projects:read","runs:read","findings:read","reports:read"],"apiVersion":"v1","contractVersion":2}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/projects":{"get":{"operationId":"list_projects","tags":["projects"],"summary":"List projects","description":"Cursor-paginated projects in the key's organization. Use to resolve the projectId needed by start_audit.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Page size (max 100)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque cursor from the previous page's pagination.nextCursor."}],"responses":{"200":{"description":"Project page.","content":{"application/json":{"example":{"projects":[{"projectId":"1f2e3d4c-0000-0000-0000-000000000000","name":"Acme marketing site","domain":"acme.com","slug":"acme-com","status":"active","createdAt":"2026-06-01T12:00:00Z","updatedAt":"2026-06-01T12:00:00Z"}],"pagination":{"nextCursor":null,"limit":20}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/projects/{projectId}":{"get":{"operationId":"get_project","tags":["projects"],"summary":"Get one project","description":"Fetch a single project by id (scoped to the key's org).","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Project."},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/projects/{projectId}/marketing/report":{"get":{"operationId":"get_marketing_report","tags":["reports"],"summary":"Get the latest Marketing Signal report for a project","description":"Project-scoped convenience over get_report_context: returns the latest COMPLETED Marketing Signal run's report (stage scores, source coverage, top findings) without listing runs first. 404 error.code=no_marketing_run means no marketing audit has completed yet; start one with start_audit scanMode=paid_marketing_signal.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Marketing Signal report context.","content":{"application/json":{"schema":{"type":"object","description":"Marketing Signal report context (product=marketing_signal). Stage scores replace the AI-Readiness foundation block; sourceCoverage names the evidence base (public_only until connected integrations launch).","required":["schemaVersion","product","runId","projectId","url","score","scoreLabel","execSummary","severityCounts","findingsTotal","stageScores","sourceCoverage","connectedSources","templatesAudited","topFindings","pagesCrawled","scanMode","model","costUsd","createdAt","completedAt","humanUrl"],"properties":{"schemaVersion":{"type":"integer","example":2},"product":{"type":"string","enum":["marketing_signal"]},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string","format":"uri"},"score":{"type":"integer","minimum":0,"maximum":100},"scoreLabel":{"type":"string","example":"Good"},"execSummary":{"type":"string"},"severityCounts":{"type":"object","required":["critical","high","medium","low","info"],"properties":{"critical":{"type":"integer","minimum":0},"high":{"type":"integer","minimum":0},"medium":{"type":"integer","minimum":0},"low":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0}}},"findingsTotal":{"type":"integer","minimum":0},"stageScores":{"type":"array","description":"The five funnel stages (find/trust/act/measure/improve), each 0-100 with check tallies. The overall score blends these at weights 20/20/25/25/10.","items":{"type":"object","required":["stage","score","checks_pass","checks_fail","finding_count","top_finding","confidence"],"properties":{"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."},"score":{"type":"integer","minimum":0,"maximum":100},"checks_pass":{"type":"integer","minimum":0},"checks_fail":{"type":"integer","minimum":0},"finding_count":{"type":"integer","minimum":0},"top_finding":{"type":["string","null"]},"confidence":{"type":"string","enum":["high","medium","low"],"description":"measure is capped at medium under public_only coverage: HTML proves a tag exists, never that the account behind it is configured correctly."}}}},"sourceCoverage":{"type":"string","enum":["public_only","connected"],"description":"Evidence base for this run. public_only = HTML-visible public signals."},"connectedSources":{"type":"array","items":{"type":"object","required":["provider","account_label","last_synced_at","freshness"],"properties":{"provider":{"type":"string"},"account_label":{"type":"string"},"last_synced_at":{"type":["string","null"],"format":"date-time"},"freshness":{"type":"string","enum":["fresh","stale","error"]}}}},"templatesAudited":{"type":"integer","minimum":0},"topFindings":{"type":"array","maxItems":10,"items":{"type":"object","required":["findingId","severity","category","stage","title","remediation"],"properties":{"findingId":{"type":"string","example":"f_1a2b3c4d5e6f7a8b"},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."},"title":{"type":"string"},"remediation":{"type":"string"}}}},"checks":{"type":"object","description":"Marketing check ledger summary (pass/fail/info) + rows.","required":["pass","fail","info","rows"],"properties":{"pass":{"type":"integer","minimum":0},"fail":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0},"rows":{"type":"array","items":{"type":"object","description":"One structural probe row from the AI-readiness check ledger. info rows are emerging standards and are not score-penalizing.","required":["id","label","category","status","detail"],"properties":{"id":{"type":"string","example":"mcp-server-card"},"label":{"type":"string","example":"MCP server card"},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"status":{"type":"string","enum":["pass","fail","info"]},"detail":{"type":"string","example":"Not detected."}}}}}},"pagesCrawled":{"type":"integer","minimum":0},"scanMode":{"type":["string","null"],"example":"paid_marketing_signal"},"model":{"type":["string","null"]},"costUsd":{"type":"number","minimum":0},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"humanUrl":{"type":"string","description":"Dashboard Marketing page view of this exact run for human teammates."}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"not_found | no_marketing_run | results_unavailable.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/projects/{projectId}/integrations":{"get":{"operationId":"list_integrations","tags":["projects"],"summary":"List connected-signal integrations for a project","description":"Provider registry + per-project connection status for connected signals (GA4, Search Console, Tag Manager, ads, CRM). Until the hosted integration layer launches every provider reports connected=false with phase=planned; this endpoint exists so agents can discover the surface without guessing.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Integration statuses.","content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid"},"integrations":{"type":"array","items":{"type":"object","description":"One connected-signal provider and its per-project status. Until the hosted OAuth broker launches, every provider reports connected=false with phase=planned.","required":["provider","label","phase","access","connected"],"properties":{"provider":{"type":"string","enum":["google_analytics","search_console","google_tag_manager","google_ads","meta_ads","linkedin_ads","hubspot"]},"label":{"type":"string","example":"Google Analytics 4"},"phase":{"type":"string","enum":["planned","beta","available"]},"access":{"type":"string","enum":["read_only"]},"connected":{"type":"boolean"},"readScopeSummary":{"type":"string"},"valueSummary":{"type":"string"}}}},"note":{"type":"string"}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/projects/{projectId}/signals":{"get":{"operationId":"list_connected_signals","tags":["projects"],"summary":"List connected-source signal rows for a project","description":"Normalized signal rows imported from connected sources. Stable surface for the integration layer: under public_only coverage (current state) the list is empty and sourceCoverage says so explicitly.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Signal rows + source coverage.","content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid"},"sourceCoverage":{"type":"string","enum":["public_only","connected"]},"connectedSources":{"type":"array","items":{"type":"object"}},"signals":{"type":"array","items":{"type":"object"}},"note":{"type":"string"}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/runs":{"get":{"operationId":"list_runs","tags":["runs"],"summary":"List audit runs","description":"Cursor-paginated runs, newest first. Filter with projectId and status. List items are compact; call get_run for score and links.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Page size (max 100)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque cursor from the previous page's pagination.nextCursor."},{"name":"projectId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["pending","running","completed","failed","failed_auto_credit","refunded"]}}],"responses":{"200":{"description":"Run page."},"400":{"description":"Unknown status filter (error.code=validation_failed).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}},"post":{"operationId":"start_audit","tags":["runs"],"summary":"Start a paid project scan","description":"Starts a supported paid scan for a project and returns 202 with the run immediately. scanMode defaults to paid_ai_readiness; use paid_marketing_signal for Marketing Signal or paid_website_security for the deterministic public-surface security scan. Spends org credits (10/run); requires the runs:write scope and an active paid plan. Poll get_run or subscribe to run.completed webhooks for completion. Send an Idempotency-Key header so retries never double-spend. Single-flight is per product per project.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Replaying the same key returns the original run (200) instead of creating a new one."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["projectId"],"properties":{"projectId":{"type":"string","format":"uuid"},"scanMode":{"type":"string","enum":["paid_ai_readiness","paid_marketing_signal","paid_website_security"],"default":"paid_ai_readiness"},"idempotencyKey":{"type":"string","maxLength":255}}},"example":{"projectId":"1f2e3d4c-0000-0000-0000-000000000000","scanMode":"paid_website_security"}}}},"responses":{"200":{"description":"Idempotent replay of an existing run (idempotentReplay=true).","content":{"application/json":{"schema":{"type":"object","description":"Run status + summary. score/severityCounts are null until status=completed.","properties":{"schemaVersion":{"type":"integer","example":2},"product":{"type":"string","enum":["ai_readiness","marketing_signal"]},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["pending","running","completed","failed","failed_auto_credit","refunded"]},"progressPct":{"type":"integer","minimum":0,"maximum":100},"currentStep":{"type":["string","null"]},"url":{"type":"string"},"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]},"costUsd":{"type":"number"},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"score":{"type":["integer","null"],"minimum":0,"maximum":100},"severityCounts":{"type":["object","null"],"additionalProperties":{"type":"integer"}},"findingsTotal":{"type":["integer","null"]},"humanUrl":{"type":"string"},"links":{"type":"object","properties":{"self":{"type":"string"},"findings":{"type":"string"},"report":{"type":"string"},"pdf":{"type":["string","null"],"description":"null for Marketing Signal runs (no PDF render in v1)."}}}}}}}},"202":{"description":"Run accepted and queued.","content":{"application/json":{"schema":{"type":"object","description":"Run status + summary. score/severityCounts are null until status=completed.","properties":{"schemaVersion":{"type":"integer","example":2},"product":{"type":"string","enum":["ai_readiness","marketing_signal"]},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["pending","running","completed","failed","failed_auto_credit","refunded"]},"progressPct":{"type":"integer","minimum":0,"maximum":100},"currentStep":{"type":["string","null"]},"url":{"type":"string"},"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]},"costUsd":{"type":"number"},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"score":{"type":["integer","null"],"minimum":0,"maximum":100},"severityCounts":{"type":["object","null"],"additionalProperties":{"type":"integer"}},"findingsTotal":{"type":["integer","null"]},"humanUrl":{"type":"string"},"links":{"type":"object","properties":{"self":{"type":"string"},"findings":{"type":"string"},"report":{"type":"string"},"pdf":{"type":["string","null"],"description":"null for Marketing Signal runs (no PDF render in v1)."}}}}}}}},"400":{"description":"invalid_json | validation_failed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"402":{"description":"no_active_subscription | insufficient_credits.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"insufficient_scope | key_project_mismatch.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"409":{"description":"run_in_flight: an audit is already running for this project.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/runs/{runId}":{"get":{"operationId":"get_run","tags":["runs"],"summary":"Get run status + summary","description":"Poll this until status is terminal. Completed runs are immutable and served with a cacheable Cache-Control; in-flight runs are no-store.","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Run id returned by start_audit or list_runs."}],"responses":{"200":{"description":"Run envelope.","content":{"application/json":{"schema":{"type":"object","description":"Run status + summary. score/severityCounts are null until status=completed.","properties":{"schemaVersion":{"type":"integer","example":2},"product":{"type":"string","enum":["ai_readiness","marketing_signal"]},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["pending","running","completed","failed","failed_auto_credit","refunded"]},"progressPct":{"type":"integer","minimum":0,"maximum":100},"currentStep":{"type":["string","null"]},"url":{"type":"string"},"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]},"costUsd":{"type":"number"},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"score":{"type":["integer","null"],"minimum":0,"maximum":100},"severityCounts":{"type":["object","null"],"additionalProperties":{"type":"integer"}},"findingsTotal":{"type":["integer","null"]},"humanUrl":{"type":"string"},"links":{"type":"object","properties":{"self":{"type":"string"},"findings":{"type":"string"},"report":{"type":"string"},"pdf":{"type":["string","null"],"description":"null for Marketing Signal runs (no PDF render in v1)."}}}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/runs/{runId}/findings":{"get":{"operationId":"list_findings","tags":["findings"],"summary":"List findings (agent contract v2)","description":"Severity-ordered findings with stable ids, evidence, affected URLs, and remediation. Read get_report_context first for orientation, then page through here. Filter with severity/category.","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Completed run to read findings from."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Page size (max 100)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque cursor from the previous page's pagination.nextCursor."},{"name":"severity","in":"query","required":false,"schema":{"type":"string","enum":["critical","high","medium","low","info"]}},{"name":"category","in":"query","required":false,"schema":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]}},{"name":"stage","in":"query","required":false,"schema":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."},"description":"Filter Marketing Signal findings by funnel stage."}],"responses":{"200":{"description":"Finding page.","content":{"application/json":{"schema":{"type":"object","properties":{"schemaVersion":{"type":"integer"},"runId":{"type":"string"},"findingsTotal":{"type":"integer"},"findings":{"type":"array","items":{"type":"object","description":"Agent result contract v2 finding. findingId is deterministic and stable for a given run.","required":["findingId","runId","category","status","severity","confidence","title","detail","evidence","affectedUrls","remediation","agentActions","humanUrl","createdAt","updatedAt"],"properties":{"findingId":{"type":"string","example":"f_1a2b3c4d5e6f7a8b"},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"status":{"type":"string","enum":["open","acknowledged","resolved","wont_fix"]},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"confidence":{"type":"string","enum":["high","medium","low"]},"title":{"type":"string"},"detail":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","required":["type","summary"],"properties":{"type":{"type":"string","enum":["page","file","check"]},"url":{"type":"string"},"summary":{"type":"string"}}}},"affectedUrls":{"type":"array","items":{"type":"string"}},"remediation":{"type":"string"},"agentActions":{"type":"array","items":{"type":"object","required":["type","description"],"properties":{"type":{"type":"string","enum":["remediation"]},"description":{"type":"string"}}}},"humanUrl":{"type":"string","description":"Dashboard view of the run for human teammates."},"source":{"type":"object","properties":{"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."}}}},"pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"limit":{"type":"integer"}}}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"409":{"description":"run_not_completed: findings exist only after completion.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/runs/{runId}/findings/{findingId}":{"get":{"operationId":"get_finding","tags":["findings"],"summary":"Get one finding by id","description":"Fetch-by-id detail for a finding surfaced by list_findings.","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Run the finding belongs to."},{"name":"findingId","in":"path","required":true,"schema":{"type":"string"},"description":"Stable finding id (f_...)."}],"responses":{"200":{"description":"Finding.","content":{"application/json":{"schema":{"type":"object","properties":{"schemaVersion":{"type":"integer"},"finding":{"type":"object","description":"Agent result contract v2 finding. findingId is deterministic and stable for a given run.","required":["findingId","runId","category","status","severity","confidence","title","detail","evidence","affectedUrls","remediation","agentActions","humanUrl","createdAt","updatedAt"],"properties":{"findingId":{"type":"string","example":"f_1a2b3c4d5e6f7a8b"},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"status":{"type":"string","enum":["open","acknowledged","resolved","wont_fix"]},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"confidence":{"type":"string","enum":["high","medium","low"]},"title":{"type":"string"},"detail":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","required":["type","summary"],"properties":{"type":{"type":"string","enum":["page","file","check"]},"url":{"type":"string"},"summary":{"type":"string"}}}},"affectedUrls":{"type":"array","items":{"type":"string"}},"remediation":{"type":"string"},"agentActions":{"type":"array","items":{"type":"object","required":["type","description"],"properties":{"type":{"type":"string","enum":["remediation"]},"description":{"type":"string"}}}},"humanUrl":{"type":"string","description":"Dashboard view of the run for human teammates."},"source":{"type":"object","properties":{"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."}}}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/runs/{runId}/report":{"get":{"operationId":"get_report_context","tags":["reports"],"summary":"Get the compact agent report context","description":"Bounded orientation payload to read FIRST after a run completes; it is sized to fit agent context budgets. The shape is product-aware (discriminate on `product`): AI-Readiness runs serve score + severity mix + foundation-file state; Marketing Signal runs serve score + stage scores + source coverage.","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Completed run."}],"responses":{"200":{"description":"Report context (AgentReportContext or MarketingReportContext).","content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Agent result contract v2 report context. Bounded orientation payload to read before paginating findings.","required":["schemaVersion","runId","projectId","url","score","scoreLabel","execSummary","severityCounts","findingsTotal","topFindings","foundation","pagesCrawled","scanMode","model","costUsd","createdAt","completedAt","humanUrl"],"properties":{"schemaVersion":{"type":"integer","example":2},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string","format":"uri"},"score":{"type":"integer","minimum":0,"maximum":100},"scoreLabel":{"type":"string","example":"Needs work"},"execSummary":{"type":"string"},"severityCounts":{"type":"object","required":["critical","high","medium","low","info"],"properties":{"critical":{"type":"integer","minimum":0},"high":{"type":"integer","minimum":0},"medium":{"type":"integer","minimum":0},"low":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0}}},"findingsTotal":{"type":"integer","minimum":0},"topFindings":{"type":"array","maxItems":10,"items":{"type":"object","required":["findingId","severity","category","title","remediation"],"properties":{"findingId":{"type":"string","example":"f_1a2b3c4d5e6f7a8b"},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"title":{"type":"string"},"remediation":{"type":"string"}}}},"foundation":{"type":"object","required":["sitemap","robotsTxt","llmsTxt"],"properties":{"sitemap":{"type":"object","required":["present","notes"],"properties":{"present":{"type":"boolean"},"notes":{"type":"string"}}},"robotsTxt":{"type":"object","required":["present","notes"],"properties":{"present":{"type":"boolean"},"notes":{"type":"string"}}},"llmsTxt":{"type":"object","required":["present","notes"],"properties":{"present":{"type":"boolean"},"notes":{"type":"string"}}}}},"checks":{"type":"object","description":"Structural check ledger for runs created after the ledger shipped. pass/fail/info summarize rows.","required":["pass","fail","info","rows"],"properties":{"pass":{"type":"integer","minimum":0},"fail":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0},"rows":{"type":"array","items":{"type":"object","description":"One structural probe row from the AI-readiness check ledger. info rows are emerging standards and are not score-penalizing.","required":["id","label","category","status","detail"],"properties":{"id":{"type":"string","example":"mcp-server-card"},"label":{"type":"string","example":"MCP server card"},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"status":{"type":"string","enum":["pass","fail","info"]},"detail":{"type":"string","example":"Not detected."}}}}}},"pagesCrawled":{"type":"integer","minimum":0},"scanMode":{"type":["string","null"]},"model":{"type":["string","null"]},"costUsd":{"type":"number","minimum":0},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"humanUrl":{"type":"string","description":"Dashboard view of this exact run for human teammates."}}},{"type":"object","description":"Marketing Signal report context (product=marketing_signal). Stage scores replace the AI-Readiness foundation block; sourceCoverage names the evidence base (public_only until connected integrations launch).","required":["schemaVersion","product","runId","projectId","url","score","scoreLabel","execSummary","severityCounts","findingsTotal","stageScores","sourceCoverage","connectedSources","templatesAudited","topFindings","pagesCrawled","scanMode","model","costUsd","createdAt","completedAt","humanUrl"],"properties":{"schemaVersion":{"type":"integer","example":2},"product":{"type":"string","enum":["marketing_signal"]},"runId":{"type":"string","format":"uuid"},"projectId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string","format":"uri"},"score":{"type":"integer","minimum":0,"maximum":100},"scoreLabel":{"type":"string","example":"Good"},"execSummary":{"type":"string"},"severityCounts":{"type":"object","required":["critical","high","medium","low","info"],"properties":{"critical":{"type":"integer","minimum":0},"high":{"type":"integer","minimum":0},"medium":{"type":"integer","minimum":0},"low":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0}}},"findingsTotal":{"type":"integer","minimum":0},"stageScores":{"type":"array","description":"The five funnel stages (find/trust/act/measure/improve), each 0-100 with check tallies. The overall score blends these at weights 20/20/25/25/10.","items":{"type":"object","required":["stage","score","checks_pass","checks_fail","finding_count","top_finding","confidence"],"properties":{"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."},"score":{"type":"integer","minimum":0,"maximum":100},"checks_pass":{"type":"integer","minimum":0},"checks_fail":{"type":"integer","minimum":0},"finding_count":{"type":"integer","minimum":0},"top_finding":{"type":["string","null"]},"confidence":{"type":"string","enum":["high","medium","low"],"description":"measure is capped at medium under public_only coverage: HTML proves a tag exists, never that the account behind it is configured correctly."}}}},"sourceCoverage":{"type":"string","enum":["public_only","connected"],"description":"Evidence base for this run. public_only = HTML-visible public signals."},"connectedSources":{"type":"array","items":{"type":"object","required":["provider","account_label","last_synced_at","freshness"],"properties":{"provider":{"type":"string"},"account_label":{"type":"string"},"last_synced_at":{"type":["string","null"],"format":"date-time"},"freshness":{"type":"string","enum":["fresh","stale","error"]}}}},"templatesAudited":{"type":"integer","minimum":0},"topFindings":{"type":"array","maxItems":10,"items":{"type":"object","required":["findingId","severity","category","stage","title","remediation"],"properties":{"findingId":{"type":"string","example":"f_1a2b3c4d5e6f7a8b"},"severity":{"type":"string","enum":["critical","high","medium","low","info"]},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"stage":{"type":"string","enum":["find","trust","act","measure","improve"],"description":"Marketing Signal funnel stage (Marketing Signal findings only)."},"title":{"type":"string"},"remediation":{"type":"string"}}}},"checks":{"type":"object","description":"Marketing check ledger summary (pass/fail/info) + rows.","required":["pass","fail","info","rows"],"properties":{"pass":{"type":"integer","minimum":0},"fail":{"type":"integer","minimum":0},"info":{"type":"integer","minimum":0},"rows":{"type":"array","items":{"type":"object","description":"One structural probe row from the AI-readiness check ledger. info rows are emerging standards and are not score-penalizing.","required":["id","label","category","status","detail"],"properties":{"id":{"type":"string","example":"mcp-server-card"},"label":{"type":"string","example":"MCP server card"},"category":{"type":"string","enum":["discoverability","structured_data","metadata","content_structure","accessibility","answerability","agent_operability","performance","security","general","findability","measurement","conversion_path","offer_clarity","trust_proof","schema_metadata","social_preview","performance_ux","consent_privacy_signal","connected_account"]},"status":{"type":"string","enum":["pass","fail","info"]},"detail":{"type":"string","example":"Not detected."}}}}}},"pagesCrawled":{"type":"integer","minimum":0},"scanMode":{"type":["string","null"],"example":"paid_marketing_signal"},"model":{"type":["string","null"]},"costUsd":{"type":"number","minimum":0},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"humanUrl":{"type":"string","description":"Dashboard Marketing page view of this exact run for human teammates."}}}]}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"409":{"description":"run_not_completed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/runs/{runId}/pdf":{"get":{"operationId":"get_report_pdf_link","tags":["reports"],"summary":"Mint a short-lived PDF download link","description":"Returns { url, expiresInSeconds } for the human-formatted PDF report. Links expire in ~15 minutes; call again whenever a fresh link is needed.","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Completed run with a rendered PDF."}],"responses":{"200":{"description":"Signed link."},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"not_found | pdf_not_available.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"502":{"description":"pdf_unavailable: link minting failed, retry.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/webhooks":{"get":{"operationId":"list_webhooks","tags":["webhooks"],"summary":"List webhook endpoints","description":"Endpoints for this org. Signing secrets are never returned after creation.","responses":{"200":{"description":"Endpoint list."},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}},"post":{"operationId":"create_webhook","tags":["webhooks"],"summary":"Register a webhook endpoint","description":"Subscribe an https URL to events. The response includes the HMAC signing secret EXACTLY ONCE; verify x-index365-signature (t=<unix>,v1=<hmac-sha256 of '<t>.<body>'>) and reject timestamps older than 5 minutes. Events: run.completed, run.failed, monitoring.changed","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","events"],"properties":{"url":{"type":"string","format":"uri","description":"https only."},"events":{"type":"array","items":{"type":"string","enum":["run.completed","run.failed","monitoring.changed"]}},"description":{"type":"string","maxLength":500}}},"example":{"url":"https://hooks.acme.com/index365","events":["run.completed","run.failed"]}}}},"responses":{"201":{"description":"Endpoint created; response carries the one-time secret."},"400":{"description":"invalid_json | validation_failed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"409":{"description":"limit_reached: max endpoints for this org.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}},"/api/v1/webhooks/{webhookId}":{"get":{"operationId":"get_webhook","tags":["webhooks"],"summary":"Get one webhook endpoint","description":"Inspect one endpoint's url, events, and active state. The signing secret is never returned.","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Endpoint."},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}},"patch":{"operationId":"update_webhook","tags":["webhooks"],"summary":"Update a webhook endpoint","description":"Change url/events/description or toggle active.","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["run.completed","run.failed","monitoring.changed"]}},"description":{"type":["string","null"],"maxLength":500},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Updated endpoint."},"400":{"description":"invalid_json | validation_failed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}},"delete":{"operationId":"delete_webhook","tags":["webhooks"],"summary":"Delete a webhook endpoint","description":"Permanently remove the endpoint and its delivery log. Prefer update_webhook with active=false to pause deliveries instead.","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deleted."},"401":{"description":"Missing/unknown/revoked API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"403":{"description":"Key lacks the required scope (error.code=insufficient_scope).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"404":{"description":"Resource not found in this organization.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded (60 req/min per key). Honor Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable explanation."}},"additionalProperties":true}}}}}}}}}}}