{"openapi":"3.1.0","info":{"title":"isthisaigenerated.app API","description":"Multimodal synthetic-content warning signals. Image and sampled-video are core lanes; text and audio are experimental. Results are signals, not proof of origin, and require human review for consequential decisions.","version":"0.1.0"},"paths":{"/v1/health/live":{"get":{"summary":"Check process liveness","operationId":"health_live_v1_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"tags":["Health"]}},"/v1/health/ready":{"get":{"summary":"Check production readiness","operationId":"health_ready_v1_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"tags":["Health"]}},"/health":{"get":{"summary":"Read legacy service health metadata","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}},"tags":["Health"]}},"/v1/health":{"get":{"summary":"Read service health metadata","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}},"tags":["Health"]}},"/v1/beta-signups":{"post":{"summary":"Request private-beta access","operationId":"beta_signup_v1_beta_signups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BetaSignupRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BetaSignupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"tags":["Account"]}},"/v1/auth/magic-links":{"post":{"summary":"Request a passwordless sign-in link","operationId":"create_magic_link_v1_auth_magic_links_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"tags":["Account"]}},"/v1/auth/magic-links/consume":{"post":{"summary":"Consume a passwordless sign-in link","operationId":"consume_magic_link_v1_auth_magic_links_consume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkConsumeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"tags":["Account"]}},"/v1/auth/logout":{"post":{"summary":"Revoke the current browser session","operationId":"logout_v1_auth_logout_post","responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing or invalid browser session."}},"tags":["Account"],"security":[{"SessionCookie":[]}]}},"/v1/account":{"get":{"summary":"Read the current account and usage","operationId":"current_account_v1_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}},"401":{"description":"Missing or invalid browser session."}},"tags":["Account"],"security":[{"SessionCookie":[]}]}},"/v1/account/api-keys":{"get":{"summary":"List API-key metadata","operationId":"list_account_api_keys_v1_account_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyMetadata"},"type":"array","title":"Response List Account Api Keys V1 Account Api Keys Get"}}}},"401":{"description":"Missing or invalid browser session."}},"tags":["Account"],"security":[{"SessionCookie":[]}]},"post":{"summary":"Create an API key","operationId":"create_account_api_key_v1_account_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid browser session."}},"tags":["Account"],"security":[{"SessionCookie":[]}]}},"/v1/account/api-keys/{key_id}":{"delete":{"summary":"Revoke an API key","operationId":"revoke_account_api_key_v1_account_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid browser session."}},"tags":["Account"],"security":[{"SessionCookie":[]}]}},"/v1/usage":{"get":{"summary":"Read current token usage and balance","operationId":"current_usage_v1_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"security":[{"HTTPBearer":[]}],"tags":["Account"]}},"/v1/billing/checkout-sessions":{"post":{"summary":"Create a server-priced Stripe checkout session","operationId":"create_billing_checkout_v1_billing_checkout_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingCheckoutRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingCheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid browser session."},"400":{"description":"Invalid Idempotency-Key."},"409":{"description":"Idempotency-Key was already used with a different bundle."},"503":{"description":"Stripe billing is disabled or unavailable."}},"tags":["Billing"],"security":[{"SessionCookie":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Unique 8–128 character request key. Same key and token cost reuses one reservation; a different cost conflicts.","schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"example":"request-unique-001"}]}},"/v1/billing/orders/{order_id}":{"get":{"summary":"Read one tenant billing order","operationId":"get_billing_order_v1_billing_orders__order_id__get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid browser session."}},"tags":["Billing"],"security":[{"SessionCookie":[]}]}},"/v1/billing/ledger":{"get":{"summary":"Read the tenant prepaid-token ledger","operationId":"get_billing_ledger_v1_billing_ledger_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TokenLedgerEntry"},"type":"array","title":"Response Get Billing Ledger V1 Billing Ledger Get"}}}},"401":{"description":"Missing or invalid browser session."}},"tags":["Billing"],"security":[{"SessionCookie":[]}]}},"/v1/billing/webhooks/stripe":{"post":{"summary":"Receive signed Stripe webhook events","operationId":"stripe_webhook_v1_billing_webhooks_stripe_post","responses":{"204":{"description":"Successful Response"}},"tags":["Billing"]}},"/v1/model-info":{"get":{"summary":"Read active model policy","operationId":"model_info_v1_model_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelInfoResponse"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"security":[{"HTTPBearer":[]}],"tags":["Models"]}},"/v1/reviews":{"get":{"summary":"List review dossiers","operationId":"list_review_records_v1_reviews_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ReviewResponse"},"type":"array","title":"Response List Review Records V1 Reviews Get"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"security":[{"HTTPBearer":[]}],"tags":["Reviews"]},"post":{"summary":"Create an asset review dossier","operationId":"create_review_v1_reviews_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewResponse"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"security":[{"HTTPBearer":[]}],"tags":["Reviews"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Image asset to review."},"declared_ai_use":{"type":"string","enum":["yes","no","unknown","partial"],"default":"unknown"},"supplier":{"type":"string","maxLength":200},"notes":{"type":"string","maxLength":2000}},"required":["file"]}}}}}},"/v1/reviews/{review_id}":{"get":{"summary":"Retrieve a review dossier","operationId":"get_review_record_v1_reviews__review_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","title":"Review Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"tags":["Reviews"]},"delete":{"summary":"Delete a review dossier","operationId":"delete_review_record_v1_reviews__review_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","title":"Review Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"tags":["Reviews"]}},"/v1/reviews/{review_id}/decision":{"post":{"summary":"Record a human review decision","operationId":"decide_review_v1_reviews__review_id__decision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","title":"Review Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"tags":["Reviews"]}},"/v1/reviews/{review_id}/export":{"get":{"summary":"Export a review dossier","operationId":"export_review_v1_reviews__review_id__export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","title":"Review Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"tags":["Reviews"]}},"/v1/public/image-check":{"post":{"summary":"Check one image without an API key","operationId":"public_image_check_v1_public_image_check_post","responses":{"200":{"description":"Accepted public check. Inspect status; processing responses include a signed polling capability.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["known","unknown","processing"]},"label":{"type":"string"},"score":{"type":["number","null"]},"model":{"type":["string","null"]},"source":{"type":"string"},"cached":{"type":"boolean"},"match_distance":{"type":["integer","null"]},"thresholds":{"type":"object","additionalProperties":{"type":"number"}},"job_id":{"type":"string"},"job_token":{"type":"string"},"feedback_token":{"type":"string"},"share_token":{"type":"string"},"provenance":{"type":"object","properties":{"status":{"type":"string"},"verified":{"type":"boolean"},"ai_evidence":{"type":"boolean"},"active_manifest":{"type":["string","null"]},"claim_generator":{"type":["string","null"]},"validation_errors":{"type":"array","items":{"type":"string"}},"details":{"type":["string","null"]},"metadata":{"type":"object","description":"Unverified, removable file metadata. Context only; never proof of origin.","properties":{"status":{"type":"string"},"software":{"type":["string","null"]},"camera_make":{"type":["string","null"]},"camera_model":{"type":["string","null"]},"synthetic_tool_signal":{"type":"boolean"},"matched_marker":{"type":["string","null"]},"verified":{"type":"boolean"}}}},"required":["status","verified","ai_evidence"]}},"required":["status","label","score","model","source","cached","match_distance","thresholds","provenance"]}}}},"400":{"description":"Error response.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"403":{"description":"Origin missing or denied.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"413":{"description":"Public media or request-body limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"503":{"description":"Public checker or required model worker unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"415":{"description":"Body is not multipart/form-data.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}}},"tags":["Public test"],"description":"One JPEG/PNG image. Maximum 4 MB and 25 million decoded pixels. May return a signed asynchronous job capability. No API key is required. Media-size and validation limits still apply.","parameters":[{"name":"Origin","in":"header","required":true,"description":"Exact allowed website origin. Missing or unknown origins fail closed.","schema":{"type":"string","format":"uri"},"example":"https://isthisaigenerated.app"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"JPEG or PNG image, maximum 4 MB and 25 million decoded pixels."},"client_asset_id":{"type":"string"},"canonical_url":{"type":"string"},"platform_asset_id":{"type":"string"}},"required":["file"]}}}}}},"/v1/public/video-check":{"post":{"summary":"Check sampled video frames without an API key","operationId":"public_video_check_v1_public_video_check_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$defs":{"AssetCheckRequest":{"examples":[{"client_asset_id":"asset-client-001","frame_phash":"16-character-phash","frame_sha256":"64-character-sha256","thumb_jpeg_base64":"<base64-jpeg omitted>"}],"properties":{"client_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional caller-owned idempotency/reference identifier.","title":"Client Asset Id"},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional source application package.","title":"App Package"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional canonical source URL.","title":"Canonical Url"},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional source-platform asset identifier.","title":"Platform Asset Id"},"frame_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Exact SHA-256 fingerprint when computed by the client.","title":"Frame Sha256"},"frame_phash":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Perceptual hash used for near-duplicate lookup.","title":"Frame Phash"},"thumb_jpeg_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Base64-encoded low-resolution JPEG; omitted from documentation examples.","title":"Thumb Jpeg Base64"},"captured_at_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Client capture timestamp in Unix milliseconds.","title":"Captured At Ms"}},"title":"AssetCheckRequest","type":"object"}},"examples":[{"frames":[{"thumb_jpeg_base64":"<base64-jpeg omitted>"}],"video_footprint":"stable-video-footprint"}],"properties":{"frames":{"items":{"$ref":"#/$defs/AssetCheckRequest"},"maxItems":15,"minItems":1,"title":"Frames","type":"array","description":"One to five representative JPEG/PNG frames. Each frame requires thumb_jpeg_base64."},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"App Package"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Canonical Url"},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Platform Asset Id"},"video_footprint":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Video Footprint"}},"required":["frames"],"title":"VideoCheckRequest","type":"object"}}}},"responses":{"200":{"description":"Accepted public check. Inspect status; processing responses include a signed polling capability.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["known","unknown","processing"]},"label":{"type":"string"},"score":{"type":["number","null"]},"median_score":{"type":["number","null"]},"mean_score":{"type":["number","null"]},"max_score":{"type":["number","null"]},"frame_count":{"type":"integer"},"scored_frame_count":{"type":"integer"},"pending_frame_count":{"type":"integer"},"failed_frame_count":{"type":"integer"},"ai_frame_count":{"type":"integer"},"strong_frame_count":{"type":"integer"},"source":{"type":"string"},"cached":{"type":"boolean"},"policy":{"type":"string"},"job_id":{"type":"string"},"job_token":{"type":"string"}},"required":["status","label","score","frame_count","source","cached","policy"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Error response.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"403":{"description":"Origin missing or denied.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"413":{"description":"Public media or request-body limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"503":{"description":"Public checker or required model worker unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}}},"tags":["Public test"],"description":"One sampled video represented by 1–5 validated image frames. One submission costs one free check. This is sampled-frame analysis, not temporal deepfake analysis. No API key is required. Media-size and validation limits still apply.","parameters":[{"name":"Origin","in":"header","required":true,"description":"Exact allowed website origin. Missing or unknown origins fail closed.","schema":{"type":"string","format":"uri"},"example":"https://isthisaigenerated.app"}]}},"/v1/public/text-check":{"post":{"summary":"Check text without an API key","operationId":"public_text_check_v1_public_text_check_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"examples":[{"language":"en","text":"A sufficiently long sample is required for a meaningful warning signal."}],"properties":{"text":{"maxLength":20000,"minLength":1,"title":"Text","type":"string"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Language"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Canonical Url"},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Platform Asset Id"}},"required":["text"],"title":"TextCheckRequest","type":"object"}}}},"responses":{"200":{"description":"Accepted public check. Inspect status; processing responses include a signed polling capability.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["known","unknown"]},"label":{"type":"string"},"score":{"type":["number","null"]},"confidence":{"type":["number","null"]},"model":{"type":"string"},"source":{"type":"string"},"cached":{"type":"boolean"},"char_count":{"type":"integer"},"word_count":{"type":"integer"},"reason":{"type":"string"},"policy":{"type":"string"}},"required":["status","label","score","model","source","cached","char_count","word_count","reason","policy"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Error response.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"403":{"description":"Origin missing or denied.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"413":{"description":"Public media or request-body limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"503":{"description":"Public checker or required model worker unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}}},"tags":["Public test"],"description":"One text sample of 1–20,000 characters. This experimental lane can abstain on short or unsupported-language input. No API key is required. Media-size and validation limits still apply.","parameters":[{"name":"Origin","in":"header","required":true,"description":"Exact allowed website origin. Missing or unknown origins fail closed.","schema":{"type":"string","format":"uri"},"example":"https://isthisaigenerated.app"}]}},"/v1/public/audio-check":{"post":{"summary":"Check PCM WAV audio without an API key","operationId":"public_audio_check_v1_public_audio_check_post","responses":{"200":{"description":"Accepted public check. Inspect status; processing responses include a signed polling capability.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["known","unknown"]},"label":{"type":"string"},"score":{"type":["number","null"]},"confidence":{"type":["number","null"]},"model":{"type":"string"},"source":{"type":"string"},"cached":{"type":"boolean"},"duration_seconds":{"type":"number"},"sample_rate":{"type":"integer"},"reason":{"type":"string"},"policy":{"type":"string"}},"required":["status","label","score","model","source","cached","duration_seconds","sample_rate","reason","policy"]}}}},"400":{"description":"Error response.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"403":{"description":"Origin missing or denied.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"413":{"description":"Public media or request-body limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"503":{"description":"Public checker or required model worker unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}}},"tags":["Public test"],"description":"One PCM/IEEE-float WAV up to 20 MB. The production lane is speech-only and may abstain on unsupported or low-quality input. No API key is required. Media-size and validation limits still apply.","parameters":[{"name":"Origin","in":"header","required":true,"description":"Exact allowed website origin. Missing or unknown origins fail closed.","schema":{"type":"string","format":"uri"},"example":"https://isthisaigenerated.app"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"examples":[{"audio_base64":"<base64-pcm-wav omitted>","content_kind":"auto","filename":"sample.wav"}],"properties":{"audio_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Audio Base64"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Canonical Url"},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Platform Asset Id"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Filename"},"content_kind":{"default":"auto","enum":["speech","music","auto"],"title":"Content Kind","type":"string"}},"title":"AudioCheckRequest","type":"object"}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"PCM/IEEE-float WAV audio, maximum 20 MB decoded."},"canonical_url":{"type":"string"},"platform_asset_id":{"type":"string"},"content_kind":{"type":"string","enum":["speech","music","auto"],"default":"auto","description":"Auto routes content; only detected speech enters the validated authenticity model."}},"required":["file"]}}}}}},"/v1/public/jobs/{job_id}":{"get":{"summary":"Poll a public check with its job token","operationId":"public_job_v1_public_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"Origin","in":"header","required":true,"description":"Exact allowed website origin. Missing or unknown origins fail closed.","schema":{"type":"string","format":"uri"},"example":"https://isthisaigenerated.app"},{"name":"X-Job-Token","in":"header","required":true,"description":"Opaque signed capability returned with the processing response.","schema":{"type":"string"},"example":"opaque-signed-job-capability"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Error response.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"403":{"description":"Origin missing or denied.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"413":{"description":"Public media or request-body limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"503":{"description":"Public checker or required model worker unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"404":{"description":"Job absent/expired or capability invalid.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}}},"tags":["Public test"],"description":"Poll an image or sampled-video job. Pass the signed capability in X-Job-Token; never put it in a URL. No API key is required. Media-size and validation limits still apply."}},"/v1/public/share":{"post":{"summary":"Public Share Create","description":"Exchange a signed share token for a short link, optionally with a preview.\n\nThe token stays the proof - it is what the signature covers and what /v1/public/result\nverifies. This endpoint only shortens the way to it: the record it stores holds the same\nsigned token, and reading a short id hands that token back to be verified as before. So\na forged or edited record cannot survive verification any more than a forged link could.\n\nPreviews are opt-in and never implicit. The check flow promises the image is not stored;\nincluding one in a share is the visitor choosing otherwise for that one image, and it\nlives exactly as long as the link does.","operationId":"public_share_create_v1_public_share_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/public/share/{share_id}":{"get":{"summary":"Public Share Read","description":"Resolve a short link: the verdict, verified, plus any preview it was given.","operationId":"public_share_read_v1_public_share__share_id__get","parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","title":"Share Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/result":{"get":{"summary":"Verify a shared result token and return what was signed","description":"Verify a shared result token and return exactly what the server signed.\n\nA share link has to be checkable by whoever receives it, not just readable. The token\nis an HMAC-signed payload issued with a check, so a forged link cannot survive this\nendpoint — and a real one proves the verdict came from us and has not been edited.\n\nRead-only: this accepts the share token, and still accepts the feedback token that\nshare links carried before the two were split.","operationId":"public_result_v1_public_result_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"tags":["Public test"]}},"/v1/public/feedback":{"post":{"summary":"Report a detector result with its signed result token","operationId":"public_feedback_v1_public_feedback_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"result_token":{"maxLength":500,"minLength":10,"title":"Result Token","type":"string"},"expected_label":{"enum":["ai","human","unsure"],"title":"Expected Label","type":"string"}},"required":["result_token","expected_label"],"title":"PublicFeedbackRequest","type":"object"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"400":{"description":"Error response.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"403":{"description":"Origin missing or denied.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"413":{"description":"Public media or request-body limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}},"503":{"description":"Public checker or required model worker unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]}}}}},"tags":["Public test"],"description":"Submit minimal image-result feedback using the signed result capability. Video, audio and text do not issue feedback tokens. No API key is required. Media-size and validation limits still apply.","parameters":[{"name":"Origin","in":"header","required":true,"description":"Exact allowed website origin. Missing or unknown origins fail closed.","schema":{"type":"string","format":"uri"},"example":"https://isthisaigenerated.app"}]}},"/v1/assets/check":{"post":{"summary":"Check an image or frame","operationId":"check_asset_v1_assets_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCheckResponse"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."},"400":{"description":"Invalid Idempotency-Key or request payload."},"402":{"description":"Free and prepaid token balance exhausted."},"409":{"description":"Idempotency-Key was already used with a different token cost."},"503":{"description":"Token reservation store unavailable; no detection is performed."}},"security":[{"HTTPBearer":[]}],"tags":["Detection"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Unique 8–128 character request key. Same key and token cost reuses one reservation; a different cost conflicts.","schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"example":"request-unique-001"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"examples":[{"client_asset_id":"asset-client-001","frame_phash":"16-character-phash","frame_sha256":"64-character-sha256","thumb_jpeg_base64":"<base64-jpeg omitted>"}],"properties":{"client_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional caller-owned idempotency/reference identifier.","title":"Client Asset Id"},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional source application package.","title":"App Package"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional canonical source URL.","title":"Canonical Url"},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional source-platform asset identifier.","title":"Platform Asset Id"},"frame_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Exact SHA-256 fingerprint when computed by the client.","title":"Frame Sha256"},"frame_phash":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Perceptual hash used for near-duplicate lookup.","title":"Frame Phash"},"thumb_jpeg_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Base64-encoded low-resolution JPEG; omitted from documentation examples.","title":"Thumb Jpeg Base64"},"captured_at_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Client capture timestamp in Unix milliseconds.","title":"Captured At Ms"}},"title":"AssetCheckRequest","type":"object"}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"JPEG or PNG image/frame."},"client_asset_id":{"type":"string"},"app_package":{"type":"string"},"canonical_url":{"type":"string"},"platform_asset_id":{"type":"string"},"frame_sha256":{"type":"string"},"frame_phash":{"type":"string"},"captured_at_ms":{"type":"integer"}},"required":["file"]}}}}}},"/v1/assets/{asset_id}":{"get":{"summary":"Retrieve an image result","operationId":"get_asset_v1_assets__asset_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"tags":["Detection"]}},"/v1/audio/check":{"post":{"summary":"Check PCM WAV audio for weak synthetic signals","operationId":"check_audio_v1_audio_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioCheckResponse"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."},"400":{"description":"Invalid Idempotency-Key or request payload."},"402":{"description":"Free and prepaid token balance exhausted."},"409":{"description":"Idempotency-Key was already used with a different token cost."},"503":{"description":"Token reservation store unavailable; no detection is performed."}},"security":[{"HTTPBearer":[]}],"tags":["Experimental"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Unique 8–128 character request key. Same key and token cost reuses one reservation; a different cost conflicts.","schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"example":"request-unique-001"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"examples":[{"audio_base64":"<base64-pcm-wav omitted>","content_kind":"auto","filename":"sample.wav"}],"properties":{"audio_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Audio Base64"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Canonical Url"},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Platform Asset Id"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Filename"},"content_kind":{"default":"auto","enum":["speech","music","auto"],"title":"Content Kind","type":"string"}},"title":"AudioCheckRequest","type":"object"}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"PCM WAV audio."},"canonical_url":{"type":"string"},"platform_asset_id":{"type":"string"},"content_kind":{"type":"string","enum":["speech","music","auto"],"default":"auto"}},"required":["file"]}}}}}},"/v1/text/check":{"post":{"summary":"Check text for weak AI-style signals","operationId":"check_text_v1_text_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."},"400":{"description":"Invalid Idempotency-Key or request payload."},"402":{"description":"Free and prepaid token balance exhausted."},"409":{"description":"Idempotency-Key was already used with a different token cost."},"503":{"description":"Token reservation store unavailable; no detection is performed."}},"security":[{"HTTPBearer":[]}],"tags":["Experimental"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Unique 8–128 character request key. Same key and token cost reuses one reservation; a different cost conflicts.","schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"example":"request-unique-001"}]}},"/v1/videos/check-frames":{"post":{"summary":"Check sampled video frames","operationId":"check_video_v1_videos_check_frames_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."},"400":{"description":"Invalid Idempotency-Key or request payload."},"402":{"description":"Free and prepaid token balance exhausted."},"409":{"description":"Idempotency-Key was already used with a different token cost."},"503":{"description":"Token reservation store unavailable; no detection is performed."}},"security":[{"HTTPBearer":[]}],"tags":["Detection"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Unique 8–128 character request key. Same key and token cost reuses one reservation; a different cost conflicts.","schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"example":"request-unique-001"}]}},"/v1/jobs/{job_id}":{"get":{"summary":"Poll an asynchronous detection job","operationId":"get_job_v1_jobs__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing or invalid Bearer API key."},"403":{"description":"API key lacks the required detect scope."},"429":{"description":"Tenant API-key rate limit exceeded."}},"tags":["Jobs"]}}},"components":{"schemas":{"AccountResponse":{"properties":{"user":{"$ref":"#/components/schemas/AccountUser"},"tenant":{"$ref":"#/components/schemas/AccountTenant"},"role":{"type":"string","enum":["owner","member"],"title":"Role"},"usage":{"$ref":"#/components/schemas/UsageResponse"}},"type":"object","required":["user","tenant","role","usage"],"title":"AccountResponse"},"AccountTenant":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["tenant_id","name"],"title":"AccountTenant"},"AccountUser":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["user_id","email"],"title":"AccountUser"},"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"ApiKeyCreateResponse":{"properties":{"key_id":{"type":"string","title":"Key Id"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"string","format":"date-time"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["key_id","name","scopes","created_at","api_key"],"title":"ApiKeyCreateResponse"},"ApiKeyMetadata":{"properties":{"key_id":{"type":"string","title":"Key Id"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"string","format":"date-time"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["key_id","name","scopes","created_at"],"title":"ApiKeyMetadata"},"AssetCheckRequest":{"properties":{"client_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Asset Id","description":"Optional caller-owned idempotency/reference identifier."},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Package","description":"Optional source application package."},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url","description":"Optional canonical source URL."},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Asset Id","description":"Optional source-platform asset identifier."},"frame_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frame Sha256","description":"Exact SHA-256 fingerprint when computed by the client."},"frame_phash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frame Phash","description":"Perceptual hash used for near-duplicate lookup."},"thumb_jpeg_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Jpeg Base64","description":"Base64-encoded low-resolution JPEG; omitted from documentation examples."},"captured_at_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Captured At Ms","description":"Client capture timestamp in Unix milliseconds."}},"type":"object","title":"AssetCheckRequest","examples":[{"client_asset_id":"asset-client-001","frame_phash":"16-character-phash","frame_sha256":"64-character-sha256","thumb_jpeg_base64":"<base64-jpeg omitted>"}]},"AssetCheckResponse":{"properties":{"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"status":{"type":"string","title":"Status"},"label":{"type":"string","title":"Label"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"thresholds":{"additionalProperties":{"type":"number"},"type":"object","title":"Thresholds"},"source":{"type":"string","title":"Source"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"model_retired":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Model Retired"},"cached":{"type":"boolean","title":"Cached","default":false},"match_distance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Match Distance"},"ttl_seconds":{"type":"integer","title":"Ttl Seconds"},"provenance":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Provenance"}},"type":"object","required":["status","label","thresholds","source","ttl_seconds"],"title":"AssetCheckResponse"},"AudioCheckResponse":{"properties":{"status":{"type":"string","title":"Status"},"label":{"type":"string","title":"Label"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"source":{"type":"string","title":"Source"},"model":{"type":"string","title":"Model"},"cached":{"type":"boolean","title":"Cached","default":false},"audio_hash":{"type":"string","title":"Audio Hash"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"sample_rate":{"type":"integer","title":"Sample Rate"},"reason":{"type":"string","title":"Reason"},"detected_content_kind":{"type":"string","enum":["speech","music","mixed","other","unknown"],"title":"Detected Content Kind","default":"unknown"},"policy":{"type":"string","title":"Policy","default":"weak_signal_warning_only"}},"type":"object","required":["status","label","source","model","audio_hash","duration_seconds","sample_rate","reason"],"title":"AudioCheckResponse"},"BetaSignupRequest":{"properties":{"email":{"type":"string","maxLength":320,"minLength":3,"title":"Email"},"organization":{"type":"string","maxLength":200,"minLength":1,"title":"Organization"},"intent":{"type":"string","enum":["free","api","team","pilot"],"title":"Intent"},"website":{"type":"string","maxLength":200,"title":"Website","default":""}},"type":"object","required":["email","organization","intent"],"title":"BetaSignupRequest"},"BetaSignupResponse":{"properties":{"status":{"type":"string","enum":["received"],"const":"received","title":"Status","default":"received"},"message":{"type":"string","title":"Message","default":"If eligible, we will contact you."}},"type":"object","title":"BetaSignupResponse"},"BillingCheckoutRequest":{"properties":{"bundle_code":{"type":"string","enum":["tokens_1000","tokens_5000","tokens_20000"],"title":"Bundle Code"}},"additionalProperties":false,"type":"object","required":["bundle_code"],"title":"BillingCheckoutRequest"},"BillingCheckoutResponse":{"properties":{"order_id":{"type":"string","title":"Order Id"},"status":{"type":"string","title":"Status"},"url":{"type":"string","title":"Url"}},"type":"object","required":["order_id","status","url"],"title":"BillingCheckoutResponse"},"BillingOrderResponse":{"properties":{"order_id":{"type":"string","title":"Order Id"},"bundle_code":{"type":"string","title":"Bundle Code"},"token_amount":{"type":"integer","title":"Token Amount"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["order_id","bundle_code","token_amount","amount_cents","currency","status"],"title":"BillingOrderResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"},"product":{"type":"string","title":"Product"},"release_sha":{"type":"string","title":"Release Sha"},"db":{"type":"string","title":"Db"},"cache":{"type":"string","title":"Cache"},"queue":{"type":"string","title":"Queue"},"model_loaded":{"type":"boolean","title":"Model Loaded"},"model":{"type":"string","title":"Model"}},"type":"object","required":["ok","product","release_sha","db","cache","queue","model_loaded","model"],"title":"HealthResponse"},"JobResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"result":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Result"}},"type":"object","required":["job_id","status"],"title":"JobResponse"},"MagicLinkConsumeRequest":{"properties":{"token":{"type":"string","maxLength":256,"minLength":32,"title":"Token"}},"type":"object","required":["token"],"title":"MagicLinkConsumeRequest"},"MagicLinkRequest":{"properties":{"email":{"type":"string","maxLength":320,"minLength":3,"title":"Email"}},"type":"object","required":["email"],"title":"MagicLinkRequest"},"MagicLinkResponse":{"properties":{"status":{"type":"string","enum":["accepted"],"const":"accepted","title":"Status","default":"accepted"},"message":{"type":"string","title":"Message","default":"If the address can sign in, a link will be sent."},"dev_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dev Token"}},"type":"object","title":"MagicLinkResponse"},"ModelInfoResponse":{"properties":{"name":{"type":"string","title":"Name"},"backend":{"type":"string","title":"Backend"},"thresholds":{"additionalProperties":{"type":"number"},"type":"object","title":"Thresholds"},"policy":{"type":"string","title":"Policy"}},"type":"object","required":["name","backend","thresholds","policy"],"title":"ModelInfoResponse"},"PublicFeedbackRequest":{"properties":{"result_token":{"type":"string","maxLength":500,"minLength":10,"title":"Result Token"},"expected_label":{"type":"string","enum":["ai","human","unsure"],"title":"Expected Label"}},"type":"object","required":["result_token","expected_label"],"title":"PublicFeedbackRequest"},"ReviewDecisionRequest":{"properties":{"decision":{"type":"string","enum":["disclose","no_disclosure","reject","recheck"],"title":"Decision"},"reviewer":{"type":"string","maxLength":200,"minLength":1,"title":"Reviewer"},"rationale":{"type":"string","maxLength":4000,"minLength":1,"title":"Rationale"}},"type":"object","required":["decision","reviewer","rationale"],"title":"ReviewDecisionRequest"},"ReviewResponse":{"properties":{"review_id":{"type":"string","title":"Review Id"},"status":{"type":"string","enum":["pending_review","completed"],"title":"Status"},"content_sha256":{"type":"string","title":"Content Sha256"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"declaration":{"type":"object","title":"Declaration"},"provenance":{"type":"object","title":"Provenance"},"detector":{"type":"object","title":"Detector"},"decision":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Decision"},"policy":{"type":"string","title":"Policy","default":"signals_are_not_proof_human_decision_required"},"created_at":{"type":"integer","title":"Created At"},"updated_at":{"type":"integer","title":"Updated At"}},"type":"object","required":["review_id","status","content_sha256","declaration","provenance","detector","created_at","updated_at"],"title":"ReviewResponse"},"SessionResponse":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token"},"expires_at":{"type":"integer","title":"Expires At"}},"type":"object","required":["csrf_token","expires_at"],"title":"SessionResponse"},"TextCheckRequest":{"properties":{"text":{"type":"string","maxLength":20000,"minLength":1,"title":"Text"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url"},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Asset Id"}},"type":"object","required":["text"],"title":"TextCheckRequest","examples":[{"language":"en","text":"A sufficiently long sample is required for a meaningful warning signal."}]},"TextCheckResponse":{"properties":{"status":{"type":"string","title":"Status"},"label":{"type":"string","title":"Label"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"source":{"type":"string","title":"Source"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"cached":{"type":"boolean","title":"Cached","default":false},"text_hash":{"type":"string","title":"Text Hash"},"char_count":{"type":"integer","title":"Char Count"},"word_count":{"type":"integer","title":"Word Count"},"reason":{"type":"string","title":"Reason"},"policy":{"type":"string","title":"Policy","default":"weak_signal_warning_only"}},"type":"object","required":["status","label","source","text_hash","char_count","word_count","reason"],"title":"TextCheckResponse"},"TokenLedgerEntry":{"properties":{"ledger_id":{"type":"string","title":"Ledger Id"},"delta_paid":{"type":"integer","title":"Delta Paid"},"balance_after":{"type":"integer","title":"Balance After"},"entry_type":{"type":"string","title":"Entry Type"},"source_type":{"type":"string","title":"Source Type"},"source_id":{"type":"string","title":"Source Id"},"operation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation"},"created_at":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"string","format":"date-time"}],"title":"Created At"}},"type":"object","required":["ledger_id","delta_paid","balance_after","entry_type","source_type","source_id","created_at"],"title":"TokenLedgerEntry"},"UsageResponse":{"properties":{"plan_code":{"type":"string","enum":["free","developer","team","agency"],"title":"Plan Code"},"monthly_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Units"},"used_units":{"type":"integer","title":"Used Units"},"remaining_units":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining Units"},"free_used":{"type":"integer","title":"Free Used"},"free_remaining":{"type":"integer","title":"Free Remaining"},"paid_balance":{"type":"integer","title":"Paid Balance"},"total_available":{"type":"integer","title":"Total Available"},"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"by_operation":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Operation"}},"type":"object","required":["plan_code","monthly_units","used_units","remaining_units","free_used","free_remaining","paid_balance","total_available","period_start","period_end","by_operation"],"title":"UsageResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VideoCheckRequest":{"properties":{"frames":{"items":{"$ref":"#/components/schemas/AssetCheckRequest"},"type":"array","maxItems":20,"minItems":1,"title":"Frames"},"app_package":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Package"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url"},"platform_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Asset Id"},"video_footprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Footprint"}},"type":"object","required":["frames"],"title":"VideoCheckRequest","examples":[{"frames":[{"thumb_jpeg_base64":"<base64-jpeg omitted>"}],"video_footprint":"stable-video-footprint"}]},"VideoCheckResponse":{"properties":{"status":{"type":"string","title":"Status"},"label":{"type":"string","title":"Label"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"median_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Score"},"mean_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean Score"},"max_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Score"},"frame_count":{"type":"integer","title":"Frame Count"},"scored_frame_count":{"type":"integer","title":"Scored Frame Count","default":0},"pending_frame_count":{"type":"integer","title":"Pending Frame Count","default":0},"ai_frame_count":{"type":"integer","title":"Ai Frame Count","default":0},"strong_frame_count":{"type":"integer","title":"Strong Frame Count","default":0},"frames":{"items":{"$ref":"#/components/schemas/AssetCheckResponse"},"type":"array","title":"Frames"},"cached":{"type":"boolean","title":"Cached","default":false},"source":{"type":"string","title":"Source","default":"video_aggregate"}},"type":"object","required":["status","label","score","median_score","frame_count","frames"],"title":"VideoCheckResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","description":"Tenant API key. Send `Authorization: Bearer <API_KEY>`.","scheme":"bearer"},"SessionCookie":{"type":"apiKey","in":"cookie","name":"aidetect_session","description":"HTTP-only browser session cookie returned after magic-link sign-in."}}},"tags":[{"name":"Health","description":"Public liveness and dependency readiness."},{"name":"Models","description":"Active model and warning-threshold metadata."},{"name":"Public test","description":"Browser-safe public website checks without API keys."},{"name":"Detection","description":"Core image and sampled-video warning signals."},{"name":"Experimental","description":"Weak-signal text and audio lanes."},{"name":"Jobs","description":"Asynchronous detection job status."},{"name":"Reviews","description":"Provenance-first human review dossiers."},{"name":"Account","description":"Private-beta access and monthly usage."},{"name":"Billing","description":"Server-priced Stripe checkout sessions and prepaid tokens."}]}