{"openapi":"3.1.0","info":{"title":"AI Security Guard","description":"AI Security Guard - Multi-expert security scanning for AI agent content. Detects prompt injection, credential exfiltration, intent drift, and more. Pay-per-scan via x402 micropayments.","version":"1.2.0"},"paths":{"/v1/guard/quote":{"post":{"tags":["guard"],"summary":"Get price quote for content scanning","description":"Get a price quote for content scanning (content-length based).\n\nProvide `content_length` to get a quote, then submit content in\nPOST /v1/guard with X-Quote-ID header.\n\nFor URL-based quotes (we fetch content for you), use POST /v1/guard/quote/url instead.\n\nThe returned quote_id can be used in the X-Quote-ID header when calling /guard.","operationId":"get_quote_v1_guard_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}}},"required":true},"responses":{"200":{"description":"Price quote created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/guard/quote/url":{"post":{"tags":["guard"],"summary":"Get price quote by fetching URL content","description":"Get a price quote by fetching URL content.\n\nWe fetch the content, cache it, and return a quote based on actual size.\nContent is cached for 10 minutes.\n\n**Rate limited to 10/minute** to prevent abuse (fetch has compute cost).\n\nUse cases:\n- MCP tool definitions hosted on GitHub/IPFS\n- Remote API responses to pre-check before processing\n- Any content where the agent wants pre-flight security check\n\nAfter receiving the quote, call POST /v1/guard with X-Quote-ID header\n(no content body needed - we use the cached content).","operationId":"get_url_quote_v1_guard_quote_url_post","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}}],"responses":{"200":{"description":"URL fetched and quote created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"URL fetch failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded"}}}},"/v1/guard/batch/quote/url":{"post":{"tags":["guard"],"summary":"Get batch price quote by fetching multiple URLs","description":"Get a batch quote by fetching multiple URLs.\n\nWe fetch each URL concurrently, cache successful content, and return a quote.\n**Failed URLs are skipped** (too large, blocked, timeout) and reported separately.\n\n**Rate limited to 5/minute** - batch URL fetching has significant compute cost.\n\n**Response includes:**\n- `successful_items`: URLs fetched successfully with pricing\n- `failed_items`: URLs that failed (with error details)\n- `total_price`: Sum of successful items only\n- `can_proceed`: True if at least one URL succeeded\n\nAfter receiving the quote, call POST /v1/guard/batch with X-Batch-Quote-ID header.","operationId":"get_batch_url_quote_v1_guard_batch_quote_url_post","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Urls"}}},"required":true},"responses":{"200":{"description":"Batch URL quote created","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request"},"429":{"description":"Rate limit exceeded"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/guard":{"post":{"tags":["guard"],"summary":"Scan content for security threats","description":"Scan content for security threats.\n\n**REQUIRES a valid quote.** First call POST /v1/guard/quote to get a quote_id,\nthen include it in the X-Quote-ID header.\n\n**Two modes:**\n\n1. **Content-based**: Provide content in request body with X-Quote-ID header.\n\n2. **URL-based**: Use a URL-based quote (content already cached). Just provide\n   X-Quote-ID header - no content body needed. We use the cached content from\n   the URL fetch.\n\nPerforms multi-expert analysis including:\n- Intent drift detection (content vs. declared purpose)\n- Prompt injection patterns\n- Credential exfiltration attempts\n- Hidden content revelation\n\nAccepts content as a string or messages array (conversation format).\n\n**Response Headers:**\n- `X-Session-ID`: Use this for follow-up questions via POST /v1/qa\n\n**Privacy & Data Retention:**\n- Content is **not stored permanently** - only held for 15 minutes to enable follow-up Q&A\n- Content is hashed (SHA-256) so it is never readable by us; the hash enables faster repeat scans of identical content (retained 7 days)\n- After 15 minutes, the original content is automatically deleted\n- Session metadata (verdict, threat summary) remains available for 1 hour\n\n**Follow-up Q&A Window:** Ask follow-up questions within 15 minutes of this scan.","operationId":"scan_content_v1_guard_post","parameters":[{"name":"X-Quote-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Quote-Id"}},{"name":"X-Session-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Id"}},{"name":"X-Agent-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Agent-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanRequest"}}}},"responses":{"200":{"description":"Scan completed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResponse"}}}},"400":{"description":"Invalid request or quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required - quote required"},"413":{"description":"Content too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/guard/batch/quote":{"post":{"tags":["guard"],"summary":"Get price quote for batch scanning","description":"Get a price quote for batch scanning.\n\nProvide content lengths for all items to get total batch price.\nThe returned batch_quote_id is used in X-Batch-Quote-ID header when submitting.\n\n**Pricing:**\n- Each item priced based on content size tier\n- Total price is sum of individual item prices\n- No additional batch fees","operationId":"get_batch_quote_v1_guard_batch_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Batch price quote created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchQuoteResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/guard/batch":{"post":{"tags":["guard"],"summary":"Submit batch scan request","description":"Submit a batch of items for scanning.\n\n**REQUIRES a valid batch quote.** First call POST /v1/guard/batch/quote,\nthen include the batch_quote_id in the X-Batch-Quote-ID header.\n\n**Processing:**\n- Items are queued for parallel processing\n- Poll GET /v1/guard/batch/{batch_id} for status and results\n- Each successful item returns scan_id and session_id for Q&A\n\n**Failure Handling:**\n- Failed items include a retry_token for free retry within 1 hour\n- Skipped items (validation errors) are not retryable","operationId":"submit_batch_v1_guard_batch_post","parameters":[{"name":"X-Batch-Quote-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Batch-Quote-Id"}},{"name":"X-Agent-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Agent-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchScanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSubmitResponse"}}}},"202":{"description":"Batch accepted for processing"},"400":{"description":"Invalid request or quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required - batch quote required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/guard/batch/{batch_id}":{"get":{"tags":["guard"],"summary":"Get batch scan status and results","description":"Get status and results for a batch scan.\n\n**Polling:**\n- Poll this endpoint until status is 'complete', 'partial', or 'failed'\n- Results are available incrementally as items complete\n- Batch results expire after 2 hours\n\n**Status values:**\n- `queued`: Batch accepted, waiting to start\n- `processing`: Items being scanned\n- `complete`: All items succeeded\n- `partial`: Some items failed (check retry_tokens)\n- `failed`: Batch-level error (including timeout)\n\n**Timeout behavior:**\n- Batches with no progress for 120s are automatically failed\n- This prevents infinite polling when workers are unavailable\n- Timed-out items have error_code='batch_timeout'\n\n**Results:**\n- Each item includes scan_id and session_id for Q&A follow-ups\n- Failed items include retry_token for free retry","operationId":"get_batch_status_v1_guard_batch__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Batch status and results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchStatusResponse"}}}},"404":{"description":"Batch not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/guard/batch/url":{"post":{"tags":["guard"],"summary":"Submit batch URL scan (content already cached)","description":"Submit a batch of URLs for scanning (content already fetched).\n\n**REQUIRES a URL batch quote.** First call POST /v1/guard/batch/quote/url,\nthen include the batch_quote_id in the X-Batch-Quote-ID header.\n\nThe URLs were fetched and cached during the quote phase. Just provide\nintent contracts for each URL.\n\n**Processing:**\n- Items are queued for parallel processing\n- Poll GET /v1/guard/batch/{batch_id} for status and results\n- Each item scans both the URL string AND fetched content\n- Each successful item returns scan_id and session_id for Q&A\n\n**URL String Scanning:**\n- Each URL is scanned for encoded payloads (base64, injection attempts)\n- Findings are merged with content scan results","operationId":"submit_batch_url_v1_guard_batch_url_post","parameters":[{"name":"X-Batch-Quote-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Batch-Quote-Id"}},{"name":"X-Agent-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Agent-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchURLScanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSubmitResponse"}}}},"202":{"description":"Batch accepted for processing"},"400":{"description":"Invalid request or quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required - batch URL quote required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skill.md":{"get":{"tags":["skill"],"summary":"Get SDK/PTI quick reference (Markdown)","description":"Returns simplified skill documentation focused on SDK and PTI usage.\n\nFor comprehensive HTTP API documentation, see /v1/api.md instead.","operationId":"get_skill_markdown_v1_skill_md_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/v1/skill":{"get":{"tags":["skill"],"summary":"Get integration info (JSON)","description":"Returns integration info for quick discovery.\n\nFor full API specification, see /v1/api instead.","operationId":"get_skill_json_v1_skill_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/api":{"get":{"tags":["pro_api"],"summary":"Get full API specification (JSON)","description":"Returns agent-consumable API summary in JSON format.\n\nIncludes:\n- Service info and version\n- Available endpoints\n- Supported threat categories\n- Content types and intent types\n- Pricing tiers\n- Link to full OpenAPI spec","operationId":"get_api_json_v1_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/api.md":{"get":{"tags":["pro_api"],"summary":"Get full API documentation (Markdown)","description":"Returns API documentation as markdown text (cached).\n\nSuitable for:\n- Copy-paste into agent context\n- Human reading\n- Static file generation","operationId":"get_api_markdown_v1_api_md_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/v1/risk-wizard/activities":{"get":{"tags":["pro_api"],"summary":"Get available activities for risk wizard","description":"Get the list of available activities for the risk assessment wizard.\n\nReturns activity IDs, labels, and base risk scores to help users\nunderstand what to select.","operationId":"get_wizard_activities_v1_risk_wizard_activities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Wizard Activities V1 Risk Wizard Activities Get"}}}}}}},"/v1/risk-wizard":{"post":{"tags":["pro_api"],"summary":"Activity-based risk assessment (Educational)","description":"Educational risk assessment based on agent activities.\n\nThis wizard helps both humans and AI agents understand their security risks\nby analyzing what activities they perform. It provides:\n\n- **Risk score and level** based on selected activities\n- **Detailed threat analysis** with educational explanations\n- **DIY mitigations** - free actionable advice you can implement yourself\n- **AI Security Guard protection** - how scanning helps for each threat\n- **General best practices** - security fundamentals for all AI systems\n- **Recommended scan configuration** - optimal settings for the use case\n\n**Available activities:**\n- summarizing_web_content\n- using_mcp_servers\n- consuming_apis\n- agent_to_agent\n- downloading_skills\n- processing_user_files\n- executing_generated_code\n- reading_emails\n\nCall GET /v1/risk-wizard/activities for full list with descriptions.","operationId":"activity_risk_wizard_v1_risk_wizard_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityRiskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Activity Risk Wizard V1 Risk Wizard Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/qa":{"post":{"tags":["qa"],"summary":"Ask follow-up question about scan (PAID)","description":"Ask a follow-up question about a previous scan.\n\n    Use this to dig deeper into scan results, understand specific\n    threats, or get clarification on recommendations.\n\n    **Requires**: session_id from a previous /v1/guard scan\n    (obtained from X-Session-ID response header)\n\n    **Payment**: $0.0125 USDC per question\n\n    ---\n\n    **15-Minute Window**: Follow-up questions work best within 15 minutes of the scan.\n    During this window, the LLM has access to your original content for detailed analysis.\n\n    **After 15 minutes**: The original content is automatically deleted for privacy.\n    You can still ask questions, but answers will be based only on the scan metadata\n    (verdict, threat types, locations) rather than the full content.\n\n    **Privacy**: Your content is never stored permanently and is never readable by us.","operationId":"ask_question_v1_qa_post","parameters":[{"name":"X-Agent-ID","in":"header","required":false,"schema":{"type":"string","description":"Agent ID for budget tracking","title":"X-Agent-Id"},"description":"Agent ID for budget tracking"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QARequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QAResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/advisory":{"post":{"tags":["qa"],"summary":"Get security advisory (PAID)","description":"Ask general security questions without a prior scan.\n\n    Use this for:\n    - Learning about security best practices for AI agents\n    - Understanding threat types (prompt injection, tool abuse, etc.)\n    - Getting guidance on securing your AI/LLM applications\n    - Remediation advice for specific vulnerability classes\n\n    **No scan required** - answers are powered by our threat intelligence\n    knowledge base with 60+ documented attack patterns and mitigations.\n\n    **Payment**: $0.01 USDC per question\n\n    ---\n\n    **Example questions**:\n    - \"How do I prevent prompt injection in my chatbot?\"\n    - \"What are the risks of using MCP tools with untrusted content?\"\n    - \"Explain indirect prompt injection and how to defend against it\"\n    - \"Best practices for input validation before LLM processing\"\n\n    **Tip**: Provide context about your setup for more tailored advice.","operationId":"get_advisory_v1_advisory_post","parameters":[{"name":"X-Agent-ID","in":"header","required":false,"schema":{"type":"string","description":"Agent ID for budget tracking","title":"X-Agent-Id"},"description":"Agent ID for budget tracking"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdvisoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdvisoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/calculator":{"post":{"tags":["support"],"summary":"Cost calculator (FREE)","description":"Calculate projected monthly costs based on scan volume.\n\n    **This endpoint is FREE** - rate limited by IP.\n\n    ## Input Formats\n\n    **Simple Format** (quick estimates):\n    ```json\n    {\"daily_scans\": 100, \"primary_tier\": \"standard\"}\n    ```\n    Just specify daily volume and your typical content size tier.\n\n    **Detailed Format** (precise planning):\n    ```json\n    {\"scan_estimates\": {\"micro\": 500, \"standard\": 2000, \"large\": 100}}\n    ```\n    Specify monthly counts per content size tier.\n\n    ## Size Tiers & Pricing\n    **Text Scanning (by content size):**\n    - Micro (0-500 chars): $0.0035\n    - Standard (501-2K chars): $0.0095\n    - Large (2K-25K chars): $0.025\n    - Bulk (25K-100K chars): $0.055\n\n    **Document Scanning (PDF/DOCX):**\n    - Extraction fee: $0.12/document\n    - Block scanning: standard tier pricing per extracted block\n    - Typical document: ~20 blocks (10 pages × 2)\n\n    **Preflight Validation (URLs, prices, integers, addresses, hashes):**\n    - $0.0075/validation\n\n    **Advisory (Follow-up Q&A):** $0.025/question\n\n    ## Example Response\n    The calculator returns monthly projections including scan costs,\n    advisory costs, and a suggested budget configuration.","operationId":"calculate_costs_v1_calculator_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support":{"post":{"tags":["support"],"summary":"Pre-sales support Q&A (FREE, LLM-powered)","description":"Ask questions about the service before making paid requests.\n\n    **This endpoint is FREE** - rate limited by IP.\n\n    Uses LLM for intelligent, context-aware answers with rule-based fallback\n    for reliability.\n\n    Good questions to ask:\n    - \"How does the scanning work?\"\n    - \"What threats can you detect?\"\n    - \"How do I integrate with x402 payments?\"\n    - \"What's the best workflow for high-volume scanning?\"","operationId":"support_qa_v1_support_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/faq":{"get":{"tags":["support"],"summary":"Get frequently asked questions (FREE)","description":"Get pre-defined answers to frequently asked questions.\n\n    **This endpoint is FREE** - rate limited by IP.\n\n    Useful for:\n    - Building agent knowledge bases\n    - Quick reference without LLM calls\n    - Displaying help content in UIs","operationId":"get_faq_v1_support_faq_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Faq V1 Support Faq Get"}}}}}}},"/v1/pricing":{"get":{"tags":["support"],"summary":"Get pricing information (FREE)","description":"Get complete pricing information for all services.\n\n    **This endpoint is FREE** - rate limited by IP.\n\n    Returns:\n    - Content scanning pricing tiers (micro, standard, large, bulk)\n    - Size boundaries for each tier\n    - Additional services (Q&A, advisory, document scanning, preflight validation)\n    - Batch volume discounts (up to 15% off for 200+ items)\n    - Relevant endpoint references\n\n    Use this endpoint to:\n    - Display pricing in UIs\n    - Build internal cost calculators\n    - Integrate pricing data into agent budgeting systems","operationId":"get_pricing_v1_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}}}}},"/v1/budget/register":{"post":{"tags":["budget"],"summary":"Register and get API key (FREE)","description":"Register to enable budget tracking. Returns an API key.\n\n    **IMPORTANT:**\n    - The API key is shown ONLY ONCE during registration\n    - Save it securely - you cannot retrieve it again\n    - Use this API key as your X-Agent-ID in ALL subsequent requests\n\n    **Flow:**\n    1. Call this endpoint with a unique seed (e.g., your wallet address)\n    2. Save the returned API key\n    3. Use the API key as X-Agent-ID header for all paid endpoints\n    4. Your spending is tracked automatically\n    5. View your budget anytime at GET /v1/budget/status\n\n    If the seed is already registered, returns 409 Conflict.","operationId":"register_agent_v1_budget_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/budget/status":{"get":{"tags":["budget"],"summary":"Get budget status (FREE, requires registration)","description":"Get current spending status.\n\n    **This endpoint is FREE** - requires X-Agent-ID header (your API key from registration).\n\n    Register first at POST /v1/budget/register to get your API key.\n\n    Returns:\n    - Total and monthly spending\n    - Scan counts\n    - Budget utilization (if budget configured)\n    - Alerts when approaching or exceeding limits\n\n    **IMPORTANT:** Budget limits are INFORMATIONAL ONLY. API calls are never blocked\n    when budget is exceeded. Agents can use this data to make informed decisions\n    about API usage, but enforcement is left to the agent's discretion.","operationId":"get_budget_status_v1_budget_status_get","parameters":[{"name":"X-Agent-ID","in":"header","required":true,"schema":{"type":"string","description":"Your API key from registration (use as X-Agent-ID)","title":"X-Agent-Id"},"description":"Your API key from registration (use as X-Agent-ID)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/budget/config":{"post":{"tags":["budget"],"summary":"Set budget configuration (FREE, requires registration)","description":"Configure budget limits and alerts.\n\n    **This endpoint is FREE** - requires X-Agent-ID header (your API key from registration).\n\n    Register first at POST /v1/budget/register to get your API key.\n\n    Set:\n    - Monthly spending limit\n    - Alert threshold percentage\n    - Optional daily limit\n\n    **IMPORTANT:** Budget limits are INFORMATIONAL ONLY. API calls are never blocked\n    when budget is exceeded. Use this to enable spending awareness and self-governance.","operationId":"set_budget_config_v1_budget_config_post","parameters":[{"name":"X-Agent-ID","in":"header","required":true,"schema":{"type":"string","description":"Your API key from registration (use as X-Agent-ID)","title":"X-Agent-Id"},"description":"Your API key from registration (use as X-Agent-ID)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/budget/tracking-config":{"get":{"tags":["budget"],"summary":"Generate tracking config file (FREE, requires registration)","description":"Generate a configuration file that agents can save locally\n    to track their budget settings.\n\n    **This endpoint is FREE** - requires X-Agent-ID header (your API key from registration).\n\n    Register first at POST /v1/budget/register to get your API key.","operationId":"get_tracking_config_v1_budget_tracking_config_get","parameters":[{"name":"monthly_budget","in":"query","required":false,"schema":{"type":"string","default":"10.00","title":"Monthly Budget"}},{"name":"X-Agent-ID","in":"header","required":true,"schema":{"type":"string","description":"Your API key from registration (use as X-Agent-ID)","title":"X-Agent-Id"},"description":"Your API key from registration (use as X-Agent-ID)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Tracking Config V1 Budget Tracking Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research-feed":{"get":{"tags":["research"],"summary":"Get Research Feed","description":"Get AI Security Guard research articles from Moltx.\n\nReturns cached data if available and fresh (< 30 minutes old).\nIncludes social proof stats (agents reached, interactions).","operationId":"get_research_feed_v1_research_feed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchFeedResponse"}}}}}}},"/v1/articles":{"get":{"tags":["research"],"summary":"Get Articles","description":"Get all published articles from local storage.\n\nArticles are synced from the marketing CRM via DO Spaces, enabling\nself-hosted article serving with full SEO benefits.\n\nReturns:\n    List of articles with metadata (truncated content for list view)","operationId":"get_articles_v1_articles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleListResponse"}}}}}}},"/v1/articles/{slug}/image":{"get":{"tags":["research"],"summary":"Get Article Image","description":"Serve article image as binary response.\n\nReturns the image for an article, suitable for use in <img> tags.\nReturns 404 if article or image not found.","operationId":"get_article_image_v1_articles__slug__image_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/{slug}":{"get":{"tags":["research"],"summary":"Get Article Page","description":"Serve an individual article page as HTML.\n\nRenders articles for SEO-friendly, self-hosted serving.\nArticles are loaded from local JSON file (synced from DO Spaces).\n\nArgs:\n    slug: URL-friendly article identifier\n\nReturns:\n    Rendered HTML page with article content","operationId":"get_article_page_v1_research__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback":{"post":{"tags":["feedback"],"summary":"Submit feedback on a scan result","description":"Report false positives (safe content flagged as threat) or false negatives (threats missed by the scanner). This feedback helps improve detection patterns.\n\n**Privacy:** No content is stored. Only metadata about the scan (verdict, threat score, content type) is captured for analysis.","operationId":"submit_feedback_v1_feedback_post","parameters":[{"name":"X-Session-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"200":{"description":"Feedback accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10/minute)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/general":{"post":{"tags":["feedback"],"summary":"Submit general feedback or suggestions","description":"Submit general feedback, feature suggestions, or comments that are not tied to a specific scan result.\n\nUse this for:\n- Feature requests and suggestions\n- Service improvement ideas\n- Documentation feedback\n- General questions or comments\n- Bug reports (non-scan-related)\n\n**Privacy:** No code snippets allowed in the message. Describe your feedback in plain text only.","operationId":"submit_general_feedback_v1_feedback_general_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneralFeedbackRequest"}}},"required":true},"responses":{"200":{"description":"Feedback accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneralFeedbackResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10/minute)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status":{"get":{"tags":["status"],"summary":"Get service status and uptime metrics","description":"Returns current service health status, uptime percentages over 24h/7d/30d windows, and component status. Uses lightweight piggyback tracking - no synthetic health checks.\n\n**No authentication required.** Designed for monitoring dashboards and autonomous agents checking service availability.","operationId":"get_status_v1_status_get","responses":{"200":{"description":"Status retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"429":{"description":"Rate limit exceeded (120/minute)"}}}},"/v1/status/ping":{"get":{"tags":["status"],"summary":"Simple health ping","description":"Lightweight health check that records a data point and returns quickly.","operationId":"ping_v1_status_ping_head","responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ping V1 Status Ping Head"}}}},"503":{"description":"Service unhealthy"}}},"head":{"tags":["status"],"summary":"Simple health ping","description":"Lightweight health check that records a data point and returns quickly.","operationId":"ping_v1_status_ping_head","responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ping V1 Status Ping Head"}}}},"503":{"description":"Service unhealthy"}}}},"/v1/contribute":{"post":{"tags":["contribute"],"summary":"Submit a threat sample","description":"Submit a threat sample to help improve detection patterns.\n\n**THIS IS NOT PRIVATE** - Content you submit WILL be stored.\n\nGood contributions:\n- Novel prompt injection techniques\n- Jailbreak attempts (synthetic or from research)\n- Social engineering patterns targeting AI assistants\n- Obfuscation techniques (encoding, payload splitting)\n\nDo NOT submit:\n- Real credentials or API keys\n- Personal information (names, emails, etc.)\n- Proprietary business data","operationId":"submit_contribution_v1_contribute_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributeRequest"}}},"required":true},"responses":{"200":{"description":"Contribution accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributeResponse"}}}},"400":{"description":"Invalid request or duplicate content"},"429":{"description":"Rate limit exceeded"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/contribute/stats":{"get":{"tags":["contribute"],"summary":"Community contribution statistics","description":"View statistics about community threat contributions.","operationId":"get_stats_v1_contribute_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributeStatsResponse"}}}}}}},"/v1/document/quote":{"post":{"tags":["document"],"summary":"Get price quote for document scanning","description":"Get a price quote for document scanning.\n\nDocument scanning includes:\n- **Extraction fee**: Flat $0.12 for document processing (covers subprocess overhead)\n- **Block scanning fee**: Per extracted text block (standard tier pricing)\n\nThe returned `quote_id` should be used in the `X-Quote-ID` header when calling\nPOST /v1/document/scan.\n\n**Supported formats:**\n- PDF (application/pdf)\n- DOCX (application/vnd.openxmlformats-officedocument.wordprocessingml.document)\n\n**What gets scanned:**\n- Document metadata (title, author, keywords, etc.)\n- Annotations and comments\n- Hidden text (white color, tiny font, off-page, etc.)\n- Form field values\n- JavaScript content (detection only, no execution)","operationId":"get_document_quote_v1_document_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Document quote created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentQuoteResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/document/scan":{"post":{"tags":["document"],"summary":"Scan document for security threats","description":"Scan a document for security threats.\n\n**REQUIRES a valid quote.** First call POST /v1/document/quote to get a quote_id,\nthen include it in the X-Quote-ID header.\n\n**Scanning process:**\n1. Decode base64 document\n2. Extract and analyze all text content\n3. Scan for prompt injection, credential exfiltration, and other threats\n4. Aggregate results with structural analysis\n\n**Response includes:**\n- Overall verdict and threat score\n- Security findings with severity levels\n- Structural risk indicators\n- Block-by-block scan results (if requested)\n- Pricing breakdown","operationId":"scan_document_v1_document_scan_post","parameters":[{"name":"X-Quote-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Quote-Id"}},{"name":"X-Agent-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Agent-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentScanRequest"}}}},"responses":{"200":{"description":"Document scan completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentScanResponse"}}}},"400":{"description":"Invalid request or quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required - quote required"},"413":{"description":"Document too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Document extraction failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/document/supported-types":{"get":{"tags":["document"],"summary":"Get supported document types","description":"Get list of supported document types for scanning.\n\nReturns MIME types and their descriptions.","operationId":"get_supported_types_v1_document_supported_types_get","responses":{"200":{"description":"List of supported document types","content":{"application/json":{"schema":{}}}}}}},"/v1/guard/preflight/quote":{"post":{"tags":["preflight-validation"],"summary":"Get price quote for batch validation (FREE)","description":"Get a price quote for batch validation.\n\n**This endpoint is FREE** - no payment required.\n\nUse the returned `quote_id` in the `X-Quote-ID` header when calling `/v1/guard/preflight/batch`.","operationId":"get_batch_quote_v1_guard_preflight_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicroBatchQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Quote generated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicroBatchQuoteResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicroValidationError"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/guard/preflight":{"post":{"tags":["preflight-validation"],"summary":"Validate a single value (URL, price, integer, address, or hash)","description":"Lightweight structural validation for:\n- **URLs**: Format and security validation\n- **Prices**: Numeric bounds validation\n- **Integers**: Type-safe bounds validation\n- **Addresses**: Format validation\n- **Hashes**: Format validation\n\n**Cost**: $0.0005 per validation","operationId":"validate_single_v1_guard_preflight_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}},{"name":"X-Agent-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Agent-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicroValidationRequest"}}}},"responses":{"200":{"description":"Validation completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicroValidationResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicroValidationError"}}}},"402":{"description":"Payment required"},"429":{"description":"Rate limited"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/guard/preflight/batch":{"post":{"tags":["preflight-validation"],"summary":"Validate multiple values in batch","description":"Batch validation for multiple values in a single request.\n\n**Cost**: $0.0005 per item (total = $0.0005 * item_count)\n\n**Max batch size**: 500 items\n\nIdeal for validating:\n- Multiple URLs before agent processing\n- Transaction parameters (amount, recipient, data)\n- Array of values from API responses","operationId":"validate_batch_endpoint_v1_guard_preflight_batch_post","parameters":[{"name":"X-Request-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}},{"name":"X-Agent-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Agent-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchValidationRequest"}}}},"responses":{"200":{"description":"Batch validation completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchValidationResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicroValidationError"}}}},"402":{"description":"Payment required"},"429":{"description":"Rate limited"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/newsletter/signup":{"post":{"tags":["newsletter"],"summary":"Newsletter Signup","description":"Subscribe an email to the AI Security Guard newsletter.\n\nPrivacy notes:\n- Email is stored only in Brevo for newsletter delivery\n- Never connected to scan data or API usage\n- Unsubscribe link in every email\n- No spam, only security research updates\n\nBot protection:\n- Rate limited to 5/minute per IP\n- Honeypot field detection\n- One-time nonce validation","operationId":"newsletter_signup_v1_newsletter_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSignupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/risk/assess":{"post":{"tags":["risk"],"summary":"Assess content risk from Content DNA","description":"Assess content risk using Content DNA markers.\n\n**Privacy-preserving**: No actual content is transmitted. The Content DNA\ncontains only structural and behavioral markers extracted client-side.\n\n**Performance**: Target latency <20ms (Redis-speed lookup).\n\n**Free Tier**: Generous initial credit quota. Beyond quota, returns 402 with\nx402 payment option for continued access.\n\n**Response Fields**:\n- `risk_level`: low | medium | high | critical\n- `risk_score`: 0.0 - 1.0 numeric score\n- `flags`: Specific threat indicators (e.g., \"high_directive_density\")\n- `escalate`: True if premium scan recommended for deeper analysis","operationId":"assess_content_risk_v1_risk_assess_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAssessRequest"}}}},"responses":{"200":{"description":"Risk assessment completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAssessResponse"}}}},"400":{"description":"Invalid Content DNA"},"401":{"description":"Invalid API key"},"402":{"description":"Free tier quota exceeded"},"429":{"description":"Rate limit exceeded"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/risk/quota":{"get":{"tags":["risk"],"summary":"Check remaining risk assessment quota","description":"Check remaining risk assessment quota for the current billing period.\n\nReturns:\n- `remaining`: Number of assessments remaining\n- `limit`: Total limit for the initial credit quota","operationId":"get_quota_v1_risk_quota_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Quota information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskQuotaResponse"}}}},"401":{"description":"Invalid API key"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/risk/keys/provision":{"post":{"tags":["risk"],"summary":"Provision a free tier API key","description":"Provision a new free tier API key.\n\n**Rate Limited**: Maximum 5 requests per minute per IP.\n\n**Machine Binding**: Each machine can only have one active API key.\nThe key is bound to machine characteristics for secure authentication.\n\nThe provisioned key is valid immediately and includes the free tier quota.\nStore this key securely - it cannot be recovered if lost.","operationId":"provision_api_key_v1_risk_keys_provision_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionKeyRequest"}}},"required":true},"responses":{"200":{"description":"API key provisioned","content":{"application/json":{"schema":{}}}},"400":{"description":"Missing or invalid machine_id"},"403":{"description":"Already registered"},"429":{"description":"Rate limit exceeded"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/risk/credits":{"get":{"tags":["risk"],"summary":"Check risk assessment credit balance","description":"Check risk assessment credit balance.\n\nReturns:\n- `credits_available`: Purchased credits remaining\n- `free_quota_remaining`: Free tier quota remaining this month\n- `free_quota_limit`: Total free tier limit","operationId":"get_credits_v1_risk_credits_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Credit balance information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskCreditsResponse"}}}},"401":{"description":"Invalid API key"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/risk/credits/purchase":{"post":{"tags":["risk"],"summary":"Purchase risk assessment credits","description":"Purchase risk assessment credits via x402 payment.\n\n**Payment**: $1.75 USDC for 10,000 credits (1 assessment per credit).\n\nCredits are added immediately after payment verification.\nCredits do not expire.\n\nThis endpoint requires x402 payment. Include payment signature\nin the request headers per x402 protocol.","operationId":"purchase_credits_v1_risk_credits_purchase_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Credits purchased successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskCreditsPurchaseResponse"}}}},"401":{"description":"Invalid API key"},"402":{"description":"Payment required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shield/analyze":{"post":{"tags":["shield"],"summary":"Analyze activity telemetry","description":"Analyze activity telemetry for behavioral anomalies and threat patterns.\n\nUses credits from free quota (1250 one-time) or purchased credits.\n\nCredit cost:\n- Base analysis: 10 credits (includes up to 25 IP hash lookups)\n- Additional IP lookups: +1 per 25 IP hashes over 25\n- Trend analysis: +2 if daily_totals provided\n\nIdempotency:\n- Include idempotency_key to prevent duplicate billing on retries\n- Cached responses returned for 1 hour\n\nReturns:\n- Risk score and grade\n- Detected anomalies with explanations\n- Flagged IPs from threat intelligence\n- Comparison to community baselines\n- Actionable recommendations","operationId":"analyze_activity_v1_shield_analyze_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityTelemetryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityAnalysisResponse"}}}},"401":{"description":"Invalid or missing API key"},"402":{"description":"Credits depleted - purchase required"},"408":{"description":"Analysis timed out"},"422":{"description":"Invalid telemetry data"},"429":{"description":"Rate limit exceeded"}}}},"/v1/shield/baselines":{"get":{"tags":["shield"],"summary":"Get community baseline statistics (FREE)","description":"Get anonymized community baseline statistics.\n\nFREE endpoint (rate-limited). Useful for self-comparison.","operationId":"get_baselines_v1_shield_baselines_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityBaselinesResponse"}}}}}}},"/v1/alerts/send":{"post":{"tags":["alerts"],"summary":"Send Alert","description":"Send an alert email to a user via Brevo transactional API.\n\nRequires valid risk assessment API key in Authorization header.\nRate limited to 10 requests per minute per IP to prevent abuse.\n\nArgs:\n    request: FastAPI request object (for rate limiting).\n    alert_request: Alert details including email, type, and data.\n    api_key: Validated API key from Authorization header.\n\nReturns:\n    AlertResponse with success status and Brevo message ID.\n\nRaises:\n    HTTPException: 400 if required data is missing for alert type.\n    HTTPException: 401 if API key is invalid.\n    HTTPException: 502 if Brevo API fails.\n    HTTPException: 503 if Brevo is not configured.\n    HTTPException: 504 if Brevo times out.","operationId":"send_alert_v1_alerts_send_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alerts/health":{"get":{"tags":["alerts"],"summary":"Alerts Health","description":"Health check for alerts service.\n\nReturns configuration status without exposing sensitive values.\n\nReturns:\n    Dictionary with service status and template configuration.","operationId":"alerts_health_v1_alerts_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alerts Health V1 Alerts Health Get"}}}}}}},"/v1/alerts/validate-email":{"post":{"tags":["alerts"],"summary":"Validate Email For Alerts","description":"Validate an email address for alert delivery.\n\nUses the same validation logic as the /send endpoint:\n- Format validation (valid email structure)\n- Length check (max 254 characters)\n- Disposable domain rejection\n\nRequires valid risk assessment API key in Authorization header.\n\nArgs:\n    request: FastAPI request object (for rate limiting).\n    validation_request: Contains the email to validate.\n    api_key: Validated API key from Authorization header.\n\nReturns:\n    EmailValidationResponse with valid status and error message if invalid.","operationId":"validate_email_for_alerts_v1_alerts_validate_email_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailValidationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/action-pack":{"get":{"tags":["action-pack"],"summary":"Action Pack Landing","description":"Serve the Action Pack landing page.\n\nThis is the public page where users sign up to receive the email-gated content.","operationId":"action_pack_landing_action_pack_get","responses":{"200":{"description":"Successful Response"}}}},"/action-pack/subscribe":{"post":{"tags":["action-pack"],"summary":"Subscribe Action Pack","description":"Subscribe to receive the AI Agent Security Action Pack.\n\nCreates a signed download token, adds contact to Brevo list,\nand sends transactional email with the download link.","operationId":"subscribe_action_pack_action_pack_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionPackSubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionPackSubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/action-pack/guide":{"get":{"tags":["action-pack"],"summary":"Access Guide","description":"Access the Action Pack guide with a valid token.\n\nValidates the signed token and serves the guide HTML.\nRedirects to landing page if token is missing or invalid.","operationId":"access_guide_action_pack_guide_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"description":"Download token from email","title":"Token"},"description":"Download token from email"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/action-pack/guide/{file_path}":{"get":{"tags":["action-pack"],"summary":"Serve Guide Assets","description":"Serve guide static assets (CSS, JS, images).\n\nToken validation is optional for most assets to allow proper loading\nafter the main page is authenticated. However, downloadable files\n(.zip, .tar.gz) require token validation.","operationId":"serve_guide_assets_action_pack_guide__file_path__get","parameters":[{"name":"file_path","in":"path","required":true,"schema":{"type":"string","title":"File Path"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reports/shipping-the-future/":{"get":{"tags":["reports"],"summary":"Shipping The Future Index","description":"Serve report entry HTML.","operationId":"shipping_the_future_index_reports_shipping_the_future__get","responses":{"200":{"description":"Successful Response"}}}},"/reports/shipping-the-future":{"get":{"tags":["reports"],"summary":"Shipping The Future Index","description":"Serve report entry HTML.","operationId":"shipping_the_future_index_reports_shipping_the_future_get","responses":{"200":{"description":"Successful Response"}}}},"/reports/shipping-the-future/{file_path}":{"get":{"tags":["reports"],"summary":"Serve Shipping The Future Assets","description":"Serve report static assets (images, future css/js).","operationId":"serve_shipping_the_future_assets_reports_shipping_the_future__file_path__get","parameters":[{"name":"file_path","in":"path","required":true,"schema":{"type":"string","title":"File Path"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap.xml":{"get":{"tags":["learn"],"summary":"Get Sitemap","description":"Generate dynamic XML sitemap including static pages and all articles.\n\nCritical for SEO: Search engines use this to discover content.\nWithout a sitemap, crawlers may not find article pages.","operationId":"get_sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/learn/":{"get":{"tags":["learn"],"summary":"Get Learn Center","description":"Learning Center landing page.\n\nServes static HTML file with article grid, newsletter signup, and action pack sidebar.","operationId":"get_learn_center_learn__get","responses":{"200":{"description":"Successful Response"}}}},"/learn":{"get":{"tags":["learn"],"summary":"Get Learn Center","description":"Learning Center landing page.\n\nServes static HTML file with article grid, newsletter signup, and action pack sidebar.","operationId":"get_learn_center_learn_get","responses":{"200":{"description":"Successful Response"}}}},"/learn/article/{slug}":{"get":{"tags":["learn"],"summary":"Get Learn Article","description":"Serve article in learn center with Article schema.\n\nFor in-depth research content targeting human readers.","operationId":"get_learn_article_learn_article__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/learn/how-to/{slug}":{"get":{"tags":["learn"],"summary":"Get Learn Howto","description":"Serve how-to guide with HowTo + FAQPage schema.\n\nFor quick answers optimized for AI Overview extraction.\nQuestion-format H2 headings for better LLM comprehension.","operationId":"get_learn_howto_learn_how_to__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/learn/comparison/{slug}":{"get":{"tags":["learn"],"summary":"Get Learn Comparison","description":"Serve comparison article with Article schema.\n\nFor tool/product comparisons targeting informational + commercial keywords.\nIncludes feature tables and FAQ for AEO extraction.","operationId":"get_learn_comparison_learn_comparison__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/landing/{slug}":{"get":{"tags":["landing"],"summary":"Get Landing Page","description":"Serve a compact keyword landing page.\n\nDistinct from /learn/* — product-intent pages with CTA flip controlled\nby SITE_LAUNCH_MODE env var (waitlist | launched).","operationId":"get_landing_page_landing__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/":{"get":{"tags":["tools"],"summary":"Get Tools Hub","description":"Tools hub page listing all available browser-based tools.\n\nSEO-optimized landing page with category filtering.","operationId":"get_tools_hub_tools__get","responses":{"200":{"description":"Successful Response"}}}},"/tools":{"get":{"tags":["tools"],"summary":"Get Tools Hub","description":"Tools hub page listing all available browser-based tools.\n\nSEO-optimized landing page with category filtering.","operationId":"get_tools_hub_tools_get","responses":{"200":{"description":"Successful Response"}}}},"/tools/{slug}":{"get":{"tags":["tools"],"summary":"Get Tool Page","description":"Serve individual tool page.\n\nEach tool is a self-contained HTML file with inline JS.\nReturns 404 if tool doesn't exist or isn't active.\n\nArgs:\n    slug: URL-friendly tool identifier (e.g., 'jwt-decoder')","operationId":"get_tool_page_tools__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data/tools/tools-registry.json":{"get":{"tags":["tools"],"summary":"Get Tools Registry","description":"Serve tools registry JSON for client-side tool listing.\n\nUsed by tools.html to dynamically render tool cards.","operationId":"get_tools_registry_api_data_tools_tools_registry_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/assessments/optin":{"post":{"tags":["assessments"],"summary":"User opts in to receive personalized report","description":"Process user opt-in: validate spam signals, subscribe to Brevo,\ngenerate signed token, and send personalized report email.\n\nArgs:\n    optin: Email and temp_id from the frontend form.\n\nReturns:\n    Success message.","operationId":"assessment_optin_assessments_optin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptinRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Assessment Optin Assessments Optin Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/assessments/questions":{"get":{"tags":["assessments"],"summary":"Get all quiz questions","description":"Return all 13 quiz questions for frontend rendering.\n\nQuestions include profile, behavioral, and belief sections with options\nand answer keys. No authentication required.","operationId":"get_quiz_questions_assessments_questions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Quiz Questions Assessments Questions Get"}}}}}}},"/assessments/questions/{section}":{"get":{"tags":["assessments"],"summary":"Get questions for a section","description":"Return questions for a specific section (1-4).\n\nArgs:\n    section: Section number (1=Profile, 2=Behaviors, 3=Beliefs, 4=Priority Goal).","operationId":"get_section_questions_assessments_questions__section__get","parameters":[{"name":"section","in":"path","required":true,"schema":{"type":"integer","title":"Section"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Section Questions Assessments Questions  Section  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/assessments/skills/download":{"get":{"tags":["assessments"],"summary":"Download personalized skills for this user","description":"Download a ZIP of personalized skill packages.\n\nValidates that the user completed an assessment (temp_id from report token)\nbefore allowing the download.\n\nArgs:\n    temp_id: Assessment ID from report token, validated against\n             temp_assessments.jsonl.\n    skills: Comma-separated skill names to include.\n\nReturns:\n    ZIP file of skill markdown + assets.","operationId":"download_skills_assessments_skills_download_get","parameters":[{"name":"temp_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Temp assessment ID from report token","title":"Temp Id"},"description":"Temp assessment ID from report token"},{"name":"skills","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated skill names (e.g., 'Retry Coach,Model Coach')","title":"Skills"},"description":"Comma-separated skill names (e.g., 'Retry Coach,Model Coach')"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/assessments/submit":{"post":{"tags":["assessments"],"summary":"Submit quiz answers and get results","description":"Score quiz answers and store temporarily for pending opt-in.\n\nReturns a temp_id that the frontend uses to let the user opt in to\na personalized report. Also stores anonymous benchmark data.\n\nArgs:\n    answers: Dict mapping question number (int) to answer key (str).\n             Example: {\"1\": \"a\", \"2\": \"b\", \"4\": \"c\", ...}\n    priority_goal: Optional user-stated goal (e.g., \"Reduce costs\").\n\nReturns:\n    Dict with temp_id, score, archetype, grade, and efficiency_index.","operationId":"submit_assessment_assessments_submit_post","parameters":[{"name":"priority_goal","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"User's stated priority goal","title":"Priority Goal"},"description":"User's stated priority goal"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Answers"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Assessment Assessments Submit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/assessments/report":{"get":{"tags":["assessments"],"summary":"Generate and return the personalized report","description":"Generate a personalized HTML report from a signed token.\n\nThe token is generated when the user opts in during the quiz flow\nand sent via email (Brevo). The token contains the temp_id and is\nHMAC-signed to prevent forgery.\n\nArgs:\n    token: Signed token from the email link (?token=xxx).\n\nReturns:\n    HTML report served as a downloadable/streamed file.","operationId":"get_report_assessments_report_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/assessments/report-viewer":{"get":{"tags":["assessments"],"summary":"Report viewer — shows archetype summary with generate button","description":"Landing page for report access.\n\nValidates the token, extracts archetype from temp data, and renders\na page with a \"Generate Report\" button. The button calls the existing\n/assessments/report endpoint to generate and serve the HTML report.","operationId":"report_viewer_assessments_report_viewer_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Signed assessment token","title":"Token"},"description":"Signed assessment token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reports/secrets-of-llm-whisperer/hidden-llm-cost-factors-research-home":{"get":{"tags":["reports"],"summary":"Research Overview","description":"Serve the SEO-friendly research overview landing page.","operationId":"research_overview_reports_secrets_of_llm_whisperer_hidden_llm_cost_factors_research_home_get","responses":{"200":{"description":"Successful Response"}}}},"/reports/secrets-of-llm-whisperer/cut-llm-costs-llm-whisperer-method-overview":{"get":{"tags":["reports"],"summary":"Method Overview","description":"Serve the LLM Whisperer Method overview page.","operationId":"method_overview_reports_secrets_of_llm_whisperer_cut_llm_costs_llm_whisperer_method_overview_get","responses":{"200":{"description":"Successful Response"}}}},"/reports/secrets-of-llm-whisperer/free-90-day-llm-cost-reduction-courses":{"get":{"tags":["reports"],"summary":"Coaching Courses","description":"Serve the free 90-day LLM cost reduction courses page.","operationId":"coaching_courses_reports_secrets_of_llm_whisperer_free_90_day_llm_cost_reduction_courses_get","responses":{"200":{"description":"Successful Response"}}}},"/reports/secrets-of-llm-whisperer/clarity-consult":{"get":{"tags":["reports"],"summary":"Clarity Consult","description":"Serve the Clarity Consult booking page.","operationId":"clarity_consult_reports_secrets_of_llm_whisperer_clarity_consult_get","responses":{"200":{"description":"Successful Response"}}}},"/reports/secrets-of-llm-whisperer/assessments/llm-cost-personality":{"get":{"tags":["reports"],"summary":"Assessment Landing","description":"Serve the LLM Cost Personality Assessment landing page.","operationId":"assessment_landing_reports_secrets_of_llm_whisperer_assessments_llm_cost_personality_get","responses":{"200":{"description":"Successful Response"}}}},"/reports/secrets-of-llm-whisperer/":{"get":{"tags":["reports"],"summary":"Index","description":"Serve the main landing page.","operationId":"index_reports_secrets_of_llm_whisperer__get","responses":{"200":{"description":"Successful Response"}}}},"/reports/secrets-of-llm-whisperer":{"get":{"tags":["reports"],"summary":"Index","description":"Serve the main landing page.","operationId":"index_reports_secrets_of_llm_whisperer_get","responses":{"200":{"description":"Successful Response"}}}},"/reports/secrets-of-llm-whisperer/{section_slug}":{"get":{"tags":["reports"],"summary":"Section Article","description":"Serve a section article by slug (e.g., 2_hidden_cost_drivers).","operationId":"section_article_reports_secrets_of_llm_whisperer__section_slug__get","parameters":[{"name":"section_slug","in":"path","required":true,"schema":{"type":"string","title":"Section Slug"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reports/secrets-of-llm-whisperer/{file_path}":{"get":{"tags":["reports"],"summary":"Serve Assets","description":"Serve report static assets (images, charts, report_content files).","operationId":"serve_assets_reports_secrets_of_llm_whisperer__file_path__get","parameters":[{"name":"file_path","in":"path","required":true,"schema":{"type":"string","title":"File Path"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/x402":{"get":{"tags":["Discovery"],"summary":"x402 Discovery Document","description":"Returns the x402 discovery document for this service.","operationId":"get_discovery_document__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["system"],"summary":"Health Check","description":"Health check endpoint for load balancers and uptime monitors.\n\nReturns service status and version.","operationId":"health_check_health_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Check Health Head"}}}}}},"head":{"tags":["system"],"summary":"Health Check","description":"Health check endpoint for load balancers and uptime monitors.\n\nReturns service status and version.","operationId":"health_check_health_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Check Health Head"}}}}}}},"/":{"get":{"tags":["frontend"],"summary":"Root","description":"Serve the landing page or JSON discovery response.\n\nReturns JSON for agents (Accept: application/json) or HTML for browsers.\nAgents can use this endpoint for initial API discovery.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/for-agents":{"get":{"tags":["frontend"],"summary":"For Agents","description":"Serve the machine-readable documentation page.","operationId":"for_agents_for_agents_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy-policy":{"get":{"tags":["frontend"],"summary":"Privacy Policy","description":"Serve the privacy policy page.","operationId":"privacy_policy_privacy_policy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/terms-of-service":{"get":{"tags":["frontend"],"summary":"Terms Of Service","description":"Serve the terms of service page.","operationId":"terms_of_service_terms_of_service_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/trust.md":{"get":{"tags":["frontend"],"summary":"Trust Md","description":"Serve the trust & security documentation as markdown.","operationId":"trust_md_trust_md_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/trust":{"get":{"tags":["frontend"],"summary":"Trust Page","description":"Serve the trust & security page with embedded markdown.","operationId":"trust_page_trust_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/contact":{"get":{"tags":["frontend"],"summary":"Contact Page","description":"Serve the contact page.","operationId":"contact_page_contact_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/fund_agentguard360_wallet":{"get":{"tags":["frontend"],"summary":"Fund Wallet Page","description":"Serve the wallet funding page.","operationId":"fund_wallet_page_fund_agentguard360_wallet_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"head":{"tags":["frontend"],"summary":"Fund Wallet Page","description":"Serve the wallet funding page.","operationId":"fund_wallet_page_fund_agentguard360_wallet_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/funding-success":{"get":{"tags":["frontend"],"summary":"Funding Success Page","description":"Serve the funding success confirmation page.","operationId":"funding_success_page_funding_success_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"head":{"tags":["frontend"],"summary":"Funding Success Page","description":"Serve the funding success confirmation page.","operationId":"funding_success_page_funding_success_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/waitlist":{"get":{"tags":["frontend"],"summary":"Waitlist Page","description":"Serve the waitlist landing page.","operationId":"waitlist_page_waitlist_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/agentic-ai-briefing":{"get":{"tags":["frontend"],"summary":"Agentic Ai Briefing Page","description":"Serve the Agentic AI Briefing signup page.","operationId":"agentic_ai_briefing_page_agentic_ai_briefing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/contact.json":{"get":{"tags":["frontend"],"summary":"Contact Json","description":"Serve machine-readable contact information.","operationId":"contact_json_contact_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/robots.txt":{"get":{"tags":["frontend"],"summary":"Robots Txt","description":"Serve robots.txt for web crawlers.","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"tags":["frontend"],"summary":"Llms Txt","description":"Serve llms.txt for AI language models.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms-full.txt":{"get":{"tags":["frontend"],"summary":"Llms Full Txt","description":"Serve llms-full.txt extended context for AI language models.","operationId":"llms_full_txt_llms_full_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/agents.txt":{"get":{"tags":["frontend"],"summary":"Agents Txt","description":"Serve agents.txt for AI agent access policy.","operationId":"agents_txt_agents_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/79cee2f8e68a4d61b1eee172397be735.txt":{"get":{"tags":["frontend"],"summary":"Bing Verification","description":"Serve Bing Webmaster Tools verification file.","operationId":"bing_verification_79cee2f8e68a4d61b1eee172397be735_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/agent":{"get":{"tags":["frontend"],"summary":"Well Known Agent","description":"Serve AID protocol agent discovery JSON.","operationId":"well_known_agent__well_known_agent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/agent-card.json":{"get":{"tags":["frontend"],"summary":"Well Known Agent Card","description":"Serve A2A protocol agent card JSON.","operationId":"well_known_agent_card__well_known_agent_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/docs":{"get":{"tags":["frontend"],"summary":"Docs Redirect","description":"Redirect docs to for-agents page.","operationId":"docs_redirect_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/about":{"get":{"tags":["frontend"],"summary":"About Redirect","description":"Redirect about to for-agents page.","operationId":"about_redirect_about_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api":{"get":{"tags":["system"],"summary":"Api Info","description":"API discovery endpoint for programmatic access.\n\nReturns service info, documentation links, and available endpoints.\nAgents should use this to discover API capabilities.","operationId":"api_info_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Info Api Get"}}}}}}}},"components":{"schemas":{"ActionPackSubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"nonce":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nonce"}},"type":"object","required":["email"],"title":"ActionPackSubscribeRequest","description":"Action Pack subscription request."},"ActionPackSubscribeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"ActionPackSubscribeResponse","description":"Action Pack subscription response."},"ActivityAnalysisResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"risk_score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Risk Score","description":"Overall risk score"},"risk_level":{"type":"string","title":"Risk Level","description":"low, elevated, high, critical"},"grade":{"type":"string","title":"Grade","description":"Letter grade A-F"},"anomalies":{"items":{"$ref":"#/components/schemas/AnomalyDetail"},"type":"array","title":"Anomalies"},"flagged_ips":{"items":{"$ref":"#/components/schemas/FlaggedIP"},"type":"array","title":"Flagged Ips"},"comparisons":{"$ref":"#/components/schemas/ComparisonData"},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations"},"credits_used":{"type":"integer","title":"Credits Used","default":0},"credits_remaining":{"type":"integer","title":"Credits Remaining","default":0},"credits_source":{"type":"string","title":"Credits Source","description":"free, credits, or mixed","default":"free"},"request_id":{"type":"string","title":"Request Id","default":""}},"type":"object","required":["risk_score","risk_level","grade"],"title":"ActivityAnalysisResponse","description":"Response from activity analysis."},"ActivityRiskRequest":{"properties":{"activities":{"items":{"type":"string"},"type":"array","title":"Activities","description":"List of activity IDs representing what the agent does","examples":[["summarizing_web_content","using_mcp_servers","downloading_skills"]]},"data_sensitivity":{"type":"string","enum":["public","internal","confidential","restricted"],"title":"Data Sensitivity","description":"Sensitivity level of data handled","default":"internal"}},"type":"object","required":["activities"],"title":"ActivityRiskRequest","description":"Request for activity-based risk assessment."},"ActivityTelemetryRequest":{"properties":{"version":{"type":"string","title":"Version","description":"Schema version","default":"1.0"},"period_hours":{"type":"integer","maximum":168.0,"minimum":1.0,"title":"Period Hours","description":"Analysis window in hours (1-168)","default":24},"client_hash":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Client Hash","description":"Optional anonymized client ID for baseline tracking"},"idempotency_key":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Idempotency Key","description":"Optional key to prevent duplicate billing on retries"},"by_category":{"additionalProperties":true,"type":"object","title":"By Category","description":"Event counts by category (File Operations, Code Generation, etc.)"},"by_risk":{"additionalProperties":true,"type":"object","title":"By Risk","description":"Event counts by risk level (low, medium, high, critical)"},"watch_events":{"additionalProperties":true,"type":"object","title":"Watch Events","description":"Counts of watch tags (network_upload, shell_sudo, etc.)"},"by_source":{"additionalProperties":true,"type":"object","title":"By Source","description":"Event counts by source (ai, system, unknown)"},"network":{"additionalProperties":true,"type":"object","title":"Network","description":"Network stats: unique_outbound_ips, ip_hashes, etc."},"timing":{"additionalProperties":true,"type":"object","title":"Timing","description":"Timing patterns: peak_hour, night_activity_pct, hourly_distribution"},"total_events":{"type":"integer","minimum":0.0,"title":"Total Events","default":0},"total_watch_events":{"type":"integer","minimum":0.0,"title":"Total Watch Events","default":0},"daily_totals":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Daily Totals","description":"Last 7 days event totals for trend detection"},"attack_chain_indicators":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attack Chain Indicators","description":"Temporal correlation data for attack chain detection: max_correlation_score, high_risk_windows, correlated_events"},"supply_chain":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Supply Chain","description":"Package installation metrics and risk indicators: installs_7d (total, by_ecosystem, by_agent), risk_indicators (typosquat_detections, first_seen_packages, high_velocity_installs), package_hashes (SHA256 of suspicious package names)"}},"type":"object","title":"ActivityTelemetryRequest","description":"Activity telemetry for analysis.\n\nPrivacy-preserving: Only aggregated statistics and hashed identifiers.\nNo raw IPs, file paths, or command strings transmitted."},"AdditionalService":{"properties":{"service":{"type":"string","title":"Service","description":"Service name"},"price_usdc":{"type":"string","title":"Price Usdc","description":"Price in USDC"},"unit":{"type":"string","title":"Unit","description":"Billing unit (e.g., per question, per document)"},"description":{"type":"string","title":"Description","description":"Service description"},"hint":{"type":"string","title":"Hint","description":"Usage hint or endpoint reference"}},"type":"object","required":["service","price_usdc","unit","description","hint"],"title":"AdditionalService","description":"Pricing for additional services beyond content scanning."},"Advisory":{"properties":{"threat_level":{"type":"string","enum":["CRITICAL","HIGH","MEDIUM","LOW","SAFE"],"title":"Threat Level","description":"Overall threat level assessment"},"summary":{"type":"string","title":"Summary","description":"One-sentence summary of the security situation"},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","description":"Actionable recommendations for the user"},"what_to_watch":{"items":{"type":"string"},"type":"array","title":"What To Watch","description":"Signs to monitor if content is allowed"},"related_questions":{"items":{"type":"string"},"type":"array","title":"Related Questions","description":"Suggested follow-up questions to ask via /v1/qa"},"likely_attack_scenario":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Likely Attack Scenario","description":"What the attacker was likely trying to accomplish"}},"type":"object","required":["threat_level","summary"],"title":"Advisory","description":"Security advisory generated from scan results."},"AdvisoryRequest":{"properties":{"question":{"type":"string","maxLength":2000,"minLength":10,"title":"Question","description":"Security question or topic to get advisory on","examples":["How do I prevent prompt injection attacks in my AI agent?","What are the best practices for securing MCP server tools?","Explain the risks of indirect prompt injection and how to mitigate them","How should I validate user input before passing it to an LLM?"]},"context":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Context","description":"Optional context about your setup (e.g., tech stack, use case)"},"threat_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Threat Types","description":"Specific threat types to focus on","examples":[["prompt_injection","command_injection"]]}},"type":"object","required":["question"],"title":"AdvisoryRequest","description":"Request for general security advisory."},"AdvisoryResponse":{"properties":{"request_id":{"type":"string","title":"Request Id","description":"Unique request ID for tracking"},"question":{"type":"string","title":"Question","description":"Original question"},"answer":{"type":"string","title":"Answer","description":"Security advisory answer"},"related_questions":{"items":{"type":"string"},"type":"array","title":"Related Questions","description":"Suggested follow-up questions"},"technical_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Technical Details","description":"Additional technical context"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources","description":"References (CVE, CWE, OWASP, documentation)"},"threat_types_covered":{"items":{"type":"string"},"type":"array","title":"Threat Types Covered","description":"Threat types addressed in this response"},"billing":{"additionalProperties":true,"type":"object","title":"Billing","description":"Billing information for this request"}},"type":"object","required":["request_id","question","answer","billing"],"title":"AdvisoryResponse","description":"Response from advisory endpoint."},"AlertRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"alert_type":{"$ref":"#/components/schemas/AlertType"},"digest_data":{"anyOf":[{"$ref":"#/components/schemas/DailyDigestData"},{"type":"null"}]},"security_data":{"anyOf":[{"$ref":"#/components/schemas/SecurityAlertData"},{"type":"null"}]}},"type":"object","required":["email","alert_type"],"title":"AlertRequest","description":"Request model for sending alert emails.\n\nAttributes:\n    email: Recipient email address (validated, no disposable domains).\n    alert_type: Type of alert to send.\n    digest_data: Data for daily digest alerts (required if alert_type is daily_digest).\n    security_data: Data for security alerts (required if alert_type is security_alert)."},"AlertResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"alert_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alert Id"}},"type":"object","required":["success","message"],"title":"AlertResponse","description":"Response model for alert send operations.\n\nAttributes:\n    success: Whether the alert was sent successfully.\n    message: Human-readable status message.\n    alert_id: Brevo message ID for tracking (if successful)."},"AlertType":{"type":"string","enum":["daily_digest","security_alert"],"title":"AlertType","description":"Supported alert types for email notifications."},"AnomalyDetail":{"properties":{"type":{"type":"string","title":"Type","description":"Anomaly type identifier"},"severity":{"type":"string","title":"Severity","description":"low, medium, high, critical"},"zscore":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zscore","description":"Statistical deviation"},"explanation":{"type":"string","title":"Explanation","description":"Human-readable explanation"}},"type":"object","required":["type","severity","explanation"],"title":"AnomalyDetail","description":"Individual anomaly detected in activity."},"Article":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"excerpt":{"type":"string","title":"Excerpt"},"url":{"type":"string","title":"Url"},"created_at":{"type":"string","title":"Created At"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["id","title","excerpt","url","created_at"],"title":"Article","description":"Article response model."},"ArticleListResponse":{"properties":{"articles":{"items":{"$ref":"#/components/schemas/LocalArticle"},"type":"array","title":"Articles"},"total":{"type":"integer","title":"Total"},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["articles","total"],"title":"ArticleListResponse","description":"Response for /v1/articles endpoint."},"BatchDiscount":{"properties":{"min_items":{"type":"integer","title":"Min Items","description":"Minimum items to qualify"},"discount_percent":{"type":"integer","title":"Discount Percent","description":"Discount percentage (e.g., 5, 10, 15)"},"description":{"type":"string","title":"Description","description":"Human-readable description"}},"type":"object","required":["min_items","discount_percent","description"],"title":"BatchDiscount","description":"Batch discount tier definition."},"BatchItemRequest":{"properties":{"content":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"}],"title":"Content","description":"Content to scan (string or messages dict)"},"intent_contract":{"$ref":"#/components/schemas/IntentContractRequest","description":"Intent contract for this item"},"source_hint":{"enum":["skill","api_response","mcp_response","web",null],"title":"Source Hint","description":"Hint about content source"},"item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Id","description":"Optional client-provided ID for tracking"}},"type":"object","required":["content","intent_contract"],"title":"BatchItemRequest","description":"Single item in a batch scan request.\n\nEach item contains content and its intent contract."},"BatchItemResultFailed":{"properties":{"index":{"type":"integer","title":"Index","description":"Item index in original batch"},"item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Id","description":"Client-provided item ID"},"status":{"type":"string","const":"failed","title":"Status","default":"failed"},"error":{"type":"string","title":"Error","description":"Error description"},"error_code":{"type":"string","title":"Error Code","description":"Error code for programmatic handling"},"retry_token":{"type":"string","title":"Retry Token","description":"Token for free retry (valid 1 hour)"}},"type":"object","required":["index","error","error_code","retry_token"],"title":"BatchItemResultFailed","description":"Failed scan result with retry token."},"BatchItemResultSkipped":{"properties":{"index":{"type":"integer","title":"Index","description":"Item index in original batch"},"item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Id","description":"Client-provided item ID"},"status":{"type":"string","const":"skipped","title":"Status","default":"skipped"},"error":{"type":"string","title":"Error","description":"Validation error description"},"error_code":{"type":"string","title":"Error Code","description":"Error code"}},"type":"object","required":["index","error","error_code"],"title":"BatchItemResultSkipped","description":"Skipped item (validation error, no retry)."},"BatchItemResultSuccess":{"properties":{"index":{"type":"integer","title":"Index","description":"Item index in original batch"},"item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Id","description":"Client-provided item ID"},"status":{"type":"string","const":"success","title":"Status","default":"success"},"scan_id":{"type":"string","title":"Scan Id","description":"Scan ID for reference/feedback"},"session_id":{"type":"string","title":"Session Id","description":"Session ID for Q&A follow-ups"},"verdict":{"type":"string","title":"Verdict","description":"clean, suspicious, or malicious"},"confidence":{"type":"number","title":"Confidence","description":"Confidence score 0.0-1.0"},"threat_score":{"type":"number","title":"Threat Score","description":"Overall threat score"},"content_type":{"type":"string","title":"Content Type","description":"Detected content type"},"findings_count":{"type":"integer","title":"Findings Count","description":"Number of findings","default":0},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings","description":"Detailed findings"},"advisory_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advisory Summary","description":"Brief advisory"}},"type":"object","required":["index","scan_id","session_id","verdict","confidence","threat_score","content_type"],"title":"BatchItemResultSuccess","description":"Successful scan result for a batch item."},"BatchQuoteItemRequest":{"properties":{"content_length":{"type":"integer","maximum":100000.0,"exclusiveMinimum":0.0,"title":"Content Length","description":"Expected content size in bytes"}},"type":"object","required":["content_length"],"title":"BatchQuoteItemRequest","description":"Single item for batch quote (content length only)."},"BatchQuoteRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchQuoteItemRequest"},"type":"array","maxItems":500,"minItems":2,"title":"Items","description":"Items to quote (2-500 items)"}},"type":"object","required":["items"],"title":"BatchQuoteRequest","description":"Request a price quote for batch scanning.\n\nProvide content lengths for all items to get total batch price."},"BatchQuoteResponse":{"properties":{"batch_quote_id":{"type":"string","title":"Batch Quote Id","description":"Quote ID for use with X-Batch-Quote-ID header"},"item_count":{"type":"integer","title":"Item Count","description":"Number of items in batch"},"subtotal":{"type":"string","title":"Subtotal","description":"Pre-discount total price in USDC"},"discount_rate":{"type":"string","title":"Discount Rate","description":"Batch discount rate applied (e.g., \"0.10\" for 10%)"},"discount_amount":{"type":"string","title":"Discount Amount","description":"Discount amount saved in USDC"},"total_price":{"type":"string","title":"Total Price","description":"Final price after discount in USDC"},"per_item_prices":{"items":{"type":"string"},"type":"array","title":"Per Item Prices","description":"Price for each item by index (before discount)"},"valid_for_seconds":{"type":"integer","title":"Valid For Seconds","description":"Quote validity period"},"currency":{"type":"string","title":"Currency","description":"Price currency","default":"USDC"}},"type":"object","required":["batch_quote_id","item_count","subtotal","discount_rate","discount_amount","total_price","per_item_prices","valid_for_seconds"],"title":"BatchQuoteResponse","description":"Response to a batch quote request."},"BatchScanRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchItemRequest"},"type":"array","maxItems":500,"minItems":2,"title":"Items","description":"Items to scan (2-500 items)"},"scan_depth":{"type":"string","enum":["fast","thorough"],"title":"Scan Depth","description":"Scan depth for all items","default":"thorough"}},"type":"object","required":["items"],"title":"BatchScanRequest","description":"Request to scan multiple items in batch.\n\nSubmit after obtaining a batch quote via /v1/guard/batch/quote."},"BatchStatusResponse":{"properties":{"batch_id":{"type":"string","title":"Batch Id","description":"Batch identifier"},"status":{"type":"string","enum":["queued","processing","complete","partial","failed"],"title":"Status","description":"Batch status: queued (waiting), processing (in progress), complete (all done), partial (some failed), failed (batch error)"},"summary":{"$ref":"#/components/schemas/BatchSummary","description":"Processing summary"},"results":{"items":{"anyOf":[{"$ref":"#/components/schemas/BatchItemResultSuccess"},{"$ref":"#/components/schemas/BatchItemResultFailed"},{"$ref":"#/components/schemas/BatchItemResultSkipped"}]},"type":"array","title":"Results","description":"Results for completed items"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Batch creation time"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update time"},"estimated_completion_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Completion Seconds","description":"Estimated seconds until complete (if processing)"}},"type":"object","required":["batch_id","status","summary","created_at","updated_at"],"title":"BatchStatusResponse","description":"Response for batch status check.\n\nPoll this endpoint until status is 'complete' or 'failed'."},"BatchSubmitResponse":{"properties":{"batch_id":{"type":"string","title":"Batch Id","description":"Batch identifier for status polling"},"status":{"type":"string","const":"queued","title":"Status","default":"queued"},"item_count":{"type":"integer","title":"Item Count","description":"Number of items queued"},"poll_url":{"type":"string","title":"Poll Url","description":"URL to poll for status"},"estimated_completion_seconds":{"type":"integer","title":"Estimated Completion Seconds","description":"Estimated processing time"}},"type":"object","required":["batch_id","item_count","poll_url","estimated_completion_seconds"],"title":"BatchSubmitResponse","description":"Response when submitting a batch scan request."},"BatchSummary":{"properties":{"total":{"type":"integer","title":"Total","description":"Total items in batch"},"succeeded":{"type":"integer","title":"Succeeded","description":"Successfully scanned items","default":0},"failed":{"type":"integer","title":"Failed","description":"Items that failed (retryable)","default":0},"skipped":{"type":"integer","title":"Skipped","description":"Items skipped (validation errors)","default":0},"processing":{"type":"integer","title":"Processing","description":"Items still processing","default":0},"verdicts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Verdicts","description":"Verdict counts for successful scans"},"all_clean":{"type":"boolean","title":"All Clean","description":"True only when ALL items succeeded with 'clean' verdict. False if any item is suspicious, malicious, failed, or still processing.","default":false}},"type":"object","required":["total"],"title":"BatchSummary","description":"Summary statistics for batch processing."},"BatchURLItemContract":{"properties":{"intent_contract":{"$ref":"#/components/schemas/IntentContractRequest","description":"Intent contract for this URL"},"item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Id","description":"Optional client-provided ID for tracking"}},"type":"object","required":["intent_contract"],"title":"BatchURLItemContract","description":"Intent contract for a URL in the batch."},"BatchURLScanRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchURLItemContract"},"type":"array","maxItems":500,"minItems":2,"title":"Items","description":"Intent contracts for each URL (2-500 items). Must match the number of successful URLs in the quote."},"scan_depth":{"type":"string","enum":["fast","thorough"],"title":"Scan Depth","description":"Scan depth for all items","default":"thorough"}},"type":"object","required":["items"],"title":"BatchURLScanRequest","description":"Request to scan URLs from a batch URL quote.\n\nThe content has already been fetched and cached during the quote phase.\nProvide intent contracts for each URL in the same order as the quote."},"BatchValidationItem":{"properties":{"type":{"type":"string","enum":["url","price","integer","address","hash"],"title":"Type","description":"Type of validation"},"value":{"type":"string","maxLength":2000,"minLength":1,"title":"Value","description":"Value to validate"},"decimals":{"anyOf":[{"type":"integer","maximum":18.0,"minimum":0.0},{"type":"null"}],"title":"Decimals","default":18},"int_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Int Type","default":"uint256"},"min_val":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Val"},"max_val":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Val"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain","default":"evm"},"hash_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hash Type","default":"sha256"}},"type":"object","required":["type","value"],"title":"BatchValidationItem","description":"Single item in a batch validation request."},"BatchValidationRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BatchValidationItem"},"type":"array","maxItems":500,"minItems":1,"title":"Items","description":"List of items to validate"}},"type":"object","required":["items"],"title":"BatchValidationRequest","description":"Request for batch micro validation."},"BatchValidationResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Total number of items validated"},"valid_count":{"type":"integer","title":"Valid Count","description":"Number of items that are valid and clean"},"suspicious_count":{"type":"integer","title":"Suspicious Count","description":"Number of items that are valid but suspicious"},"invalid_count":{"type":"integer","title":"Invalid Count","description":"Number of items that failed format validation"},"all_clean":{"type":"boolean","title":"All Clean","description":"True if all items passed validation without suspicious flags"},"results":{"items":{"$ref":"#/components/schemas/MicroValidationResultSchema"},"type":"array","title":"Results","description":"Individual validation results"}},"type":"object","required":["total","valid_count","suspicious_count","invalid_count","all_clean","results"],"title":"BatchValidationResponse","description":"Response for batch validation."},"BudgetConfig":{"properties":{"monthly_budget":{"type":"string","title":"Monthly Budget"},"daily_budget":{"type":"string","title":"Daily Budget"},"alert_threshold":{"type":"number","title":"Alert Threshold"},"cost_per_tier":{"additionalProperties":{"type":"string"},"type":"object","title":"Cost Per Tier"}},"type":"object","required":["monthly_budget","daily_budget","alert_threshold","cost_per_tier"],"title":"BudgetConfig","description":"Budget configuration for tracking."},"BudgetConfigRequest":{"properties":{"monthly_budget_usdc":{"type":"string","title":"Monthly Budget Usdc","description":"Monthly budget limit in USDC (e.g., '10.00')","examples":["10.00","50.00","100.00"]},"alert_threshold_percent":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Alert Threshold Percent","description":"Percentage at which to trigger budget alerts (default: 80%)","default":80.0},"daily_limit_usdc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daily Limit Usdc","description":"Optional daily spending limit in USDC"}},"type":"object","required":["monthly_budget_usdc"],"title":"BudgetConfigRequest","description":"Request to set budget configuration."},"BudgetStatusResponse":{"properties":{"agent_id":{"type":"string","title":"Agent Id","description":"Unique agent identifier"},"total_spent_usdc":{"type":"string","title":"Total Spent Usdc","description":"Total lifetime spending in USDC"},"scan_count":{"type":"integer","title":"Scan Count","description":"Total number of scans"},"monthly_spent_usdc":{"type":"string","title":"Monthly Spent Usdc","description":"Current month spending in USDC"},"monthly_scan_count":{"type":"integer","title":"Monthly Scan Count","description":"Current month scan count"},"last_scan_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Scan At","description":"ISO timestamp of last scan"},"monthly_budget_usdc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monthly Budget Usdc","description":"Monthly budget limit if set (informational)"},"budget_remaining_usdc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget Remaining Usdc","description":"Remaining budget if limit set (informational)"},"budget_utilization_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Utilization Percent","description":"Budget usage percentage (informational)"},"alert":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Alert","description":"Budget alert if threshold exceeded (informational)"}},"type":"object","required":["agent_id","total_spent_usdc","scan_count","monthly_spent_usdc","monthly_scan_count","last_scan_at","monthly_budget_usdc","budget_remaining_usdc","budget_utilization_percent"],"title":"BudgetStatusResponse","description":"Current budget status for an agent.\n\nNOTE: Budget limits are INFORMATIONAL ONLY. API calls are never blocked\nwhen budget is exceeded. This enables agents to track spending and make\ninformed decisions about API usage without hard enforcement."},"CalculatorRequest":{"properties":{"scan_estimates":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Scan Estimates","description":"Estimated monthly scan counts per content size tier. Keys: 'micro', 'standard', 'large', 'bulk'. Example: {\"micro\": 500, \"standard\": 2000}"},"daily_scans":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Daily Scans","description":"Daily scan volume (multiplied by 30 for monthly). Use with primary_tier for quick estimates."},"primary_tier":{"type":"string","title":"Primary Tier","description":"Primary content size tier when using daily_scans. Options: 'micro', 'standard', 'large', 'bulk'","default":"standard"},"document_scans":{"type":"integer","minimum":0.0,"title":"Document Scans","description":"Number of documents (PDF/DOCX) to scan per month. Each document has extraction fee ($0.12) + per-block scanning.","default":0},"avg_document_pages":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Avg Document Pages","description":"Average pages per document (used to estimate blocks). Default 10. Blocks ≈ pages × 2.","default":10},"preflight_validations":{"type":"integer","minimum":0.0,"title":"Preflight Validations","description":"Number of preflight validations (URLs, prices, integers, addresses, hashes) per month. $0.0005 per validation.","default":0},"qa_ratio":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Qa Ratio","description":"Average follow-up Q&A questions per scan. Default 0.05 (roughly 1 question every 20 scans).","default":0.05}},"type":"object","title":"CalculatorRequest","description":"Request for cost calculation.\n\nSupports two input formats:\n\n**Simple Format** (for quick estimates):\n```json\n{\"daily_scans\": 100, \"primary_tier\": \"standard\"}\n```\nAutomatically converts daily to monthly (×30) and assigns to one tier.\n\n**Detailed Format** (for precise planning):\n```json\n{\"scan_estimates\": {\"micro\": 500, \"standard\": 2000, \"large\": 100}}\n```\nSpecify monthly counts per content size tier."},"CalculatorResponse":{"properties":{"monthly_projection":{"type":"string","title":"Monthly Projection","description":"Projected monthly cost in USDC (all services combined)"},"scan_cost":{"type":"string","title":"Scan Cost","description":"Total text scan cost in USDC"},"document_cost":{"type":"string","title":"Document Cost","description":"Total document scanning cost in USDC (extraction + blocks)","default":"0.0000"},"preflight_cost":{"type":"string","title":"Preflight Cost","description":"Total preflight validation cost in USDC","default":"0.0000"},"advisory_cost":{"type":"string","title":"Advisory Cost","description":"Estimated advisory (Q&A) cost in USDC"},"cost_breakdown":{"additionalProperties":{"type":"string"},"type":"object","title":"Cost Breakdown","description":"Cost per size tier (text scans only)"},"document_detail":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Document Detail","description":"Document scanning breakdown: documents, blocks, extraction, block_scanning, total"},"preflight_detail":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Preflight Detail","description":"Preflight validation breakdown: validations, price_per, total"},"advisory_detail":{"additionalProperties":{"type":"string"},"type":"object","title":"Advisory Detail","description":"Advisory cost breakdown: estimated questions, price per question, total"},"budget_config":{"$ref":"#/components/schemas/BudgetConfig","description":"Suggested budget configuration"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","description":"Optimization tips and notes"}},"type":"object","required":["monthly_projection","scan_cost","advisory_cost","cost_breakdown","advisory_detail","budget_config"],"title":"CalculatorResponse","description":"Response from cost calculator."},"CommunityBaselinesResponse":{"properties":{"sample_size":{"type":"integer","title":"Sample Size"},"by_category_avg":{"additionalProperties":true,"type":"object","title":"By Category Avg"},"watch_ratio_p50":{"type":"number","title":"Watch Ratio P50"},"watch_ratio_p90":{"type":"number","title":"Watch Ratio P90"},"updated_at":{"type":"string","title":"Updated At"},"confidence":{"type":"string","title":"Confidence","description":"Data confidence level: none, minimal, low, medium, high. Based on number of contributing clients.","default":"none"}},"type":"object","required":["sample_size","by_category_avg","watch_ratio_p50","watch_ratio_p90","updated_at"],"title":"CommunityBaselinesResponse","description":"Community baseline statistics (public, anonymized)."},"ComparisonData":{"properties":{"vs_baseline":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Vs Baseline","description":"Comparison to client's own historical baseline"},"vs_community":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Vs Community","description":"Comparison to community aggregate"},"breach_probability":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Breach Probability","description":"ML-predicted breach probability (0.0-1.0)"},"breach_risk_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Breach Risk Level","description":"Breach risk level: low, medium, high, critical"},"trajectory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trajectory","description":"Risk trajectory: improving, stable, worsening, volatile"},"predicted_risk":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Predicted Risk","description":"Predicted risk score based on trajectory"},"ml_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Ml Confidence","description":"ML model confidence (0.0-1.0)"},"breach_explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Breach Explanation","description":"Human-readable explanation of breach assessment"}},"type":"object","title":"ComparisonData","description":"Comparison against baselines and ML predictions."},"ComponentStatus":{"properties":{"api":{"type":"string","title":"Api","description":"API server status","default":"operational"},"together_ai":{"type":"string","title":"Together Ai","description":"Together AI status","default":"unknown"}},"type":"object","title":"ComponentStatus","description":"Status of individual components."},"ContributeRequest":{"properties":{"content":{"type":"string","maxLength":50000,"minLength":10,"title":"Content","description":"The threat sample. THIS WILL BE STORED."},"category":{"type":"string","enum":["instruction_bypass","manipulation","dangerous_actions","data_theft","guardrail_evasion","encoding_tricks","unknown"],"title":"Category","description":"Threat category"},"why_malicious":{"type":"string","maxLength":500,"minLength":10,"title":"Why Malicious","description":"Brief explanation of the attack technique"},"source":{"type":"string","enum":["real_attack","research","ctf","synthetic","other"],"title":"Source","description":"Where this sample came from","default":"other"},"reference_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Reference Url","description":"Optional reference (paper, writeup, etc.)"},"username":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Username","description":"A pseudonymous username for attribution. Do NOT use your real name, social media handles, or any identifiable information. Create a unique alias for this service. Omit for anonymous submission."},"i_understand":{"type":"boolean","title":"I Understand","description":"Confirm: I understand this content WILL be stored and used for security research. I'm not submitting PII or confidential data."}},"type":"object","required":["content","category","why_malicious","i_understand"],"title":"ContributeRequest","description":"Submit a threat sample to help improve detection.\n\nPRIVACY NOTICE - READ CAREFULLY:\nContent you submit WILL be stored and used for security research.\nDo NOT submit any:\n- Personally identifiable information (PII)\n- Real credentials, API keys, or secrets\n- Proprietary or confidential business data\n- Content you don't have rights to share"},"ContributeResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Contribution ID for reference"},"status":{"type":"string","title":"Status","description":"Submission status"},"message":{"type":"string","title":"Message"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Username for attribution (if provided)"}},"type":"object","required":["id","status","message"],"title":"ContributeResponse","description":"Confirmation of threat submission."},"ContributeStatsResponse":{"properties":{"total_last_30_days":{"type":"integer","title":"Total Last 30 Days"},"pending_review":{"type":"integer","title":"Pending Review"},"top_categories":{"items":{"type":"string"},"type":"array","title":"Top Categories"}},"type":"object","required":["total_last_30_days","pending_review","top_categories"],"title":"ContributeStatsResponse","description":"Community contribution statistics."},"DailyDigestData":{"properties":{"protection_status":{"type":"string","title":"Protection Status","description":"Active/Inactive/Paused"},"threats_detected":{"type":"integer","minimum":0.0,"title":"Threats Detected","default":0},"security_grade":{"type":"string","maxLength":5,"title":"Security Grade","default":"N/A"},"health_grade":{"type":"string","maxLength":5,"title":"Health Grade","default":"N/A"},"days_active":{"type":"integer","minimum":0.0,"title":"Days Active","default":0},"device_events":{"type":"integer","minimum":0.0,"title":"Device Events","description":"Behavioral events monitored (24h)","default":0},"device_alerts":{"type":"integer","minimum":0.0,"title":"Device Alerts","description":"Security alerts from device monitoring","default":0},"content_scanned":{"type":"integer","minimum":0.0,"title":"Content Scanned","description":"Total content items scanned (24h)","default":0},"high_risk_scans":{"type":"integer","minimum":0.0,"title":"High Risk Scans","default":0},"correlated_threats":{"type":"integer","minimum":0.0,"title":"Correlated Threats","default":0},"dismissed_scans":{"type":"integer","minimum":0.0,"title":"Dismissed Scans","default":0},"incidents_dismissed":{"type":"integer","minimum":0.0,"title":"Incidents Dismissed","description":"Threats dismissed after correlation (protected)","default":0},"breach_potential":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Breach Potential"},"threat_pressure":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Threat Pressure"},"credits_total":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Credits Total","description":"Total risk assessment credits available"},"credits_coverage_days":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Credits Coverage Days","description":"Estimated days of coverage at current usage"},"auto_purchase_enabled":{"type":"boolean","title":"Auto Purchase Enabled","description":"Whether auto-purchase credits is enabled","default":false},"budget_monthly":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Budget Monthly","description":"Monthly budget amount in USD"},"today_spend":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Today Spend","description":"Today's LLM API spending in USD"},"top_categories":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Top Categories","description":"Top 3 spending categories [{name, cost, pct}]"},"alerts_recap":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Alerts Recap","description":"Recent alerts [{type, title, acknowledged, timestamp}]"},"is_subscription":{"type":"boolean","title":"Is Subscription","description":"True if user is on subscription plan vs manual budget","default":false}},"type":"object","required":["protection_status"],"title":"DailyDigestData","description":"Data payload for daily digest alerts.\n\nAttributes:\n    protection_status: Current protection state (Active/Inactive/Paused).\n    threats_detected: Number of threats detected in the period.\n    security_grade: Letter grade for security posture (A-F).\n    health_grade: Letter grade for system health (A-F).\n    days_active: Number of days protection has been active.\n    high_risk_scans: High-risk content scans detected (24h).\n    correlated_threats: Scans correlated with device impact.\n    dismissed_scans: Scans dismissed (no device impact).\n    breach_potential: ML analysis breach potential (if available).\n    threat_pressure: ML analysis threat pressure (if available)."},"DocumentIntentContract":{"properties":{"intent_type":{"type":"string","title":"Intent Type","description":"Intent type for the document (default: document_scanning)","default":"document_scanning","examples":["document_scanning","data_retrieval"]},"task_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Task Description","description":"Description of what you're doing with this document","examples":["Processing uploaded resume for job application"]},"trusted":{"type":"boolean","title":"Trusted","description":"Whether the document source is trusted (default: False for external documents)","default":false}},"type":"object","title":"DocumentIntentContract","description":"Intent contract for document scanning."},"DocumentQuoteRequest":{"properties":{"file_size":{"type":"integer","maximum":15728640.0,"exclusiveMinimum":0.0,"title":"File Size","description":"Document file size in bytes","examples":[1500000]},"content_type":{"type":"string","enum":["application/pdf","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],"title":"Content Type","description":"Document MIME type (PDF or DOCX)","examples":["application/pdf"]},"estimated_pages":{"anyOf":[{"type":"integer","maximum":500.0,"minimum":1.0},{"type":"null"}],"title":"Estimated Pages","description":"Estimated page count (helps predict block count)","examples":[25]}},"type":"object","required":["file_size","content_type"],"title":"DocumentQuoteRequest","description":"Request a price quote for document scanning.\n\nDocument scanning includes:\n- Extraction fee (flat rate for document processing)\n- Per-block scanning fees (for each extracted text block)"},"DocumentQuoteResponse":{"properties":{"quote_id":{"type":"string","title":"Quote Id","description":"Unique quote identifier for use in X-Quote-ID header","examples":["doc_quote_xyz789"]},"extraction_fee":{"type":"string","title":"Extraction Fee","description":"Flat fee for document extraction in USDC","examples":["0.12"]},"block_fee":{"type":"string","title":"Block Fee","description":"Block scanning fee in USDC","examples":["0.024"]},"total_price":{"type":"string","title":"Total Price","description":"Total price in USDC that will be charged","examples":["0.144"]},"currency":{"type":"string","title":"Currency","description":"Currency for all prices","default":"USDC"},"estimated_blocks":{"type":"integer","title":"Estimated Blocks","description":"Estimated number of text blocks to scan","examples":[8]},"block_tier":{"type":"string","title":"Block Tier","description":"Pricing tier for block scanning","examples":["standard"]},"valid_for_seconds":{"type":"integer","title":"Valid For Seconds","description":"Seconds until this quote expires","default":300},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","description":"Pricing notes (e.g., about hidden text detection)"}},"type":"object","required":["quote_id","extraction_fee","block_fee","total_price","estimated_blocks","block_tier"],"title":"DocumentQuoteResponse","description":"Response containing a price quote for document scanning."},"DocumentScanRequest":{"properties":{"document_base64":{"type":"string","title":"Document Base64","description":"Base64-encoded document content"},"content_type":{"type":"string","enum":["application/pdf","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],"title":"Content Type","description":"Document MIME type (PDF or DOCX)"},"intent_contract":{"anyOf":[{"$ref":"#/components/schemas/DocumentIntentContract"},{"type":"null"}],"description":"Optional intent contract (defaults to untrusted document_scanning)"},"include_block_details":{"type":"boolean","title":"Include Block Details","description":"Include details about each extracted block in response","default":false}},"type":"object","required":["document_base64","content_type"],"title":"DocumentScanRequest","description":"Request to scan a document for security threats.\n\nDocument is uploaded as base64-encoded binary data."},"DocumentScanResponse":{"properties":{"verdict":{"type":"string","enum":["clean","suspicious","malicious","error"],"title":"Verdict","description":"Final verdict from combined analysis"},"verdict_strength":{"type":"string","enum":["strong","moderate","borderline"],"title":"Verdict Strength","description":"Confidence within the verdict category. 'strong' = firmly in this category, 'borderline' = close to threshold and could shift with more context.","default":"moderate"},"notice":{"type":"string","title":"Notice","description":"Legal notice: this scan is an advisory assessment, not a guarantee","default":"Assessment only. Not a guarantee of safety."},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Confidence in the verdict (0.0-1.0)"},"threat_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Threat Score","description":"Overall threat score (0.0 = safe, 1.0 = definite threat)"},"document_type":{"type":"string","title":"Document Type","description":"Document type processed","examples":["application/pdf"]},"page_count":{"type":"integer","minimum":0.0,"title":"Page Count","description":"Number of pages in document"},"blocks_extracted":{"type":"integer","minimum":0.0,"title":"Blocks Extracted","description":"Number of text blocks extracted and scanned"},"blocks_flagged":{"type":"integer","minimum":0.0,"title":"Blocks Flagged","description":"Number of blocks with findings"},"hidden_text_detected":{"type":"boolean","title":"Hidden Text Detected","description":"Whether hidden text was detected"},"hidden_text_findings":{"items":{"$ref":"#/components/schemas/HiddenTextFinding"},"type":"array","title":"Hidden Text Findings","description":"Details of hidden text detection by technique"},"has_javascript":{"type":"boolean","title":"Has Javascript","description":"Whether JavaScript was detected"},"has_forms":{"type":"boolean","title":"Has Forms","description":"Whether form fields were detected"},"has_annotations":{"type":"boolean","title":"Has Annotations","description":"Whether annotations were detected"},"has_embedded_files":{"type":"boolean","title":"Has Embedded Files","description":"Whether embedded files were detected"},"scan_id":{"type":"string","title":"Scan Id","description":"Unique identifier for this scan"},"content_hash":{"type":"string","title":"Content Hash","description":"SHA-256 hash of the document"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Timestamp when scan was performed"},"extraction_time_ms":{"type":"number","minimum":0.0,"title":"Extraction Time Ms","description":"Time to extract document content (ms)"},"scan_time_ms":{"type":"number","minimum":0.0,"title":"Scan Time Ms","description":"Time to scan extracted blocks (ms)"},"total_time_ms":{"type":"number","minimum":0.0,"title":"Total Time Ms","description":"Total processing time (ms)"},"actual_price":{"type":"string","title":"Actual Price","description":"Actual price charged in USDC"},"price_breakdown":{"additionalProperties":true,"type":"object","title":"Price Breakdown","description":"Breakdown of pricing (extraction + blocks)"},"extracted_blocks":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExtractedBlock"},"type":"array"},{"type":"null"}],"title":"Extracted Blocks","description":"Details of extracted blocks (if include_block_details=true)"},"findings":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Findings","description":"Security findings with location, excerpt, reason, and expert info"},"expert_contributions":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Expert Contributions","description":"Breakdown of each expert's contribution to the scan"},"advisory":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Advisory","description":"Security advisory with recommendations, what to watch, etc."},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","description":"Security recommendations based on findings"},"cascade_stage":{"type":"string","title":"Cascade Stage","description":"Deepest tier reached during scanning (fast or full)","default":"full"},"detected_content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detected Content Type","description":"System-detected content type of scanned blocks"},"intent_used":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Intent Used","description":"Intent contract used for scanning (affects findings context)"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if verdict is 'error'"}},"type":"object","required":["verdict","confidence","threat_score","document_type","page_count","blocks_extracted","blocks_flagged","hidden_text_detected","has_javascript","has_forms","has_annotations","has_embedded_files","scan_id","content_hash","timestamp","extraction_time_ms","scan_time_ms","total_time_ms","actual_price"],"title":"DocumentScanResponse","description":"Response from a document security scan."},"EmailValidationRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"EmailValidationRequest","description":"Request model for email validation.\n\nAttributes:\n    email: Email address to validate."},"EmailValidationResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["valid"],"title":"EmailValidationResponse","description":"Response model for email validation.\n\nAttributes:\n    valid: Whether the email is valid.\n    email: Normalized email address (if valid).\n    error: Error message (if invalid)."},"ErrorResponse":{"properties":{"error":{"type":"string","title":"Error","description":"Error type","examples":["validation_error","quote_expired","method_not_allowed"]},"message":{"type":"string","title":"Message","description":"Human-readable error message"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Additional error details"},"docs":{"type":"string","title":"Docs","description":"Link to API documentation for self-correction","default":"https://aisecurityguard.io/v1/skill"},"endpoint_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Hint","description":"Hint about correct usage of the endpoint (method, required params)","examples":["/v1/guard requires POST with {content: string}"]},"available_endpoints":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Available Endpoints","description":"List of available endpoints (for 404 errors)"}},"type":"object","required":["error","message"],"title":"ErrorResponse","description":"Standard error response with API discoverability hints."},"ExpertContribution":{"properties":{"threat_level":{"type":"string","enum":["CRITICAL","HIGH","MEDIUM","LOW","SAFE"],"title":"Threat Level","description":"Overall threat level (CRITICAL/HIGH/MEDIUM/LOW/SAFE)"},"confidence_level":{"type":"string","enum":["high","medium","low"],"title":"Confidence Level","description":"Confidence in the assessment (high/medium/low)"},"findings_count":{"type":"integer","minimum":0.0,"title":"Findings Count","description":"Total number of findings detected"}},"type":"object","required":["threat_level","confidence_level","findings_count"],"title":"ExpertContribution","description":"Aggregated contribution summary from scanner analysis."},"ExtractedBlock":{"properties":{"source":{"type":"string","title":"Source","description":"Source of text within document","examples":["metadata","annotation","hidden_text"]},"content_preview":{"type":"string","maxLength":100,"title":"Content Preview","description":"Preview of block content (first 100 chars)"},"page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page","description":"Page number where block was found (1-indexed)"},"is_hidden":{"type":"boolean","title":"Is Hidden","description":"Whether this block was detected as hidden content","default":false},"scan_verdict":{"anyOf":[{"type":"string","enum":["clean","suspicious","malicious"]},{"type":"null"}],"title":"Scan Verdict","description":"Verdict from scanning this block"}},"type":"object","required":["source","content_preview"],"title":"ExtractedBlock","description":"An extracted text block from the document."},"FeedbackContextCaptured":{"properties":{"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"Content type from original scan"},"threat_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threat Score","description":"Threat score from original scan (0.0-1.0)"},"findings_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Findings Count","description":"Number of findings in original scan"},"finding_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Finding Types","description":"Types of findings detected"}},"type":"object","title":"FeedbackContextCaptured","description":"Details of what context was captured from the original scan."},"FeedbackRequest":{"properties":{"scan_id":{"type":"string","pattern":"^scan_[a-f0-9]{12}$","title":"Scan Id","description":"Scan ID from the original scan response","examples":["scan_abc123def456"]},"feedback_type":{"type":"string","enum":["false_positive","false_negative"],"title":"Feedback Type","description":"Type of feedback: 'false_positive' if safe content was flagged, 'false_negative' if a threat was missed"},"expected_verdict":{"type":"string","enum":["clean","suspicious","malicious"],"title":"Expected Verdict","description":"What you believe the correct verdict should have been"},"reason_category":{"type":"string","enum":["legitimate_tool","security_research","educational","documentation","missed_threat","other"],"title":"Reason Category","description":"Category explaining the feedback reason: 'legitimate_tool' - legitimate security tool or admin command, 'security_research' - security research or CTF content, 'educational' - educational or documentation content, 'documentation' - API docs or code examples, 'missed_threat' - actual threat not detected, 'other' - doesn't fit above categories"},"user_note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"User Note","description":"Optional explanation. IMPORTANT: Do NOT include any code or content from the scan - only describe the situation in plain text."},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Session ID from the original scan (X-Session-ID header). Provides richer context if session is still active."}},"type":"object","required":["scan_id","feedback_type","expected_verdict","reason_category"],"title":"FeedbackRequest","description":"Request to submit feedback on a scan result.\n\nUsed for reporting false positives (clean content flagged as threat)\nor false negatives (threat missed by scanner)."},"FeedbackResponse":{"properties":{"feedback_id":{"type":"string","title":"Feedback Id","description":"Unique identifier for this feedback submission","examples":["fb_abc123def456"]},"status":{"type":"string","enum":["accepted","accepted_limited"],"title":"Status","description":"'accepted' - full context captured from active session, 'accepted_limited' - session expired, limited context available"},"scan_id":{"type":"string","title":"Scan Id","description":"The scan ID this feedback is for"},"feedback_type":{"type":"string","title":"Feedback Type","description":"Type of feedback submitted"},"message":{"type":"string","title":"Message","description":"Human-readable confirmation message"},"context_captured":{"$ref":"#/components/schemas/FeedbackContextCaptured","description":"What context was captured (for transparency)"}},"type":"object","required":["feedback_id","status","scan_id","feedback_type","message","context_captured"],"title":"FeedbackResponse","description":"Response after submitting feedback."},"Finding":{"properties":{"type":{"type":"string","title":"Type","description":"Type of threat detected","examples":["prompt_injection","credential_exfiltration","indirect_injection"]},"severity":{"type":"string","enum":["low","medium","high","critical"],"title":"Severity","description":"Severity level of the finding. Note: when disposition is 'informational', severity is downgraded to 'low' since the pattern was assessed as benign."},"disposition":{"type":"string","enum":["threat","informational","monitor"],"title":"Disposition","description":"How this finding should be treated in context of the overall verdict. 'threat' = actionable, matches the panel verdict; 'informational' = a pattern was detected but the expert panel assessed it as benign in context (possible false positive); 'monitor' = borderline finding, recommend monitoring","default":"threat"},"assessed_as":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assessed As","description":"Panel's contextual assessment when different from the detected type. For informational findings, this explains what the pattern actually is (e.g., 'instructional_content', 'example_data', 'documentation'). None when disposition is 'threat' (the type accurately describes the threat).","examples":["instructional_content","example_credential","documentation",null]},"location":{"$ref":"#/components/schemas/Location","description":"Location of the finding in content"},"excerpt":{"type":"string","maxLength":200,"title":"Excerpt","description":"HTML-escaped excerpt showing the flagged content"},"reason":{"type":"string","title":"Reason","description":"Human-readable explanation of why this was flagged. For informational findings, explains why the pattern was assessed as benign."},"expert":{"type":"string","title":"Expert","description":"Name of the expert that detected this finding","examples":["intent","pattern","ml_classifier"]},"expected_in_content_type":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Expected In Content Type","description":"Whether this pattern is expected/normal for the declared content type. True indicates the pattern is typical for this content type (e.g., mandatory language in READMEs). Helps agents distinguish FPs."},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"Content type derived from intent_type (e.g., 'readme', 'skill_definition', 'data_retrieval')"},"context_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Note","description":"Human-readable explanation of why this pattern is expected or unexpected for this content type. Helps agents make informed decisions."},"is_hidden_content":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Hidden Content","description":"Whether the pattern was found in hidden content (base64, comments, etc.)"},"content_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Location","description":"Where the content was found (e.g., 'visible', 'base64', 'html_comment')"},"suggested_disposition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Disposition","description":"Suggested disposition adjustment based on content type context. Agents may use this to refine their handling of the finding."},"disposition_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disposition Reason","description":"Explanation for the suggested disposition adjustment"}},"type":"object","required":["type","severity","location","excerpt","reason","expert"],"title":"Finding","description":"A security finding detected during scanning."},"FlaggedIP":{"properties":{"ip_hash":{"type":"string","title":"Ip Hash","description":"Partial IP hash for reference"},"source":{"type":"string","title":"Source","description":"Threat intel source (e.g., urlhaus)"},"threat_types":{"items":{"type":"string"},"type":"array","title":"Threat Types","description":"Types of threats"},"malicious_url_count":{"type":"integer","minimum":0.0,"title":"Malicious Url Count","description":"Associated malicious URLs","default":0},"first_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Seen","description":"First seen timestamp"},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen","description":"Last seen timestamp"}},"type":"object","required":["ip_hash","source"],"title":"FlaggedIP","description":"IP flagged from threat intelligence."},"GeneralFeedbackRequest":{"properties":{"feedback_type":{"type":"string","enum":["suggestion","bug_report","question","compliment","other"],"title":"Feedback Type","description":"Type of feedback: 'suggestion' - feature request or improvement idea, 'bug_report' - non-scan-related bug or issue, 'question' - question about the service, 'compliment' - positive feedback, 'other' - doesn't fit above categories"},"topic":{"anyOf":[{"type":"string","enum":["detection_accuracy","api_usability","documentation","pricing","performance","new_feature","integration","other"]},{"type":"null"}],"title":"Topic","description":"Optional topic category to help route feedback: 'detection_accuracy' - pattern matching, threat detection, 'api_usability' - endpoints, request/response formats, 'documentation' - docs, examples, guides, 'pricing' - costs, plans, billing, 'performance' - speed, latency, rate limits, 'new_feature' - capability requests, 'integration' - MCP, SDK, tooling, 'other' - miscellaneous"},"message":{"type":"string","maxLength":2000,"minLength":10,"title":"Message","description":"Your feedback message. Be as specific as possible.","examples":["It would be helpful if the API returned line numbers for each finding.","The documentation for batch scanning could use more examples.","Consider adding support for scanning Jupyter notebooks."]},"alias":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Alias","description":"Optional agent name or alias for attribution. For agents: use your agent identifier (e.g., \"security-bot-v2\"). For humans: use a pseudonym, not your real name."}},"type":"object","required":["feedback_type","message"],"title":"GeneralFeedbackRequest","description":"Request to submit general feedback, suggestions, or comments.\n\nUse this for feedback not tied to a specific scan result:\n- Feature suggestions\n- Service improvement ideas\n- General questions or comments\n- Bug reports (non-scan related)"},"GeneralFeedbackResponse":{"properties":{"feedback_id":{"type":"string","title":"Feedback Id","description":"Unique identifier for this feedback submission","examples":["gfb_abc123def456"]},"status":{"type":"string","const":"accepted","title":"Status","description":"Feedback acceptance status","default":"accepted"},"feedback_type":{"type":"string","title":"Feedback Type","description":"Type of feedback submitted"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic","description":"Topic category if provided"},"message":{"type":"string","title":"Message","description":"Human-readable confirmation message"}},"type":"object","required":["feedback_id","feedback_type","message"],"title":"GeneralFeedbackResponse","description":"Response after submitting general feedback."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HiddenTextFinding":{"properties":{"technique":{"type":"string","title":"Technique","description":"Detection technique identifier"},"count":{"type":"integer","minimum":0.0,"title":"Count","description":"Number of hidden text blocks using this technique"},"sample":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Sample","description":"Sample of hidden content (truncated)"}},"type":"object","required":["technique","count"],"title":"HiddenTextFinding","description":"Information about hidden text detected in document."},"Incident":{"properties":{"timestamp":{"type":"string","title":"Timestamp"},"component":{"type":"string","title":"Component"},"duration_minutes":{"type":"integer","title":"Duration Minutes"},"resolved":{"type":"boolean","title":"Resolved"}},"type":"object","required":["timestamp","component","duration_minutes","resolved"],"title":"Incident","description":"Recent incident record."},"IntentContractRequest":{"properties":{"intent_type":{"type":"string","enum":["data_retrieval","code_generation","text_summarization","text_translation","question_answering","content_creation","data_analysis","file_operation","api_interaction","mcp_interaction","instruction_following","readme","code_review","skill_definition","email","calendar_invite","document_scanning","web_scraping","webhook_payload","search_results","authentication","financial_analysis","conversation"],"title":"Intent Type","description":"CRITICAL: Controls scanner sensitivity. The scanner detects attacks - benign content will trigger findings. The intent_type determines if findings are expected or suspicious. Types: data_retrieval, code_generation, text_summarization, text_translation, question_answering, content_creation, data_analysis, file_operation, api_interaction, mcp_interaction, instruction_following, readme, code_review, skill_definition, email, calendar_invite, document_scanning, web_scraping, webhook_payload, search_results, conversation. Use code_review for GitHub PRs/issues. Use readme for documentation. Use conversation for LLM/AI assistant chat traffic. Wrong intent_type = perceived high FP rate.","examples":["data_retrieval","mcp_interaction","readme","code_review","conversation"]},"task_description":{"type":"string","maxLength":500,"title":"Task Description","description":"Brief description of the intended task (free text; does not change enforcement)","default":"","examples":["MCP tool definition from external agent"]},"expects_instructions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Expects Instructions","description":"Whether instructions are expected in the content. If None, derived from intent_type. If set, must be consistent with intent_type."},"expected_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Language","description":"Expected language code (ISO 639-1, e.g., 'en', 'de')","examples":["en"]},"expected_content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Content Type","description":"Expected content format: json, text, html, markdown","examples":["json"]},"allowed_domains":{"items":{"type":"string"},"type":"array","title":"Allowed Domains","description":"List of allowed domains for URL content","examples":[["api.weather.gov","openweathermap.org"]]},"trusted":{"type":"boolean","title":"Trusted","description":"REQUIRED: Is this content from a source you consider trusted? Even trusted sources can be compromised or contain unexpected patterns. Setting trusted=true helps contextualize findings for known-good sources (e.g., your own repositories, verified partners). Setting trusted=false treats content with appropriate caution for unknown or external sources."}},"type":"object","required":["intent_type","trusted"],"title":"IntentContractRequest","description":"Intent contract declaration for a scan request.\n\nThe intent contract tells the scanner what type of content to expect,\nenabling drift detection when content doesn't match declared intent.\n\nCRITICAL: The scanner is designed to be highly sensitive to attacks. This means\nbenign content will trigger findings. The intent_type controls how findings are\ninterpreted. Using the WRONG intent_type will result in high false positive perception.\n\nCommon mistakes:\n- GitHub PRs with `data_retrieval` → Use `code_review` instead\n- README files with `data_retrieval` → Use `readme` instead\n- MCP skills with `data_retrieval` → Use `skill_definition` instead"},"LocalArticle":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"word_count":{"type":"integer","title":"Word Count","default":0},"topic_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Category"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"has_image":{"type":"boolean","title":"Has Image","default":false}},"type":"object","required":["id","slug","title","content"],"title":"LocalArticle","description":"Article from local database (synced to DO Spaces)."},"Location":{"properties":{"char_start":{"type":"integer","minimum":0.0,"title":"Char Start","description":"Start character position in processed content"},"char_end":{"type":"integer","minimum":0.0,"title":"Char End","description":"End character position in processed content"},"line":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line","description":"Line number (1-indexed) if applicable"},"json_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Json Path","description":"JSON path for structured content (e.g., '$.data[0].value')"},"message_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Message Index","description":"Message index for conversation content (0-indexed)"}},"type":"object","required":["char_start","char_end"],"title":"Location","description":"Location of a finding within the content."},"MicroBatchQuoteRequest":{"properties":{"item_count":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Item Count","description":"Number of items to validate in batch","examples":[10,50,100]}},"type":"object","required":["item_count"],"title":"MicroBatchQuoteRequest","description":"Request for batch validation price quote."},"MicroBatchQuoteResponse":{"properties":{"quote_id":{"type":"string","title":"Quote Id","description":"Quote ID to include in X-Quote-ID header when calling /micro/batch","examples":["micro_quote_abc123def456"]},"item_count":{"type":"integer","title":"Item Count","description":"Number of items quoted"},"price_per_item":{"type":"string","title":"Price Per Item","description":"Price per item in USDC","examples":["0.0005"]},"total_price":{"type":"string","title":"Total Price","description":"Total price in USDC (price_per_item * item_count)","examples":["0.05"]},"valid_for_seconds":{"type":"integer","title":"Valid For Seconds","description":"Quote validity period in seconds","examples":[300]}},"type":"object","required":["quote_id","item_count","price_per_item","total_price","valid_for_seconds"],"title":"MicroBatchQuoteResponse","description":"Response with batch validation price quote."},"MicroValidationError":{"properties":{"error":{"type":"string","title":"Error","description":"Error message"},"code":{"type":"string","title":"Code","description":"Error code","examples":["invalid_request","batch_too_large","rate_limited"]},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Additional error details"}},"type":"object","required":["error","code"],"title":"MicroValidationError","description":"Error response for validation failures."},"MicroValidationRequest":{"properties":{"type":{"type":"string","enum":["url","price","integer","address","hash"],"title":"Type","description":"Type of validation to perform. Options:\n- `url`: Validate URL format and structure\n- `price`: Validate numeric value and bounds\n- `integer`: Validate integer type and bounds\n- `address`: Validate blockchain address format\n- `hash`: Validate hash format","examples":["url","price","integer"]},"value":{"type":"string","maxLength":2000,"minLength":1,"title":"Value","description":"The value to validate","examples":["https://api.example.com/data?token=abc123","1000000000000000000","0x742d35Cc6634C0532925a3b844Bc9e7595f3"]},"decimals":{"anyOf":[{"type":"integer","maximum":18.0,"minimum":0.0},{"type":"null"}],"title":"Decimals","description":"Token decimals for price validation (default: 18 for ETH)","default":18},"int_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Int Type","description":"Integer type for bounds checking (uint8, uint256, int128, etc.)","default":"uint256","examples":["uint256","uint128","int256"]},"min_val":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Val","description":"Custom minimum value for integer validation (overrides int_type bounds)"},"max_val":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Val","description":"Custom maximum value for integer validation (overrides int_type bounds)"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain","description":"Blockchain type for address validation","default":"evm","examples":["evm","solana"]},"hash_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hash Type","description":"Expected hash type for hash validation","default":"sha256","examples":["sha256","keccak256","tx_hash","md5"]}},"type":"object","required":["type","value"],"title":"MicroValidationRequest","description":"Request for single micro validation."},"MicroValidationResponse":{"properties":{"result":{"$ref":"#/components/schemas/MicroValidationResultSchema","description":"Validation result"}},"type":"object","required":["result"],"title":"MicroValidationResponse","description":"Response for single validation."},"MicroValidationResultSchema":{"properties":{"type":{"type":"string","enum":["url","price","integer","address","hash"],"title":"Type","description":"Type of validation performed"},"value":{"type":"string","title":"Value","description":"The validated value"},"valid":{"type":"boolean","title":"Valid","description":"Whether the value passes format validation"},"suspicious":{"type":"boolean","title":"Suspicious","description":"Whether the value contains suspicious patterns (may still be valid format)"},"verdict":{"type":"string","enum":["clean","suspicious","invalid"],"title":"Verdict","description":"Overall verdict:\n- `clean`: Valid format, no suspicious patterns\n- `suspicious`: Valid format but contains suspicious patterns\n- `invalid`: Does not pass format validation"},"flags":{"items":{"type":"string"},"type":"array","title":"Flags","description":"Specific issues found during validation","examples":[["invalid_format","bounds_exceeded"]]},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Confidence in the assessment (0.0-1.0)"},"details":{"additionalProperties":true,"type":"object","title":"Details","description":"Type-specific details (domain info, parsed values, etc.)"}},"type":"object","required":["type","value","valid","suspicious","verdict","confidence"],"title":"MicroValidationResultSchema","description":"Result of a single validation."},"NewsletterSignupRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"nonce":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nonce"},"list_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","required":["email"],"title":"NewsletterSignupRequest","description":"Newsletter signup request."},"NewsletterSignupResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"br_captured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Br Captured"}},"type":"object","required":["success","message"],"title":"NewsletterSignupResponse","description":"Newsletter signup response."},"OptinRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"temp_id":{"type":"string","title":"Temp Id"},"nonce":{"type":"string","title":"Nonce"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"}},"type":"object","required":["email","temp_id","nonce"],"title":"OptinRequest","description":"Assessment opt-in request."},"PricingResponse":{"properties":{"tiers":{"items":{"$ref":"#/components/schemas/PricingTier"},"type":"array","title":"Tiers","description":"Content scanning pricing tiers by size"},"additional_services":{"items":{"$ref":"#/components/schemas/AdditionalService"},"type":"array","title":"Additional Services","description":"Pricing for Q&A, advisory, document scanning, etc."},"batch_discounts":{"items":{"$ref":"#/components/schemas/BatchDiscount"},"type":"array","title":"Batch Discounts","description":"Volume discounts for batch operations (up to 15%)"},"max_batch_discount_percent":{"type":"integer","title":"Max Batch Discount Percent","description":"Maximum batch discount available (15%)","default":15},"currency":{"type":"string","title":"Currency","description":"Currency for all prices","default":"USDC"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","description":"Important pricing notes and tips"},"endpoints":{"additionalProperties":{"type":"string"},"type":"object","title":"Endpoints","description":"Relevant endpoint references"}},"type":"object","required":["tiers","additional_services","batch_discounts","notes","endpoints"],"title":"PricingResponse","description":"Complete pricing information for all services."},"PricingTier":{"properties":{"name":{"type":"string","title":"Name","description":"Tier name (micro, standard, large, bulk)"},"price_usdc":{"type":"string","title":"Price Usdc","description":"Price per scan in USDC"},"max_chars":{"type":"integer","title":"Max Chars","description":"Maximum content length in characters"},"use_case":{"type":"string","title":"Use Case","description":"Typical use case for this tier"}},"type":"object","required":["name","price_usdc","max_chars","use_case"],"title":"PricingTier","description":"A single pricing tier definition."},"ProvisionKeyRequest":{"properties":{"machine_id":{"type":"string","maxLength":64,"minLength":64,"title":"Machine Id","description":"SHA256 hash of OS machine identifier"}},"type":"object","required":["machine_id"],"title":"ProvisionKeyRequest","description":"Request body for API key provisioning."},"QARequest":{"properties":{"session_id":{"type":"string","title":"Session Id","description":"Session ID from a previous /v1/guard scan (X-Session-ID header)"},"question":{"type":"string","maxLength":1000,"minLength":5,"title":"Question","description":"Follow-up question about the scan results","examples":["What specific lines contain the threat?","How do I mitigate this issue?","Is this a false positive?"]}},"type":"object","required":["session_id","question"],"title":"QARequest","description":"Request for follow-up Q&A about a scan."},"QAResponse":{"properties":{"session_id":{"type":"string","title":"Session Id","description":"Session ID for tracking"},"question":{"type":"string","title":"Question","description":"Original question"},"answer":{"type":"string","title":"Answer","description":"Answer to the question"},"related_questions":{"items":{"type":"string"},"type":"array","title":"Related Questions","description":"Suggested follow-up questions"},"technical_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Technical Details","description":"Additional technical context"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources","description":"CWE, OWASP, or documentation references"},"billing":{"additionalProperties":true,"type":"object","title":"Billing","description":"Billing information for this request"}},"type":"object","required":["session_id","question","answer","billing"],"title":"QAResponse","description":"Response from Q&A endpoint."},"QuoteRequest":{"properties":{"content_length":{"anyOf":[{"type":"integer","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Content Length","description":"Expected content size in bytes. Required if not providing a URL. Ignored if URL is provided (we determine size from fetch).","examples":[1500]},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL to fetch for scanning. If provided, we fetch the content, cache it, and return a quote based on actual size. Content is cached for 10 minutes. Use the returned quote_id to scan.","examples":["https://raw.githubusercontent.com/org/repo/main/documentation.md"]},"content_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type Hint","description":"Optional hint about content type","examples":["documentation"]}},"type":"object","title":"QuoteRequest","description":"Request a price quote for content scanning.\n\nReturns pricing information without performing the scan.\n\nTwo modes:\n1. Content-length based: Provide `content_length` for content you'll submit\n2. URL-based: Provide `url` to have us fetch and cache the content\n\nURL-based quotes automatically fetch and cache the content, enabling\nquote-then-scan flow for remote resources (MCP tools, IPFS, GitHub, etc.)"},"QuoteResponse":{"properties":{"price":{"type":"string","title":"Price","description":"Price in USDC","examples":["0.002"]},"currency":{"type":"string","title":"Currency","description":"Currency for the price","default":"USDC"},"tier":{"type":"string","enum":["micro","standard","large","bulk"],"title":"Tier","description":"Pricing tier based on content size"},"quote_id":{"type":"string","title":"Quote Id","description":"Unique quote identifier for use in X-Quote-ID header","examples":["quote_xyz789"]},"valid_for_seconds":{"type":"integer","title":"Valid For Seconds","description":"Seconds until this quote expires","default":300},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"The URL that was fetched (only for URL-based quotes)"},"content_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Content Length","description":"Actual fetched content length in bytes (only for URL-based quotes)"},"fetch_time_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fetch Time Ms","description":"Time taken to fetch URL content in milliseconds"},"content_cached":{"type":"boolean","title":"Content Cached","description":"Whether content is cached. For URL quotes, content is cached and ready for scanning. For content-length quotes, you provide content.","default":false}},"type":"object","required":["price","tier","quote_id"],"title":"QuoteResponse","description":"Response containing a price quote."},"RegistrationRequest":{"properties":{"seed":{"type":"string","maxLength":128,"minLength":8,"title":"Seed","description":"Unique seed for API key generation (e.g., wallet address, UUID). Must be 8-128 characters.","examples":["0x1234567890abcdef","my-unique-agent-identifier"]}},"type":"object","required":["seed"],"title":"RegistrationRequest","description":"Request to register for budget tracking."},"RegistrationResponse":{"properties":{"api_key":{"type":"string","title":"Api Key","description":"Your API key - USE THIS as X-Agent-ID for all requests (SAVE IT - shown only once)"},"message":{"type":"string","title":"Message","description":"Registration status message"},"usage":{"additionalProperties":true,"type":"object","title":"Usage","description":"How to use the API key"}},"type":"object","required":["api_key","message","usage"],"title":"RegistrationResponse","description":"Response from agent registration."},"ResearchFeedResponse":{"properties":{"articles":{"items":{"$ref":"#/components/schemas/Article"},"type":"array","title":"Articles"},"social_proof":{"anyOf":[{"$ref":"#/components/schemas/SocialProof"},{"type":"null"}]},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["articles"],"title":"ResearchFeedResponse","description":"Research feed response."},"RiskAssessRequest":{"properties":{"content_dna":{"type":"string","maxLength":128,"minLength":8,"title":"Content Dna","description":"Base64-encoded Content DNA from marker extractor"},"url_count":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Url Count","description":"Number of URLs in content (no URLs transmitted)","default":0},"url_shortener_count":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Url Shortener Count","description":"Count of URL shortener links (bit.ly, t.co, etc.)","default":0},"url_ip_based_count":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Url Ip Based Count","description":"Count of IP-based URLs (potential C2/malware)","default":0},"url_suspicious_tld_count":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Url Suspicious Tld Count","description":"Count of URLs with suspicious TLDs","default":0},"url_long_path_count":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Url Long Path Count","description":"Count of URLs with unusually long paths","default":0},"content_hash":{"type":"string","maxLength":64,"title":"Content Hash","description":"Content hash for deduplication","default":""}},"type":"object","required":["content_dna"],"title":"RiskAssessRequest","description":"Request body for risk assessment.\n\nPrivacy-preserving: Only statistical markers transmitted.\nNo URLs or content leave the client.\nUse preflight API for URL reputation checks."},"RiskAssessResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"risk_level":{"type":"string","title":"Risk Level","description":"Risk level: low, medium, high, critical"},"risk_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Risk Score","description":"Numeric risk score (0.0 - 1.0)"},"threat_categories":{"items":{"type":"string"},"type":"array","title":"Threat Categories","description":"Generalized threat categories (paid tier only)"},"escalate":{"type":"boolean","title":"Escalate","description":"Whether to recommend premium scan for deeper analysis","default":false},"request_id":{"type":"string","title":"Request Id","description":"Request ID for debugging","default":""}},"type":"object","required":["risk_level","risk_score"],"title":"RiskAssessResponse","description":"Response from risk assessment."},"RiskCreditsPurchaseResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"credits_added":{"type":"integer","title":"Credits Added"},"new_balance":{"type":"integer","title":"New Balance"},"price_paid":{"type":"string","title":"Price Paid"}},"type":"object","required":["success","credits_added","new_balance","price_paid"],"title":"RiskCreditsPurchaseResponse","description":"Response after purchasing credits."},"RiskCreditsResponse":{"properties":{"credits_available":{"type":"integer","title":"Credits Available"},"free_quota_remaining":{"type":"integer","title":"Free Quota Remaining"},"free_quota_limit":{"type":"integer","title":"Free Quota Limit"}},"type":"object","required":["credits_available","free_quota_remaining","free_quota_limit"],"title":"RiskCreditsResponse","description":"Response with credit balance information."},"RiskQuotaResponse":{"properties":{"remaining":{"type":"integer","title":"Remaining"},"limit":{"type":"integer","title":"Limit"},"reset_at":{"type":"string","title":"Reset At"}},"type":"object","required":["remaining","limit","reset_at"],"title":"RiskQuotaResponse","description":"Response with quota information."},"ScanOverview":{"properties":{"action":{"type":"string","enum":["proceed","proceed_constrained","review","block"],"title":"Action","description":"Suggested high-level routing action"},"action_reason":{"type":"string","title":"Action Reason","description":"Stable reason label for the chosen action","examples":["clean_verdict","malicious_verdict","hidden_content_present","unexpected_patterns_untrusted","threat_findings_present","suspicious_monitor_only"]},"verdict":{"type":"string","enum":["clean","suspicious","malicious"],"title":"Verdict","description":"Echo of top-level verdict"},"verdict_strength":{"type":"string","enum":["strong","moderate","borderline"],"title":"Verdict Strength","description":"Echo of verdict_strength"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Echo of confidence"},"content_type":{"type":"string","title":"Content Type","description":"Echo of system-detected content_type"},"has_hidden_content":{"type":"boolean","title":"Has Hidden Content","description":"Whether hidden content was revealed during scanning"},"counts":{"$ref":"#/components/schemas/ScanOverviewCounts","description":"Compact counts for routing decisions"},"top_threat_groups":{"items":{"type":"string"},"type":"array","title":"Top Threat Groups","description":"High-level threat groups inferred from finding types"},"top_finding_types":{"items":{"type":"string"},"type":"array","title":"Top Finding Types","description":"Top finding types (unique, ordered)"},"intent_contract":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Intent Contract","description":"Echo of request intent contract context (if provided)"}},"type":"object","required":["action","action_reason","verdict","verdict_strength","confidence","content_type","has_hidden_content","counts"],"title":"ScanOverview","description":"Deterministic summary for agents.\n\nCollapses the response into a small routing object so agents don't need to\nre-derive policy from all findings."},"ScanOverviewCounts":{"properties":{"findings_total":{"type":"integer","minimum":0.0,"title":"Findings Total","description":"Number of findings returned in this response"},"by_disposition":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Disposition","description":"Counts by disposition (threat/monitor/informational)"},"unexpected_count":{"type":"integer","minimum":0.0,"title":"Unexpected Count","description":"Count of findings where expected_in_content_type is false (None is treated as unknown)"}},"type":"object","required":["findings_total","unexpected_count"],"title":"ScanOverviewCounts","description":"Compact counts for fast routing decisions."},"ScanRequest":{"properties":{"content":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Content","description":"Content to scan. Either a string or a dict with 'messages' array containing {role, content} objects. **Optional for URL-based quotes** - if using X-Quote-ID from /v1/guard/quote/url, content is retrieved from cache and this field can be omitted.","examples":["Simple text to scan",{"messages":[{"content":"Hello","role":"user"},{"content":"Hi!","role":"assistant"}]}]},"intent_contract":{"$ref":"#/components/schemas/IntentContractRequest","description":"Intent contract declaring expected content behavior"},"source_hint":{"anyOf":[{"type":"string","enum":["skill","api_response","mcp_response","mcp_data","web","email","calendar","ics"]},{"type":"null"}],"title":"Source Hint","description":"Hint about content source to aid detection. Options: skill, api_response, mcp_response, mcp_data, web, email, calendar, ics. Use mcp_data for MCP manifests, capability declarations, and tool schemas."},"scan_depth":{"type":"string","enum":["fast","thorough"],"title":"Scan Depth","description":"Scan depth: 'fast' (Tier 1 only) or 'thorough' (full cascade)","default":"thorough"},"include_informational":{"type":"boolean","title":"Include Informational","description":"Whether to include informational findings in the response. Informational findings are patterns detected by individual experts but assessed as benign by the expert panel (e.g., instructional language in educational content). Set to true for debugging or detailed analysis. Default is false to reduce noise for most use cases.","default":false}},"type":"object","required":["intent_contract"],"title":"ScanRequest","description":"Request to scan content for security threats.\n\nContent can be a string or a messages array (conversation format)."},"ScanResponse":{"properties":{"verdict":{"type":"string","enum":["clean","suspicious","malicious"],"title":"Verdict","description":"Final verdict from combined expert analysis"},"verdict_strength":{"type":"string","enum":["strong","moderate","borderline"],"title":"Verdict Strength","description":"Confidence within the verdict category. 'strong' = firmly in this category, 'borderline' = close to threshold and could shift with more context. Use for smell tests: a 'clean' verdict with 'borderline' strength warrants extra attention.","default":"moderate"},"notice":{"type":"string","title":"Notice","description":"Legal notice: this scan is an advisory assessment, not a guarantee","default":"Assessment only. Not a guarantee of safety."},"content_type":{"type":"string","title":"Content Type","description":"System-detected content type","examples":["conversation","skill","api_telemetry","web_content"]},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Confidence in the verdict (0.0-1.0)"},"threat_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Threat Score","description":"Overall threat score (0.0 = safe, 1.0 = definite threat)"},"drift_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Drift Score","description":"Intent drift score (0.0 = aligned, 1.0 = complete mismatch)"},"scan_id":{"type":"string","title":"Scan Id","description":"Unique identifier for this scan","examples":["scan_abc123def456"]},"content_hash":{"type":"string","title":"Content Hash","description":"SHA-256 hash of the scanned content"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Timestamp when scan was performed"},"execution_time_ms":{"type":"number","minimum":0.0,"title":"Execution Time Ms","description":"Total scan execution time in milliseconds"},"cascade_stage":{"type":"string","enum":["fast","full"],"title":"Cascade Stage","description":"Deepest tier reached during scanning"},"early_exit":{"type":"boolean","title":"Early Exit","description":"Whether scan stopped at Tier 1 (did not run full cascade)"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"type":"array","title":"Findings","description":"List of security findings"},"expert_contributions":{"additionalProperties":{"$ref":"#/components/schemas/ExpertContribution"},"type":"object","title":"Expert Contributions","description":"Breakdown of each expert's contribution"},"advisory":{"anyOf":[{"$ref":"#/components/schemas/Advisory"},{"type":"null"}],"description":"LLM-generated security advisory with recommendations"},"overview":{"anyOf":[{"$ref":"#/components/schemas/ScanOverview"},{"type":"null"}],"description":"Deterministic routing summary for agents"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Additional metadata about the scan"},"hint":{"anyOf":[{"$ref":"#/components/schemas/UsageHint"},{"type":"null"}],"description":"Rotating educational hint about platform usage. Hints are weighted so important guidance appears more frequently. Helps agents and operators understand intent contracts, result interpretation, and best practices."},"is_malicious":{"type":"boolean","title":"Is Malicious","description":"Whether the verdict is malicious.","readOnly":true},"is_suspicious":{"type":"boolean","title":"Is Suspicious","description":"Whether the verdict is suspicious.","readOnly":true},"is_clean":{"type":"boolean","title":"Is Clean","description":"Whether the verdict is clean.","readOnly":true}},"type":"object","required":["verdict","content_type","confidence","threat_score","drift_score","scan_id","content_hash","timestamp","execution_time_ms","cascade_stage","early_exit","is_malicious","is_suspicious","is_clean"],"title":"ScanResponse","description":"Response from a content scan."},"SecurityAlertData":{"properties":{"alert_title":{"type":"string","maxLength":200,"title":"Alert Title"},"alert_summary":{"type":"string","maxLength":500,"title":"Alert Summary"},"severity":{"type":"string","pattern":"^(low|medium|high|critical)$","title":"Severity","default":"medium"},"action_required":{"type":"boolean","title":"Action Required","default":false},"response_details":{"type":"string","maxLength":500,"title":"Response Details","description":"What AgentGuard360 did in response (e.g., \"Detected and logged\", \"Blocked and logged\")","default":"This event was detected and logged."}},"type":"object","required":["alert_title","alert_summary"],"title":"SecurityAlertData","description":"Data payload for security alert notifications.\n\nUsed for all security events including prompt injection, supply chain blocks,\nmalware detection, etc. The alert_title and alert_summary fields provide\nflexibility to describe any security event type.\n\nAttributes:\n    alert_title: Brief title describing the security event.\n    alert_summary: Summary of what happened and potential impact.\n    severity: Threat severity level (low/medium/high/critical).\n    action_required: Whether user action is needed.\n    response_details: Description of what AgentGuard360 did in response."},"SocialProof":{"properties":{"agents_reached":{"type":"string","title":"Agents Reached"},"total_interactions":{"type":"string","title":"Total Interactions"},"total_posts":{"type":"string","title":"Total Posts"},"daily_views":{"type":"string","title":"Daily Views"}},"type":"object","required":["agents_reached","total_interactions","total_posts","daily_views"],"title":"SocialProof","description":"Social proof stats for the research section."},"StatusResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Overall service status"},"uptime":{"$ref":"#/components/schemas/UptimeMetrics"},"last_check":{"type":"string","title":"Last Check","description":"ISO timestamp of last health check"},"components":{"$ref":"#/components/schemas/ComponentStatus"},"recent_incidents":{"items":{"$ref":"#/components/schemas/Incident"},"type":"array","title":"Recent Incidents"},"total_checks":{"type":"integer","title":"Total Checks","description":"Total health checks recorded"}},"type":"object","required":["status","uptime","last_check","components","total_checks"],"title":"StatusResponse","description":"Full status response."},"SupportRequest":{"properties":{"question":{"type":"string","maxLength":1000,"minLength":10,"title":"Question","description":"Question about the service"},"context":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Context","description":"Optional context about use case"}},"type":"object","required":["question"],"title":"SupportRequest","description":"Request for pre-sales support."},"SupportResponse":{"properties":{"answer":{"type":"string","title":"Answer","description":"Answer to the question"},"suggested_questions":{"items":{"type":"string"},"type":"array","title":"Suggested Questions","description":"Suggested follow-up questions"},"relevant_endpoints":{"items":{"type":"string"},"type":"array","title":"Relevant Endpoints","description":"Relevant API endpoints"},"documentation_links":{"items":{"type":"string"},"type":"array","title":"Documentation Links","description":"Links to documentation"}},"type":"object","required":["answer"],"title":"SupportResponse","description":"Response from support Q&A."},"UptimeMetrics":{"properties":{"last_24h":{"type":"string","title":"Last 24H","description":"Uptime percentage over last 24 hours"},"last_7d":{"type":"string","title":"Last 7D","description":"Uptime percentage over last 7 days"},"last_30d":{"type":"string","title":"Last 30D","description":"Uptime percentage over last 30 days"}},"type":"object","required":["last_24h","last_7d","last_30d"],"title":"UptimeMetrics","description":"Uptime percentages over different time windows."},"UsageHint":{"properties":{"id":{"type":"string","title":"Id","description":"Unique hint identifier for tracking/suppression","examples":["intent_contract_sensitivity","code_review_intent"]},"category":{"type":"string","enum":["intent_contract","interpretation","best_practice","feature"],"title":"Category","description":"Category of hint for filtering"},"message":{"type":"string","title":"Message","description":"The educational hint message"},"learn_more":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Learn More","description":"Link to detailed documentation"}},"type":"object","required":["id","category","message"],"title":"UsageHint","description":"In-context education hint for platform usage."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}