1<!DOCTYPE html> 2<html lang="en-us"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta name="theme-color" content="#FE5185"> 8 <meta name="msapplication-TileColor" content="#FE5185"> 9 <link rel="icon" type="image/png" href="/img/favicon-32x32.png"> 10 <link rel="canonical" href="https://wasitai.com/privacy" /> 11 12 <title>Privacy Policy | WasItAI</title> 13 <meta name="description" content="Learn about how WasItAI handles your data and privacy. Our AI image detector respects your privacy and ensures data security." /> 14 15 <!-- Open Graph --> 16 <meta property="og:title" content="Privacy Policy | WasItAI" /> 17 <meta property="og:description" content="Learn about how WasItAI handles your data and privacy. Our AI image detector respects your privacy and ensures data security." /> 18 <meta property="og:type" content="website" /> 19 <meta property="og:site_name" content="WasItAI" /> 20 <meta property="og:locale" content="en_US" /> 21 <meta property="og:url" content="https://wasitai.com/privacy" /> 22 <meta property="og:image" content="https://wasitai.com/img/wasitai-og-fb-share-image-v1.png" /> 23 <meta property="og:image:url" content="https://wasitai.com/img/wasitai-og-fb-share-image-v1.png" /> 24 <meta property="og:image:secure_url" content="https://wasitai.com/img/wasitai-og-fb-share-image-v1.png" /> 25 <meta property="og:image:type" content="image/png" /> 26 <meta property="og:image:width" content="1200" /> 27 <meta property="og:image:height" content="628" /> 28 29 <!-- Twitter Card --> 30 <meta name="twitter:card" content="summary_large_image" /> 31 <meta name="twitter:title" content="Privacy Policy | WasItAI" /> 32 <meta name="twitter:description" content="Learn about how WasItAI handles your data and privacy. Our AI image detector respects your privacy and ensures data security." /> 33 <meta name="twitter:image" content="https://wasitai.com/img/wasitai-og-fb-share-image-v1.png" /> 34 <meta name="twitter:site" content="@WasItAI_" /> 35 36 <!-- Google tag (gtag.js) -->
vendor: 67 bytes, lines 36-37
36 37 <script async src="https://www.googletagmanager.com/gtag/js?id=
37G-SR61QZXDHM
vendor: 15 bytes, lines 37-38
37"></script> 38
38<script> 39
vendor: 144 bytes, lines 39-43
39window.dataLayer = window.dataLayer || []; 40 function gtag(){dataLayer.push(arguments);} 41 gtag('js', new Date()); 42 43 gtag('config', '
43G-SR61QZXDHM
vendor: 7 bytes, lines 43-44
43'); 44
44</script>
44 45 46 47 <link rel="stylesheet" href="style.css"> 48 49 <!-- Outfit is self-hosted (see @font-face at the top of style.css). Preload it so it 50 downloads in parallel with the CSS rather than after it. Inter, Inconsolata and 51 Material Icons were all requested here but referenced by nothing on any page. --> 52 <link rel="preload" href="assets/fonts/outfit-latin.woff2" as="font" type="font/woff2" crossorigin> 53 54 55 56 57 <style> 58 .material-icons.md-64.red { font-size: 64px; color: rgb(180, 6, 6); } 59 .material-icons.md-64.yellow { font-size: 64px; color: rgb(207, 193, 0); } 60 .main-box p {text-align: justify;} 61 </style> 62 63 <!-- OUTFIT font --> 64 65</head> 66 67<body id="page"> 68 69 <div class="container"> 70 <div class="header"> 71 72 <a class="logo" href="/" target="_self" title="Home page"> 73 <img src="./assets/img/logo.svg" width="369" height="137" alt="WasItAI logo"> 74 </a> 75 76 <div class="navigation js-navigation"> 77 <a href="api">API & Pricing</a> 78 <a href="https://blog.wasitai.com">Blog</a> 79 <a href="contact">Contact</a> 80 <a id="nav-dashboard-link" href="#" style="display:none">Dashboard</a> 81 </div><!-- .navigation --> 82 83 <input class="menu-btn" type="checkbox" id="menu-btn" name="menu-btn" aria-label="Toggle navigation menu" /> 84 <label class="menu-icon js-menu-trigger" for="menu-btn"> 85 <span class="navicon" aria-hidden="true"></span> 86 </label> 87 88 </div><!-- .header --> 89 90 <div class="main-box" style="max-width: 750px; margin: auto;"> 91 <h1 class="box-title">Privacy Policy</h1> 92 <p>wasitai.com ("we", "our", "us") provides a free AI image detection tool and paid API service. This Privacy Policy explains how we collect, use, and protect information when you use our website and services.</p> 93 <p>By using wasitai.com you agree to the collection and use of information as described in this policy.</p> 94 95 <h2>1. Information We Collect</h2> 96 <p><strong>Information you provide directly:</strong></p> 97 <ul> 98 <li>Email address and name when you register an account (via email, Google, or Apple Sign In)</li> 99 <li>Payment information processed by Lemon Squeezy (we never store your card details)</li> 100 <li>Images you submit for AI detection analysis</li> 101 <li>Support messages or other communications you send us</li> 102 </ul> 103 <p><strong>Information collected automatically:</strong></p> 104 <ul> 105 <li>IP address, browser type, and operating system</li> 106 <li>Pages visited and time spent on the site</li> 107 <li>API usage statistics (request counts, response times)</li> 108 <li>Cookies and similar tracking technologies</li> 109 </ul> 110 111 <h2>2. How We Use Your Information</h2> 112 <ul> 113 <li>To provide and improve the AI detection service</li> 114 <li>To manage your account and process payments</li> 115 <li>To send transactional emails (account confirmation, subscription updates)</li> 116 <li>To monitor for abuse and enforce our Terms of Service</li> 117 <li>To analyse usage trends and improve performance</li> 118 </ul> 119 <p>We do not sell your personal data to third parties.</p> 120 121 <h2>3. Third-Party Services</h2> 122 <p>We use the following third-party services that may process your data:</p> 123 <ul> 124 <li><strong>Google Sign In</strong> - for OAuth authentication (<a href="https://policies.google.com/privacy" target="_blank">Google Privacy Policy</a>)</li> 125 <li><strong>Apple Sign In</strong> - for OAuth authentication (<a href="https://www.apple.com/legal/privacy/" target="_blank">Apple Privacy Policy</a>)</li> 126 <li><strong>Lemon Squeezy</strong> - for payment processing and subscription management (<a href="https://www.lemonsqueezy.com/privacy" target="_blank">Lemon Squeezy Privacy Policy</a>)</li> 127 <li><strong>Hotjar</strong> - for analytics and user behaviour insights (<a href="https://www.hotjar.com/legal/policies/privacy/" target="_blank">Hotjar Privacy Policy</a>)</li> 128 </ul> 129 <p>Each of these services operates under its own privacy policy. We encourage you to review them.</p> 130 131 <h2>4. Image Processing</h2> 132 <p>Images submitted for analysis are processed solely to return a detection result. We do not store submitted images beyond the duration required to complete the analysis request. Images are never shared with third parties or used to train our models without explicit consent.</p> 133 <p>Detection results are probabilistic estimates based on statistical analysis â they are not factual determinations. A result indicating AI-generated content does not constitute definitive proof, and should never be used as the sole basis for any consequential personal, professional, legal, or academic decision. Please refer to our <a href="terms">Terms of Service</a> for our full accuracy limitations and liability disclaimer.</p> 134 135 <h2>5. Log Data</h2> 136 <p>Our servers automatically record information ("Log Data") when you use the service. Log Data may include your IP address, browser version, pages visited, date and time of visits, and error reports. Log Data is retained for security and debugging purposes and is deleted after 90 days.</p> 137 138 <h2>6. Cookies</h2> 139 <p>We use cookies to maintain your login session and remember your preferences. We also use analytics cookies (via Hotjar) to understand how visitors interact with our site. You can disable cookies in your browser settings; however, some features of the service may not function correctly without them.</p> 140 141 <h2>7. Data Retention</h2> 142 <p>We retain your account data for as long as your account is active. If you delete your account, your personal data is removed from our systems within 30 days, except where retention is required by law.</p> 143 144 <h2>8. Your Rights</h2> 145 <p>Depending on your jurisdiction (including under the GDPR for EEA residents), you may have the right to:</p> 146 <ul> 147 <li>Access the personal data we hold about you</li> 148 <li>
148Request correction or deletion of your data</li> 149 <li>Object to or restrict certain processing activities</li> 150 <li>Request data portability</li> 151 </ul> 152 <p>To exercise these rights, contact us at <a href="/cdn-cgi/l/email-protection#a2cbccc4cde2d5c3d1cbd6c3cb8cc1cdcf"><span class="__cf_email__" data-cfemail="8de4e3ebe2cdfaecfee4f9ece4a3eee2e0">[email protected]</span></a>.</p> 153 154 <h2>9. Security</h2> 155 <p>We use industry-standard measures, including HTTPS encryption and access controls, to protect your data. However, no method of transmission over the internet is 100% secure and we cannot guarantee absolute security.</p> 156 157 <h2>10. Links to Other Sites</h2> 158 <p>Our service may contain links to third-party websites. We are not responsible for the privacy practices of those sites and encourage you to review their policies.</p> 159 160 <h2>11. Children's Privacy</h2> 161 <p>Our service is not directed to children under the age of 13 (or 16 in certain jurisdictions). We do not knowingly collect personal data from children. If you believe a child has provided us with personal information, please contact us so we can delete it.</p> 162 163 <h2>12. Changes to This Privacy Policy</h2> 164 <p>We may update this Privacy Policy from time to time. The updated version will be indicated by a revised effective date. We encourage you to review this page periodically. Continued use of the service after changes are posted constitutes acceptance of the revised policy.</p> 165 <p><strong>Effective Date: 2026-03-27</strong></p> 166 167 <h2>13. Contact Us</h2> 168 <p>If you have any questions about this Privacy Policy, please contact us at <a href="/cdn-cgi/l/email-protection#137a7d757c536472607a67727a3d707c7e"><span class="__cf_email__" data-cfemail="ee87808881ae998f9d879a8f87c08d8183">[email protected]</span></a>.</p> 169 170 </div> <!-- .main-box --> 171 172 </div> <!-- .container --> 173 174 <!-- Modern Footer --> 175 <footer class="site-footer"> 176 <div class="footer-container"> 177 <div class="footer-grid"> 178 179 <!-- Brand Column --> 180 <div class="footer-col footer-brand"> 181 <a href="/" class="footer-logo"> 182 <img src="./assets/img/logo.svg" width="369" height="137" loading="lazy" alt="WasItAI logo"> 183 </a> 184 <p class="footer-tagline">Detect AI-generated images with confidence. Protect yourself from deepfakes, scams, and misinformation.</p> 185 <div class="footer-social"> 186 <a href="https://www.linkedin.com/company/98882864" target="_blank" aria-label="LinkedIn" title="Follow us on LinkedIn"> 187 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> 188 </a> 189 <a href="https://blog.wasitai.com" target="_blank" aria-label="Blog" title="Read our Blog"> 190 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"/></svg> 191 </a> 192 </div> 193 </div> 194 195 <!-- Quick Links --> 196 <div class="footer-col"> 197 <h4>Product</h4> 198 <ul> 199 <li><a href="/">AI Image Detector</a></li> 200 <li><a href="/#browser-extension">Browser Extension</a></li> 201 <li><a href="api">API & Pricing</a></li> 202 <li id="footer-dashboard-li" style="display:none"><a id="footer-dashboard-link" href="#">Dashboard</a></li> 203 </ul> 204 </div> 205 206 <!-- Resources --> 207 <div class="footer-col"> 208 <h4>Resources</h4> 209 <ul> 210 <li><a href="https://blog.wasitai.com" target="_blank">Blog</a></li> 211 <li><a href="contact">Contact</a></li> 212 </ul> 213 </div> 214 215 <!-- Legal --> 216 <div class="footer-col"> 217 <h4>Legal</h4> 218 <ul> 219 <li><a href="terms">Terms of Service</a></li> 220 <li><a href="privacy">Privacy Policy</a></li> 221 <li><a href="/privacy-extension">Extension Privacy Policy</a></li> 222 </ul> 223 </div> 224 225 </div> 226 227 <div class="footer-bottom"> 228 <p>© 2026 <a href="https://www.linkedin.com/company/98882864" target="_blank">WasItAI</a>. All rights reserved.</p> 229 <p class="footer-legal-note">By using our service you agree to our <a href="terms">Terms of Service</a> and <a href="privacy">Privacy Policy</a></p> 230 </div> 231 </div> 232 </footer> 233 234 <style> 235 .site-footer { 236 background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); 237 color: #b8c5d6; 238 padding: 3rem 1.5rem 1.5rem; 239 margin-top: 2rem; 240 } 241 242 .footer-container { 243 max-width: 1200px; 244 margin: 0 auto; 245 } 246 247 .footer-grid { 248 display: grid; 249 grid-template-columns: 2fr 1fr 1fr 1fr; 250 gap: 2rem; 251 padding-bottom: 2rem; 252 border-bottom: 1px solid rgba(255, 255, 255, 0.1); 253 } 254 255 .footer-brand { 256 padding-right: 2rem; 257 } 258 259 .footer-logo img { 260 width: auto; 261 height: 32px; 262 margin-bottom: 1rem; 263 filter: brightness(0) invert(1); 264 } 265 266 .footer-tagline { 267 font-size: 0.9rem; 268 line-height: 1.6; 269 color: #8b9cb5; 270 margin-bottom: 1.5rem; 271 } 272 273 .footer-social { 274 display: flex; 275 gap: 1rem; 276 } 277 278 .footer-social a { 279 display: flex; 280 align-items: center; 281 justify-content: center; 282 width: 36px; 283 height: 36px; 284 background: rgba(255, 255, 255, 0.1); 285 border-radius: 8px; 286 color: #b8c5d6; 287 transition: all 0.2s ease; 288 } 289 290 .footer-social a:hover { 291 background: #0389ff; 292 color: #fff; 293 transform: translateY(-2px); 294 } 295 296 .footer-col h4 { 297 color: #fff; 298 font-size: 0.95rem; 299 font-weight: 600; 300 margin-bottom: 1rem; 301 text-transform: uppercase; 302 letter-spacing: 0.5px; 303 } 304 305 .footer-col ul { 306 list-style: none; 307 padding: 0; 308 margin: 0; 309 } 310 311 .footer-col ul li { 312 margin-bottom: 0.6rem; 313 } 314 315 .footer-col ul li a { 316 color: #8b9cb5; 317 text-decoration: none; 318 font-size: 0.9rem; 319 transition: color 0.2s ease; 320 } 321 322 .footer-col ul li a:hover { 323 color: #0389ff; 324 } 325 326 .footer-bottom { 327 padding-top: 1.5rem; 328 text-align: center; 329 } 330 331 .footer-bottom p { 332 margin: 0.3rem 0; 333 font-size: 0.85rem; 334 color: #6b7c94; 335 } 336 337 .footer-bottom a { 338 color: #0389ff; 339 text-decoration: none; 340 } 341 342 .footer-bottom a:hover { 343 text-decoration: underline; 344 } 345 346 .footer-legal-note { 347 font-size: 0.8rem !important; 348 opacity: 0.8; 349 } 350 351 @media (max-width: 768px) { 352 .footer-grid { 353 grid-template-columns: 1fr 1fr; 354 gap: 1.5rem; 355 } 356 357 .footer-brand { 358 grid-column: 1 / -1; 359 padding-right: 0; 360 text-align: center; 361 } 362 363 .footer-social { 364 justify-content: center; 365 } 366 367 .footer-col { 368 text-align: center; 369 } 370 } 371 372 @media (max-width: 480px) { 373 .footer-grid { 374 grid-template-columns: 1fr; 375 } 376 } 377 </style> 378 379 380<!-- SCRIPTS: -->
vendor: 110 bytes, lines 380-381
380 381<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
381<script> 382// class to show hide ".is-hidden" 383let dropArea = document.getElementById("drop-area") 384 385function hideDropArea() { 386 dropArea.classList.add('is-hidden') 387} 388 389function showDropArea() { 390 dropArea.classList.remove('is-hidden') 391} 392 393// class to show hide ".is-visible" 394let loadingBoxUploadingElement = document.getElementById("loading-box"); 395let loadingBoxProcessingElement = document.getElementById("loading-box-processing"); 396let loadingBoxErrorElementUnexpected = document.getElementById("loading-box-error"); 397let loadingBoxErrorElementBadRequest = document.getElementById("loading-box-error-bad-request"); 398 399function makeVisibleLoadingBox(loadingBoxElement) { 400 loadingBoxElement.classList.add('is-visible') 401} 402 403function makeInvisibleLoadingBox(loadingBoxElement) { 404 loadingBoxElement.classList.remove('is-visible') 405} 406 407let pasteUrlElement = document.getElementById("paste-url-input"); 408 409function showPasteUrlElement() { 410 pasteUrlElement.style.display = 'flex'; 411} 412 413function hidePasteUrlElement() { 414 pasteUrlElement.style.display = 'none'; 415} 416 417// class to show hide ".is-showing" 418let resultsWrapperElement = document.getElementById("results-wrap"); 419let resultIsNaturalElement = document.getElementById("p-result-description-natural"); 420let resultIsAiElement = document.getElementById("p-result-description-ai"); 421let galleryImgLinkElement = document.getElementById("gallery-img-link"); 422 423function showResult(chosenResult) { 424 resultsWrapperElement.classList.add('is-showing'); 425 chosenResult.classList.add('is-showing'); 426} 427 428function hideResult(chosenResult) { 429 resultsWrapperElement.remove('is-showing'); 430 chosenResult.classList.remove('is-showing'); 431} 432 433// ************************ Drag and drop old logic that is still in use ***************** // 434// Prevent default drag behaviors 435;['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { 436 dropArea.addEventListener(eventName, preventDefaults, false) 437 document.body.addEventListener(eventName, preventDefaults, false) 438}) 439 440// Highlight drop area when item is dragged over it 441;['dragenter', 'dragover'].forEach(eventName => { 442 dropArea.addEventListener(eventName, highlight, false) 443}) 444 445;['dragleave', 'drop'].forEach(eventName => { 446 dropArea.addEventListener(eventName, unhighlight, false) 447}) 448 449// Handle dropped files 450dropArea.addEventListener('drop', handleDrop, false) 451 452function preventDefaults (e) { 453 e.preventDefault() 454 e.stopPropagation() 455} 456 457function highlight(e) { 458 dropArea.classList.add('highlight') 459} 460 461function unhighlight(e) { 462 dropArea.classList.remove('highlight') 463} 464 465function handleDrop(e) { 466 var dt = e.dataTransfer 467 var files = dt.files 468 handleFiles(files) 469} 470 471//////////////////////////////////////////////////////////////////////////////// 472 473function handleFiles(files) { 474 files = [...files] 475 hideDropArea() 476 hidePasteUrlElement() 477 //makeVisibleLoadingBox(loadingBoxProcessingElement) 478 files.forEach(uploadFile) 479} 480 481function previewFile(file) { 482 let reader = new FileReader() 483 reader.readAsDataURL(file) 484 reader.onloadend = function () { 485 galleryImgLinkElement.style=`background-image: url(${reader.result});`; 486 galleryImgLinkElement.href = reader.result; 487 } 488} 489 490function previewFileBase64Encoded(base64EncodedImage, fileType) { 491 galleryImgLinkElement.style = "background-image: url(\"data:image;base64," + base64EncodedImage.replace(/(\r\n|\n|\r)/gm, ""); 492 galleryImgLinkElement.href = "data:image/" + fileType + ";base64," + base64EncodedImage.replace(/(\r\n|\n|\r)/gm, ""); 493} 494 495function uploadFile(file, i) { 496 var url = 'api/images/check-is-it-ai' 497 var xhr = new XMLHttpRequest() 498 var formData = new FormData() 499 xhr.open('POST', url, true) 500 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest') 501 502 xhr.upload.addEventListener("loadstart", function(e) { 503 // console.log('loadstart event') 504 hideDropArea() 505 hidePasteUrlElement() 506 makeInvisibleLoadingBox(loadingBoxProcessingElement) 507 makeInvisibleLoadingBox(loadingBoxUploadingElement) 508 makeInvisibleLoadingBox(loadingBoxErrorElementUnexpected) 509 makeVisibleLoadingBox(loadingBoxUploadingElement) 510 }) 511 512 xhr.upload.addEventListener("progress", function(event) { 513 // Monitor upload progress 514 if (event.lengthComputable) { 515 var percentComplete = (event.loaded / event.total) * 100; 516 if (percentComplete == 100){ 517 makeInvisibleLoadingBox(loadingBoxProcessingElement) 518 makeInvisibleLoadingBox(loadingBoxUploadingElement) 519 makeInvisibleLoadingBox(loadingBoxErrorElementUnexpected) 520 makeVisibleLoadingBox(loadingBoxProcessingElement) 521 } 522 // console.log('Upload Progress: ' + percentComplete + '%'); 523 } 524 }); 525 526 xhr.upload.addEventListener("error", function(e) { 527 // console.log('error event') 528 makeInvisibleLoadingBox(loadingBoxProcessingElement) 529 makeInvisibleLoadingBox(loadingBoxUploadingElement) 530 makeInvisibleLoadingBox(loadingBoxErrorElementUnexpected) 531 makeVisibleLoadingBox(loadingBoxErrorElementUnexpected) 532 }) 533 534 xhr.upload.addEventListener("load", function(e) { 535 // console.log('load') 536 // this one does not work properly, so we have fallback with "progress" event listener 537 makeInvisibleLoadingBox(loadingBoxProcessingElement) 538 makeInvisibleLoadingBox(loadingBoxUploadingElement) 539 makeInvisibleLoadingBox(loadingBoxErrorElementUnexpected) 540 makeVisibleLoadingBox(loadingBoxProcessingElement) 541 }) 542 543 xhr.onreadystatechange = function() { 544 if (xhr.readyState == XMLHttpRequest.DONE 545 && xhr.status == 200) { 546 responseJson = JSON.parse(xhr.responseText) 547 if(responseJson.isItAi){ 548 makeInvisibleLoadingBox(loadingBoxProcessingElement) 549 showResult(resultIsAiElement) 550 } else{ 551 makeInvisibleLoadingBox(loadingBoxProcessingElement) 552 showResult(resultIsNaturalElement) 553 } 554 555 previewFile(file) 556 557 document.getElementById("scrollHereId").scrollIntoView( 558 { 559 block: 'center', 560 behavior: 'smooth' 561 }); 562 } else { 563 makeInvisibleLoadingBox(loadingBoxProcessingElement) 564 makeInvisibleLoadingBox(loadingBoxUploadingElement) 565 if (xhr.status >= 400 && xhr.status < 500){ 566 makeVisibleLoadingBox(loadingBoxErrorElementBadRequest) 567 if(xhr.responseText){ 568 var jsonResponse = JSON.parse(xhr.responseText); 569 if (jsonResponse["detail"]){ 570 badRequestExplanation = jsonResponse["detail"]; 571 document.getElementById("bad-request-explanation-text-id").innerHTML = badRequestExplanation; 572 } 573 } 574 } else if (xhr.status >= 500){ 575 makeVisibleLoadingBox(loadingBoxErrorElementUnexpected) 576 } 577 } 578 } 579 580 formData.append('file', file) 581 xhr.send(formData) 582} 583 584function checkImageViaURL() { 585 var imageUrl = document.getElementById("urlImageToBeFetchedInput").value.trim(); 586 587 var apiUrl = 'api/images/check-is-it-ai-url'; 588 var xhr = new XMLHttpRequest(); 589 590 var formData = new FormData(); 591 formData.append('imageUrl', encodeURIComponent(imageUrl)); 592 593 var body = { 594 "imageUrl": imageUrl 595 }; 596 597 xhr.open('POST', apiUrl, true); 598 599 // TODO: Refactor this events setup to common function that can be re-used 600 xhr.upload.addEventListener("loadstart", function(e) { 601 document.getElementById("urlImageToBeFetchedInput").value = ""; 602 hideDropArea() 603 hidePasteUrlElement() 604 makeInvisibleLoadingBox(loadingBoxProcessingElement) 605 makeInvisibleLoadingBox(loadingBoxUploadingElement) 606 makeInvisibleLoadingBox(loadingBoxErrorElementUnexpected) 607 makeVisibleLoadingBox(loadingBoxProcessingElement) 608 }) 609 610 xhr.upload.addEventListener("error", function(e) { 611 makeInvisibleLoadingBox(loadingBoxProcessingElement) 612 makeInvisibleLoadingBox(loadingBoxUploadingElement) 613 makeInvisibleLoadingBox(loadingBoxErrorElementUnexpected) 614 makeVisibleLoadingBox(loadingBoxErrorElementUnexpected) 615 }) 616 617 xhr.onreadystatechange = function() { 618 if (xhr.readyState == XMLHttpRequest.DONE 619 && xhr.status == 200) { 620 responseJson = JSON.parse(xhr.responseText) 621 if(responseJson.isItAi){ 622 makeInvisibleLoadingBox(loadingBoxProcessingElement) 623 showResult(resultIsAiElement) 624 } else{ 625 makeInvisibleLoadingBox(loadingBoxProcessingElement) 626 showResult(resultIsNaturalElement) 627 } 628 629 previewFileBase64Encoded(responseJson.fetchedImage, responseJson.fetchedImageType) 630 document.getElementById("disabled-url-input-above-results-wrapper-id").style.display="flex" 631 document.getElementById("disabled-url-input-above-results-id").value=responseJson.imageURL 632 633 document.getElementById("scrollHereId").scrollIntoView( 634 { 635 block: 'center', 636 behavior: 'smooth' 637 }); 638 } else { 639 makeInvisibleLoadingBox(loadingBoxProcessingElement) 640 makeInvisibleLoadingBox(loadingBoxUploadingElement) 641 if (xhr.status >= 400 && xhr.status < 500){ 642 makeVisibleLoadingBox(loadingBoxErrorElementBadRequest) 643 if(xhr.responseText){ 644 var jsonResponse = JSON.parse(xhr.responseText); 645 if (jsonResponse["detail"]){ 646 badRequestExplanation = jsonResponse["detail"]; 647 document.getElementById("bad-request-explanation-text-id").innerHTML = badRequestExplanation; 648 } 649 } 650 } else if (xhr.status >= 500){ 651 makeVisibleLoadingBox(loadingBoxErrorElementUnexpected) 652 } 653 } 654 } 655 656 xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); 657 xhr.send(JSON.stringify(body)) 658} 659 660</script>
660 661 662<!-- vanilla JS (no jQuery) --> 663
663<script defer src="./javascript/main.js"></script>
663 664
664<script> 665 fetch('/api/pricing-links') 666 .then(function(r) { return r.json(); }) 667 .then(function(links) { 668 var dashboard = document.getElementById('nav-dashboard-link'); 669 if (dashboard && links.dashboard && links.dashboard !== 'not-set') { 670 dashboard.href = links.dashboard; 671 dashboard.style.display = ''; 672 } 673 var footerDashboard = document.getElementById('footer-dashboard-link'); 674 var footerDashboardLi = document.getElementById('footer-dashboard-li'); 675 if (footerDashboard && footerDashboardLi && links.dashboard && links.dashboard !== 'not-set') { 676 footerDashboard.href = links.dashboard; 677 footerDashboardLi.style.display = ''; 678 } 679 }) 680 .catch(function() {}); 681 </script>
681
682<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"46eb1b33acc34ef581e127987d6e4ef8","r":1,"spa":2}' crossorigin="anonymous"></script>
682 683</body> 684</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.