{"openapi":"3.1.0","info":{"title":"IssueProbe API","version":"0.1.0","description":"Public account, website, report, review, plan, credential, and owner-authorized agent operations for IssueProbe.","termsOfService":"https://issueprobe.com/terms","contact":{"name":"IssueProbe","url":"https://issueprobe.com"}},"jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","servers":[{"url":"https://issueprobe.com","description":"Public IssueProbe service"}],"tags":[{"name":"Service","description":"Public service status."},{"name":"Documentation","description":"Machine-readable public documentation."},{"name":"Authentication","description":"Scanner-safe human account access."},{"name":"Agent enrollment","description":"Owner-authorized agent access."},{"name":"API credentials","description":"Human-owned scoped credentials."},{"name":"Account","description":"Customer-safe account activity."},{"name":"Websites","description":"Exact-origin and read-only repository setup."},{"name":"Public reports","description":"Exact-origin widget configuration and report intake."},{"name":"Reports","description":"Customer-safe report review operations."},{"name":"Plans","description":"Plan limits and hosted subscription operations."}],"paths":{"/healthz":{"get":{"operationId":"readHealth","tags":["Service"],"summary":"Read process health","description":"Returns process health without an external service call.","security":[],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"The service process is available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"},"example":{"status":"ok"}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/readyz":{"get":{"operationId":"readReadiness","tags":["Service"],"summary":"Read service readiness","description":"Returns one public readiness state without component names. The service shares concurrent checks and reuses each result for at most five seconds while the HTTP response remains no-store.","security":[],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"The service is ready.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadinessStatus"},"example":{"status":"ready"}}}},"503":{"description":"The service is not ready.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadinessStatus"},"example":{"status":"not_ready"}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/version":{"get":{"operationId":"readVersion","tags":["Service"],"summary":"Read the public version","description":"Returns the public application version.","security":[],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"The public version.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Version"},"example":{"version":"0.1.0"}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/openapi.json":{"get":{"operationId":"downloadOpenApi","tags":["Documentation"],"summary":"Download the OpenAPI document","description":"Returns this customer API contract as OpenAPI 3.1 JSON.","security":[],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{"schema":{"type":"object","required":["openapi","info","paths"],"additionalProperties":true},"example":{"openapi":"3.1.0","info":{"title":"IssueProbe API","version":"0.1.0"},"paths":{}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/auth/signup":{"post":{"operationId":"requestSignupLink","tags":["Authentication"],"summary":"Request a no-card account link","description":"Sends a neutral authentication response for a new or existing email address. One normalized address has a 60-second message cooldown. Durable client and global limits suppress excess email without changing the response.","security":[],"x-issueprobe-idempotency":"The cooldown and durable rate limits suppress extra messages and keep the same HTTP 202 response.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupInput"},"example":{"email":"owner@example.com","displayName":"Owner"}}}},"responses":{"202":{"description":"The neutral request result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeutralOk"},"example":{"ok":true}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/auth/magic-link":{"post":{"operationId":"requestAuthenticationLink","tags":["Authentication"],"summary":"Request an account access link","description":"Sends the same neutral response for every valid email address. Email is only an authentication channel. Durable client and global limits suppress excess email without changing the response.","security":[],"x-issueprobe-idempotency":"The cooldown and durable rate limits suppress extra messages and keep the same HTTP 202 response.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthenticationLinkInput"},"example":{"email":"owner@example.com"}}}},"responses":{"202":{"description":"The neutral request result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeutralOk"},"example":{"ok":true}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/auth/callback":{"get":{"operationId":"openAuthenticationConfirmation","tags":["Authentication"],"summary":"Open the scanner-safe confirmation","description":"A token-bearing GET stores a short-lived claim cookie and redirects to this clean address. A clean GET shows the confirmation form. No GET creates an account or authenticated browser state.","security":[],"x-issueprobe-idempotency":"A GET does not consume the one-use authentication token.","parameters":[{"$ref":"#/components/parameters/AuthenticationToken"}],"responses":{"200":{"description":"The clean confirmation form.","content":{"text/html":{"schema":{"type":"string"},"example":"<!doctype html><title>Confirm sign-in</title>"}}},"303":{"description":"The token-bearing address redirects to the clean address.","headers":{"Location":{"description":"The next safe page.","schema":{"type":"string"},"example":"/v1/auth/callback"}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}},"post":{"operationId":"confirmAuthentication","tags":["Authentication"],"summary":"Confirm account access","description":"Consumes the one-use claim after an explicit human POST and creates the authenticated browser cookie.","security":[{"authenticationClaimCookie":[]}],"x-issueprobe-idempotency":"The one-use claim can succeed once. A repeated confirmation fails safely.","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"303":{"description":"The confirmed owner continues to the dashboard.","headers":{"Location":{"description":"The next safe page.","schema":{"type":"string"},"example":"/dashboard"}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/auth/logout":{"post":{"operationId":"logoutHuman","tags":["Authentication"],"summary":"End account access","description":"Revokes the current human cookie and clears the browser authentication cookies.","security":[{"humanCookie":[]}],"x-issueprobe-idempotency":"Repeated requests leave the browser signed out.","parameters":[{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"204":{"description":"The browser is signed out."},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/me":{"get":{"operationId":"readCurrentAccount","tags":["Authentication"],"summary":"Read the current principal and account","description":"Returns the current human or agent identity and the authorized account.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"The current authorized account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentAccount"},"example":{"principal":{"id":"prn_example","type":"human","displayName":"Owner","email":"owner@example.com"},"account":{"id":"acc_example","name":"Owner account","plan":"free"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/agent-enrollments":{"post":{"operationId":"requestAgentEnrollment","tags":["Agent enrollment"],"summary":"Request owner authorization for one agent","description":"Creates one owner-authorized enrollment. Email, client, and one-hundred-email global limits use one fixed hour. An exact valid retry can recover the same unused exchange secret and sends no second email.","security":[],"x-issueprobe-idempotency":"Requires Idempotency-Key. The same client, key, and request replay one enrollment before rate consumption. A changed request with the same key fails.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/PublicClient"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentEnrollmentInput"},"example":{"ownerEmail":"owner@example.com","accountName":"Example account","agentName":"website-setup-agent","scopes":["websites:write","websites:read","reports:read","reports:write"]}}}},"responses":{"200":{"description":"The exact retry result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentEnrollmentReplay"},"example":{"enrollmentId":"enr_example","exchangeSecret":"ip_enroll_exchange_example","expiresAt":"2026-08-30T12:00:00Z","replayed":true}}}},"201":{"description":"The pending enrollment and its exchange secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentEnrollmentCreated"},"example":{"enrollmentId":"enr_example","exchangeSecret":"ip_enroll_exchange_example","expiresAt":"2026-08-30T12:00:00Z","replayed":false}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"429":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/agent-enrollments/authorize":{"get":{"operationId":"startOwnerAuthorization","tags":["Agent enrollment"],"summary":"Start scanner-safe owner authorization","description":"Stores a short-lived owner claim and redirects to the clean review page. The GET does not approve or reject the request.","security":[],"x-issueprobe-idempotency":"The GET does not consume the owner authorization token.","parameters":[{"$ref":"#/components/parameters/OwnerAuthorizationToken"}],"responses":{"303":{"description":"Continue to the clean owner review page.","headers":{"Location":{"description":"The next safe page.","schema":{"type":"string"},"example":"/agent-enrollment/authorize"}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/agent-enrollment/authorize":{"get":{"operationId":"readOwnerAuthorization","tags":["Agent enrollment"],"summary":"Review one agent request","description":"Shows the requested account name, agent name, and exact scopes without an owner email or exchange secret.","security":[{"ownerAuthorizationCookie":[]}],"x-issueprobe-idempotency":"Safe read. The page does not record a decision.","responses":{"200":{"description":"The owner review form.","content":{"text/html":{"schema":{"type":"string"},"example":"<!doctype html><title>Authorize an agent</title>"}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}},"post":{"operationId":"decideAgentEnrollment","tags":["Agent enrollment"],"summary":"Approve or reject one agent request","description":"Records one explicit owner decision. Rejection for a new owner email creates no account.","security":[{"ownerAuthorizationCookie":[]}],"x-issueprobe-idempotency":"The one-use owner claim can record one decision. A repeated POST fails safely.","parameters":[{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AgentEnrollmentDecision"},"example":{"decision":"approve","csrfToken":"csrf-example"}}}},"responses":{"200":{"description":"A safe new-owner rejection confirmation.","content":{"text/html":{"schema":{"type":"string"},"example":"<!doctype html><title>Agent request rejected</title>"}}},"303":{"description":"An existing owner continues to the credential page.","headers":{"Location":{"description":"The next safe page.","schema":{"type":"string"},"example":"/dashboard/api-credentials?notice=enrollment-approved"}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/agent-enrollments/{enrollmentId}/exchange":{"post":{"operationId":"exchangeAgentEnrollment","tags":["Agent enrollment"],"summary":"Exchange one approved enrollment secret","description":"Returns one scoped API credential once after owner approval. The exchange and enrollment expire after seven days.","security":[],"x-issueprobe-idempotency":"The exchange succeeds once. A repeated exchange creates no second credential.","parameters":[{"$ref":"#/components/parameters/EnrollmentId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentEnrollmentExchange"},"example":{"exchangeSecret":"ip_enroll_exchange_example"}}}},"responses":{"201":{"description":"The one-time API credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedCredentialEnvelope"},"example":{"credential":{"id":"cred_example","name":"website-setup-agent","token":"ip_api_example","scopes":["websites:write","websites:read"],"expiresAt":"2026-11-28T12:00:00Z"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"410":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/api-credentials":{"get":{"operationId":"listApiCredentials","tags":["API credentials"],"summary":"List API credentials without raw values","description":"Returns safe credential metadata for a human owner.","security":[{"humanCookie":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"Safe credential metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialList"},"example":{"items":[{"id":"cred_example","name":"website-setup-agent","scopes":["websites:read"],"createdAt":"2026-08-22T12:00:00Z","expiresAt":"2026-11-20T12:00:00Z","lastUsedAt":null,"revokedAt":null}]}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}},"post":{"operationId":"createApiCredential","tags":["API credentials"],"summary":"Create one owner-authorized API credential","description":"Only a human owner can create a credential. The raw value appears in this no-store response only.","security":[{"humanCookie":[]}],"x-issueprobe-idempotency":"This operation does not accept an idempotency key. A successful request creates one new credential.","parameters":[{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCredentialInput"},"example":{"name":"website-setup-agent","scopes":["websites:read","reports:read"],"expiresAt":"2026-11-20T12:00:00Z"}}}},"responses":{"201":{"description":"The one-time credential response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedCredentialEnvelope"},"example":{"credential":{"id":"cred_example","name":"website-setup-agent","token":"ip_api_example","scopes":["websites:read","reports:read"],"expiresAt":"2026-11-20T12:00:00Z"}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/api-credentials/{credentialId}":{"delete":{"operationId":"revokeApiCredential","tags":["API credentials"],"summary":"Revoke one API credential","description":"Only a human owner can revoke a credential. A revoked credential cannot authenticate later calls.","security":[{"humanCookie":[]}],"x-issueprobe-idempotency":"Repeated revocation requests keep the credential revoked.","parameters":[{"$ref":"#/components/parameters/CredentialId"},{"$ref":"#/components/parameters/MutationProof"}],"responses":{"204":{"description":"The credential is revoked."},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/audit-events":{"get":{"operationId":"listAuditEvents","tags":["Account"],"summary":"List customer-safe account activity","description":"Returns safe human, agent, website, report, credential, enrollment, plan, and subscription actions.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"Customer-safe account activity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditEventList"},"example":{"items":[{"actorType":"agent","actorLabel":"website-setup-agent","action":"website.created","createdAt":"2026-08-22T12:00:00Z"}]}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites":{"get":{"operationId":"listWebsites","tags":["Websites"],"summary":"List authorized websites","description":"Returns account websites with origin and repository readiness states.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"The authorized website list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteList"},"example":{"items":[{"id":"web_example","name":"Example Site","state":"ready","primaryOrigin":"https://www.example.com","position":"right","repositoryState":"ready","verifiedOriginCount":1,"updatedAt":"2026-08-22T12:00:00Z"}]}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}},"post":{"operationId":"createWebsite","tags":["Websites"],"summary":"Register one website and repository","description":"Creates one website, exact origin, public widget key, and website-specific read-only deploy key.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"This operation does not accept an idempotency key. A successful request creates one website.","parameters":[{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebsiteInput"},"example":{"name":"Example Site","primaryOrigin":"https://www.example.com","position":"right","repository":{"sshUrl":"git@example.com:owner/site.git","defaultBranch":"main","hostKeyFingerprint":"SHA256:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="}}}}},"responses":{"201":{"description":"The new website and public deploy key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedWebsite"},"example":{"website":{"id":"web_example","name":"Example Site","state":"needs_origin_proof","primaryOrigin":"https://www.example.com","publicWidgetKey":"ip_widget_example","position":"right"},"repository":{"state":"needs_deploy_key","publicDeployKey":"ssh-ed25519 AAAAexample issueprobe-web_example"}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}":{"get":{"operationId":"readWebsite","tags":["Websites"],"summary":"Read one website setup","description":"Returns exact origins, public well-known proof publication data, the neutral repository revision mode and current revision, evidence settings, plan limits, and readiness.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","parameters":[{"$ref":"#/components/parameters/WebsiteId"}],"responses":{"200":{"description":"One authorized website.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDetail"},"example":{"website":{"id":"web_example","name":"Example Site","state":"ready","primaryOrigin":"https://www.example.com","publicWidgetKey":"ip_widget_example","position":"right","createdAt":"2026-08-22T12:00:00Z","updatedAt":"2026-08-22T12:00:00Z"},"origins":[{"id":"orgn_example","origin":"https://www.example.com","state":"pending","proofMethod":null,"verifiedAt":null,"verification":{"method":"well_known","url":"https://www.example.com/.well-known/issueprobe-verification.txt","content":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}],"repository":{"sshUrl":"git@example.com:owner/site.git","defaultBranch":"main","deployedRevision":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","revisionMode":"branch_head","publicDeployKey":"ssh-ed25519 AAAAexample issueprobe-web_example","state":"ready","lastCheckedAt":"2026-08-22T12:00:00Z","lastErrorCode":null},"evidenceSettings":{"screenshot":true,"console":true,"network":true,"browserStateMetadata":true},"limits":{"websites":1,"investigationsPerMonth":3,"activeInvestigations":{"scope":"account","count":1},"artifactRetentionDays":7},"readiness":{"originVerified":true,"repositoryReady":true,"widgetReady":true}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}},"patch":{"operationId":"updateWebsite","tags":["Websites"],"summary":"Update a website name or widget position","description":"Changes only the website name or left-right widget position.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Repeating the same fields leaves the same website settings.","parameters":[{"$ref":"#/components/parameters/WebsiteId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebsiteInput"},"example":{"name":"Example Product","position":"left"}}}},"responses":{"200":{"description":"The updated website setup.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteDetail"},"example":{"website":{"id":"web_example","name":"Example Product","position":"left"}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}/origins":{"post":{"operationId":"addWebsiteOrigin","tags":["Websites"],"summary":"Add one exact website origin","description":"Normalizes a root HTTP or HTTPS origin and stores it in a pending state.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"A duplicate normalized origin fails with a stable conflict error.","parameters":[{"$ref":"#/components/parameters/WebsiteId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOriginInput"},"example":{"origin":"https://app.example.com/"}}}},"responses":{"201":{"description":"The pending exact origin.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginEnvelope"},"example":{"origin":{"id":"orgn_example","origin":"https://app.example.com","state":"pending"}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}/origins/{originId}/verify":{"post":{"operationId":"verifyWebsiteOrigin","tags":["Websites"],"summary":"Verify control of one exact origin","description":"Fetches the exact HTTPS well-known file without credentials or redirects and requires the exact public proof text.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"A repeated successful proof performs no fetch and adds no duplicate audit event.","parameters":[{"$ref":"#/components/parameters/WebsiteId"},{"$ref":"#/components/parameters/OriginId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyOriginInput"},"example":{"method":"well_known"}}}},"responses":{"200":{"description":"The verified exact origin.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginEnvelope"},"example":{"origin":{"id":"orgn_example","origin":"https://www.example.com","state":"verified","verifiedAt":"2026-08-22T12:00:00Z"}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}/evidence-settings":{"put":{"operationId":"replaceEvidenceSettings","tags":["Websites"],"summary":"Replace evidence category settings","description":"Enables or disables fixed categories. No setting can enable cookie, form, or local-storage values.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Repeating the same category states leaves the same settings.","parameters":[{"$ref":"#/components/parameters/WebsiteId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidenceSettings"},"example":{"screenshot":true,"console":true,"network":true,"browserStateMetadata":true}}}},"responses":{"200":{"description":"The fixed category settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidenceSettingsEnvelope"},"example":{"evidenceSettings":{"screenshot":true,"console":true,"network":true,"browserStateMetadata":true}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}/widget-key/rotate":{"post":{"operationId":"rotateWidgetKey","tags":["Websites"],"summary":"Rotate one public widget key","description":"Replaces the public website identifier. The old identifier stops reading configuration or creating reports.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"This operation creates a new public identifier on each successful request.","parameters":[{"$ref":"#/components/parameters/WebsiteId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"The replacement public widget key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetKey"},"example":{"publicWidgetKey":"ip_widget_example"}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}/deploy-key/rotate":{"post":{"operationId":"rotateDeployKey","tags":["Websites"],"summary":"Rotate one website deploy key","description":"Creates a replacement website-specific key and returns only its public value.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"This operation creates a new key pair on each successful request.","parameters":[{"$ref":"#/components/parameters/WebsiteId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"The replacement public deploy key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployKey"},"example":{"state":"needs_deploy_key","publicDeployKey":"ssh-ed25519 AAAAexample issueprobe-web_example"}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"503":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}/repository/check":{"post":{"operationId":"checkRepositoryReadiness","tags":["Websites"],"summary":"Check read-only repository access","description":"Checks read-only access. Branch-head mode records the current remote branch head. Pinned mode preserves the owner-supplied revision.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Each successful branch-head check can refresh the current revision. A pinned check preserves its revision.","parameters":[{"$ref":"#/components/parameters/WebsiteId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"The safe repository readiness result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepositoryCheck"},"example":{"state":"ready","deployedRevision":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","errorCode":null,"checkedAt":"2026-08-22T12:00:00Z"}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"503":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}/install":{"get":{"operationId":"readWidgetInstall","tags":["Websites"],"summary":"Read the widget installation snippet","description":"Returns the versioned widget snippet and exact verified origins.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","parameters":[{"$ref":"#/components/parameters/WebsiteId"}],"responses":{"200":{"description":"The widget installation data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetInstall"},"example":{"script":"<script src=\"https://issueprobe.com/widget/v1/issueprobe.js\" data-website=\"ip_widget_example\" async></script>","verifiedOrigins":["https://www.example.com"]}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/websites/{websiteId}/readiness":{"get":{"operationId":"readWebsiteReadiness","tags":["Websites"],"summary":"Read website readiness","description":"Returns safe origin, repository, and widget readiness states.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","parameters":[{"$ref":"#/components/parameters/WebsiteId"}],"responses":{"200":{"description":"The website readiness state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteReadiness"},"example":{"state":"ready","checks":{"origin":"ready","repository":"ready","widget":"ready"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/public/widget-config":{"get":{"operationId":"readPublicWidgetConfiguration","tags":["Public reports"],"summary":"Read exact-origin widget configuration","description":"Returns configuration only when the public widget key and request Origin match one verified website.","security":[],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","parameters":[{"$ref":"#/components/parameters/WebsiteKeyQuery"},{"$ref":"#/components/parameters/OriginHeader"}],"responses":{"200":{"description":"The public widget configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetConfiguration"},"example":{"website":{"name":"Example Site","position":"right"},"reportTypes":["problem","suggestion"],"evidence":{"screenshot":true,"console":true,"network":true,"browserStateMetadata":true,"maxScreenshotBytes":5242880},"privacyUrl":"https://issueprobe.com/privacy/widget"}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/public/reports":{"options":{"operationId":"preflightPublicReport","tags":["Public reports"],"summary":"Check exact-origin report access","description":"Allows the documented report headers only for a ready website and exact verified origin.","security":[],"x-issueprobe-idempotency":"Safe preflight. Repeated requests do not change state.","parameters":[{"$ref":"#/components/parameters/WebsiteKeyQuery"},{"$ref":"#/components/parameters/OriginHeader"}],"responses":{"204":{"description":"The exact origin can submit a report.","headers":{"Access-Control-Allow-Origin":{"schema":{"type":"string"},"example":"https://www.example.com"},"Access-Control-Allow-Headers":{"schema":{"type":"string"},"example":"Content-Type, Idempotency-Key, X-IssueProbe-Client"}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}},"post":{"operationId":"createPublicReport","tags":["Public reports"],"summary":"Create one exact-origin website report","description":"Stores a problem or suggestion with bounded approved evidence. An optional screenshot must match explicit consent.","security":[],"x-issueprobe-idempotency":"Requires Idempotency-Key. An exact request replays its first safe result for 24 hours. A changed request with the same key fails.","parameters":[{"$ref":"#/components/parameters/WebsiteKeyQuery"},{"$ref":"#/components/parameters/OriginHeader"},{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/PublicClient"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PublicReportMultipart"},"example":{"payload":"{\"websiteKey\":\"ip_widget_example\",\"type\":\"problem\",\"description\":\"The save button does not finish.\",\"page\":{\"url\":\"https://www.example.com/profile\",\"title\":\"Profile\",\"locale\":\"en-US\",\"timeZone\":\"UTC\",\"viewport\":{\"width\":1440,\"height\":900}},\"console\":[],\"network\":[],\"browserState\":{\"cookies\":[],\"formFields\":[],\"localStorage\":[]},\"consent\":{\"screenshot\":false,\"evidence\":true}}"}}}},"responses":{"201":{"description":"The stored report and safe investigation state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicReportResult"},"example":{"report":{"id":"rpt_example","reference":"IPR-1042","state":"queued","receivedAt":"2026-08-22T14:00:02Z"},"investigation":{"state":"queued"}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"429":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/reports":{"get":{"operationId":"listReports","tags":["Reports"],"summary":"List account reports","description":"Filters customer-safe reports and uses a bounded opaque cursor.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","parameters":[{"$ref":"#/components/parameters/WebsiteFilter"},{"$ref":"#/components/parameters/ReportTypeFilter"},{"$ref":"#/components/parameters/ReportStateFilter"},{"$ref":"#/components/parameters/ReviewStateFilter"},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"A customer-safe report page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportList"},"example":{"items":[{"id":"rpt_example","reference":"IPR-1042","website":{"id":"web_example","name":"Example Site"},"type":"problem","state":"ready_for_review","summary":"The profile save request failed.","conclusionStatus":"likely","reviewState":"pending","reviewDisposition":null,"receivedAt":"2026-08-22T14:00:02Z","updatedAt":"2026-08-22T14:08:00Z"}],"nextCursor":null}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/reports/{reportId}":{"get":{"operationId":"readReport","tags":["Reports"],"summary":"Read one customer-safe report","description":"Returns the visitor report, safe browser evidence, source-backed result, unknown facts, recommended action, owner draft, review, plan use, and safe account activity.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","parameters":[{"$ref":"#/components/parameters/ReportId"}],"responses":{"200":{"description":"One customer-safe report.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDetail"},"example":{"report":{"id":"rpt_example","reference":"IPR-1042","website":{"id":"web_example","name":"Example Site","state":"ready"},"type":"problem","description":"The save button does not finish.","state":"ready_for_review","page":{"url":"https://www.example.com/profile","title":"Profile","locale":"en-US","timeZone":"UTC","viewport":{"width":1440,"height":900}},"receivedAt":"2026-08-22T14:00:02Z","updatedAt":"2026-08-22T14:08:00Z","archivedAt":null},"browserEvidence":{"console":[],"network":[],"browserState":{"cookies":[],"formFields":[],"localStorage":[]}},"result":{"schemaVersion":1,"reportSummary":{"title":"Profile save request fails","visitorSummary":"The visitor cannot save profile changes.","technicalSummary":"The active save branch can fail."},"classification":{"reportType":"problem","confidence":0.82,"reason":"The visitor and source evidence describe the same save path."},"conclusion":{"status":"likely","summary":"The active save path does not handle an absent field.","confidence":0.82,"evidenceIds":["EV-001","EV-002"],"limits":"The affected visitor count is unknown."},"evidence":[{"id":"EV-001","type":"browser_network","description":"The save request returned an error.","excerpt":"POST /api/profile -> 500 in 412 ms","observedAt":"2026-08-22T14:00:01Z","source":{"kind":"visitor_browser","reference":"report-network-1"}},{"id":"EV-002","type":"source_code","description":"The active branch uses an absent field without a check.","excerpt":"const zone = profile.timeZone.trim()","observedAt":"2026-08-22T14:06:30Z","source":{"kind":"repository","repositoryRevision":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","path":"src/routes/profile.ts","lineStart":118,"lineEnd":124}}],"unknowns":[{"fact":"The affected visitor count","whyUnknown":"The evidence contains one report.","nextEvidence":"Review an approved aggregate before a production decision."}],"recommendedAction":{"type":"code_change","summary":"Handle the absent field before the save path uses it.","steps":["Add a safe branch.","Add a focused regression test."],"risk":"low","requiresHumanApproval":true,"evidenceIds":["EV-002"]},"draftResponse":{"body":"Thank you for the report. The owner will review the save behavior.","claimsEvidenceIds":["EV-001","EV-002"]}},"artifacts":[],"draftResponse":{"body":"Thank you for the report.","source":"result","updatedAt":null},"review":null,"planUse":{"plan":"free","limits":{"websites":1,"investigationsPerMonth":3,"activeInvestigations":{"scope":"account","count":1},"artifactRetentionDays":7},"usage":{"websites":1,"investigationsStarted":1,"reportsReceived":1,"periodStartsAt":"2026-08-01T00:00:00Z","periodEndsAt":"2026-09-01T00:00:00Z"}},"auditHistory":[],"investigationElapsedMs":60000}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/reports/{reportId}/artifacts/{artifactId}":{"get":{"operationId":"readReportArtifact","tags":["Reports"],"summary":"Read one authorized screenshot","description":"Checks the exact account, website, report, artifact, media type, safety state, and retention time.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","parameters":[{"$ref":"#/components/parameters/ReportId"},{"$ref":"#/components/parameters/ArtifactId"}],"responses":{"200":{"description":"An approved PNG, JPEG, or WebP screenshot.","headers":{"Cache-Control":{"schema":{"type":"string","const":"no-store"},"example":"no-store"},"Content-Disposition":{"schema":{"type":"string"},"example":"inline; filename=\"issueprobe-screenshot.png\""}},"content":{"image/png":{"schema":{"type":"string","format":"binary"},"example":"binary image data"},"image/jpeg":{"schema":{"type":"string","format":"binary"},"example":"binary image data"},"image/webp":{"schema":{"type":"string","format":"binary"},"example":"binary image data"}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"410":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/reports/{reportId}/draft-response":{"put":{"operationId":"saveDraftResponse","tags":["Reports"],"summary":"Save one owner draft revision","description":"Appends an owner draft outside the immutable result. This operation sends no visitor message.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Each successful request appends a new draft revision.","parameters":[{"$ref":"#/components/parameters/ReportId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftResponseInput"},"example":{"body":"Thank you for the report. The owner will review the next change."}}}},"responses":{"200":{"description":"The saved draft revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftResponseEnvelope"},"example":{"draftResponse":{"body":"Thank you for the report. The owner will review the next change.","source":"owner","updatedAt":"2026-08-22T14:10:00Z"}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/reports/{reportId}/review":{"post":{"operationId":"reviewReport","tags":["Reports"],"summary":"Record one human review decision","description":"Appends one human disposition outside the immutable result.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"One report result accepts one review decision. A conflicting repeated decision fails safely.","parameters":[{"$ref":"#/components/parameters/ReportId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportReviewInput"},"example":{"disposition":"accepted_with_edits"}}}},"responses":{"201":{"description":"The saved human review decision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewEnvelope"},"example":{"review":{"disposition":"accepted_with_edits","reviewedAt":"2026-08-22T14:12:00Z"}}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/reports/{reportId}/archive":{"post":{"operationId":"archiveReport","tags":["Reports"],"summary":"Archive one report","description":"Uses an explicit report transition and cancels queued work without a quota refund.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Repeated requests leave the report archived.","parameters":[{"$ref":"#/components/parameters/ReportId"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"The archived report state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportStateEnvelope"},"example":{"report":{"id":"rpt_example","state":"archived"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"404":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/reports/{reportId}/investigations":{"post":{"operationId":"requestReportInvestigation","tags":["Reports"],"summary":"Request one new investigation","description":"Rechecks report state, website readiness, monthly quota, and active limits before one follow-up investigation.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Requires Idempotency-Key. An exact retry returns the first safe result. A changed request with the same key fails.","parameters":[{"$ref":"#/components/parameters/ReportId"},{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"202":{"description":"One new investigation is queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvestigationRequestResult"},"example":{"report":{"id":"rpt_example","state":"queued"},"investigation":{"state":"queued"},"replayed":false}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/plan":{"get":{"operationId":"readPlan","tags":["Plans"],"summary":"Read plan limits and monthly use","description":"Returns the exact Free or Pro limits and current account use.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"The current plan limits and use.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanUse"},"example":{"plan":"free","limits":{"websites":1,"investigationsPerMonth":3,"activeInvestigations":{"scope":"account","count":1},"artifactRetentionDays":7},"usage":{"websites":1,"investigationsStarted":2,"reportsReceived":4,"periodStartsAt":"2026-08-01T00:00:00Z","periodEndsAt":"2026-09-01T00:00:00Z"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/metrics/useful-results":{"get":{"operationId":"readUsefulResultMetrics","tags":["Reports"],"summary":"Read customer review metrics","description":"Returns the accepted-result rate and median report-to-ready time only when account data supports them.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"Customer-safe review metrics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsefulResultMetrics"},"example":{"usefulResultRate":{"accepted":3,"reviewed":4,"rate":0.75},"medianReportToReadyMs":62000}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/subscription":{"get":{"operationId":"readSubscription","tags":["Plans"],"summary":"Read customer-safe subscription state","description":"Returns the account plan and safe subscription state without external identifiers.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Safe read. Repeated requests do not change state.","responses":{"200":{"description":"The safe subscription state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SafeSubscription"},"example":{"plan":"pro","subscription":{"state":"active","cancelAtPeriodEnd":false,"currentPeriodEndsAt":"2026-09-22T12:00:00Z"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/billing/checkout":{"post":{"operationId":"createCheckout","tags":["Plans"],"summary":"Create hosted Checkout for Pro","description":"Creates a hosted HTTPS Checkout page for the exact US$49 monthly Pro plan. IssueProbe does not receive card data.","security":[{"humanCookie":[]},{"agentCredential":[]}],"x-issueprobe-idempotency":"Requires Idempotency-Key. An exact valid retry returns the same hosted Checkout page.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"201":{"description":"The exact hosted Checkout URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostedCheckout"},"example":{"url":"https://checkout.stripe.com/c/pay/example","replayed":false}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"503":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/billing/portal":{"post":{"operationId":"createBillingPortal","tags":["Plans"],"summary":"Create hosted subscription management","description":"Creates a hosted HTTPS subscription-management page for a human owner with a managed customer.","security":[{"humanCookie":[]}],"x-issueprobe-idempotency":"Each successful request creates a short-lived hosted management page.","parameters":[{"$ref":"#/components/parameters/MutationProof"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false},"example":{}}}},"responses":{"201":{"description":"The exact hosted management URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostedPortal"},"example":{"url":"https://billing.stripe.com/p/example"}}}},"401":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"403":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"409":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"503":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}},"/v1/webhooks/stripe":{"post":{"operationId":"receiveStripeEvent","tags":["Plans"],"summary":"Receive one signed Stripe event","description":"Verifies the exact raw body and complete IssueProbe product ownership before any local state change.","security":[{"stripeSignature":[]}],"x-issueprobe-idempotency":"An owned event identifier applies once. A replay returns a duplicate outcome. A foreign event creates no local record.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","created","livemode","data"],"additionalProperties":true},"example":{"id":"evt_example","type":"customer.subscription.updated","created":1787400000,"livemode":false,"data":{"object":{"id":"sub_example"}}}}}},"responses":{"200":{"description":"The safe event outcome.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StripeEventResult"},"example":{"received":true,"outcome":"applied"}}}},"400":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"503":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}},"default":{"description":"The service returns a stable error code and a safe message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"payload_invalid","message":"The request payload is invalid.","requestId":"req_example"}}}}}}}}},"components":{"securitySchemes":{"humanCookie":{"type":"apiKey","in":"cookie","name":"ip_session","description":"Secure human account cookie."},"agentCredential":{"type":"http","scheme":"bearer","bearerFormat":"IssueProbe API credential"},"authenticationClaimCookie":{"type":"apiKey","in":"cookie","name":"ip_auth_claim","description":"Short-lived scanner-safe authentication claim."},"ownerAuthorizationCookie":{"type":"apiKey","in":"cookie","name":"ip_enroll_claim","description":"Short-lived owner authorization claim."},"stripeSignature":{"type":"apiKey","in":"header","name":"Stripe-Signature","description":"Stripe webhook signature over the exact raw body."}},"parameters":{"MutationProof":{"name":"X-CSRF-Token","in":"header","required":false,"description":"Cookie mutations need this server-issued value or an exact same-origin Origin header. Bearer calls use scopes instead.","schema":{"type":"string","minLength":43,"maxLength":43}},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":true,"description":"A caller-owned key for one logical action.","schema":{"type":"string","minLength":8,"maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"},"example":"setup-2026-08-22-001"},"PublicClient":{"name":"X-IssueProbe-Client","in":"header","required":true,"description":"A bounded caller identifier used only through a keyed hash for public limits.","schema":{"type":"string","minLength":8,"maxLength":200},"example":"browser-install-001"},"AuthenticationToken":{"name":"token","in":"query","required":false,"description":"The emailed one-use value. Omit it on the clean confirmation address.","schema":{"type":"string","pattern":"^ip_auth_[A-Za-z0-9_-]{43}$"},"example":"ip_auth_example"},"OwnerAuthorizationToken":{"name":"token","in":"query","required":true,"description":"The one-use owner authorization value from the email link.","schema":{"type":"string","pattern":"^ip_enroll_owner_[A-Za-z0-9_-]{43}$"},"example":"ip_enroll_owner_example"},"EnrollmentId":{"name":"enrollmentId","in":"path","required":true,"schema":{"type":"string","pattern":"^enr_"},"example":"enr_example"},"CredentialId":{"name":"credentialId","in":"path","required":true,"schema":{"type":"string","pattern":"^cred_"},"example":"cred_example"},"WebsiteId":{"name":"websiteId","in":"path","required":true,"schema":{"type":"string","pattern":"^web_"},"example":"web_example"},"OriginId":{"name":"originId","in":"path","required":true,"schema":{"type":"string","pattern":"^orgn_"},"example":"orgn_example"},"ReportId":{"name":"reportId","in":"path","required":true,"schema":{"type":"string","pattern":"^rpt_"},"example":"rpt_example"},"ArtifactId":{"name":"artifactId","in":"path","required":true,"schema":{"type":"string","pattern":"^art_"},"example":"art_example"},"OriginHeader":{"name":"Origin","in":"header","required":true,"description":"The exact normalized website origin.","schema":{"type":"string","format":"uri"},"example":"https://www.example.com"},"WebsiteKeyQuery":{"name":"websiteKey","in":"query","required":true,"schema":{"type":"string","pattern":"^ip_widget_"},"example":"ip_widget_example"},"WebsiteFilter":{"name":"websiteId","in":"query","required":false,"schema":{"type":"string","pattern":"^web_"}},"ReportTypeFilter":{"name":"type","in":"query","required":false,"schema":{"enum":["problem","suggestion"]}},"ReportStateFilter":{"name":"state","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ReportState"}},"ReviewStateFilter":{"name":"reviewState","in":"query","required":false,"schema":{"enum":["pending","reviewed"]}},"Cursor":{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":1000}},"Limit":{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId"],"properties":{"code":{"type":"string","minLength":1,"maxLength":100},"message":{"type":"string","minLength":1,"maxLength":500},"requestId":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}},"additionalProperties":false},"NeutralOk":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}},"additionalProperties":false},"Health":{"type":"object","required":["status"],"properties":{"status":{"type":"string","const":"ok"}},"additionalProperties":false},"ReadinessStatus":{"type":"object","required":["status"],"properties":{"status":{"enum":["ready","not_ready"]}},"additionalProperties":false},"Version":{"type":"object","required":["version"],"properties":{"version":{"type":"string","minLength":1,"maxLength":100}},"additionalProperties":false},"ApiScope":{"enum":["websites:write","websites:read","audit:read","reports:read","reports:write","billing:checkout","credentials:write"]},"EnrollmentScope":{"enum":["websites:write","websites:read","audit:read","reports:read","reports:write","billing:checkout"]},"SignupInput":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","maxLength":320},"displayName":{"type":"string","minLength":1,"maxLength":120}},"additionalProperties":false},"AuthenticationLinkInput":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","maxLength":320}},"additionalProperties":false},"CurrentAccount":{"type":"object","required":["principal","account"],"properties":{"principal":{"type":"object","required":["id","type","displayName","email"],"properties":{"id":{"type":"string","pattern":"^prn_"},"type":{"enum":["human","agent"]},"displayName":{"type":"string","minLength":1,"maxLength":120},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}]}},"additionalProperties":false},"account":{"type":"object","required":["id","name","plan"],"properties":{"id":{"type":"string","pattern":"^acc_"},"name":{"type":"string"},"plan":{"enum":["free","pro"]}},"additionalProperties":false}},"additionalProperties":false},"AgentEnrollmentInput":{"type":"object","required":["ownerEmail","accountName","agentName","scopes"],"properties":{"ownerEmail":{"type":"string","format":"email","maxLength":320},"accountName":{"type":"string","minLength":1,"maxLength":120},"agentName":{"type":"string","minLength":1,"maxLength":120},"scopes":{"type":"array","minItems":1,"maxItems":6,"uniqueItems":true,"items":{"enum":["websites:write","websites:read","audit:read","reports:read","reports:write","billing:checkout"]}}},"additionalProperties":false},"AgentEnrollmentCreated":{"type":"object","required":["enrollmentId","exchangeSecret","expiresAt","replayed"],"properties":{"enrollmentId":{"type":"string","pattern":"^enr_"},"exchangeSecret":{"type":"string","pattern":"^ip_enroll_exchange_"},"expiresAt":{"type":"string","format":"date-time"},"replayed":{"type":"boolean","const":false}},"additionalProperties":false},"AgentEnrollmentReplay":{"type":"object","required":["enrollmentId","exchangeSecret","expiresAt","replayed"],"properties":{"enrollmentId":{"type":"string","pattern":"^enr_"},"exchangeSecret":{"anyOf":[{"type":"string","pattern":"^ip_enroll_exchange_"},{"type":"null"}]},"expiresAt":{"type":"string","format":"date-time"},"replayed":{"type":"boolean","const":true}},"additionalProperties":false},"AgentEnrollmentDecision":{"type":"object","required":["decision","csrfToken"],"properties":{"decision":{"enum":["approve","reject"]},"csrfToken":{"type":"string","minLength":43,"maxLength":43}},"additionalProperties":false},"AgentEnrollmentExchange":{"type":"object","required":["exchangeSecret"],"properties":{"exchangeSecret":{"type":"string","pattern":"^ip_enroll_exchange_"}},"additionalProperties":false},"CreateCredentialInput":{"type":"object","required":["name","scopes","expiresAt"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"scopes":{"type":"array","minItems":1,"maxItems":20,"uniqueItems":true,"items":{"enum":["websites:write","websites:read","audit:read","reports:read","reports:write","billing:checkout","credentials:write"]}},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"CreatedCredential":{"type":"object","required":["id","name","token","scopes","expiresAt"],"properties":{"id":{"type":"string","pattern":"^cred_"},"name":{"type":"string"},"token":{"type":"string","pattern":"^ip_api_"},"scopes":{"type":"array","items":{"enum":["websites:write","websites:read","audit:read","reports:read","reports:write","billing:checkout","credentials:write"]}},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"CreatedCredentialEnvelope":{"type":"object","required":["credential"],"properties":{"credential":{"$ref":"#/components/schemas/CreatedCredential"}},"additionalProperties":false},"ListedCredential":{"type":"object","required":["id","name","scopes","createdAt","expiresAt","lastUsedAt","revokedAt"],"properties":{"id":{"type":"string","pattern":"^cred_"},"name":{"type":"string"},"scopes":{"type":"array","items":{"enum":["websites:write","websites:read","audit:read","reports:read","reports:write","billing:checkout","credentials:write"]}},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"additionalProperties":false},"CredentialList":{"type":"object","required":["items"],"properties":{"items":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/ListedCredential"}}},"additionalProperties":false},"AuditEvent":{"type":"object","required":["actorType","actorLabel","action","createdAt"],"properties":{"actorType":{"enum":["human","agent","system","billing"]},"actorLabel":{"type":"string"},"action":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"AuditEventList":{"type":"object","required":["items"],"properties":{"items":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/AuditEvent"}}},"additionalProperties":false},"CreateWebsiteInput":{"type":"object","required":["name","primaryOrigin","repository"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"primaryOrigin":{"type":"string","format":"uri"},"position":{"enum":["left","right"]},"repository":{"type":"object","required":["sshUrl","defaultBranch"],"properties":{"sshUrl":{"type":"string","minLength":1,"maxLength":2048},"defaultBranch":{"type":"string","minLength":1,"maxLength":255},"deployedRevision":{"type":"string","pattern":"^([0-9a-fA-F]{40}|[0-9a-fA-F]{64})$"},"hostKeyFingerprint":{"type":"string","pattern":"^SHA256:[A-Za-z0-9+/]{43}=?$"}},"additionalProperties":false}},"additionalProperties":false},"UpdateWebsiteInput":{"type":"object","minProperties":1,"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"position":{"enum":["left","right"]}},"additionalProperties":false},"WebsiteSummary":{"type":"object","required":["id","name","state","primaryOrigin","position","repositoryState","verifiedOriginCount","updatedAt"],"properties":{"id":{"type":"string","pattern":"^web_"},"name":{"type":"string"},"state":{"type":"string"},"primaryOrigin":{"type":"string","format":"uri"},"position":{"enum":["left","right"]},"repositoryState":{"type":"string"},"verifiedOriginCount":{"type":"integer","minimum":0},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"WebsiteList":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WebsiteSummary"}}},"additionalProperties":false},"CreatedWebsite":{"type":"object","required":["website","repository"],"properties":{"website":{"type":"object","required":["id","name","state","primaryOrigin","publicWidgetKey","position"],"properties":{"id":{"type":"string","pattern":"^web_"},"name":{"type":"string"},"state":{"type":"string"},"primaryOrigin":{"type":"string","format":"uri"},"publicWidgetKey":{"type":"string","pattern":"^ip_widget_"},"position":{"enum":["left","right"]}},"additionalProperties":false},"repository":{"type":"object","required":["state","publicDeployKey"],"properties":{"state":{"type":"string"},"publicDeployKey":{"type":"string","minLength":1}},"additionalProperties":false}},"additionalProperties":false},"WebsiteDetail":{"type":"object","required":["website","origins","repository","evidenceSettings","limits","readiness"],"properties":{"website":{"type":"object","required":["id","name","state","primaryOrigin","publicWidgetKey","position","createdAt","updatedAt"],"properties":{"id":{"type":"string","pattern":"^web_"},"name":{"type":"string"},"state":{"type":"string"},"primaryOrigin":{"type":"string","format":"uri"},"publicWidgetKey":{"type":"string","pattern":"^ip_widget_"},"position":{"enum":["left","right"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"origins":{"type":"array","items":{"type":"object","required":["id","origin","state"],"properties":{"id":{"type":"string","pattern":"^orgn_"},"origin":{"type":"string","format":"uri"},"state":{"enum":["pending","verified"]},"proofMethod":{"anyOf":[{"const":"well_known"},{"type":"null"}]},"verifiedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"verification":{"anyOf":[{"type":"object","required":["method","url","content"],"properties":{"method":{"const":"well_known"},"url":{"type":"string","format":"uri","pattern":"^https://.*/\\.well-known/issueprobe-verification\\.txt$"},"content":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false}},"repository":{"type":"object","required":["sshUrl","defaultBranch","deployedRevision","revisionMode","publicDeployKey","state","lastCheckedAt","lastErrorCode"],"properties":{"sshUrl":{"type":"string"},"defaultBranch":{"type":"string"},"deployedRevision":{"anyOf":[{"type":"string","pattern":"^([0-9a-fA-F]{40}|[0-9a-fA-F]{64})$"},{"type":"null"}]},"revisionMode":{"enum":["branch_head","pinned"]},"publicDeployKey":{"type":"string"},"state":{"type":"string"},"lastCheckedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"lastErrorCode":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false},"evidenceSettings":{"type":"object","required":["screenshot","console","network","browserStateMetadata"],"properties":{"screenshot":{"type":"boolean"},"console":{"type":"boolean"},"network":{"type":"boolean"},"browserStateMetadata":{"type":"boolean"}},"additionalProperties":false},"limits":{"type":"object","required":["websites","investigationsPerMonth","activeInvestigations","artifactRetentionDays"],"properties":{"websites":{"type":"integer","minimum":1},"investigationsPerMonth":{"type":"integer","minimum":1},"activeInvestigations":{"type":"object","required":["scope","count"],"properties":{"scope":{"enum":["account","website"]},"count":{"type":"integer","minimum":1}},"additionalProperties":false},"artifactRetentionDays":{"type":"integer","minimum":1}},"additionalProperties":false},"readiness":{"type":"object","required":["originVerified","repositoryReady","widgetReady"],"properties":{"originVerified":{"type":"boolean"},"repositoryReady":{"type":"boolean"},"widgetReady":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"CreateOriginInput":{"type":"object","required":["origin"],"properties":{"origin":{"type":"string","format":"uri"}},"additionalProperties":false},"VerifyOriginInput":{"type":"object","required":["method"],"properties":{"method":{"const":"well_known"}},"additionalProperties":false},"OriginEnvelope":{"type":"object","required":["origin"],"properties":{"origin":{"type":"object","required":["id","origin","state"],"properties":{"id":{"type":"string","pattern":"^orgn_"},"origin":{"type":"string","format":"uri"},"state":{"enum":["pending","verified"]},"proofMethod":{"anyOf":[{"const":"well_known"},{"type":"null"}]},"verifiedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"verification":{"anyOf":[{"type":"object","required":["method","url","content"],"properties":{"method":{"const":"well_known"},"url":{"type":"string","format":"uri","pattern":"^https://.*/\\.well-known/issueprobe-verification\\.txt$"},"content":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false}},"additionalProperties":false},"EvidenceSettings":{"type":"object","required":["screenshot","console","network","browserStateMetadata"],"properties":{"screenshot":{"type":"boolean"},"console":{"type":"boolean"},"network":{"type":"boolean"},"browserStateMetadata":{"type":"boolean"}},"additionalProperties":false},"EvidenceSettingsEnvelope":{"type":"object","required":["evidenceSettings"],"properties":{"evidenceSettings":{"type":"object","required":["screenshot","console","network","browserStateMetadata"],"properties":{"screenshot":{"type":"boolean"},"console":{"type":"boolean"},"network":{"type":"boolean"},"browserStateMetadata":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"WidgetKey":{"type":"object","required":["publicWidgetKey"],"properties":{"publicWidgetKey":{"type":"string","pattern":"^ip_widget_"}},"additionalProperties":false},"DeployKey":{"type":"object","required":["state","publicDeployKey"],"properties":{"state":{"type":"string","const":"needs_deploy_key"},"publicDeployKey":{"type":"string"}},"additionalProperties":false},"RepositoryCheck":{"type":"object","required":["state","deployedRevision","errorCode","checkedAt"],"properties":{"state":{"enum":["ready","failed"]},"deployedRevision":{"anyOf":[{"type":"string","pattern":"^([0-9a-fA-F]{40}|[0-9a-fA-F]{64})$"},{"type":"null"}]},"errorCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"checkedAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"WidgetInstall":{"type":"object","required":["script","verifiedOrigins"],"properties":{"script":{"type":"string"},"verifiedOrigins":{"type":"array","items":{"type":"string","format":"uri"}}},"additionalProperties":false},"WebsiteReadiness":{"type":"object","required":["state","checks"],"properties":{"state":{"type":"string"},"checks":{"type":"object","required":["origin","repository","widget"],"properties":{"origin":{"enum":["ready","pending"]},"repository":{"enum":["ready","pending","failed"]},"widget":{"enum":["ready","pending"]}},"additionalProperties":false}},"additionalProperties":false},"WidgetConfiguration":{"type":"object","required":["website","reportTypes","evidence","privacyUrl"],"properties":{"website":{"type":"object","required":["name","position"],"properties":{"name":{"type":"string"},"position":{"enum":["left","right"]}},"additionalProperties":false},"reportTypes":{"type":"array","prefixItems":[{"const":"problem"},{"const":"suggestion"}],"minItems":2,"maxItems":2},"evidence":{"type":"object","required":["screenshot","console","network","browserStateMetadata","maxScreenshotBytes"],"properties":{"screenshot":{"type":"boolean"},"console":{"type":"boolean"},"network":{"type":"boolean"},"browserStateMetadata":{"type":"boolean"},"maxScreenshotBytes":{"type":"integer","maximum":5242880}},"additionalProperties":false},"privacyUrl":{"type":"string","format":"uri"}},"additionalProperties":false},"PublicReportMultipart":{"type":"object","required":["payload"],"properties":{"payload":{"type":"string","description":"A JSON string that matches PublicReportInput."},"screenshot":{"type":"string","format":"binary"}},"additionalProperties":false},"BrowserStateItem":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false},"BrowserState":{"type":"object","required":["cookies","formFields","localStorage"],"properties":{"cookies":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}},"formFields":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}},"localStorage":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}}},"additionalProperties":false},"PublicReportInput":{"type":"object","required":["websiteKey","type","description","page","console","network","browserState","consent"],"properties":{"websiteKey":{"type":"string","pattern":"^ip_widget_"},"type":{"enum":["problem","suggestion"]},"description":{"type":"string","minLength":1,"maxLength":20000},"page":{"type":"object","required":["url","title","locale","timeZone","viewport"],"properties":{"url":{"type":"string","format":"uri"},"title":{"type":"string","maxLength":500},"release":{"type":"string","maxLength":200},"locale":{"type":"string"},"timeZone":{"type":"string"},"viewport":{"type":"object","required":["width","height"],"properties":{"width":{"type":"integer","minimum":1,"maximum":20000},"height":{"type":"integer","minimum":1,"maximum":20000}},"additionalProperties":false}},"additionalProperties":false},"console":{"type":"array","maxItems":50,"items":{"type":"object","required":["level","message","occurredAt"],"properties":{"level":{"enum":["error","warn"]},"message":{"type":"string","maxLength":4096},"sourcePath":{"type":"string","maxLength":1024},"line":{"type":"integer"},"column":{"type":"integer"},"occurredAt":{"type":"string","format":"date-time"}},"additionalProperties":false}},"network":{"type":"array","maxItems":50,"items":{"type":"object","required":["method","path","durationMs","occurredAt"],"properties":{"method":{"enum":["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"]},"path":{"type":"string","pattern":"^/[^?#]*$"},"status":{"type":"integer","minimum":0,"maximum":599},"durationMs":{"type":"integer","minimum":0,"maximum":600000},"occurredAt":{"type":"string","format":"date-time"}},"additionalProperties":false}},"browserState":{"type":"object","required":["cookies","formFields","localStorage"],"properties":{"cookies":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}},"formFields":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}},"localStorage":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}}},"additionalProperties":false},"consent":{"type":"object","required":["screenshot","evidence"],"properties":{"screenshot":{"type":"boolean"},"evidence":{"type":"boolean","const":true}},"additionalProperties":false}},"additionalProperties":false},"PublicReportResult":{"type":"object","required":["report","investigation"],"properties":{"report":{"type":"object","required":["id","reference","state","receivedAt"],"properties":{"id":{"type":"string","pattern":"^rpt_"},"reference":{"type":"string"},"state":{"enum":["received","queued","investigating","ready_for_review","investigation_failed","stored_without_investigation","archived"]},"receivedAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"investigation":{"anyOf":[{"type":"object","required":["state"],"properties":{"state":{"enum":["queued"]}},"additionalProperties":false},{"type":"null"}]},"quota":{"anyOf":[{"type":"object","required":["code"],"properties":{"code":{"const":"monthly_investigation_limit_reached"}},"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false},"ReportState":{"enum":["received","queued","investigating","ready_for_review","investigation_failed","stored_without_investigation","archived"]},"ReportListItem":{"type":"object","required":["id","reference","website","type","state","summary","conclusionStatus","reviewState","reviewDisposition","receivedAt","updatedAt"],"properties":{"id":{"type":"string","pattern":"^rpt_"},"reference":{"type":"string"},"website":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","pattern":"^web_"},"name":{"type":"string"}},"additionalProperties":false},"type":{"enum":["problem","suggestion"]},"state":{"enum":["received","queued","investigating","ready_for_review","investigation_failed","stored_without_investigation","archived"]},"summary":{"type":"string"},"conclusionStatus":{"anyOf":[{"enum":["confirmed","likely","possible","unknown"]},{"type":"null"}]},"reviewState":{"enum":["pending","reviewed"]},"reviewDisposition":{"anyOf":[{"type":"string"},{"type":"null"}]},"receivedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"investigationElapsedMs":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}},"additionalProperties":false},"ReportList":{"type":"object","required":["items","nextCursor"],"properties":{"items":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/ReportListItem"}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false},"InvestigationResult":{"type":"object","required":["schemaVersion","reportSummary","classification","conclusion","evidence","unknowns","recommendedAction","draftResponse"],"properties":{"schemaVersion":{"type":"integer","const":1},"reportSummary":{"type":"object","required":["title","visitorSummary","technicalSummary"],"properties":{"title":{"type":"string","minLength":1,"maxLength":120},"visitorSummary":{"type":"string","minLength":1,"maxLength":2000},"technicalSummary":{"type":"string","minLength":1,"maxLength":4000}},"additionalProperties":false},"classification":{"type":"object","required":["reportType","confidence","reason"],"properties":{"reportType":{"enum":["problem","suggestion"]},"confidence":{"type":"number","minimum":0,"maximum":1},"reason":{"type":"string","minLength":1,"maxLength":2000}},"additionalProperties":false},"conclusion":{"type":"object","required":["status","summary","confidence","evidenceIds","limits"],"properties":{"status":{"enum":["confirmed","likely","possible","unknown"]},"summary":{"type":"string","maxLength":6000},"confidence":{"type":"number","minimum":0,"maximum":1},"evidenceIds":{"type":"array","maxItems":100,"items":{"type":"string","pattern":"^EV-[0-9]{3,6}$"}},"limits":{"type":"string","maxLength":4000}},"additionalProperties":false},"evidence":{"type":"array","maxItems":100,"items":{"type":"object","required":["id","type","description","excerpt","observedAt","source"],"properties":{"id":{"type":"string","pattern":"^EV-[0-9]{3,6}$"},"type":{"enum":["visitor_statement","visitor_screenshot","browser_console","browser_network","browser_state_metadata","source_code","repository_documentation","release_metadata","related_report"]},"description":{"type":"string","minLength":1,"maxLength":2000},"excerpt":{"type":"string","maxLength":2000},"observedAt":{"type":"string","format":"date-time"},"source":{"oneOf":[{"type":"object","required":["kind","reference"],"properties":{"kind":{"const":"visitor_browser"},"reference":{"type":"string","minLength":1,"maxLength":300}},"additionalProperties":false},{"type":"object","required":["kind","repositoryRevision","path"],"properties":{"kind":{"const":"repository"},"repositoryRevision":{"type":"string","pattern":"^([0-9a-fA-F]{40}|[0-9a-fA-F]{64})$"},"path":{"type":"string","minLength":1,"maxLength":1024},"lineStart":{"type":"integer","minimum":1},"lineEnd":{"type":"integer","minimum":1}},"additionalProperties":false},{"type":"object","required":["kind","reference"],"properties":{"kind":{"enum":["report","release","related_report","documentation"]},"reference":{"type":"string","minLength":1,"maxLength":300}},"additionalProperties":false}]}},"additionalProperties":false}},"unknowns":{"type":"array","maxItems":50,"items":{"type":"object","required":["fact","whyUnknown","nextEvidence"],"properties":{"fact":{"type":"string","minLength":1,"maxLength":2000},"whyUnknown":{"type":"string","minLength":1,"maxLength":2000},"nextEvidence":{"type":"string","minLength":1,"maxLength":2000}},"additionalProperties":false}},"recommendedAction":{"type":"object","required":["type","summary","steps","risk","requiresHumanApproval","evidenceIds"],"properties":{"type":{"enum":["code_change","configuration_change","documentation_change","product_review","visitor_guidance","no_action","unknown"]},"summary":{"type":"string","minLength":1,"maxLength":4000},"steps":{"type":"array","maxItems":20,"items":{"type":"string","minLength":1,"maxLength":2000}},"risk":{"enum":["high","medium","low","unknown"]},"requiresHumanApproval":{"type":"boolean","const":true},"evidenceIds":{"type":"array","maxItems":100,"items":{"type":"string","pattern":"^EV-[0-9]{3,6}$"}}},"additionalProperties":false},"draftResponse":{"type":"object","required":["body","claimsEvidenceIds"],"properties":{"body":{"type":"string","minLength":1,"maxLength":10000},"claimsEvidenceIds":{"type":"array","maxItems":100,"items":{"type":"string","pattern":"^EV-[0-9]{3,6}$"}}},"additionalProperties":false}},"additionalProperties":false},"ResultEvidence":{"type":"object","required":["id","type","description","excerpt","observedAt","source"],"properties":{"id":{"type":"string","pattern":"^EV-[0-9]{3,6}$"},"type":{"enum":["visitor_statement","visitor_screenshot","browser_console","browser_network","browser_state_metadata","source_code","repository_documentation","release_metadata","related_report"]},"description":{"type":"string","minLength":1,"maxLength":2000},"excerpt":{"type":"string","maxLength":2000},"observedAt":{"type":"string","format":"date-time"},"source":{"oneOf":[{"type":"object","required":["kind","reference"],"properties":{"kind":{"const":"visitor_browser"},"reference":{"type":"string","minLength":1,"maxLength":300}},"additionalProperties":false},{"type":"object","required":["kind","repositoryRevision","path"],"properties":{"kind":{"const":"repository"},"repositoryRevision":{"type":"string","pattern":"^([0-9a-fA-F]{40}|[0-9a-fA-F]{64})$"},"path":{"type":"string","minLength":1,"maxLength":1024},"lineStart":{"type":"integer","minimum":1},"lineEnd":{"type":"integer","minimum":1}},"additionalProperties":false},{"type":"object","required":["kind","reference"],"properties":{"kind":{"enum":["report","release","related_report","documentation"]},"reference":{"type":"string","minLength":1,"maxLength":300}},"additionalProperties":false}]}},"additionalProperties":false},"ReportDetail":{"type":"object","required":["report","browserEvidence","result","artifacts","draftResponse","review","planUse","auditHistory","investigationElapsedMs"],"properties":{"report":{"type":"object","required":["id","reference","type","state","description","receivedAt","updatedAt","archivedAt","website","page"],"properties":{"id":{"type":"string","pattern":"^rpt_"},"reference":{"type":"string"},"type":{"enum":["problem","suggestion"]},"state":{"enum":["received","queued","investigating","ready_for_review","investigation_failed","stored_without_investigation","archived"]},"description":{"type":"string","minLength":1,"maxLength":20000},"receivedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"archivedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"website":{"type":"object","required":["id","name","state"],"properties":{"id":{"type":"string","pattern":"^web_"},"name":{"type":"string"},"state":{"type":"string"}},"additionalProperties":false},"page":{"type":"object","required":["url","title","locale","timeZone","viewport"],"properties":{"url":{"type":"string","format":"uri"},"title":{"type":"string","maxLength":500},"release":{"type":"string","maxLength":200},"locale":{"type":"string"},"timeZone":{"type":"string"},"viewport":{"type":"object","required":["width","height"],"properties":{"width":{"type":"integer","minimum":1,"maximum":20000},"height":{"type":"integer","minimum":1,"maximum":20000}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"browserEvidence":{"type":"object","required":["console","network","browserState"],"properties":{"console":{"type":"array","maxItems":50,"items":{"type":"object","required":["level","message","occurredAt"],"properties":{"level":{"enum":["error","warn"]},"message":{"type":"string","maxLength":4096},"sourcePath":{"type":"string","maxLength":1024},"line":{"type":"integer"},"column":{"type":"integer"},"occurredAt":{"type":"string","format":"date-time"}},"additionalProperties":false}},"network":{"type":"array","maxItems":50,"items":{"type":"object","required":["method","path","durationMs","occurredAt"],"properties":{"method":{"enum":["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"]},"path":{"type":"string","pattern":"^/[^?#]*$"},"status":{"type":"integer","minimum":0,"maximum":599},"durationMs":{"type":"integer","minimum":0,"maximum":600000},"occurredAt":{"type":"string","format":"date-time"}},"additionalProperties":false}},"browserState":{"type":"object","required":["cookies","formFields","localStorage"],"properties":{"cookies":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}},"formFields":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}},"localStorage":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","present","size"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"present":{"type":"boolean"},"size":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"result":{"anyOf":[{"type":"object","required":["schemaVersion","reportSummary","classification","conclusion","evidence","unknowns","recommendedAction","draftResponse"],"properties":{"schemaVersion":{"type":"integer","const":1},"reportSummary":{"type":"object","required":["title","visitorSummary","technicalSummary"],"properties":{"title":{"type":"string","minLength":1,"maxLength":120},"visitorSummary":{"type":"string","minLength":1,"maxLength":2000},"technicalSummary":{"type":"string","minLength":1,"maxLength":4000}},"additionalProperties":false},"classification":{"type":"object","required":["reportType","confidence","reason"],"properties":{"reportType":{"enum":["problem","suggestion"]},"confidence":{"type":"number","minimum":0,"maximum":1},"reason":{"type":"string","minLength":1,"maxLength":2000}},"additionalProperties":false},"conclusion":{"type":"object","required":["status","summary","confidence","evidenceIds","limits"],"properties":{"status":{"enum":["confirmed","likely","possible","unknown"]},"summary":{"type":"string","maxLength":6000},"confidence":{"type":"number","minimum":0,"maximum":1},"evidenceIds":{"type":"array","maxItems":100,"items":{"type":"string","pattern":"^EV-[0-9]{3,6}$"}},"limits":{"type":"string","maxLength":4000}},"additionalProperties":false},"evidence":{"type":"array","maxItems":100,"items":{"type":"object","required":["id","type","description","excerpt","observedAt","source"],"properties":{"id":{"type":"string","pattern":"^EV-[0-9]{3,6}$"},"type":{"enum":["visitor_statement","visitor_screenshot","browser_console","browser_network","browser_state_metadata","source_code","repository_documentation","release_metadata","related_report"]},"description":{"type":"string","minLength":1,"maxLength":2000},"excerpt":{"type":"string","maxLength":2000},"observedAt":{"type":"string","format":"date-time"},"source":{"oneOf":[{"type":"object","required":["kind","reference"],"properties":{"kind":{"const":"visitor_browser"},"reference":{"type":"string","minLength":1,"maxLength":300}},"additionalProperties":false},{"type":"object","required":["kind","repositoryRevision","path"],"properties":{"kind":{"const":"repository"},"repositoryRevision":{"type":"string","pattern":"^([0-9a-fA-F]{40}|[0-9a-fA-F]{64})$"},"path":{"type":"string","minLength":1,"maxLength":1024},"lineStart":{"type":"integer","minimum":1},"lineEnd":{"type":"integer","minimum":1}},"additionalProperties":false},{"type":"object","required":["kind","reference"],"properties":{"kind":{"enum":["report","release","related_report","documentation"]},"reference":{"type":"string","minLength":1,"maxLength":300}},"additionalProperties":false}]}},"additionalProperties":false}},"unknowns":{"type":"array","maxItems":50,"items":{"type":"object","required":["fact","whyUnknown","nextEvidence"],"properties":{"fact":{"type":"string","minLength":1,"maxLength":2000},"whyUnknown":{"type":"string","minLength":1,"maxLength":2000},"nextEvidence":{"type":"string","minLength":1,"maxLength":2000}},"additionalProperties":false}},"recommendedAction":{"type":"object","required":["type","summary","steps","risk","requiresHumanApproval","evidenceIds"],"properties":{"type":{"enum":["code_change","configuration_change","documentation_change","product_review","visitor_guidance","no_action","unknown"]},"summary":{"type":"string","minLength":1,"maxLength":4000},"steps":{"type":"array","maxItems":20,"items":{"type":"string","minLength":1,"maxLength":2000}},"risk":{"enum":["high","medium","low","unknown"]},"requiresHumanApproval":{"type":"boolean","const":true},"evidenceIds":{"type":"array","maxItems":100,"items":{"type":"string","pattern":"^EV-[0-9]{3,6}$"}}},"additionalProperties":false},"draftResponse":{"type":"object","required":["body","claimsEvidenceIds"],"properties":{"body":{"type":"string","minLength":1,"maxLength":10000},"claimsEvidenceIds":{"type":"array","maxItems":100,"items":{"type":"string","pattern":"^EV-[0-9]{3,6}$"}}},"additionalProperties":false}},"additionalProperties":false},{"type":"null"}]},"artifacts":{"type":"array","items":{"type":"object","required":["id","type","mediaType","sizeBytes","width","height","createdAt","url"],"properties":{"id":{"type":"string","pattern":"^art_"},"type":{"const":"screenshot"},"mediaType":{"enum":["image/png","image/jpeg","image/webp"]},"sizeBytes":{"type":"integer","minimum":1},"width":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"height":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"url":{"type":"string","pattern":"^/v1/reports/"}},"additionalProperties":false}},"draftResponse":{"anyOf":[{"type":"object","required":["body","source","updatedAt"],"properties":{"body":{"type":"string"},"source":{"enum":["result","owner"]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"additionalProperties":false},{"type":"null"}]},"review":{"anyOf":[{"type":"object","required":["disposition","reviewedAt","actorType"],"properties":{"disposition":{"type":"string"},"reviewedAt":{"type":"string","format":"date-time"},"actorType":{"enum":["human","agent"]}},"additionalProperties":false},{"type":"null"}]},"planUse":{"$ref":"#/components/schemas/PlanUse"},"auditHistory":{"type":"array","items":{"$ref":"#/components/schemas/AuditEvent"}},"investigationElapsedMs":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}},"additionalProperties":false},"DraftResponseInput":{"type":"object","required":["body"],"properties":{"body":{"type":"string","minLength":1,"maxLength":10000}},"additionalProperties":false},"DraftResponseEnvelope":{"type":"object","required":["draftResponse"],"properties":{"draftResponse":{"type":"object","required":["body","source","updatedAt"],"properties":{"body":{"type":"string"},"source":{"enum":["result","owner"]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"additionalProperties":false}},"additionalProperties":false},"ReportReviewInput":{"type":"object","required":["disposition"],"properties":{"disposition":{"enum":["accepted","accepted_with_edits","needs_more_investigation","rejected_wrong_conclusion","rejected_unsafe","reviewed_without_investigation"]}},"additionalProperties":false},"ReviewEnvelope":{"type":"object","required":["review"],"properties":{"review":{"type":"object","required":["disposition","reviewedAt"],"properties":{"disposition":{"type":"string"},"reviewedAt":{"type":"string","format":"date-time"}},"additionalProperties":false}},"additionalProperties":false},"ReportStateEnvelope":{"type":"object","required":["report"],"properties":{"report":{"type":"object","required":["id","state"],"properties":{"id":{"type":"string","pattern":"^rpt_"},"state":{"enum":["received","queued","investigating","ready_for_review","investigation_failed","stored_without_investigation","archived"]}},"additionalProperties":false}},"additionalProperties":false},"InvestigationRequestResult":{"type":"object","required":["report","investigation","replayed"],"properties":{"report":{"type":"object","required":["id","state"],"properties":{"id":{"type":"string","pattern":"^rpt_"},"state":{"enum":["received","queued","investigating","ready_for_review","investigation_failed","stored_without_investigation","archived"]}},"additionalProperties":false},"investigation":{"type":"object","required":["state"],"properties":{"state":{"const":"queued"}},"additionalProperties":false},"replayed":{"type":"boolean"}},"additionalProperties":false},"PlanLimits":{"type":"object","required":["websites","investigationsPerMonth","activeInvestigations","artifactRetentionDays"],"properties":{"websites":{"type":"integer","minimum":1},"investigationsPerMonth":{"type":"integer","minimum":1},"activeInvestigations":{"type":"object","required":["scope","count"],"properties":{"scope":{"enum":["account","website"]},"count":{"type":"integer","minimum":1}},"additionalProperties":false},"artifactRetentionDays":{"type":"integer","minimum":1}},"additionalProperties":false},"PlanUse":{"type":"object","required":["plan","limits","usage"],"properties":{"plan":{"enum":["free","pro"]},"limits":{"type":"object","required":["websites","investigationsPerMonth","activeInvestigations","artifactRetentionDays"],"properties":{"websites":{"type":"integer","minimum":1},"investigationsPerMonth":{"type":"integer","minimum":1},"activeInvestigations":{"type":"object","required":["scope","count"],"properties":{"scope":{"enum":["account","website"]},"count":{"type":"integer","minimum":1}},"additionalProperties":false},"artifactRetentionDays":{"type":"integer","minimum":1}},"additionalProperties":false},"usage":{"type":"object","required":["websites","investigationsStarted","reportsReceived","periodStartsAt","periodEndsAt"],"properties":{"websites":{"type":"integer","minimum":0},"investigationsStarted":{"type":"integer","minimum":0},"reportsReceived":{"type":"integer","minimum":0},"periodStartsAt":{"type":"string","format":"date-time"},"periodEndsAt":{"type":"string","format":"date-time"}},"additionalProperties":false}},"additionalProperties":false},"UsefulResultMetrics":{"type":"object","required":["usefulResultRate","medianReportToReadyMs"],"properties":{"usefulResultRate":{"anyOf":[{"type":"object","required":["accepted","reviewed","rate"],"properties":{"accepted":{"type":"integer","minimum":0},"reviewed":{"type":"integer","minimum":1},"rate":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},{"type":"null"}]},"medianReportToReadyMs":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}},"additionalProperties":false},"SafeSubscription":{"type":"object","required":["plan","subscription"],"properties":{"plan":{"enum":["free","pro"]},"subscription":{"anyOf":[{"type":"null"},{"type":"object","required":["state","cancelAtPeriodEnd","currentPeriodEndsAt"],"properties":{"state":{"enum":["active","unpaid","incomplete","incomplete_expired","past_due","paused","cancelled","deleted"]},"cancelAtPeriodEnd":{"type":"boolean"},"currentPeriodEndsAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"additionalProperties":false}]}},"additionalProperties":false},"HostedCheckout":{"type":"object","required":["url","replayed"],"properties":{"url":{"type":"string","format":"uri","pattern":"^https://checkout\\.stripe\\.com/"},"replayed":{"type":"boolean"}},"additionalProperties":false},"HostedPortal":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","pattern":"^https://billing\\.stripe\\.com/"}},"additionalProperties":false},"StripeEventResult":{"type":"object","required":["received","outcome"],"properties":{"received":{"type":"boolean","const":true},"outcome":{"enum":["applied","duplicate","ignored","ignored_stale","skipped"]}},"additionalProperties":false}}}}