{"components":{"headers":{"RateLimitLimit":{"description":"Request limit for the active rate-limit window.","schema":{"minimum":0,"type":"integer"}},"RateLimitPolicy":{"description":"Applied scan rate-limit class and one-minute burst policy.","schema":{"example":"scan;w=60;burst=30","type":"string"}},"RateLimitRemaining":{"description":"Remaining requests in the active rate-limit window after this request.","schema":{"minimum":0,"type":"integer"}},"RateLimitReset":{"description":"Seconds until the active rate-limit window resets.","schema":{"minimum":0,"type":"integer"}},"RetryAfter":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"minimum":1,"type":"integer"}},"ScanCacheControl":{"description":"Scan responses are request-specific and must not be shared or reused by caches.","schema":{"const":"private, no-store, max-age=0","type":"string"}},"ScanVary":{"description":"Root and scan responses vary by representation negotiation.","schema":{"const":"Accept, User-Agent","type":"string"}},"StatusCacheControl":{"description":"Status is live operational state and should not be cached.","schema":{"const":"no-store, max-age=0","type":"string"}}},"parameters":{"ActionPlanFormat":{"description":"Force JSON, HTML, or copy-paste Markdown response from `/action-plan`.","in":"query","name":"format","required":false,"schema":{"enum":["json","html","markdown","md"],"type":"string"}},"EvidenceFormat":{"description":"Force JSON or copy-paste Markdown response from evidence endpoints.","in":"query","name":"format","required":false,"schema":{"enum":["json","markdown","md"],"type":"string"}},"ExpectOpen":{"description":"Exact baseline of ports that should be open. Overrides policy with strict exact-match evaluation.","in":"query","name":"expect_open","required":false,"schema":{"example":"443,8443","type":"string"}},"IncludeFullResult":{"description":"For `/one-shot`, `/mission`, and `/automation-pack`, include the full detailed scan payload when needed for deep automation.","in":"query","name":"include_full_result","required":false,"schema":{"enum":["1","true","yes","on"],"type":"string"}},"Intent":{"description":"Defensive interpretation preset for the request source IP. Intent may select bounded profile/policy defaults, but it never accepts arbitrary targets.","in":"query","name":"intent","required":false,"schema":{"enum":["general-exposure","web-deploy","remote-access","database-exposure"],"type":"string"}},"MissionFormat":{"description":"Force JSON, HTML, or copy-paste Markdown response from `/mission`.","in":"query","name":"format","required":false,"schema":{"enum":["json","html","markdown","md"],"type":"string"}},"Platform":{"description":"Preferred command style for `/action-plan` steps.","in":"query","name":"platform","required":false,"schema":{"default":"any","enum":["any","linux","macos"],"type":"string"}},"Policy":{"description":"Exposure policy gate for CI/ops verdict. `strict` requires no public ports.","in":"query","name":"policy","required":false,"schema":{"default":"strict","enum":["strict","web","remote-admin","database-private","none"],"type":"string"}},"Ports":{"description":"Comma-separated custom TCP ports for the request source IP. Maximum 50 ports with speed=deep.","in":"query","name":"ports","required":false,"schema":{"example":"22,80,443","type":"string"}},"Profile":{"description":"Named scan profile for the request source IP. Ignored when ports is provided. No-parameter requests use compact `default` (22,80,443,3000,8080,8443); use `top1000` for explicit broad verification and `web`, `databases`, or `mail` for focused checks.","in":"query","name":"profile","required":false,"schema":{"default":"default","enum":["default","web","databases","mail","top1000"],"type":"string"}},"ResultFormat":{"description":"Force JSON, browser HTML, or Markdown response from `/result/{scan_id}`. Default response is browser HTML for `Accept: text/html`, JSON for `Accept: application/json`, and Markdown for CLI-style requests.\n","in":"query","name":"format","required":false,"schema":{"enum":["json","html","markdown","md"],"type":"string"}},"RootFormat":{"description":"Force a deterministic response representation from `/` regardless of browser, CLI, bot, or Accept-header heuristics. `plain` returns the same newline-separated open-port list shape as `/plain`.\n","in":"query","name":"format","required":false,"schema":{"enum":["json","markdown","md","plain"],"type":"string"}},"ScanId":{"description":"Unguessable UUID returned as `scan.scan_id` by a request-source-only scan result. This is not an IP, host, target, CIDR, or search parameter.\n","in":"path","name":"scan_id","required":true,"schema":{"format":"uuid","type":"string"}},"Speed":{"description":"Scan speed/depth. When omitted, root, /plain, and top1000 use fast for one-request UX; default, smaller named profiles, and custom ports default to balanced on /json and /check. Use speed=deep for a more patient confirmation check.","in":"query","name":"speed","required":false,"schema":{"default":"balanced","enum":["fast","balanced","deep"],"type":"string"}},"View":{"description":"JSON response projection. `full` is the compatibility default. `min` returns only the stable canonical machine contract and omits support, community, operator-card, receipt, and share blocks. `view` does not change scan execution or scan cache keys.\n","in":"query","name":"view","required":false,"schema":{"default":"full","enum":["full","min"],"type":"string"}}},"schemas":{"ActionPlanRemediationKit":{"properties":{"dry_run_by_default":{"const":true,"type":"boolean"},"generated_for":{"const":"request_source_ip_only","type":"string"},"recipes":{"items":{"$ref":"#/components/schemas/ActionPlanRemediationRecipe"},"type":"array"},"safety":{"items":{"type":"string"},"type":"array"},"summary":{"type":"string"},"verify_after":{"items":{"type":"string"},"type":"array"}},"required":["summary","generated_for","dry_run_by_default","safety","recipes","verify_after"],"type":"object"},"ActionPlanRemediationRecipe":{"properties":{"applies_when":{"type":"string"},"caution":{"type":"string"},"commands":{"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"title":{"type":"string"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["id","title","applies_when","commands","verify_commands","caution"],"type":"object"},"ActionPlanResponse":{"properties":{"automation_kits":{"items":{"$ref":"#/components/schemas/AutomationKit"},"type":"array"},"exposure_score":{"maximum":100,"minimum":0,"type":"integer"},"follow_up":{"items":{"type":"string"},"type":"array"},"full_result":{"$ref":"#/components/schemas/VisiblePortsResponse"},"generated_at":{"format":"date-time","type":"string"},"immediate_steps":{"items":{"$ref":"#/components/schemas/ActionPlanStep"},"type":"array"},"observed_source_ip":{"type":"string"},"policy":{"type":"string"},"profile":{"type":"string"},"remediation_kit":{"$ref":"#/components/schemas/ActionPlanRemediationKit"},"status":{"enum":["ok","action_required"],"type":"string"},"top_risks":{"items":{"$ref":"#/components/schemas/ActionPlanRisk"},"type":"array"},"verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"}},"required":["status","generated_at","observed_source_ip","profile","policy","verdict","exposure_score","top_risks","immediate_steps","remediation_kit","automation_kits","follow_up","full_result"],"type":"object"},"ActionPlanRisk":{"properties":{"operator_runbook":{"$ref":"#/components/schemas/PortExposureRunbook"},"port":{"maximum":65535,"minimum":1,"type":"integer"},"service":{"type":"string"},"severity":{"enum":["critical","high","medium","low"],"type":"string"},"title":{"type":"string"},"why":{"type":"string"}},"required":["port","severity","service","title","why","operator_runbook"],"type":"object"},"ActionPlanStep":{"properties":{"commands":{"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"objective":{"type":"string"},"priority":{"enum":["p0","p1","p2"],"type":"string"}},"required":["id","priority","objective","commands"],"type":"object"},"AutomationKit":{"properties":{"description":{"type":"string"},"expected_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"id":{"enum":["github-actions","gitlab-ci","cron-bash"],"type":"string"},"snippet":{"type":"string"},"title":{"type":"string"}},"required":["id","title","description","expected_open_ports","snippet"],"type":"object"},"AutomationPackEvidence":{"properties":{"exposure_score":{"maximum":100,"minimum":0,"type":"integer"},"fingerprint_sha256":{"type":"string"},"open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"snapshot_id":{"type":"string"},"unexpected_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"}},"required":["snapshot_id","fingerprint_sha256","open_ports","unexpected_open_ports","exposure_score"],"type":"object"},"AutomationPackFile":{"properties":{"content":{"type":"string"},"description":{"type":"string"},"language":{"enum":["bash","yaml","markdown","json"],"type":"string"},"path":{"type":"string"}},"required":["path","description","language","content"],"type":"object"},"AutomationPackLinks":{"properties":{"action_plan":{"type":"string"},"gate_baseline_url":{"type":"string"},"gate_now_url":{"type":"string"},"incident_bundle":{"type":"string"},"one_shot":{"type":"string"},"support":{"type":"string"}},"required":["one_shot","gate_now_url","gate_baseline_url","action_plan","incident_bundle","support"],"type":"object"},"AutomationPackResponse":{"properties":{"boundary":{"$ref":"#/components/schemas/OneShotBoundary"},"evidence":{"$ref":"#/components/schemas/AutomationPackEvidence"},"files":{"items":{"$ref":"#/components/schemas/AutomationPackFile"},"type":"array"},"full_result":{"$ref":"#/components/schemas/VisiblePortsResponse","nullable":true},"generated_at":{"format":"date-time","type":"string"},"install_steps":{"items":{"type":"string"},"type":"array"},"limitations":{"items":{"type":"string"},"type":"array"},"links":{"$ref":"#/components/schemas/AutomationPackLinks"},"observed_source_ip":{"type":"string"},"policy":{"type":"string"},"profile":{"type":"string"},"status":{"const":"ok","type":"string"},"summary":{"type":"string"},"verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"}},"required":["status","generated_at","observed_source_ip","profile","policy","verdict","summary","files","install_steps","evidence","boundary","limitations","links"],"type":"object"},"EvidenceCopyPaste":{"properties":{"automation_pack_command":{"type":"string"},"gate_command":{"type":"string"},"markdown":{"type":"string"},"slack_text":{"type":"string"},"verify_command":{"type":"string"}},"required":["markdown","slack_text","verify_command","gate_command","automation_pack_command"],"type":"object"},"EvidenceLinks":{"properties":{"action_plan":{"type":"string"},"automation_pack":{"type":"string"},"incident_bundle":{"type":"string"},"network_path":{"type":"string"},"one_shot":{"type":"string"},"support":{"type":"string"},"verify":{"type":"string"}},"required":["verify","one_shot","action_plan","incident_bundle","automation_pack","network_path","support"],"type":"object"},"EvidenceResponse":{"properties":{"boundary":{"$ref":"#/components/schemas/OneShotBoundary"},"confidence":{"enum":["high","medium","low"],"type":"string"},"copy_paste":{"$ref":"#/components/schemas/EvidenceCopyPaste"},"decision":{"enum":["allow","review","block"],"type":"string"},"generated_at":{"format":"date-time","type":"string"},"limitations":{"items":{"type":"string"},"type":"array"},"links":{"$ref":"#/components/schemas/EvidenceLinks"},"observed_source_ip":{"type":"string"},"open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"partial":{"type":"boolean"},"profile":{"type":"string"},"snapshot":{"$ref":"#/components/schemas/ScanSnapshot"},"status":{"const":"ok","type":"string"},"support":{"$ref":"#/components/schemas/EvidenceSupport"},"unexpected_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"},"verify_payload":{"$ref":"#/components/schemas/SnapshotVerifyRequest"}},"required":["status","generated_at","observed_source_ip","profile","decision","verdict","confidence","open_ports","unexpected_open_ports","partial","snapshot","verify_payload","copy_paste","boundary","support","limitations","links"],"type":"object"},"EvidenceSupport":{"properties":{"donate_url":{"type":"string"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"},"reason":{"type":"string"},"support_url":{"type":"string"}},"required":["support_url","donate_url","monthly_target_usd","monthly_gap_usd","reason"],"type":"object"},"FundingManifestCopyPaste":{"properties":{"agent_instruction":{"type":"string"},"badge_markdown":{"type":"string"},"procurement_note":{"type":"string"},"readme_markdown":{"type":"string"},"social_text":{"type":"string"}},"required":["readme_markdown","social_text","procurement_note","agent_instruction","badge_markdown"],"type":"object"},"FundingManifestDonation":{"properties":{"coverage_ratio":{"maximum":1,"minimum":0,"type":"number"},"donate_links":{"items":{"$ref":"#/components/schemas/SupportLink"},"type":"array"},"donate_ready":{"type":"boolean"},"donate_url":{"type":"string"},"github_funding_yml":{"type":"string"},"monthly_covered_usd":{"minimum":0,"type":"integer"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"},"next_action":{"type":"string"},"primary_action":{"type":"string"},"provider_setup":{"$ref":"#/components/schemas/SupportProviderSetup"},"provider_status":{"enum":["configured","provider_missing"],"type":"string"}},"required":["donate_url","donate_ready","provider_status","monthly_target_usd","monthly_covered_usd","monthly_gap_usd","coverage_ratio","next_action","donate_links","provider_setup","primary_action","github_funding_yml"],"type":"object"},"FundingManifestLinks":{"properties":{"badge":{"type":"string"},"donate":{"type":"string"},"funding_manifest":{"type":"string"},"funding_yml":{"type":"string"},"impact":{"type":"string"},"mission":{"type":"string"},"openapi":{"type":"string"},"readiness":{"type":"string"},"run_check":{"type":"string"},"sponsor_kit":{"type":"string"},"support":{"type":"string"},"well_known_funding_manifest":{"type":"string"},"well_known_funding_yml":{"type":"string"}},"required":["funding_manifest","well_known_funding_manifest","funding_yml","well_known_funding_yml","sponsor_kit","run_check","support","donate","impact","readiness","badge","mission","openapi"],"type":"object"},"FundingManifestResponse":{"properties":{"copy_paste":{"$ref":"#/components/schemas/FundingManifestCopyPaste"},"donation":{"$ref":"#/components/schemas/FundingManifestDonation"},"generated_at":{"format":"date-time","type":"string"},"links":{"$ref":"#/components/schemas/FundingManifestLinks"},"manifest_version":{"type":"string"},"proof":{"$ref":"#/components/schemas/SponsorKitProof"},"purpose":{"type":"string"},"roadmap":{"items":{"$ref":"#/components/schemas/MissionRoadmapItem"},"type":"array"},"safety":{"$ref":"#/components/schemas/SponsorKitSafety"},"service":{"const":"ifport.io","type":"string"},"status":{"const":"ok","type":"string"},"support_intent":{"$ref":"#/components/schemas/SupportIntent"},"support_tiers":{"items":{"$ref":"#/components/schemas/SupportTier"},"type":"array"}},"required":["status","service","generated_at","manifest_version","purpose","donation","proof","safety","support_intent","support_tiers","roadmap","copy_paste","links"],"type":"object"},"GateResponse":{"properties":{"exposure_score":{"maximum":100,"minimum":0,"type":"integer"},"full_result":{"type":"object"},"note":{"type":"string"},"observed_source_ip":{"type":"string"},"profile":{"type":"string"},"snapshot_id":{"type":"string"},"snapshot_sha256":{"type":"string"},"status":{"enum":["ok","blocked"],"type":"string"},"verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"}},"required":["status","verdict","observed_source_ip","profile","exposure_score","snapshot_id","snapshot_sha256","note","full_result"],"type":"object"},"HealthResponse":{"properties":{"scan_workers":{"properties":{"ready":{"minimum":0,"type":"integer"},"registered":{"minimum":0,"type":"integer"}},"required":["registered","ready"],"type":"object"},"service":{"type":"string"},"status":{"type":"string"},"timestamp":{"format":"date-time","type":"string"},"uptimeSeconds":{"minimum":0,"type":"integer"},"version":{"type":"string"}},"required":["status","service","version","uptimeSeconds","timestamp","scan_workers"],"type":"object"},"ImpactCommons":{"properties":{"defensive_dataset":{"type":"string"},"note":{"type":"string"},"safety_scoreboard":{"$ref":"#/components/schemas/ImpactSafetyScoreboard"},"top_open_ports_last_24h":{"items":{"$ref":"#/components/schemas/ImpactPortExposure"},"type":"array"},"top_open_ports_last_7d":{"items":{"$ref":"#/components/schemas/ImpactPortExposure"},"type":"array"}},"required":["defensive_dataset","note","safety_scoreboard","top_open_ports_last_24h","top_open_ports_last_7d"],"type":"object"},"ImpactContributionExample":{"properties":{"amount_usd":{"minimum":1,"type":"integer"},"statement":{"type":"string"},"supporters_needed":{"minimum":0,"type":"integer"}},"required":["amount_usd","supporters_needed","statement"],"type":"object"},"ImpactFunding":{"properties":{"coverage_ratio":{"maximum":1,"minimum":0,"type":"number"},"donate_links":{"items":{"$ref":"#/components/schemas/SupportLink"},"type":"array"},"donate_url":{"type":"string"},"monthly_covered_usd":{"minimum":0,"type":"integer"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"},"next_action":{"type":"string"}},"required":["monthly_target_usd","monthly_covered_usd","monthly_gap_usd","coverage_ratio","next_action","donate_url","donate_links"],"type":"object"},"ImpactLinks":{"properties":{"docs":{"type":"string"},"mission":{"type":"string"},"openapi":{"type":"string"},"support":{"type":"string"},"trust":{"type":"string"}},"required":["docs","openapi","mission","trust","support"],"type":"object"},"ImpactMission":{"properties":{"one_request_contract":{"items":{"type":"string"},"type":"array"},"summary":{"type":"string"}},"required":["summary","one_request_contract"],"type":"object"},"ImpactPortExposure":{"properties":{"common_service":{"nullable":true,"type":"string"},"open_observations":{"minimum":0,"type":"integer"},"port":{"maximum":65535,"minimum":1,"type":"integer"},"risk_hint":{"type":"string"},"unique_source_ips":{"minimum":0,"type":"integer"}},"required":["port","common_service","open_observations","unique_source_ips","risk_hint"],"type":"object"},"ImpactProof":{"properties":{"action_required_scans":{"minimum":0,"type":"integer"},"contribution_examples":{"items":{"$ref":"#/components/schemas/ImpactContributionExample"},"type":"array"},"nearest_unlock":{"anyOf":[{"$ref":"#/components/schemas/ImpactUnlockTarget"},{"type":"null"}]},"scans_with_unexpected_open_ports":{"minimum":0,"type":"integer"},"total_scans_observed":{"minimum":0,"type":"integer"},"unexpected_open_ports_total":{"minimum":0,"type":"integer"}},"required":["total_scans_observed","action_required_scans","scans_with_unexpected_open_ports","unexpected_open_ports_total","nearest_unlock","contribution_examples"],"type":"object"},"ImpactReliability":{"properties":{"endpoint_429_total":{"minimum":0,"type":"integer"},"endpoint_5xx_total":{"minimum":0,"type":"integer"},"scan_workers_ready":{"minimum":0,"type":"integer"},"scan_workers_registered":{"minimum":0,"type":"integer"}},"required":["scan_workers_registered","scan_workers_ready","endpoint_5xx_total","endpoint_429_total"],"type":"object"},"ImpactResponse":{"properties":{"commons":{"$ref":"#/components/schemas/ImpactCommons"},"funding":{"$ref":"#/components/schemas/ImpactFunding"},"generated_at":{"format":"date-time","type":"string"},"links":{"$ref":"#/components/schemas/ImpactLinks"},"mission":{"$ref":"#/components/schemas/ImpactMission"},"proof":{"$ref":"#/components/schemas/ImpactProof"},"reliability":{"$ref":"#/components/schemas/ImpactReliability"},"roadmap":{"items":{"$ref":"#/components/schemas/ImpactRoadmapProgress"},"type":"array"},"service":{"const":"ifport.io","type":"string"},"status":{"const":"ok","type":"string"},"usage":{"$ref":"#/components/schemas/ImpactUsage"}},"required":["status","service","generated_at","mission","usage","reliability","funding","proof","commons","roadmap","links"],"type":"object"},"ImpactRoadmapProgress":{"properties":{"covered_usd":{"minimum":0,"type":"integer"},"id":{"type":"string"},"min_monthly_budget_usd":{"minimum":0,"type":"integer"},"operator_outcome":{"type":"string"},"progress_ratio":{"maximum":1,"minimum":0,"type":"number"},"remaining_usd":{"minimum":0,"type":"integer"},"unlock":{"type":"string"},"unlocked":{"type":"boolean"}},"required":["id","min_monthly_budget_usd","covered_usd","remaining_usd","progress_ratio","unlocked","unlock","operator_outcome"],"type":"object"},"ImpactSafetyScoreboard":{"properties":{"exposure_ratio_24h":{"maximum":1,"minimum":0,"type":"number"},"exposure_ratio_delta_pp":{"type":"number"},"exposure_ratio_prev_24h":{"maximum":1,"minimum":0,"type":"number"},"new_exposure_sessions_24h":{"minimum":0,"type":"integer"},"resolved_exposure_sessions_24h":{"minimum":0,"type":"integer"},"scans_24h":{"minimum":0,"type":"integer"},"scans_prev_24h":{"minimum":0,"type":"integer"},"scans_with_open_ports_24h":{"minimum":0,"type":"integer"},"scans_with_open_ports_prev_24h":{"minimum":0,"type":"integer"},"trend":{"enum":["improving","stable","worsening"],"type":"string"}},"required":["scans_24h","scans_with_open_ports_24h","exposure_ratio_24h","scans_prev_24h","scans_with_open_ports_prev_24h","exposure_ratio_prev_24h","exposure_ratio_delta_pp","new_exposure_sessions_24h","resolved_exposure_sessions_24h","trend"],"type":"object"},"ImpactUnlockTarget":{"properties":{"id":{"type":"string"},"operator_outcome":{"type":"string"},"remaining_usd":{"minimum":0,"type":"integer"},"unlock":{"type":"string"}},"required":["id","remaining_usd","unlock","operator_outcome"],"type":"object"},"ImpactUsage":{"properties":{"cache_hit_ratio":{"maximum":1,"minimum":0,"type":"number"},"completion_ratio":{"maximum":1,"minimum":0,"type":"number"},"last_24h":{"anyOf":[{"$ref":"#/components/schemas/ImpactWindow"},{"type":"null"}]},"last_7d":{"anyOf":[{"$ref":"#/components/schemas/ImpactWindow"},{"type":"null"}]},"partial_ratio":{"maximum":1,"minimum":0,"type":"number"},"requests_per_minute":{"minimum":0,"type":"number"},"session_scan_count":{"minimum":0,"type":"integer"}},"required":["requests_per_minute","session_scan_count","cache_hit_ratio","completion_ratio","partial_ratio","last_24h","last_7d"],"type":"object"},"ImpactWindow":{"properties":{"avg_open_ports":{"minimum":0,"type":"number"},"completion_ratio":{"maximum":1,"minimum":0,"type":"number"},"duration_p50_ms":{"minimum":0,"type":"integer"},"duration_p95_ms":{"minimum":0,"type":"integer"},"partial_ratio":{"maximum":1,"minimum":0,"type":"number"},"scan_count":{"minimum":0,"type":"integer"},"unique_source_ips":{"minimum":0,"type":"integer"}},"required":["scan_count","unique_source_ips","completion_ratio","partial_ratio","avg_open_ports","duration_p50_ms","duration_p95_ms"],"type":"object"},"IncidentBundleResponse":{"properties":{"decision":{"enum":["allow","review","block"],"type":"string"},"evidence":{"$ref":"#/components/schemas/IncidentEvidence"},"exposure_score":{"maximum":100,"minimum":0,"type":"integer"},"firewall_commands":{"items":{"type":"string"},"type":"array"},"full_result":{"$ref":"#/components/schemas/VisiblePortsResponse"},"generated_at":{"format":"date-time","type":"string"},"observed_source_ip":{"type":"string"},"policy":{"type":"string"},"profile":{"type":"string"},"responder_checklist":{"items":{"type":"string"},"type":"array"},"severity":{"enum":["info","medium","high","critical"],"type":"string"},"slack_text":{"type":"string"},"status":{"enum":["ok","action_required"],"type":"string"},"summary":{"type":"string"},"support":{"$ref":"#/components/schemas/IncidentSupport"},"ticket_markdown":{"type":"string"},"top_risks":{"items":{"$ref":"#/components/schemas/ActionPlanRisk"},"type":"array"},"verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["status","generated_at","observed_source_ip","profile","policy","verdict","decision","severity","exposure_score","summary","top_risks","responder_checklist","verify_commands","firewall_commands","ticket_markdown","slack_text","evidence","support","full_result"],"type":"object"},"IncidentEvidence":{"properties":{"closed_or_filtered_count":{"minimum":0,"type":"integer"},"fingerprint_sha256":{"type":"string"},"open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"partial":{"type":"boolean"},"signature_present":{"type":"boolean"},"snapshot_id":{"type":"string"}},"required":["snapshot_id","fingerprint_sha256","signature_present","open_ports","closed_or_filtered_count","partial"],"type":"object"},"IncidentSupport":{"properties":{"message":{"type":"string"},"monthly_target_usd":{"minimum":0,"type":"integer"},"url":{"type":"string"}},"required":["monthly_target_usd","message","url"],"type":"object"},"MinimalVisiblePortsResponse":{"description":"Stable minimal machine contract returned by `/json?view=min` and `/?format=json&view=min`. Full `/json` remains the compatibility default.\n","example":{"accuracy":{"confidence":"high","next_steps":["Keep this as baseline evidence and rerun after network, firewall, or deploy changes."],"observed_ip_scope":"public","reasons":["Observed source IP was taken from the request transport path."],"representation":"direct_public_path"},"cache":{"hit":false,"ttl_seconds":30},"decision":{"reason_code":"policy_and_exposure_within_expected_bounds","status":"allow"},"observed_source_ip":"203.0.113.42","partial":false,"policy":{"name":"strict","verdict":"pass"},"results":{"closed":[],"errors":[],"filtered_or_timeout":[22,80,443,3000,8080,8443],"open":[]},"scan":{"duration_ms":326,"global_timeout_ms":20000,"per_port_timeout_ms":650,"ports_checked":[22,80,443,3000,8080,8443],"profile":"default","scan_id":"63ead4aa-ab2a-413f-890a-35a9e9fd890a","speed":"balanced","started_at":"2026-06-02T19:20:34.671186493Z","type":"tcp_syn_or_connect"},"schema_version":"1.0","service":"ifport.io","target":{"ip":"203.0.113.42","type":"request_source_ip"}},"properties":{"accuracy":{"properties":{"confidence":{"enum":["high","medium","low"],"type":"string"},"next_steps":{"items":{"type":"string"},"type":"array"},"observed_ip_scope":{"enum":["public","private","loopback","link_local","unspecified"],"type":"string"},"reasons":{"items":{"type":"string"},"type":"array"},"representation":{"type":"string"}},"required":["representation","confidence","observed_ip_scope","reasons","next_steps"],"type":"object"},"cache":{"properties":{"hit":{"type":"boolean"},"ttl_seconds":{"minimum":0,"type":"integer"}},"required":["hit","ttl_seconds"],"type":"object"},"decision":{"properties":{"reason_code":{"type":"string"},"status":{"enum":["allow","review","block"],"type":"string"}},"required":["status","reason_code"],"type":"object"},"observed_source_ip":{"description":"Source IP observed by ifport.io for this request path.","type":"string"},"partial":{"type":"boolean"},"policy":{"properties":{"name":{"type":"string"},"verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"}},"required":["name","verdict"],"type":"object"},"results":{"properties":{"closed":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"errors":{"items":{"$ref":"#/components/schemas/PortError"},"type":"array"},"filtered_or_timeout":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"open":{"items":{"$ref":"#/components/schemas/OpenPort"},"type":"array"}},"required":["open","closed","filtered_or_timeout","errors"],"type":"object"},"scan":{"properties":{"duration_ms":{"minimum":0,"type":"integer"},"global_timeout_ms":{"minimum":1,"type":"integer"},"per_port_timeout_ms":{"minimum":1,"type":"integer"},"ports_checked":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"profile":{"enum":["default","web","databases","mail","top1000","custom"],"type":"string"},"scan_id":{"format":"uuid","type":"string"},"speed":{"enum":["fast","balanced","deep"],"type":"string"},"started_at":{"format":"date-time","type":"string"},"type":{"description":"Public MVP scan strategy. The worker tries TCP SYN for public IPv4 targets when raw sockets are available and falls back to TCP connect where SYN is not available or not appropriate.","enum":["tcp_syn_or_connect"],"type":"string"}},"required":["scan_id","started_at","type","profile","speed","duration_ms","per_port_timeout_ms","global_timeout_ms","ports_checked"],"type":"object"},"schema_version":{"example":"1.0","type":"string"},"service":{"const":"ifport.io","type":"string"},"target":{"properties":{"ip":{"type":"string"},"type":{"const":"request_source_ip","type":"string"}},"required":["type","ip"],"type":"object"}},"required":["schema_version","service","observed_source_ip","target","scan","results","partial","cache","policy","decision","accuracy"],"type":"object"},"MissionAutomation":{"properties":{"archive_url":{"type":"string"},"file_count":{"minimum":0,"type":"integer"},"gate_baseline_url":{"type":"string"},"gate_now_url":{"type":"string"},"install_steps":{"items":{"type":"string"},"type":"array"},"key_files":{"items":{"type":"string"},"type":"array"}},"required":["archive_url","file_count","key_files","install_steps","gate_now_url","gate_baseline_url"],"type":"object"},"MissionBrief":{"properties":{"concept_statement":{"type":"string"},"operator_value":{"type":"string"},"result_statement":{"type":"string"}},"required":["result_statement","concept_statement","operator_value"],"type":"object"},"MissionConcept":{"properties":{"arbitrary_targets_allowed":{"type":"boolean"},"cidr_scanning_allowed":{"type":"boolean"},"defensive_only":{"type":"boolean"},"exploitation_allowed":{"type":"boolean"},"non_goals":{"items":{"type":"string"},"type":"array"},"promise":{"type":"string"},"request_source_only":{"type":"boolean"},"tagline":{"type":"string"},"use_cases":{"items":{"type":"string"},"type":"array"}},"required":["tagline","defensive_only","request_source_only","arbitrary_targets_allowed","cidr_scanning_allowed","exploitation_allowed","promise","use_cases","non_goals"],"type":"object"},"MissionImpactWindow":{"properties":{"completion_ratio":{"maximum":1,"minimum":0,"type":"number"},"partial_ratio":{"maximum":1,"minimum":0,"type":"number"},"scan_count":{"minimum":0,"type":"integer"},"unique_source_ips":{"minimum":0,"type":"integer"}},"required":["scan_count","unique_source_ips","completion_ratio","partial_ratio"],"type":"object"},"MissionLinks":{"properties":{"action_plan":{"type":"string"},"automation_pack":{"type":"string"},"automation_pack_archive":{"type":"string"},"incident_bundle":{"type":"string"},"mission":{"type":"string"},"one_shot":{"type":"string"},"support":{"type":"string"},"trust":{"type":"string"}},"required":["mission","one_shot","action_plan","incident_bundle","automation_pack","automation_pack_archive","trust","support"],"type":"object"},"MissionObservationPath":{"properties":{"confidence":{"enum":["high","medium","low"],"type":"string"},"fix_playbook":{"items":{"type":"string"},"type":"array"},"ip_source":{"type":"string"},"observed_ip_scope":{"enum":["public","private","cgnat","loopback","link_local","unique_local","documentation","benchmark","invalid_or_unknown"],"type":"string"},"representation":{"enum":["direct_request_path","trusted_edge_header","translated_or_proxy_path","unknown_path"],"type":"string"},"transport_remote_ip":{"type":["string","null"]},"trust_message":{"type":"string"},"trust_verdict":{"enum":["trusted_runtime_path","trusted_edge_path","translated_path_review_required"],"type":"string"},"trusted_header_candidates":{"$ref":"#/components/schemas/NetworkHeaderCandidates"}},"required":["confidence","representation","observed_ip_scope","ip_source","trusted_header_candidates","trust_verdict","trust_message","fix_playbook"],"type":"object"},"MissionOperations":{"properties":{"do_now":{"items":{"type":"string"},"type":"array"},"first_15_min_steps":{"items":{"type":"string"},"type":"array"},"immediate_steps":{"items":{"$ref":"#/components/schemas/ActionPlanStep"},"type":"array"},"incident_severity":{"type":"string"},"incident_summary":{"type":"string"},"top_risks":{"items":{"$ref":"#/components/schemas/ActionPlanRisk"},"type":"array"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["do_now","first_15_min_steps","verify_commands","immediate_steps","top_risks","incident_summary","incident_severity"],"type":"object"},"MissionResponse":{"properties":{"automation":{"$ref":"#/components/schemas/MissionAutomation"},"brief":{"$ref":"#/components/schemas/MissionBrief"},"concept":{"$ref":"#/components/schemas/MissionConcept"},"full_result":{"$ref":"#/components/schemas/VisiblePortsResponse","nullable":true},"generated_at":{"format":"date-time","type":"string"},"limitations":{"items":{"type":"string"},"type":"array"},"links":{"$ref":"#/components/schemas/MissionLinks"},"observation_path":{"$ref":"#/components/schemas/MissionObservationPath"},"observed_source_ip":{"type":"string"},"operations":{"$ref":"#/components/schemas/MissionOperations"},"project":{"const":"ifport-mission","type":"string"},"result":{"$ref":"#/components/schemas/MissionResult"},"status":{"const":"ok","type":"string"},"support":{"$ref":"#/components/schemas/MissionSupport"},"vision":{"$ref":"#/components/schemas/MissionVision"}},"required":["status","generated_at","project","observed_source_ip","brief","concept","vision","result","observation_path","operations","automation","support","limitations","links"],"type":"object"},"MissionResult":{"properties":{"confidence":{"enum":["high","medium","low"],"type":"string"},"exposure_score":{"maximum":100,"minimum":0,"type":"integer"},"fingerprint_sha256":{"type":"string"},"open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"partial":{"type":"boolean"},"policy":{"type":"string"},"policy_verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"},"snapshot_id":{"type":"string"},"summary":{"type":"string"},"unexpected_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"verdict":{"enum":["safe","action_required","uncertain"],"type":"string"}},"required":["verdict","confidence","summary","exposure_score","policy","policy_verdict","open_ports","unexpected_open_ports","partial","snapshot_id","fingerprint_sha256"],"type":"object"},"MissionRoadmapItem":{"properties":{"id":{"type":"string"},"min_monthly_budget_usd":{"minimum":0,"type":"integer"},"operator_outcome":{"type":"string"},"unlock":{"type":"string"}},"required":["id","min_monthly_budget_usd","unlock","operator_outcome"],"type":"object"},"MissionSponsorProof":{"properties":{"action_required_scans":{"minimum":0,"type":"integer"},"contribution_examples":{"items":{"type":"string"},"type":"array"},"nearest_unlock_gap_usd":{"minimum":0,"type":"integer"},"nearest_unlock_id":{"type":"string"},"nearest_unlock_outcome":{"type":"string"},"scans_with_unexpected_open_ports":{"minimum":0,"type":"integer"},"total_scans_observed":{"minimum":0,"type":"integer"},"unexpected_open_ports_total":{"minimum":0,"type":"integer"}},"required":["total_scans_observed","action_required_scans","scans_with_unexpected_open_ports","unexpected_open_ports_total","nearest_unlock_id","nearest_unlock_gap_usd","nearest_unlock_outcome","contribution_examples"],"type":"object"},"MissionSupport":{"properties":{"coverage_ratio":{"maximum":1,"minimum":0,"type":"number"},"donate_links":{"items":{"$ref":"#/components/schemas/SupportLink"},"type":"array"},"donate_url":{"type":"string"},"gap_closure_examples":{"items":{"type":"string"},"type":"array"},"impact_last_24h":{"anyOf":[{"$ref":"#/components/schemas/MissionImpactWindow"},{"type":"null"}]},"monthly_covered_usd":{"minimum":0,"type":"integer"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"},"next_support_action":{"type":"string"},"reason_to_support":{"type":"string"},"sponsor_proof":{"$ref":"#/components/schemas/MissionSponsorProof"},"support_tiers":{"items":{"$ref":"#/components/schemas/SupportTier"},"type":"array"}},"required":["monthly_target_usd","monthly_covered_usd","monthly_gap_usd","coverage_ratio","reason_to_support","sponsor_proof","donate_url","donate_links","support_tiers","gap_closure_examples","next_support_action"],"type":"object"},"MissionVision":{"properties":{"north_star":{"type":"string"},"one_request_contract":{"items":{"type":"string"},"type":"array"},"sponsor_roadmap":{"items":{"$ref":"#/components/schemas/MissionRoadmapItem"},"type":"array"},"why_now":{"type":"string"}},"required":["north_star","why_now","one_request_contract","sponsor_roadmap"],"type":"object"},"NetworkHeaderCandidates":{"properties":{"cf_connecting_ip":{"type":["string","null"]},"forwarded":{"type":["string","null"]},"x_forwarded_for_first_public":{"type":["string","null"]},"x_real_ip":{"type":["string","null"]}},"required":["cf_connecting_ip","forwarded","x_forwarded_for_first_public","x_real_ip"],"type":"object"},"NetworkPathAttribution":{"properties":{"confidence":{"enum":["high","medium","low"],"type":"string"},"message":{"type":"string"},"representation":{"enum":["direct_request_path","trusted_edge_header","translated_or_proxy_path","unknown_path"],"type":"string"},"risks":{"items":{"type":"string"},"type":"array"},"verdict":{"enum":["direct_public_path","trusted_edge_header_path","translated_or_private_path"],"type":"string"}},"required":["verdict","confidence","representation","message","risks"],"type":"object"},"NetworkPathCopyPaste":{"properties":{"curl_commands":{"items":{"type":"string"},"type":"array"},"markdown":{"type":"string"}},"required":["markdown","curl_commands"],"type":"object"},"NetworkPathLinks":{"properties":{"docs":{"type":"string"},"evidence":{"type":"string"},"json":{"type":"string"},"run_check":{"type":"string"},"support":{"type":"string"}},"required":["run_check","json","evidence","docs","support"],"type":"object"},"NetworkPathResponse":{"properties":{"attribution":{"$ref":"#/components/schemas/NetworkPathAttribution"},"copy_paste":{"$ref":"#/components/schemas/NetworkPathCopyPaste"},"fix_playbook":{"items":{"type":"string"},"type":"array"},"ip_source":{"enum":["transport_remote_ip","x_real_ip_trusted_proxy","cf_connecting_ip_trusted_proxy","forwarded_trusted_proxy","x_forwarded_for_trusted_proxy"],"type":"string"},"links":{"$ref":"#/components/schemas/NetworkPathLinks"},"notes":{"items":{"type":"string"},"type":"array"},"observed_ip_scope":{"enum":["public","private","cgnat","loopback","link_local","unique_local","documentation","benchmark","invalid_or_unknown"],"type":"string"},"observed_source_ip":{"type":"string"},"service":{"const":"ifport.io","type":"string"},"status":{"const":"ok","type":"string"},"transport_remote_ip":{"type":["string","null"]},"trusted_header_candidates":{"$ref":"#/components/schemas/NetworkHeaderCandidates"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["status","service","observed_source_ip","observed_ip_scope","ip_source","trusted_header_candidates","attribution","fix_playbook","verify_commands","copy_paste","links","notes"],"type":"object"},"OneShotBoundary":{"properties":{"arbitrary_targets_allowed":{"type":"boolean"},"cidr_scanning_allowed":{"type":"boolean"},"exploitation_allowed":{"type":"boolean"},"request_source_only":{"type":"boolean"}},"required":["request_source_only","arbitrary_targets_allowed","cidr_scanning_allowed","exploitation_allowed"],"type":"object"},"OneShotConcept":{"properties":{"non_goals":{"items":{"type":"string"},"type":"array"},"one_request_promise":{"type":"string"},"safety_boundary":{"type":"string"},"useful_for":{"items":{"type":"string"},"type":"array"}},"required":["one_request_promise","useful_for","safety_boundary","non_goals"],"type":"object"},"OneShotCopyPaste":{"properties":{"slack_text":{"type":"string"},"support_callout":{"type":"string"},"terminal_summary":{"type":"string"},"ticket_markdown":{"type":"string"},"user_message":{"type":"string"}},"required":["user_message","ticket_markdown","slack_text","terminal_summary","support_callout"],"type":"object"},"OneShotDonate":{"properties":{"donate_ready":{"type":"boolean"},"donate_url":{"type":"string"},"impact_summary":{"type":"string"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"},"nearest_unlock_id":{"type":"string"},"nearest_unlock_outcome":{"type":"string"},"next_support_action":{"type":"string"},"provider_status":{"enum":["configured","provider_missing"],"type":"string"},"reason":{"type":"string"},"support_url":{"type":"string"}},"required":["support_url","donate_url","donate_ready","provider_status","monthly_target_usd","monthly_gap_usd","nearest_unlock_id","nearest_unlock_outcome","impact_summary","next_support_action","reason"],"type":"object"},"OneShotEvidence":{"properties":{"fingerprint_sha256":{"type":"string"},"open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"snapshot_id":{"type":"string"},"unexpected_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"}},"required":["open_ports","unexpected_open_ports","snapshot_id","fingerprint_sha256"],"type":"object"},"OneShotIntent":{"description":"Compact scenario interpretation for the one-shot answer. It mirrors the request-source-only intent verdict and runbook from the full scan payload.","properties":{"matching_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"name":{"enum":["general-exposure","web-deploy","remote-access","database-exposure"],"type":"string"},"next_action":{"type":"string"},"ports_of_interest":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"reason_code":{"type":"string"},"runbook":{"$ref":"#/components/schemas/OneShotIntentRunbook"},"summary":{"type":"string"},"verdict":{"enum":["pass","review","fail"],"type":"string"}},"required":["name","verdict","reason_code","summary","next_action","ports_of_interest","matching_open_ports","runbook"],"type":"object"},"OneShotIntentRunbook":{"properties":{"copy_paste_markdown":{"type":"string"},"decision_rule":{"type":"string"},"likely_causes":{"items":{"type":"string"},"type":"array"},"remediation_steps":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["title","decision_rule","likely_causes","verify_commands","remediation_steps","copy_paste_markdown"],"type":"object"},"OneShotLinks":{"properties":{"action_plan":{"type":"string"},"automation_pack":{"type":"string"},"donate":{"type":"string"},"evidence":{"type":"string"},"incident_bundle":{"type":"string"},"mission":{"type":"string"},"network_path":{"type":"string"},"support":{"type":"string"},"trust":{"type":"string"}},"required":["action_plan","incident_bundle","evidence","automation_pack","network_path","mission","trust","donate","support"],"type":"object"},"OneShotOperatorValue":{"properties":{"automation_pack_url":{"type":"string"},"evidence_url":{"type":"string"},"gate_url":{"type":"string"},"primary_action":{"type":"string"},"primary_command":{"type":"string"},"remediation_summary":{"type":"string"},"remediation_url":{"type":"string"},"share_summary":{"type":"string"}},"required":["primary_action","primary_command","gate_url","evidence_url","automation_pack_url","remediation_url","remediation_summary","share_summary"],"type":"object"},"OneShotOutcome":{"properties":{"confidence":{"enum":["high","medium","low"],"type":"string"},"summary":{"type":"string"},"verdict":{"enum":["safe","action_required","uncertain"],"type":"string"}},"required":["verdict","confidence","summary"],"type":"object"},"OneShotResponse":{"properties":{"boundary":{"$ref":"#/components/schemas/OneShotBoundary"},"brief":{"description":"Mirrors the full scan one-request brief with answer, next action, command, evidence, artifacts, and support readiness.","type":"object"},"community":{"$ref":"#/components/schemas/VisiblePortsCommunity"},"concept":{"$ref":"#/components/schemas/OneShotConcept"},"copy_paste":{"$ref":"#/components/schemas/OneShotCopyPaste"},"decision":{"description":"Mirrors the full scan `decision` block so one-shot callers can use the same allow/review/block contract as `/json`.","type":"object"},"do_now":{"items":{"type":"string"},"type":"array"},"donate":{"$ref":"#/components/schemas/OneShotDonate"},"evidence":{"$ref":"#/components/schemas/OneShotEvidence"},"full_result":{"$ref":"#/components/schemas/VisiblePortsResponse","nullable":true},"generated_at":{"format":"date-time","type":"string"},"intent":{"$ref":"#/components/schemas/OneShotIntent"},"limitations":{"items":{"type":"string"},"type":"array"},"links":{"$ref":"#/components/schemas/OneShotLinks"},"observed_source_ip":{"type":"string"},"operator_value":{"$ref":"#/components/schemas/OneShotOperatorValue"},"outcome":{"$ref":"#/components/schemas/OneShotOutcome"},"receipt":{"description":"Mirrors the full scan value receipt, including receipt id, next operator step, and support-this-check URL.","type":"object"},"status":{"const":"ok","type":"string"},"support":{"description":"Mirrors the full scan `support` block including donation readiness and provider setup.","type":"object"},"support_proof":{"description":"Mirrors the full scan support proof that explains the value delivered without changing scan access.","type":"object"}},"required":["status","generated_at","observed_source_ip","decision","brief","outcome","concept","intent","evidence","operator_value","copy_paste","community","boundary","do_now","donate","support","receipt","support_proof","limitations","links"],"type":"object"},"OpenPort":{"properties":{"agent_recommendation":{"type":"string"},"common_service":{"type":["string","null"]},"confidence":{"const":"port_mapping_only","type":"string"},"latency_ms":{"type":["integer","null"]},"operator_runbook":{"$ref":"#/components/schemas/PortExposureRunbook"},"port":{"maximum":65535,"minimum":1,"type":"integer"},"protocol":{"const":"tcp","type":"string"},"risk_hint":{"type":"string"},"state":{"const":"open","type":"string"}},"required":["port","protocol","state","confidence","risk_hint","agent_recommendation","operator_runbook"],"type":"object"},"PersistedEvidenceResponse":{"properties":{"boundary":{"$ref":"#/components/schemas/OneShotBoundary"},"closed_or_filtered_count":{"minimum":0,"type":"integer"},"copy_paste":{"properties":{"curl_command":{"type":"string"},"markdown":{"type":"string"},"slack_text":{"type":"string"}},"required":["markdown","slack_text","curl_command"],"type":"object"},"event_id":{"type":"string"},"evidence":{"properties":{"evidence_id":{"type":"string"},"evidence_version":{"const":"persisted_evidence.v1","type":"string"},"fingerprint_sha256":{"type":"string"},"signature":{"$ref":"#/components/schemas/ScanSnapshotSignature","nullable":true},"signed_payload":{"const":"persisted_scan_observed_evidence_v1","type":"string"}},"required":["evidence_version","evidence_id","fingerprint_sha256","signed_payload"],"type":"object"},"evidence_type":{"const":"persisted_scan_observed_evidence","type":"string"},"generated_at":{"format":"date-time","type":"string"},"integrity_payload":{"description":"Canonical JSON object hashed by `evidence.fingerprint_sha256`; it is derived from stored scan_events data and does not trigger a scan.","type":"object"},"limitations":{"items":{"type":"string"},"type":"array"},"links":{"properties":{"donate":{"format":"uri","type":"string"},"openapi":{"format":"uri","type":"string"},"result_card_svg_url":{"format":"uri","type":"string"},"result_evidence_url":{"format":"uri","type":"string"},"result_url":{"format":"uri","type":"string"},"run_fresh_check":{"format":"uri","type":"string"},"support":{"format":"uri","type":"string"}},"required":["result_url","result_card_svg_url","result_evidence_url","run_fresh_check","donate","support","openapi"],"type":"object"},"observed_source_ip":{"type":"string"},"open_ports":{"items":{"$ref":"#/components/schemas/PersistedResultResponse/properties/open_ports/items"},"type":"array"},"ports_checked_count":{"minimum":0,"type":"integer"},"ports_checked_hash_sha256":{"type":"string"},"ports_checked_preview":{"description":"Short preview of checked TCP ports. The full canonical list is in `integrity_payload`.","items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"scan":{"$ref":"#/components/schemas/PersistedResultResponse/properties/scan"},"scan_id":{"format":"uuid","type":"string"},"service":{"const":"ifport.io","type":"string"},"status":{"const":"ok","type":"string"},"support":{"$ref":"#/components/schemas/EvidenceSupport"},"target":{"properties":{"ip":{"type":"string"},"type":{"const":"request_source_ip","type":"string"}},"required":["type","ip"],"type":"object"}},"required":["status","service","evidence_type","generated_at","scan_id","event_id","observed_source_ip","target","scan","open_ports","closed_or_filtered_count","ports_checked_count","ports_checked_preview","ports_checked_hash_sha256","evidence","integrity_payload","copy_paste","boundary","support","limitations","links"],"type":"object"},"PersistedResultResponse":{"properties":{"closed_or_filtered_count":{"minimum":0,"type":"integer"},"event_id":{"type":"string"},"limitations":{"items":{"type":"string"},"type":"array"},"links":{"properties":{"donate":{"format":"uri","type":"string"},"openapi":{"format":"uri","type":"string"},"result_card_svg_url":{"format":"uri","type":"string"},"result_evidence_url":{"description":"Read-only persisted evidence pack derived from stored scan_events data. Opening it does not run a scan.","format":"uri","type":"string"},"result_url":{"format":"uri","type":"string"},"run_check":{"format":"uri","type":"string"},"support":{"format":"uri","type":"string"}},"required":["run_check","result_url","result_card_svg_url","result_evidence_url","support","donate","openapi"],"type":"object"},"observed_source_ip":{"type":"string"},"open_ports":{"items":{"properties":{"common_service":{"nullable":true,"type":"string"},"confidence":{"nullable":true,"type":"string"},"latency_ms":{"minimum":0,"nullable":true,"type":"integer"},"port":{"maximum":65535,"minimum":1,"type":"integer"},"protocol":{"const":"tcp","type":"string"},"risk_hint":{"nullable":true,"type":"string"},"state":{"type":"string"}},"required":["port","protocol","state"],"type":"object"},"type":"array"},"operator_card":{"description":"Ready-to-handoff card for this persisted result. It is derived from stored request-source-only scan data and does not run a new scan.","properties":{"answer":{"type":"string"},"boundary":{"type":"string"},"card_version":{"const":"persisted_operator_card.v1","type":"string"},"concept":{"type":"string"},"copy_paste_markdown":{"type":"string"},"do_now":{"items":{"type":"string"},"type":"array"},"proof":{"items":{"type":"string"},"type":"array"},"support_prompt":{"type":"string"},"title":{"type":"string"},"verdict":{"enum":["allow","review"],"type":"string"}},"required":["card_version","title","verdict","answer","concept","boundary","do_now","proof","support_prompt","copy_paste_markdown"],"type":"object"},"result_type":{"const":"persisted_scan_result","type":"string"},"scan":{"properties":{"duration_ms":{"minimum":0,"type":"integer"},"finished_at":{"format":"date-time","type":"string"},"open_port_count":{"minimum":0,"type":"integer"},"ports_checked_count":{"description":"Number of bounded TCP ports checked by the original scan. The persisted response intentionally does not repeat every checked port.","minimum":0,"type":"integer"},"profile":{"type":"string"},"requested_at":{"format":"date-time","type":"string"},"route":{"type":"string"},"status":{"type":"string"},"timeout_ms":{"minimum":0,"type":"integer"},"type":{"type":"string"}},"required":["route","profile","type","status","ports_checked_count","timeout_ms","requested_at","finished_at","duration_ms","open_port_count"],"type":"object"},"scan_id":{"format":"uuid","type":"string"},"service":{"const":"ifport.io","type":"string"},"status":{"const":"ok","type":"string"},"target":{"properties":{"ip":{"type":"string"},"type":{"const":"request_source_ip","type":"string"}},"required":["type","ip"],"type":"object"},"value_receipt":{"description":"Value-first receipt explaining what the persisted result saved and how to support the free request-source-only utility.","properties":{"copy_paste_markdown":{"type":"string"},"estimated_minutes_saved":{"minimum":0,"type":"integer"},"operator_next_step":{"type":"string"},"receipt_id":{"type":"string"},"support_case":{"type":"string"},"support_this_check_url":{"description":"Per-result sponsor link carrying receipt/scan context only; it is not paid scan access and is not a scan target.","format":"uri","type":"string"},"title":{"type":"string"},"value_drivers":{"items":{"type":"string"},"type":"array"},"value_summary":{"type":"string"}},"required":["receipt_id","title","value_summary","estimated_minutes_saved","value_drivers","operator_next_step","support_case","support_this_check_url","copy_paste_markdown"],"type":"object"}},"required":["status","service","result_type","scan_id","event_id","observed_source_ip","target","scan","open_ports","closed_or_filtered_count","operator_card","value_receipt","limitations","links"],"type":"object"},"PortError":{"properties":{"error":{"type":"string"},"port":{"maximum":65535,"minimum":1,"type":"integer"},"protocol":{"const":"tcp","type":"string"}},"required":["port","protocol","error"],"type":"object"},"PortExposureRunbook":{"properties":{"category":{"enum":["remote_admin","data_service","container_or_control_plane","public_web","proxy_or_messaging","unknown_service"],"type":"string"},"hardening_actions":{"items":{"type":"string"},"type":"array"},"immediate_checks":{"items":{"type":"string"},"type":"array"},"owner_question":{"type":"string"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["category","owner_question","immediate_checks","hardening_actions","verify_commands"],"type":"object"},"ReadinessCheck":{"properties":{"evidence":{"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"message":{"type":"string"},"severity":{"enum":["critical","high","medium","low"],"type":"string"},"status":{"enum":["pass","warn","fail"],"type":"string"}},"required":["id","status","severity","message","evidence"],"type":"object"},"ReadinessLinks":{"properties":{"donate":{"type":"string"},"impact":{"type":"string"},"mission":{"type":"string"},"network_path":{"type":"string"},"openapi":{"type":"string"},"readiness":{"type":"string"},"run_check":{"type":"string"},"trust":{"type":"string"}},"required":["readiness","run_check","mission","trust","impact","network_path","donate","openapi"],"type":"object"},"ReadinessResponse":{"properties":{"checks":{"items":{"$ref":"#/components/schemas/ReadinessCheck"},"type":"array"},"external_smoke_command":{"type":"string"},"generated_at":{"format":"date-time","type":"string"},"grade":{"enum":["A+","A","B","C","D","F"],"type":"string"},"links":{"$ref":"#/components/schemas/ReadinessLinks"},"next_actions":{"items":{"type":"string"},"type":"array"},"score":{"maximum":100,"minimum":0,"type":"integer"},"service":{"const":"ifport.io","type":"string"},"status":{"enum":["ok","degraded","action_required"],"type":"string"},"summary":{"type":"string"},"support":{"$ref":"#/components/schemas/ReadinessSupport"},"verdict":{"enum":["ready","usable_with_notes","not_ready"],"type":"string"}},"required":["status","service","generated_at","score","grade","verdict","summary","checks","next_actions","external_smoke_command","support","links"],"type":"object"},"ReadinessSupport":{"properties":{"coverage_ratio":{"maximum":1,"minimum":0,"type":"number"},"donate_links_configured":{"type":"boolean"},"donate_url":{"type":"string"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"}},"required":["monthly_target_usd","monthly_gap_usd","coverage_ratio","donate_url","donate_links_configured"],"type":"object"},"ScanSnapshot":{"properties":{"fingerprint_sha256":{"type":"string"},"signature":{"$ref":"#/components/schemas/SnapshotVerifySignature","nullable":true},"snapshot_id":{"type":"string"},"verification":{"type":"string"},"version":{"type":"string"}},"required":["version","snapshot_id","fingerprint_sha256","verification"],"type":"object"},"SnapshotVerifyRequest":{"properties":{"closed_or_filtered_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"fingerprint_sha256":{"type":"string"},"observed_source_ip":{"type":"string"},"open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"partial":{"type":"boolean"},"policy_missing_expected_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"policy_name":{"type":"string"},"policy_unexpected_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"policy_verdict":{"type":"string"},"ports_checked":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"profile":{"type":"string"},"signature":{"$ref":"#/components/schemas/SnapshotVerifySignature","nullable":true},"snapshot_id":{"type":"string"},"speed":{"type":"string"}},"required":["observed_source_ip","profile","speed","ports_checked","open_ports","closed_or_filtered_ports","partial","policy_name","policy_verdict","policy_unexpected_open_ports","policy_missing_expected_ports","snapshot_id","fingerprint_sha256"],"type":"object"},"SnapshotVerifyResponse":{"properties":{"computed_fingerprint_sha256":{"type":"string"},"computed_snapshot_id":{"type":"string"},"fingerprint_match":{"type":"boolean"},"note":{"type":"string"},"signature_provided":{"type":"boolean"},"signature_result":{"enum":["match","mismatch","key_unavailable","key_id_mismatch","invalid_hex","algorithm_mismatch","signed_payload_mismatch"],"nullable":true,"type":"string"},"signature_verified":{"nullable":true,"type":"boolean"},"snapshot_id_match":{"type":"boolean"},"status":{"const":"ok","type":"string"},"verified":{"type":"boolean"}},"required":["status","verified","fingerprint_match","snapshot_id_match","computed_fingerprint_sha256","computed_snapshot_id","signature_provided","note"],"type":"object"},"SnapshotVerifySignature":{"properties":{"algorithm":{"const":"hmac-sha256","type":"string"},"key_id":{"type":"string"},"signature_hex":{"type":"string"},"signed_payload":{"const":"scan_snapshot_fingerprint_source_v1","type":"string"}},"required":["algorithm","key_id","signature_hex","signed_payload"],"type":"object"},"SponsorKitCopyPaste":{"properties":{"badge_markdown":{"type":"string"},"markdown":{"type":"string"},"procurement_note":{"type":"string"},"social_text":{"type":"string"}},"required":["markdown","social_text","procurement_note","badge_markdown"],"type":"object"},"SponsorKitFunding":{"properties":{"coverage_ratio":{"maximum":1,"minimum":0,"type":"number"},"donate_links":{"items":{"$ref":"#/components/schemas/SupportLink"},"type":"array"},"donate_links_configured":{"type":"boolean"},"donate_url":{"type":"string"},"monthly_covered_usd":{"minimum":0,"type":"integer"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"},"next_action":{"type":"string"},"provider_setup":{"$ref":"#/components/schemas/SupportProviderSetup"}},"required":["monthly_target_usd","monthly_covered_usd","monthly_gap_usd","coverage_ratio","next_action","donate_url","donate_links_configured","donate_links","provider_setup"],"type":"object"},"SponsorKitLinks":{"properties":{"donate":{"type":"string"},"impact":{"type":"string"},"mission":{"type":"string"},"openapi":{"type":"string"},"readiness":{"type":"string"},"run_check":{"type":"string"},"sponsor_kit":{"type":"string"},"support":{"type":"string"}},"required":["sponsor_kit","run_check","support","donate","impact","readiness","mission","openapi"],"type":"object"},"SponsorKitPitch":{"properties":{"free_promise":{"type":"string"},"headline":{"type":"string"},"one_liner":{"type":"string"},"useful_for":{"items":{"type":"string"},"type":"array"},"why_support":{"type":"string"}},"required":["headline","one_liner","why_support","free_promise","useful_for"],"type":"object"},"SponsorKitProof":{"properties":{"action_required_decisions":{"minimum":0,"type":"integer"},"completion_ratio_24h":{"maximum":1,"minimum":0,"type":["number","null"]},"contribution_examples":{"items":{"type":"string"},"type":"array"},"nearest_unlock_gap_usd":{"minimum":0,"type":"integer"},"nearest_unlock_id":{"type":"string"},"nearest_unlock_outcome":{"type":"string"},"runtime_scans_observed":{"minimum":0,"type":"integer"},"scans_24h":{"minimum":0,"type":["integer","null"]},"scans_with_unexpected_open_ports":{"minimum":0,"type":"integer"},"unexpected_open_ports_total":{"minimum":0,"type":"integer"},"unique_source_ips_24h":{"minimum":0,"type":["integer","null"]}},"required":["runtime_scans_observed","action_required_decisions","scans_with_unexpected_open_ports","unexpected_open_ports_total","nearest_unlock_id","nearest_unlock_gap_usd","nearest_unlock_outcome","contribution_examples"],"type":"object"},"SponsorKitResponse":{"properties":{"copy_paste":{"$ref":"#/components/schemas/SponsorKitCopyPaste"},"funding":{"$ref":"#/components/schemas/SponsorKitFunding"},"generated_at":{"format":"date-time","type":"string"},"links":{"$ref":"#/components/schemas/SponsorKitLinks"},"pitch":{"$ref":"#/components/schemas/SponsorKitPitch"},"proof":{"$ref":"#/components/schemas/SponsorKitProof"},"safety":{"$ref":"#/components/schemas/SponsorKitSafety"},"service":{"const":"ifport.io","type":"string"},"sponsor_roadmap":{"items":{"$ref":"#/components/schemas/MissionRoadmapItem"},"type":"array"},"status":{"const":"ok","type":"string"},"support_intent":{"$ref":"#/components/schemas/SupportIntent"},"support_tiers":{"items":{"$ref":"#/components/schemas/SupportTier"},"type":"array"}},"required":["status","service","generated_at","pitch","funding","proof","safety","support_intent","support_tiers","sponsor_roadmap","copy_paste","links"],"type":"object"},"SponsorKitSafety":{"properties":{"arbitrary_targets_allowed":{"type":"boolean"},"cidr_scanning_allowed":{"type":"boolean"},"defensive_only":{"type":"boolean"},"exploitation_allowed":{"type":"boolean"},"request_source_only":{"type":"boolean"}},"required":["defensive_only","request_source_only","arbitrary_targets_allowed","cidr_scanning_allowed","exploitation_allowed"],"type":"object"},"SupportIntent":{"properties":{"action_label":{"type":"string"},"agent_instruction":{"type":"string"},"copy_paste_markdown":{"type":"string"},"donate_url":{"type":"string"},"intent":{"const":"support_ifport_public_defensive_utility","type":"string"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"nearest_unlock_gap_usd":{"minimum":0,"type":"integer"},"nearest_unlock_id":{"type":"string"},"nearest_unlock_outcome":{"type":"string"},"no_paid_access_note":{"type":"string"},"procurement_note":{"type":"string"},"provider_status":{"enum":["configured","provider_missing"],"type":"string"},"status":{"enum":["ready_to_donate","provider_pending"],"type":"string"},"subject":{"type":"string"}},"required":["intent","status","donate_url","action_label","provider_status","monthly_gap_usd","nearest_unlock_id","nearest_unlock_gap_usd","nearest_unlock_outcome","subject","copy_paste_markdown","procurement_note","agent_instruction","no_paid_access_note"],"type":"object"},"SupportLink":{"properties":{"provider":{"description":"Provider identifier such as github_sponsors, ko_fi, stripe, open_collective, primary, or a configured custom provider.","type":"string"},"url":{"format":"uri","type":"string"}},"required":["provider","url"],"type":"object"},"SupportProviderSetup":{"properties":{"deploy_example":{"type":"string"},"message":{"type":"string"},"optional_env":{"items":{"type":"string"},"type":"array"},"readiness_check_id":{"type":"string"},"required_env":{"items":{"type":"string"},"type":"array"},"status":{"enum":["configured","provider_missing"],"type":"string"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["status","message","required_env","optional_env","deploy_example","verify_commands","readiness_check_id"],"type":"object"},"SupportTier":{"properties":{"amount_usd":{"minimum":1,"type":"integer"},"id":{"type":"string"},"impact":{"type":"string"},"label":{"type":"string"}},"required":["id","amount_usd","label","impact"],"type":"object"},"TrustPortExposure":{"properties":{"common_service":{"nullable":true,"type":"string"},"open_observations":{"minimum":0,"type":"integer"},"port":{"maximum":65535,"minimum":1,"type":"integer"},"risk_hint":{"type":"string"},"unique_source_ips":{"minimum":0,"type":"integer"}},"required":["port","common_service","open_observations","unique_source_ips","risk_hint"],"type":"object"},"TrustResponse":{"properties":{"generated_at":{"format":"date-time","type":"string"},"links":{"properties":{"action_plan":{"type":"string"},"docs":{"type":"string"},"openapi":{"type":"string"},"status":{"type":"string"},"support":{"type":"string"}},"required":["docs","support","openapi","action_plan","status"],"type":"object"},"promise":{"properties":{"arbitrary_targets_allowed":{"type":"boolean"},"cidr_scanning_allowed":{"type":"boolean"},"exploitation_allowed":{"type":"boolean"},"request_source_only":{"type":"boolean"}},"required":["request_source_only","arbitrary_targets_allowed","cidr_scanning_allowed","exploitation_allowed"],"type":"object"},"quality":{"properties":{"cache_hit_ratio":{"maximum":1,"minimum":0,"type":"number"},"completion_ratio":{"maximum":1,"minimum":0,"type":"number"},"default_ports_checked":{"minimum":1,"type":"integer"},"default_profile":{"const":"default","type":"string"},"partial_ratio":{"maximum":1,"minimum":0,"type":"number"},"requests_per_minute":{"minimum":0,"type":"number"},"scan_duration_p50_ms":{"minimum":0,"type":"integer"},"scan_duration_p95_ms":{"minimum":0,"type":"integer"},"scan_duration_p99_ms":{"minimum":0,"type":"integer"}},"required":["default_profile","default_ports_checked","completion_ratio","partial_ratio","scan_duration_p50_ms","scan_duration_p95_ms","scan_duration_p99_ms","requests_per_minute","cache_hit_ratio"],"type":"object"},"reliability":{"properties":{"endpoint_429_total":{"minimum":0,"type":"integer"},"endpoint_5xx_total":{"minimum":0,"type":"integer"},"scan_workers_ready":{"minimum":0,"type":"integer"},"scan_workers_registered":{"minimum":0,"type":"integer"}},"required":["scan_workers_registered","scan_workers_ready","endpoint_5xx_total","endpoint_429_total"],"type":"object"},"service":{"const":"ifport.io","type":"string"},"status":{"const":"ok","type":"string"},"support":{"properties":{"coverage_ratio":{"maximum":1,"minimum":0,"type":"number"},"donate_links":{"items":{"$ref":"#/components/schemas/SupportLink"},"type":"array"},"donate_url":{"type":"string"},"funding_use":{"items":{"type":"string"},"type":"array"},"mission":{"type":"string"},"monthly_covered_usd":{"minimum":0,"type":"integer"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"}},"required":["monthly_target_usd","monthly_covered_usd","monthly_gap_usd","coverage_ratio","mission","funding_use","donate_url","donate_links"],"type":"object"},"transparency":{"properties":{"available":{"type":"boolean"},"last_24h":{"$ref":"#/components/schemas/TrustWindowStats","nullable":true},"last_7d":{"$ref":"#/components/schemas/TrustWindowStats","nullable":true},"note":{"type":"string"},"safety_scoreboard":{"$ref":"#/components/schemas/TrustSafetyScoreboard"},"source":{"enum":["runtime_only","postgres_scan_events"],"type":"string"},"top_open_ports_24h":{"items":{"$ref":"#/components/schemas/TrustPortExposure"},"type":"array"},"top_open_ports_7d":{"items":{"$ref":"#/components/schemas/TrustPortExposure"},"type":"array"}},"required":["source","available","note","safety_scoreboard","top_open_ports_24h","top_open_ports_7d"],"type":"object"},"uptime_seconds":{"minimum":0,"type":"integer"}},"required":["status","service","generated_at","uptime_seconds","promise","quality","reliability","transparency","support","links"],"type":"object"},"TrustSafetyScoreboard":{"properties":{"exposure_ratio_24h":{"maximum":1,"minimum":0,"type":"number"},"exposure_ratio_delta_pp":{"type":"number"},"exposure_ratio_prev_24h":{"maximum":1,"minimum":0,"type":"number"},"new_exposure_sessions_24h":{"minimum":0,"type":"integer"},"resolved_exposure_sessions_24h":{"minimum":0,"type":"integer"},"scans_24h":{"minimum":0,"type":"integer"},"scans_prev_24h":{"minimum":0,"type":"integer"},"scans_with_open_ports_24h":{"minimum":0,"type":"integer"},"scans_with_open_ports_prev_24h":{"minimum":0,"type":"integer"},"trend":{"enum":["improving","stable","worsening"],"type":"string"}},"required":["scans_24h","scans_with_open_ports_24h","exposure_ratio_24h","scans_prev_24h","scans_with_open_ports_prev_24h","exposure_ratio_prev_24h","exposure_ratio_delta_pp","new_exposure_sessions_24h","resolved_exposure_sessions_24h","trend"],"type":"object"},"TrustWindowStats":{"properties":{"avg_open_ports":{"minimum":0,"type":"number"},"completion_ratio":{"maximum":1,"minimum":0,"type":"number"},"duration_p50_ms":{"minimum":0,"type":"integer"},"duration_p95_ms":{"minimum":0,"type":"integer"},"partial_ratio":{"maximum":1,"minimum":0,"type":"number"},"scan_count":{"minimum":0,"type":"integer"},"unique_source_ips":{"minimum":0,"type":"integer"}},"required":["scan_count","unique_source_ips","completion_ratio","partial_ratio","avg_open_ports","duration_p50_ms","duration_p95_ms"],"type":"object"},"VisiblePortsCommunity":{"properties":{"available":{"type":"boolean"},"benchmark":{"$ref":"#/components/schemas/VisiblePortsCommunityBenchmark"},"exposure_weather":{"type":"string"},"matched_open_ports":{"items":{"$ref":"#/components/schemas/VisiblePortsCommunityPort"},"type":"array"},"note":{"type":"string"},"safety":{"properties":{"aggregate_only":{"const":true,"type":"boolean"},"arbitrary_targets_exposed":{"const":false,"type":"boolean"},"purpose":{"const":"defensive_prioritization","type":"string"},"source_ips_exposed":{"const":false,"type":"boolean"}},"required":["aggregate_only","source_ips_exposed","arbitrary_targets_exposed","purpose"],"type":"object"},"source":{"enum":["runtime_only","postgres_scan_events"],"type":"string"},"summary":{"type":"string"},"top_open_ports_24h":{"description":"Aggregate defensive top-open-port context only; never includes source IPs, targets, hostnames, CIDRs, banners, or payloads.","items":{"$ref":"#/components/schemas/VisiblePortsCommunityPort"},"type":"array"}},"required":["source","available","summary","exposure_weather","benchmark","matched_open_ports","top_open_ports_24h","safety","note"],"type":"object"},"VisiblePortsCommunityBenchmark":{"description":"Aggregate-only comparison between the current request-source result and IfPort Commons exposure weather.","properties":{"aggregate_exposure_ratio_24h":{"minimum":0,"type":"number"},"aggregate_exposure_trend":{"type":"string"},"comparison":{"enum":["no_aggregate_baseline","current_result_has_no_open_ports","current_open_ports_match_commons","current_open_ports_not_seen_in_commons","current_open_ports_partially_seen_in_commons"],"type":"string"},"current_open_port_count":{"minimum":0,"type":"integer"},"current_open_ports_new_to_commons":{"minimum":0,"type":"integer"},"current_open_ports_seen_in_commons":{"minimum":0,"type":"integer"},"headline":{"type":"string"},"operator_meaning":{"type":"string"},"safety_note":{"type":"string"},"status":{"enum":["community_unavailable","clean_baseline_below_aggregate","current_exposure_seen_in_commons","current_exposure_uncommon_in_commons","current_exposure_mixed_commons_signal"],"type":"string"},"support_reason":{"type":"string"}},"required":["status","headline","comparison","operator_meaning","current_open_port_count","current_open_ports_seen_in_commons","current_open_ports_new_to_commons","aggregate_exposure_ratio_24h","aggregate_exposure_trend","support_reason","safety_note"],"type":"object"},"VisiblePortsCommunityPort":{"properties":{"common_service":{"nullable":true,"type":"string"},"open_observations_24h":{"minimum":0,"type":"integer"},"open_observations_7d":{"minimum":0,"type":"integer"},"port":{"maximum":65535,"minimum":1,"type":"integer"},"relevance":{"enum":["current_open_and_seen_in_commons","current_open_not_seen_in_commons","community_top_open_port"],"type":"string"},"risk_hint":{"type":"string"},"unique_source_count_24h":{"minimum":0,"type":"integer"},"unique_source_count_7d":{"minimum":0,"type":"integer"}},"required":["port","common_service","open_observations_24h","unique_source_count_24h","open_observations_7d","unique_source_count_7d","risk_hint","relevance"],"type":"object"},"VisiblePortsResponse":{"properties":{"accuracy":{"properties":{"confidence":{"enum":["high","medium","low"],"type":"string"},"next_steps":{"items":{"type":"string"},"type":"array"},"observed_ip_scope":{"enum":["public","private","cgnat","loopback","link_local","unique_local","documentation","benchmark","invalid_or_unknown"],"type":"string"},"reasons":{"items":{"type":"string"},"type":"array"},"representation":{"enum":["direct_request_path","trusted_edge_header","translated_or_proxy_path","unknown_path"],"type":"string"}},"required":["representation","confidence","observed_ip_scope","reasons","next_steps"],"type":"object"},"agent_handoff":{"properties":{"confidence_note":{"type":"string"},"intent":{"const":"explain_result_to_user","type":"string"},"likely_issue":{"enum":["translated_or_proxy_path","expected_ports_not_visible","unexpected_public_exposure","no_public_ports_detected","clean_but_proxy_path","critical_remote_access_exposure","data_service_exposure","policy_mismatch_exposure","intent_validation_required"],"type":"string"},"next_action":{"type":"string"},"next_command":{"type":"string"},"safety_boundary":{"type":"string"},"summary":{"type":"string"},"support_note":{"type":"string"},"user_message":{"type":"string"}},"required":["intent","likely_issue","summary","user_message","next_action","next_command","confidence_note","safety_boundary","support_note"],"type":"object"},"assessment":{"properties":{"exposure_score":{"maximum":100,"minimum":0,"type":"integer"},"grade":{"type":"string"},"recommended_actions":{"items":{"type":"string"},"type":"array"},"summary":{"type":"string"}},"required":["exposure_score","grade","summary","recommended_actions"],"type":"object"},"automation":{"properties":{"baseline_policy":{"description":"Commit-ready request-source baseline policy generated from the current scan. It is an exposure gate artifact, not an arbitrary target permission.","properties":{"arbitrary_targets_allowed":{"const":false,"type":"boolean"},"expected_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"fingerprint_sha256":{"type":"string"},"gate_url":{"type":"string"},"generated_by":{"const":"ifport.io","type":"string"},"note":{"type":"string"},"observed_source_ip":{"type":"string"},"profile":{"type":"string"},"request_source_only":{"const":true,"type":"boolean"},"snapshot_id":{"type":"string"},"speed":{"type":"string"},"target_scope":{"const":"request_source_ip_only","type":"string"},"version":{"const":"ifport_policy.v1","type":"string"}},"required":["version","generated_by","target_scope","observed_source_ip","profile","speed","expected_open_ports","gate_url","snapshot_id","fingerprint_sha256","request_source_only","arbitrary_targets_allowed","note"],"type":"object"},"bash_gate_snippet":{"type":"string"},"expected_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"gate_baseline_url":{"type":"string"},"gate_now_url":{"type":"string"},"github_actions_step":{"type":"string"},"gitlab_ci_job":{"type":"string"}},"required":["gate_now_url","gate_baseline_url","expected_open_ports","baseline_policy","bash_gate_snippet","github_actions_step","gitlab_ci_job"],"type":"object"},"brief":{"description":"Canonical one-request result+concept block for humans, CLIs, UIs, and LLM agents.","properties":{"answer":{"description":"Short user-facing explanation of the scan result.","type":"string"},"artifacts":{"description":"Direct operator artifacts returned with the one-request brief. Scan-backed artifact URLs preserve the current scan scope, policy, and speed.","items":{"properties":{"name":{"enum":["gate","evidence","action_plan","automation_pack","network_path"],"type":"string"},"purpose":{"type":"string"},"url":{"format":"uri","type":"string"},"use_when":{"type":"string"}},"required":["name","url","purpose","use_when"],"type":"object"},"type":"array"},"concept":{"type":"string"},"confidence":{"type":"string"},"evidence":{"properties":{"fingerprint_sha256":{"type":"string"},"snapshot_id":{"type":"string"},"verify_url":{"format":"uri","type":"string"}},"required":["snapshot_id","fingerprint_sha256","verify_url"],"type":"object"},"headline":{"type":"string"},"next_action":{"type":"string"},"next_command":{"type":"string"},"observed_source_ip":{"type":"string"},"open_ports":{"description":"Human-readable open TCP port list, or none.","type":"string"},"reason_code":{"type":"string"},"safety_boundary":{"type":"string"},"support":{"properties":{"donate_ready":{"description":"True when a payment provider link is configured behind /donate.","type":"boolean"},"donate_url":{"format":"uri","type":"string"},"impact_summary":{"type":"string"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"nearest_unlock_id":{"type":"string"},"nearest_unlock_outcome":{"type":"string"},"next_support_action":{"type":"string"},"provider_status":{"enum":["configured","provider_missing"],"type":"string"},"reason":{"type":"string"}},"required":["reason","donate_url","donate_ready","provider_status","monthly_gap_usd","nearest_unlock_id","nearest_unlock_outcome","impact_summary","next_support_action"],"type":"object"},"target_scope":{"const":"request_source_ip_only","type":"string"},"verdict":{"enum":["allow","review","block"],"type":"string"}},"required":["headline","answer","verdict","reason_code","target_scope","observed_source_ip","open_ports","next_action","next_command","confidence","concept","safety_boundary","evidence","artifacts","support"],"type":"object"},"cache":{"properties":{"hit":{"type":"boolean"},"ttl_seconds":{"type":"integer"}},"required":["hit","ttl_seconds"],"type":"object"},"community":{"$ref":"#/components/schemas/VisiblePortsCommunity"},"decision":{"properties":{"actions":{"items":{"type":"string"},"type":"array"},"evidence":{"properties":{"accuracy_confidence":{"enum":["high","medium","low"],"type":"string"},"exposure_score":{"maximum":100,"minimum":0,"type":"integer"},"policy_verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"},"triage_severity":{"enum":["info","medium","high","critical"],"type":"string"}},"required":["policy_verdict","exposure_score","triage_severity","accuracy_confidence"],"type":"object"},"message":{"type":"string"},"reason_code":{"enum":["low_confidence_observation_path","unexpected_public_exposure","manual_intent_validation_required","policy_and_exposure_within_expected_bounds"],"type":"string"},"status":{"enum":["allow","review","block"],"type":"string"}},"required":["status","reason_code","message","actions","evidence"],"type":"object"},"drift":{"properties":{"closed_since_last":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"new_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"note":{"type":"string"},"previous_scan_time":{"format":"date-time","nullable":true,"type":"string"},"source":{"enum":["postgres_scan_events","runtime_memory","unavailable"],"type":"string"},"status":{"enum":["first_seen","unchanged","changed","unknown"],"type":"string"}},"required":["source","status","previous_scan_time","new_open_ports","closed_since_last","note"],"type":"object"},"intent":{"description":"Request-source-only scenario preset and interpretation. Intent presets never accept ip, host, target, CIDR, domain lists, payloads, credentials, or third-party infrastructure.","properties":{"applied_policy":{"type":"string"},"applied_profile":{"type":"string"},"expected_outcome":{"type":"string"},"matching_open_ports":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"name":{"enum":["general-exposure","web-deploy","remote-access","database-exposure"],"type":"string"},"next_action":{"type":"string"},"not_seen_ports_of_interest":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"policy_from_intent":{"type":"boolean"},"ports_of_interest":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"preset_applied":{"type":"boolean"},"profile_from_intent":{"type":"boolean"},"provided":{"type":"boolean"},"purpose":{"type":"string"},"reason_code":{"type":"string"},"runbook":{"description":"Scenario-specific operator runbook for the request-source-only intent verdict.","properties":{"copy_paste_markdown":{"type":"string"},"decision_rule":{"type":"string"},"likely_causes":{"items":{"type":"string"},"type":"array"},"remediation_steps":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["title","decision_rule","likely_causes","verify_commands","remediation_steps","copy_paste_markdown"],"type":"object"},"safety_boundary":{"type":"string"},"summary":{"type":"string"},"verdict":{"enum":["pass","review","fail"],"type":"string"}},"required":["name","provided","preset_applied","purpose","expected_outcome","applied_profile","applied_policy","profile_from_intent","policy_from_intent","ports_of_interest","matching_open_ports","not_seen_ports_of_interest","verdict","reason_code","summary","next_action","runbook","safety_boundary"],"type":"object"},"limitations":{"items":{"type":"string"},"type":"array"},"links":{"properties":{"action_plan":{"type":"string"},"docs":{"type":"string"},"donate":{"type":"string"},"evidence":{"type":"string"},"impact":{"type":"string"},"mission":{"type":"string"},"openapi":{"type":"string"},"support":{"type":"string"}},"required":["docs","support","openapi","action_plan","evidence","mission","impact","donate"],"type":"object"},"network":{"properties":{"ip_source":{"enum":["transport_remote_ip","x_real_ip_trusted_proxy","cf_connecting_ip_trusted_proxy","x_forwarded_for_trusted_proxy"],"type":"string"},"observed_source_ip":{"type":"string"},"transport_remote_ip":{"nullable":true,"type":"string"}},"required":["observed_source_ip","ip_source"],"type":"object"},"observed_source_ip":{"type":"string"},"open_ports":{"items":{"$ref":"#/components/schemas/OpenPort"},"type":"array"},"operator_card":{"description":"Compact one-request operator card intended for direct user handoff, tickets, CLIs, and LLM agents.","properties":{"answer":{"type":"string"},"automation":{"items":{"type":"string"},"type":"array"},"boundary":{"type":"string"},"card_version":{"const":"operator_card.v1","type":"string"},"concept":{"type":"string"},"confidence":{"type":"string"},"copy_paste_markdown":{"type":"string"},"do_now":{"items":{"type":"string"},"type":"array"},"proof":{"items":{"type":"string"},"type":"array"},"severity":{"enum":["info","medium","high","critical"],"type":"string"},"support_prompt":{"type":"string"},"title":{"type":"string"},"verdict":{"enum":["allow","review","block"],"type":"string"}},"required":["card_version","title","verdict","severity","answer","concept","boundary","confidence","do_now","proof","automation","support_prompt","copy_paste_markdown"],"type":"object"},"partial":{"type":"boolean"},"policy":{"properties":{"allowed_open_ports":{"items":{"type":"integer"},"type":"array"},"missing_expected_ports":{"items":{"type":"integer"},"type":"array"},"name":{"type":"string"},"note":{"type":"string"},"unexpected_open_ports":{"items":{"type":"integer"},"type":"array"},"verdict":{"enum":["pass","warn","fail","not_evaluated"],"type":"string"}},"required":["name","verdict","allowed_open_ports","unexpected_open_ports","missing_expected_ports","note"],"type":"object"},"project":{"properties":{"category":{"const":"request_source_port_visibility","type":"string"},"default_check":{"type":"string"},"defensive_boundary":{"type":"string"},"name":{"const":"ifport.io","type":"string"},"one_request_promise":{"type":"string"},"outputs":{"items":{"properties":{"name":{"enum":["action_plan","evidence","mission","automation_pack","impact"],"type":"string"},"purpose":{"type":"string"},"url":{"format":"uri","type":"string"}},"required":["name","url","purpose"],"type":"object"},"type":"array"},"useful_for":{"items":{"type":"string"},"type":"array"}},"required":["name","category","one_request_promise","defensive_boundary","default_check","useful_for","outputs"],"type":"object"},"receipt":{"description":"Operator value receipt explaining what this one request produced and why support is justified.","properties":{"copy_paste_markdown":{"type":"string"},"estimated_minutes_saved":{"minimum":0,"type":"integer"},"operator_next_step":{"type":"string"},"receipt_id":{"type":"string"},"support_case":{"type":"string"},"support_this_check_url":{"description":"Per-result sponsor link that carries receipt_id and snapshot_id context only.","format":"uri","type":"string"},"title":{"type":"string"},"value_drivers":{"items":{"type":"string"},"type":"array"},"value_summary":{"type":"string"}},"required":["receipt_id","title","value_summary","estimated_minutes_saved","value_drivers","operator_next_step","support_case","support_this_check_url","copy_paste_markdown"],"type":"object"},"results":{"properties":{"closed":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"errors":{"items":{"$ref":"#/components/schemas/PortError"},"type":"array"},"filtered_or_timeout":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"open":{"items":{"$ref":"#/components/schemas/OpenPort"},"type":"array"}},"required":["open","closed","filtered_or_timeout","errors"],"type":"object"},"scan":{"properties":{"duration_ms":{"minimum":0,"type":"integer"},"global_timeout_ms":{"minimum":1,"type":"integer"},"per_port_timeout_ms":{"minimum":1,"type":"integer"},"ports_checked":{"items":{"maximum":65535,"minimum":1,"type":"integer"},"type":"array"},"profile":{"enum":["default","web","databases","mail","top1000","custom"],"type":"string"},"scan_id":{"description":"Result UUID for this request-source-only scan. Use `/result/{scan_id}` to read the persisted result after asynchronous statistics storage completes.","format":"uuid","type":"string"},"speed":{"enum":["fast","balanced","deep"],"type":"string"},"started_at":{"format":"date-time","type":"string"},"type":{"description":"Public MVP scan strategy. The worker tries TCP SYN for public IPv4 targets when raw sockets are available and falls back to TCP connect where SYN is not available or not appropriate.","enum":["tcp_syn_or_connect"],"type":"string"}},"required":["scan_id","started_at","type","profile","speed","duration_ms","per_port_timeout_ms","global_timeout_ms","ports_checked"],"type":"object"},"schema_version":{"const":"1.0","type":"string"},"service":{"const":"ifport.io","type":"string"},"share":{"properties":{"badge_markdown":{"type":"string"},"evidence_url":{"format":"uri","type":"string"},"markdown":{"description":"Copy-paste Markdown summary for tickets, chats, README notes, or incident records.","type":"string"},"readme_markdown":{"description":"Short README/support snippet with badge, evidence, and support action.","type":"string"},"report_card_markdown":{"description":"Compact result card for tickets, incident records, README notes, and agent handoff.","type":"string"},"result_card_svg_url":{"description":"Embeddable read-only SVG card for this scan result. It uses only scan_id, does not run a new scan, and does not accept arbitrary targets or source-IP lookup.","format":"uri","type":"string"},"result_evidence_url":{"description":"Read-only persisted evidence pack for this scan result. It uses only scan_id, does not run a new scan, and does not accept arbitrary targets or source-IP lookup.","format":"uri","type":"string"},"result_summary":{"type":"string"},"result_url":{"description":"Read-only permalink for this scan result. It uses only scan_id and does not accept arbitrary targets or source-IP lookup.","format":"uri","type":"string"},"social_text":{"description":"Short share text that preserves the request-source-only safety boundary.","type":"string"},"support_callout":{"type":"string"},"support_this_check_url":{"description":"Per-result sponsor action URL carrying only receipt and snapshot attribution context.","format":"uri","type":"string"},"ticket_title":{"description":"Ready issue/incident title for the current request-source result.","type":"string"},"title":{"type":"string"},"verify_url":{"format":"uri","type":"string"}},"required":["title","result_summary","result_url","result_card_svg_url","result_evidence_url","markdown","report_card_markdown","ticket_title","readme_markdown","social_text","badge_markdown","verify_url","evidence_url","support_this_check_url","support_callout"],"type":"object"},"snapshot":{"properties":{"fingerprint_sha256":{"type":"string"},"signature":{"nullable":true,"properties":{"algorithm":{"const":"hmac-sha256","type":"string"},"key_id":{"type":"string"},"signature_hex":{"type":"string"},"signed_payload":{"const":"scan_snapshot_fingerprint_source_v1","type":"string"}},"required":["algorithm","key_id","signature_hex","signed_payload"],"type":"object"},"snapshot_id":{"type":"string"},"verification":{"minimum":0,"type":"string"},"version":{"type":"string"}},"required":["version","snapshot_id","fingerprint_sha256","verification"],"type":"object"},"support":{"properties":{"contribution_examples":{"items":{"type":"string"},"type":"array"},"coverage_ratio":{"maximum":1,"minimum":0,"type":"number"},"donate_links":{"items":{"$ref":"#/components/schemas/SupportLink"},"type":"array"},"donate_ready":{"description":"True when a payment provider link is configured behind /donate.","type":"boolean"},"donate_url":{"format":"uri","type":"string"},"free_check":{"type":"boolean"},"monthly_covered_usd":{"minimum":0,"type":"integer"},"monthly_gap_usd":{"minimum":0,"type":"integer"},"monthly_target_usd":{"minimum":0,"type":"integer"},"nearest_unlock":{"nullable":true,"properties":{"id":{"type":"string"},"operator_outcome":{"type":"string"},"remaining_usd":{"minimum":0,"type":"integer"}},"required":["id","remaining_usd","operator_outcome"],"type":"object"},"next_support_action":{"type":"string"},"provider_setup":{"$ref":"#/components/schemas/SupportProviderSetup"},"provider_status":{"enum":["configured","provider_missing"],"type":"string"},"support_intent":{"$ref":"#/components/schemas/SupportIntent"},"why_support":{"type":"string"}},"required":["free_check","donate_ready","provider_status","monthly_target_usd","monthly_covered_usd","monthly_gap_usd","coverage_ratio","donate_url","donate_links","provider_setup","why_support","next_support_action","nearest_unlock","contribution_examples","support_intent"],"type":"object"},"support_proof":{"description":"Donation-safe proof pack tying the scan result, evidence, value receipt, and support ask together without implying paid scan access.","properties":{"copy_paste_markdown":{"type":"string"},"donate_url":{"format":"uri","type":"string"},"donation_ask":{"type":"string"},"estimated_minutes_saved":{"minimum":0,"type":"integer"},"evidence":{"items":{"type":"string"},"type":"array"},"nearest_unlock_id":{"type":"string"},"nearest_unlock_outcome":{"type":"string"},"no_paid_access_note":{"type":"string"},"proof_version":{"const":"support_proof.v1","type":"string"},"provider_status":{"enum":["provider_missing","configured"],"type":"string"},"summary":{"type":"string"},"support_this_check_url":{"description":"Per-result sponsor link mirrored from the value receipt; not a paid scan access link.","format":"uri","type":"string"},"title":{"type":"string"},"value_receipt_id":{"type":"string"}},"required":["proof_version","title","summary","evidence","value_receipt_id","estimated_minutes_saved","donation_ask","donate_url","support_this_check_url","provider_status","nearest_unlock_id","nearest_unlock_outcome","no_paid_access_note","copy_paste_markdown"],"type":"object"},"target":{"properties":{"ip":{"type":"string"},"type":{"const":"request_source_ip","type":"string"}},"required":["type","ip"],"type":"object"},"triage":{"properties":{"first_15_min_steps":{"items":{"type":"string"},"type":"array"},"headline":{"type":"string"},"scenario":{"enum":["no_public_ports_detected","clean_but_proxy_path","critical_remote_access_exposure","data_service_exposure","policy_mismatch_exposure","expected_ports_not_visible","intent_validation_required"],"type":"string"},"severity":{"enum":["info","medium","high","critical"],"type":"string"},"verify_commands":{"items":{"type":"string"},"type":"array"}},"required":["scenario","severity","headline","first_15_min_steps","verify_commands"],"type":"object"}},"required":["schema_version","service","observed_source_ip","target","intent","brief","operator_card","scan","results","open_ports","partial","cache","assessment","policy","accuracy","triage","decision","agent_handoff","automation","project","support","community","share","receipt","support_proof","snapshot","drift","limitations","links"],"type":"object"}}},"info":{"summary":"Like what is my IP, but for visible TCP ports","title":"ifport.io request-source port visibility API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/":{"get":{"description":"Returns a request-source result for all GET requests. Uses lightweight content negotiation: browser-like requests get HTML report, CLI/bot requests get mission-style Markdown. Deterministic root modes are available with `?format=json`, `?format=markdown`, and `?format=plain` so agents do not need to rely on heuristics. Use `?format=json&view=min` for the stable minimal machine contract.\n","operationId":"getRootEntry","parameters":[{"$ref":"#/components/parameters/RootFormat"},{"$ref":"#/components/parameters/View"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Policy"},{"$ref":"#/components/parameters/ExpectOpen"}],"responses":{"200":{"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/VisiblePortsResponse"},{"$ref":"#/components/schemas/MinimalVisiblePortsResponse"}]}},"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}},"description":"Root scan result in negotiated representation","headers":{"Cache-Control":{"$ref":"#/components/headers/ScanCacheControl"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Vary":{"$ref":"#/components/headers/ScanVary"}}}},"summary":"Root endpoint that always returns a request-source scan result"}},"/.well-known/funding.json":{"get":{"description":"Well-known alias for `/funding.json`. This endpoint does not run a scan.\n","operationId":"getWellKnownFundingManifest","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundingManifestResponse"}}},"description":"Funding manifest"}},"summary":"Get no-scan funding manifest"}},"/.well-known/funding.yml":{"get":{"description":"Well-known alias for `/funding.yml`. This endpoint does not run a scan.\n","operationId":"getWellKnownFundingYml","responses":{"200":{"content":{"text/yaml":{"schema":{"type":"string"}}},"description":"Funding YAML"}},"summary":"Get FUNDING.yml starter"}},"/.well-known/openapi.json":{"get":{"operationId":"getWellKnownOpenApi","responses":{"200":{"description":"OpenAPI JSON"}},"summary":"Get this OpenAPI document"}},"/action-plan":{"get":{"description":"Returns actionable hardening steps based on the same request-source scan result. When `expect_open` is provided and required ports are missing, the plan prioritizes listener, firewall, NAT, load-balancer, and source-attribution checks instead of treating the result as a clean baseline. This endpoint is defensive guidance only and does not perform any exploit or arbitrary-target probing.\n","operationId":"getActionPlan","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"},{"$ref":"#/components/parameters/Platform"},{"$ref":"#/components/parameters/ActionPlanFormat"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionPlanResponse"}},"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}},"description":"Action plan with steps and full scan result"},"400":{"description":"Invalid input parameters"},"429":{"description":"Rate limit exceeded"}},"summary":"Prioritized remediation plan for request-source port exposure"}},"/automation-pack":{"get":{"description":"Returns request-source-only automation artifacts for CI gating and incident response: bash scripts, GitHub/GitLab templates, incident markdown, and scan evidence JSON files built from the current scan result.\n","operationId":"getAutomationPack","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"},{"$ref":"#/components/parameters/IncludeFullResult"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationPackResponse"}}},"description":"Automation pack with file templates and evidence"},"400":{"description":"Invalid profile or custom port list"},"429":{"description":"Rate limit exceeded"}},"summary":"Generate ready-to-commit CI and ops automation files from current scan"}},"/automation-pack.tar.gz":{"get":{"description":"Returns the same request-source-derived ops bundle as `/automation-pack` in a downloadable tar.gz archive (scripts, runbook, and evidence files).\n","operationId":"getAutomationPackArchive","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"}],"responses":{"200":{"content":{"application/gzip":{"schema":{"format":"binary","type":"string"}}},"description":"tar.gz archive with ops scripts and evidence files"},"400":{"description":"Invalid profile or custom port list"},"429":{"description":"Rate limit exceeded"}},"summary":"Download automation pack as tar.gz archive"}},"/badge.svg":{"get":{"description":"Returns an SVG badge for README/docs/support outreach. It uses live support and transparency counters and does not run a scan.\n","operationId":"getSupportBadge","responses":{"200":{"content":{"image/svg+xml":{"schema":{"type":"string"}}},"description":"SVG support badge"}},"summary":"Get embeddable live support badge"}},"/check":{"get":{"operationId":"checkVisiblePortsMarkdown","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"}],"responses":{"200":{"description":"Markdown port visibility report","headers":{"Cache-Control":{"$ref":"#/components/headers/ScanCacheControl"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Vary":{"$ref":"#/components/headers/ScanVary"}}},"400":{"description":"Invalid profile or custom port list"},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Get Markdown TCP port visibility for the request source IP"}},"/docs":{"get":{"operationId":"getDocs","responses":{"200":{"description":"Static documentation page"}},"summary":"Get documentation without running a scan"}},"/donate":{"get":{"description":"Redirects to the configured primary support provider when available. Without a configured provider, renders a no-scan sponsor action page. `format=json` returns machine-readable funding, pledge, provider, safety, and optional receipt/snapshot context.\n","operationId":"getDonate","parameters":[{"description":"Optional value receipt identifier produced by a scan result.","in":"query","name":"receipt_id","required":false,"schema":{"type":"string"}},{"description":"Optional scan snapshot identifier produced by a scan result.","in":"query","name":"snapshot_id","required":false,"schema":{"type":"string"}},{"description":"Optional attribution source such as `scan_result`.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Optional support pledge amount for provider-pending handoff context. This is not payment confirmation and never changes scan access.","in":"query","name":"pledge_usd","required":false,"schema":{"enum":[5,10,25],"type":"integer"}},{"description":"Force JSON or HTML sponsor action output when no provider redirect is used.","in":"query","name":"format","required":false,"schema":{"enum":["json","html"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"action":{"const":"support_ifport_public_defensive_utility","type":"string"},"context":{"additionalProperties":true,"type":"object"},"copy_paste":{"properties":{"agent_instruction":{"type":"string"},"donor_note":{"type":"string"},"procurement_note":{"type":"string"}},"required":["donor_note","procurement_note","agent_instruction"],"type":"object"},"donate_ready":{"type":"boolean"},"funding":{"additionalProperties":true,"type":"object"},"links":{"additionalProperties":true,"type":"object"},"live_proof":{"additionalProperties":true,"type":"object"},"nearest_unlock":{"additionalProperties":true,"type":"object"},"pledge":{"properties":{"note":{"type":"string"},"payment_confirmation":{"const":false,"type":"boolean"},"provider_redirect_configured":{"type":"boolean"},"selected_amount_usd":{"enum":[5,10,25],"type":"integer"},"selected_pledge_url":{"type":"string"},"status":{"enum":["ready_to_donate","provider_pending"],"type":"string"}},"required":["selected_amount_usd","selected_pledge_url","status","note","provider_redirect_configured","payment_confirmation"],"type":"object"},"pledge_options":{"items":{"properties":{"amount_usd":{"enum":[5,10,25],"type":"integer"},"id":{"type":"string"},"impact":{"type":"string"},"label":{"type":"string"},"pledge_url":{"type":"string"},"supporters_needed":{"minimum":1,"type":"integer"},"supporters_needed_label":{"type":"string"}},"required":["id","amount_usd","label","impact","supporters_needed","supporters_needed_label","pledge_url"],"type":"object"},"type":"array"},"provider_pending_next_steps":{"items":{"type":"string"},"type":"array"},"provider_setup":{"$ref":"#/components/schemas/SupportProviderSetup"},"provider_status":{"enum":["configured","provider_missing"],"type":"string"},"safety":{"additionalProperties":true,"type":"object"},"service":{"type":"string"},"stable_donate_url":{"type":"string"},"status":{"enum":["ready_to_donate","provider_pending"],"type":"string"},"support_intent":{"$ref":"#/components/schemas/SupportIntent"}},"required":["status","action","donate_ready","provider_status","context","funding","pledge","pledge_options","nearest_unlock","support_intent","copy_paste","provider_pending_next_steps","safety","links"],"type":"object"}},"text/html":{"schema":{"type":"string"}}},"description":"Sponsor action page or JSON context when no provider redirect is used"},"302":{"description":"Redirect to configured donation provider"}},"summary":"Stable donation action"}},"/evidence":{"get":{"description":"Runs the same request-source-only scan and returns a portable evidence pack: compact verdict fields, snapshot fingerprint/signature data, `/verify` payload, copy-paste Markdown, Slack text, and commands for CI gates and automation packs. `format=markdown` or `Accept: text/markdown` returns the copy-paste Markdown directly.\n","operationId":"getEvidence","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"},{"$ref":"#/components/parameters/EvidenceFormat"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidenceResponse"}},"text/markdown":{"schema":{"type":"string"}}},"description":"Portable evidence response"},"400":{"description":"Invalid profile or custom port list"},"429":{"description":"Rate limit exceeded"}},"summary":"Portable request-source scan proof for tickets, CI, and incident review"}},"/funding.json":{"get":{"description":"Returns machine-readable funding metadata for agents, README files, sponsor workflows, and funding discovery. This endpoint does not run a scan.\n","operationId":"getFundingManifest","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundingManifestResponse"}}},"description":"Funding manifest"}},"summary":"Get no-scan funding manifest"}},"/funding.yml":{"get":{"description":"Returns a GitHub-style FUNDING.yml starter pointing at the stable `/donate` action and configured support provider links. This endpoint does not run a scan.\n","operationId":"getFundingYml","responses":{"200":{"content":{"text/yaml":{"schema":{"type":"string"}}},"description":"Funding YAML"}},"summary":"Get FUNDING.yml starter"}},"/gate":{"get":{"description":"Returns a compact gate verdict and sets HTTP status according to policy: pass/not_evaluated -> 200, warn/fail -> 409.\n","operationId":"gateVisiblePorts","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GateResponse"}}},"description":"Gate passed","headers":{"Cache-Control":{"$ref":"#/components/headers/ScanCacheControl"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Vary":{"$ref":"#/components/headers/ScanVary"}}},"400":{"description":"Invalid input parameters"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GateResponse"}}},"description":"Gate failed or warning state","headers":{"Cache-Control":{"$ref":"#/components/headers/ScanCacheControl"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Vary":{"$ref":"#/components/headers/ScanVary"}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"CI/CD gate verdict for request-source visibility"}},"/impact":{"get":{"description":"Returns non-scan impact telemetry for ifport.io: utility metrics, reliability signals, funding coverage, and sponsor roadmap progress. JSON is the default API response; browser clients can request a human impact ledger with `Accept: text/html`, and CLI/documentation clients can request Markdown with `Accept: text/markdown`.\n","operationId":"getImpact","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImpactResponse"}},"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}},"description":"Public impact status"}},"summary":"Get live utility, funding, and roadmap progress signals"}},"/incident-bundle":{"get":{"description":"Returns an incident-response bundle generated from the same request-source scan: responder checklist, verification commands, firewall command candidates, and ready ticket/slack artifacts. Defensive-only guidance; no arbitrary-target probing.\n","operationId":"getIncidentBundle","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"},{"$ref":"#/components/parameters/Platform"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentBundleResponse"}}},"description":"Incident response bundle with embedded full scan result"},"400":{"description":"Invalid input parameters"},"429":{"description":"Rate limit exceeded"}},"summary":"Incident-ready bundle for request-source exposure response"}},"/json":{"get":{"description":"Returns open TCP ports for the public source IP observed by ifport.io. This does not necessarily identify the end user's local machine if the request passes through NAT, VPN, proxy, CI/CD, cloud runtime, or LLM sandbox.\n","operationId":"getVisiblePortsForRequestSource","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"},{"$ref":"#/components/parameters/View"}],"responses":{"200":{"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/VisiblePortsResponse"},{"$ref":"#/components/schemas/MinimalVisiblePortsResponse"}]}}},"description":"Structured port visibility report","headers":{"Cache-Control":{"$ref":"#/components/headers/ScanCacheControl"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Vary":{"$ref":"#/components/headers/ScanVary"}}},"400":{"description":"Invalid profile or custom port list"},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Get TCP ports visible from the public IP that made this request"}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Plain text LLM guidance"}},"summary":"Get compact LLM/agent usage guidance"}},"/mcp":{"get":{"operationId":"getMcpToolManifest","responses":{"200":{"description":"MCP tool descriptor"}},"summary":"Get a simple MCP tool descriptor for agent integration"},"post":{"description":"Supports minimal MCP JSON-RPC methods: `initialize`, `notifications/initialized`, `tools/list`, and `tools/call` for the `get_visible_ports` tool. Tool calls scan only the observed request source IP and reject arbitrary target arguments.\n","operationId":"postMcpJsonRpc","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"MCP JSON-RPC response"},"202":{"description":"MCP initialized notification accepted"},"400":{"description":"Invalid JSON-RPC request"}},"summary":"Invoke the IfPort MCP JSON-RPC endpoint"}},"/mission":{"get":{"description":"Returns a unified request-source-only response for operators and agents: exposure verdict, defensive concept boundaries, triage/actions, automation bundle metadata, and support/impact transparency in one call.\n","operationId":"getMission","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"},{"$ref":"#/components/parameters/MissionFormat"},{"$ref":"#/components/parameters/IncludeFullResult"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionResponse"}},"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}},"description":"Unified mission response"},"400":{"description":"Invalid profile or custom port list"},"429":{"description":"Rate limit exceeded"}},"summary":"One-request mission bundle (result + concept + operations + automation + support transparency)"}},"/network-path":{"get":{"description":"Returns how ifport.io resolved observed_source_ip from trusted proxy headers and transport address. Useful to debug proxy/NAT paths when scan confidence is low.\n","operationId":"getNetworkPath","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkPathResponse"}}},"description":"Source attribution diagnostics"}},"summary":"Explain request source-IP attribution path without running a scan"}},"/one-shot":{"get":{"description":"Returns a compact request-source-only scan verdict with evidence, scenario intent/runbook, do-now steps, safety boundary, and support context.\n","operationId":"getOneShot","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"},{"$ref":"#/components/parameters/IncludeFullResult"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OneShotResponse"}}},"description":"Compact one-shot response"},"400":{"description":"Invalid profile or custom port list"},"429":{"description":"Rate limit exceeded"}},"summary":"Compact one-request defensive verdict and next actions"}},"/openapi.json":{"get":{"operationId":"getOpenApi","responses":{"200":{"description":"OpenAPI JSON"}},"summary":"Get this OpenAPI document"}},"/plain":{"get":{"operationId":"getVisiblePortsPlain","parameters":[{"$ref":"#/components/parameters/Profile"},{"$ref":"#/components/parameters/Intent"},{"$ref":"#/components/parameters/Ports"},{"$ref":"#/components/parameters/ExpectOpen"},{"$ref":"#/components/parameters/Speed"},{"$ref":"#/components/parameters/Policy"}],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Newline-separated open TCP ports"},"400":{"description":"Invalid profile or custom port list"},"429":{"description":"Rate limit exceeded"}},"summary":"Get only open TCP ports for shell scripts"}},"/playbook":{"get":{"description":"Returns a no-scan operator handbook for interpreting IfPort results, wiring CI gates, preparing evidence, understanding source attribution, and preserving the request-source-only safety boundary.\n","operationId":"getPlaybook","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Operator playbook"}},"summary":"Get no-scan operator playbook"}},"/readiness":{"get":{"description":"Returns one machine-readable readiness grade for operators and agents: request-source safety boundary, default coverage, worker readiness, transparency, scan quality, support path, and external public-vantage smoke command. This endpoint does not run a port scan.\n","operationId":"getReadiness","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadinessResponse"}}},"description":"Product readiness grade"}},"summary":"Get no-scan product readiness grade"}},"/result/{scan_id}":{"get":{"description":"Returns a previously persisted request-source-only scan result. Opening this permalink does not run a new scan and does not support lookup by IP, host, target, CIDR, range, domain, or source-IP search.\n","operationId":"getPersistedScanResult","parameters":[{"$ref":"#/components/parameters/ScanId"},{"$ref":"#/components/parameters/ResultFormat"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersistedResultResponse"}},"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}},"description":"Persisted scan result"},"400":{"description":"Invalid scan_id or format"},"404":{"description":"Persisted result not found"},"503":{"description":"Result store unavailable"}},"summary":"Read a persisted request-source scan result by scan_id"}},"/result/{scan_id}.svg":{"get":{"description":"Returns a read-only SVG card for a previously persisted request-source-only scan result. Opening this card does not run a new scan and does not support lookup by IP, host, target, CIDR, range, domain, or source-IP search.\n","operationId":"getPersistedScanResultCardSvg","parameters":[{"$ref":"#/components/parameters/ScanId"}],"responses":{"200":{"content":{"image/svg+xml":{"schema":{"type":"string"}}},"description":"Embeddable persisted result SVG card"},"400":{"description":"Invalid scan_id"},"404":{"description":"Persisted result not found"},"503":{"description":"Result store unavailable"}},"summary":"Get an embeddable SVG card for a persisted request-source result"}},"/result/{scan_id}/evidence":{"get":{"description":"Returns a read-only persisted evidence pack derived from stored `scan_events.raw_payload` for a previous request-source-only scan. Opening this endpoint does not run a scan and does not support lookup by IP, host, target, CIDR, range, domain, or source-IP search.\n","operationId":"getPersistedScanEvidence","parameters":[{"$ref":"#/components/parameters/ScanId"},{"$ref":"#/components/parameters/EvidenceFormat"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersistedEvidenceResponse"}},"text/markdown":{"schema":{"type":"string"}}},"description":"Persisted scan evidence"},"400":{"description":"Invalid scan_id or format"},"404":{"description":"Persisted result not found"},"503":{"description":"Result store unavailable"}},"summary":"Read a persisted evidence pack by scan_id"}},"/robots.txt":{"get":{"description":"Returns no-scan crawler metadata for the public request-source-only product surface and points crawlers to `/sitemap.xml`.\n","operationId":"getRobotsTxt","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Robots text"}},"summary":"Get crawler discovery policy"}},"/sitemap.xml":{"get":{"description":"Returns no-scan sitemap metadata for the public IfPort product, documentation, support, and machine-readable surfaces.\n","operationId":"getSitemapXml","responses":{"200":{"content":{"application/xml":{"schema":{"type":"string"}}},"description":"XML sitemap"}},"summary":"Get public sitemap"}},"/sponsor-kit":{"get":{"description":"Returns a machine-readable sponsor kit with funding state, live utility proof, support tiers, roadmap unlocks, copy-paste sponsor text, and the request-source-only safety boundary. This endpoint does not run a scan.\n","operationId":"getSponsorKit","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorKitResponse"}}},"description":"Sponsor kit"}},"summary":"Get no-scan sponsor/support kit"}},"/status":{"get":{"operationId":"getStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}},"description":"Service status","headers":{"Cache-Control":{"$ref":"#/components/headers/StatusCacheControl"}}}},"summary":"Get service status without running a scan"}},"/support":{"get":{"operationId":"getSupport","responses":{"200":{"description":"Support and transparency page"}},"summary":"Support ifport.io infrastructure"}},"/trust":{"get":{"description":"Returns live defensive-boundary, quality, and reliability signals for ifport.io without running a scan.\n","operationId":"getTrust","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrustResponse"}}},"description":"Public trust status"}},"summary":"Get public trust and reliability signals"}},"/verify":{"get":{"operationId":"getVerifyInfo","responses":{"200":{"description":"Verification endpoint metadata"}},"summary":"Get snapshot verification endpoint metadata"},"post":{"description":"Validates snapshot evidence fields produced by ifport.io scan responses. Recomputes the canonical fingerprint source hash and checks snapshot_id derivation. If a signature block is provided, verifies HMAC signature integrity when server key is configured.\n","operationId":"postVerifySnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotVerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotVerifyResponse"}}},"description":"Verification result"},"400":{"description":"Invalid verification payload"}},"summary":"Verify snapshot fingerprint and optional signature"}}},"servers":[{"url":"https://ifport.io"}]}