PageSourceSearch

https://wasitai.com/privacy

html wasitai.com collected 2026-09-24 11:17:48 UTC 28,006 bytes, 684 lines download raw bytes

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&#160;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&#39;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&#160;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>&copy; 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.