<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: João Reis</title>
    <description>The latest articles on DEV Community by João Reis (@mrjootta).</description>
    <link>https://dev.to/mrjootta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F169900%2Fe704b153-da8a-4dfa-99ba-3a297cad3612.png</url>
      <title>DEV Community: João Reis</title>
      <link>https://dev.to/mrjootta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mrjootta"/>
    <language>en</language>
    <item>
      <title>How we trained a multilingual AI-text detector (minus the secrets)</title>
      <dc:creator>João Reis</dc:creator>
      <pubDate>Thu, 08 Oct 2026 13:09:49 +0000</pubDate>
      <link>https://dev.to/mrjootta/how-we-trained-a-multilingual-ai-text-detector-minus-the-secrets-1h56</link>
      <guid>https://dev.to/mrjootta/how-we-trained-a-multilingual-ai-text-detector-minus-the-secrets-1h56</guid>
      <description>&lt;p&gt;We built our own model to detect AI-written text in six languages, and it now runs behind every check on &lt;a href="https://probator.ai" rel="noopener noreferrer"&gt;Probator.ai&lt;/a&gt;. This is how we trained it.&lt;/p&gt;

&lt;p&gt;We'll be open about the method and keep a few things to ourselves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which models wrote our AI training text;&lt;/li&gt;
&lt;li&gt;how much data we used;&lt;/li&gt;
&lt;li&gt;the exact architecture;&lt;/li&gt;
&lt;li&gt;the thresholds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anything that makes a detector easier to fool doesn't belong in a blog post. Everything else is here.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Teach "who wrote it", not "what it's about"
&lt;/h2&gt;

&lt;p&gt;The easiest way to build a bad AI detector is to collect human text from one place and AI text from another. The model learns that encyclopedia articles are human and blog-style answers are AI, scores beautifully on its own test set, and fails on real documents.&lt;/p&gt;

&lt;p&gt;So every piece of training data comes in &lt;strong&gt;pairs&lt;/strong&gt;: a human text, and an AI text written on the same topic, in the same language and genre. The only consistent difference left between the two sides is who wrote them, and that's what the model has to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Human text from before chatbots
&lt;/h2&gt;

&lt;p&gt;You can't be sure a text is human-written if it was published after 2022. So the human side comes from writing that predates chatbots:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;encyclopedia articles;&lt;/li&gt;
&lt;li&gt;web pages crawled years ago;&lt;/li&gt;
&lt;li&gt;news articles;&lt;/li&gt;
&lt;li&gt;academic abstracts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every text goes through quality filters, and the material is spread across six languages: English, Portuguese, Spanish, French, German and Italian.&lt;/p&gt;

&lt;p&gt;Variety of genre matters as much as volume. Formal, technical and translated writing is where AI detectors accuse humans most often, so that kind of text is deliberately well represented.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. AI text from many models, written many ways
&lt;/h2&gt;

&lt;p&gt;The AI side is written by a &lt;strong&gt;varied set of current models&lt;/strong&gt;, with prompts that ask for different genres, lengths and tones. A detector trained on one model learns that model's habits. A detector trained on many has to learn what they share.&lt;/p&gt;

&lt;p&gt;Two harder kinds of AI text go in as well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI-polished human text:&lt;/strong&gt; a human draft that a model rewrote;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"humanized" text:&lt;/strong&gt; text a model wrote with instructions to sound human.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Split by topic, never by sentence
&lt;/h2&gt;

&lt;p&gt;This is the step most homemade evaluations get wrong. We score text passage by passage. If you shuffle passages into training and test sets at random, passages of the same document end up on both sides. The model then partly recognises documents it has already seen, and your accuracy looks better than it is.&lt;/p&gt;

&lt;p&gt;We split by &lt;strong&gt;topic pair&lt;/strong&gt; instead. Each pair gets a stable hash and goes, whole, to one of three sets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;train&lt;/strong&gt;: what the model learns from;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;validation&lt;/strong&gt;: what we calibrate on;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;test&lt;/strong&gt;: what we report, and nothing else touches it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A topic in the test set was never seen in training, by either the human or the AI text.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The model
&lt;/h2&gt;

&lt;p&gt;Each passage becomes a &lt;strong&gt;multilingual sentence embedding&lt;/strong&gt;, plus a handful of simple style features. A small neural network turns that into a probability that the passage is machine-written. The passage scores are combined into a score for the whole document.&lt;/p&gt;

&lt;p&gt;The network is deliberately small. It adds only milliseconds to a check, and it's cheap enough to retrain whenever new models appear. The probabilities are calibrated, so 0.8 means roughly 80% of the time, not just "higher than 0.6".&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Calibrate for the person who could be wrongly accused
&lt;/h2&gt;

&lt;p&gt;An AI detector makes two kinds of mistake, and they don't cost the same. Missing an AI text is a shame. Telling a teacher that a student's own essay is AI-generated can hurt someone.&lt;/p&gt;

&lt;p&gt;So the decision threshold is set &lt;strong&gt;per language&lt;/strong&gt;, on the validation set, so that at most 1 in 100 human documents is flagged. Three more guards apply on top of the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short texts:&lt;/strong&gt; no "AI-generated" verdict under 80 words, unless there is hard evidence such as a chatbot leftover or a hidden mark.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agreement:&lt;/strong&gt; our model is one of several signals, alongside an expert reading by a language model, a rewrite test and forensic checks. The strongest verdict needs two of them to agree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency:&lt;/strong&gt; when a guard changes a result, the report says so.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Go after your own false positives
&lt;/h2&gt;

&lt;p&gt;Benchmarks don't find every weakness; users do. Early on, someone sent us a document they had written entirely themselves, and our model gave it a 9% AI likelihood. That's below any verdict, but a careful reader shouldn't see 9% on fully human writing.&lt;/p&gt;

&lt;p&gt;We looked at what kind of writing it was: formal, structured, with few personal touches. We added more human writing of that kind to the training data, retrained, and checked again. The broader lesson: the texts most likely to be misjudged are the most valuable ones to collect.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Training without a GPU cluster
&lt;/h2&gt;

&lt;p&gt;The whole pipeline runs on serverless infrastructure: collecting text, generating AI text, embedding and training. There's no long-running machine. That shaped the design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small resumable steps:&lt;/strong&gt; each step is short and saves its state, so training survives restarts and timeouts. The model's weights are checkpointed to object storage after each step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A queue drives the run:&lt;/strong&gt; each finished step schedules the next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A watchdog:&lt;/strong&gt; it notices a step that stalled and starts it again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additive runs:&lt;/strong&gt; a new run can add fresh texts on top of everything collected before, instead of starting from zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first version stalled in the middle of an epoch more than once. Making every step resumable is what made training boring, which is how training should be.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Results
&lt;/h2&gt;

&lt;p&gt;On held-out test documents, in all six languages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accuracy: 98.4%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AUROC: 0.998&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AUROC measures how well the model ranks AI text above human text, whatever the threshold: 1.0 is perfect, 0.5 is a coin toss. Results by language are on our &lt;a href="https://probator.ai/accuracy/" rel="noopener noreferrer"&gt;accuracy page&lt;/a&gt;, and we update it whenever a new model goes live.&lt;/p&gt;

&lt;p&gt;A detector is never proof, though. Our results come with the reasons behind them, so a person can make the decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we keep to ourselves, and why
&lt;/h2&gt;

&lt;p&gt;We don't publish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which models wrote the AI training text;&lt;/li&gt;
&lt;li&gt;the size of the data;&lt;/li&gt;
&lt;li&gt;the network's exact shape;&lt;/li&gt;
&lt;li&gt;the thresholds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With them, it would be easier to tune text until it slips under the detector. Everything that tells you whether to trust the results, the method, how the split works and the test results, is public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://probator.ai/app/" rel="noopener noreferrer"&gt;Free web editor&lt;/a&gt;:&lt;/strong&gt; 5,000 credits a month, no card needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://probator.ai/docs/api/" rel="noopener noreferrer"&gt;REST API and remote MCP server&lt;/a&gt;:&lt;/strong&gt; to plug the same checks into your code or your AI agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What would you want to know about how a detector was trained before you trusted it? Tell us in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>nlp</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Give your AI agent a fact-checker for text: AI detection, grammar and plagiarism over MCP</title>
      <dc:creator>João Reis</dc:creator>
      <pubDate>Thu, 08 Oct 2026 12:59:16 +0000</pubDate>
      <link>https://dev.to/mrjootta/give-your-ai-agent-a-fact-checker-for-text-ai-detection-grammar-and-plagiarism-over-mcp-54mm</link>
      <guid>https://dev.to/mrjootta/give-your-ai-agent-a-fact-checker-for-text-ai-detection-grammar-and-plagiarism-over-mcp-54mm</guid>
      <description>&lt;p&gt;More and more of the text that flows through our apps is written, edited or summarised by a language model. Content platforms want to know before they publish it. Schools want to know before they grade it. And under Article 50 of the EU AI Act, anyone publishing AI-generated text to inform the public will need to label it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://probator.ai" rel="noopener noreferrer"&gt;Probator.ai&lt;/a&gt;&lt;/strong&gt; checks a text for three things in one call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI generation&lt;/strong&gt;: a likelihood and a verdict, sentence by sentence, with the evidence behind it;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grammar and style&lt;/strong&gt;: corrections with explanations, never applied for you;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plagiarism&lt;/strong&gt;: matching sources from the web, academic databases and Wikipedia in every language.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also reports hidden characters, look-alike letters and AI provenance marks (C2PA, IPTC labels, invisible Unicode tags used for hidden prompts). It works in 100+ languages, and you can call it from your code or let your AI agent call it directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  For agents: one line of MCP config
&lt;/h2&gt;

&lt;p&gt;Probator runs a remote MCP server. Add it to any client that speaks MCP over HTTP (Claude, Cursor, VS Code, your own agent):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"probator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://probator.ai/mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first call returns a 401 that points the client to OAuth 2.1. The client registers itself, you sign in and approve, and that's it: no keys to copy around. If your agent prefers a key, add &lt;code&gt;"headers": { "Authorization": "Bearer pb_live_…" }&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;Your agent gets five tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check_ai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AI-text detection with evidence and provenance marks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check_grammar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;corrections, with explanations in 6 languages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check_plagiarism&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;originality score and matching sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check_all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;all three in one call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_credits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;plan and remaining credits (free)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Agents that can't run an OAuth client can still register: they send the person's email, the person signs in, and types a 6-digit code the agent shows them. The details are in &lt;a href="https://probator.ai/auth.md" rel="noopener noreferrer"&gt;auth.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  For your code: a plain REST API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://probator.ai/v1/detect &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$PROBATOR_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "Paste the text you want to check here..."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"likely_ai"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"p_ai"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"guards"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sentences"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provenance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"declared"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"marks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"credits"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;142&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"remaining"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;499858&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Endpoints:&lt;/strong&gt; &lt;code&gt;/v1/analyze&lt;/code&gt; runs any combination of checks, and also accepts PDF, Word, Markdown, HTML and text files. &lt;code&gt;/v1/detect&lt;/code&gt;, &lt;code&gt;/v1/grammar&lt;/code&gt; and &lt;code&gt;/v1/plagiarism&lt;/code&gt; run a single check each, and &lt;code&gt;/v1/usage&lt;/code&gt; returns your plan and credits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errors:&lt;/strong&gt; every error has a stable &lt;code&gt;code&lt;/code&gt; (&lt;code&gt;insufficient_credits&lt;/code&gt;, &lt;code&gt;too_many_words&lt;/code&gt;, &lt;code&gt;rate_limited&lt;/code&gt;), and every response carries &lt;code&gt;x-credits-used&lt;/code&gt; and &lt;code&gt;x-credits-remaining&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specs:&lt;/strong&gt; the &lt;a href="https://probator.ai/openapi.json" rel="noopener noreferrer"&gt;OpenAPI file&lt;/a&gt; is public, and so are &lt;a href="https://probator.ai/llms.txt" rel="noopener noreferrer"&gt;&lt;code&gt;llms.txt&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://probator.ai/llms-full.txt" rel="noopener noreferrer"&gt;&lt;code&gt;llms-full.txt&lt;/code&gt;&lt;/a&gt;, so your coding assistant can read the docs itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the detection works (and why you can trust a "no")
&lt;/h2&gt;

&lt;p&gt;Most AI detectors give you one opaque number. Probator combines four independent signals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Its own detection model:&lt;/strong&gt; a classifier over multilingual sentence embeddings, trained on human and AI-written text in six languages, including AI-polished and "humanized" text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An expert reading by a language model&lt;/strong&gt; that quotes the passages it finds suspicious.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A rewrite test:&lt;/strong&gt; machine text changes little when a model polishes it again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forensic evidence:&lt;/strong&gt; chatbot leftovers, invisible characters, look-alike letters, file metadata.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A false positive costs much more than a miss, so the engine is built to avoid them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short texts:&lt;/strong&gt; no "AI-generated" verdict under 80 words without hard evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongest verdict:&lt;/strong&gt; two detectors must agree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-language thresholds:&lt;/strong&gt; calibrated to keep false positives on human text at 1% or less.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a guard changes a result, the report tells you which one, in &lt;code&gt;verdict.guards&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On held-out test documents the model scores &lt;strong&gt;98.4% accuracy and an AUROC of 0.998&lt;/strong&gt;. Results by language are published on the &lt;a href="https://probator.ai/accuracy/" rel="noopener noreferrer"&gt;accuracy page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Results are probabilities with reasons, not proof. Use them to decide what a person should review, not to decide about a person.&lt;/p&gt;

&lt;h2&gt;
  
  
  What people build with it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Publishing pipelines:&lt;/strong&gt; check articles before they go live and add the AI disclosure where it's needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning platforms:&lt;/strong&gt; run submissions through detection and plagiarism, then show teachers the evidence, not just a score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editorial and review agents:&lt;/strong&gt; an agent that triages incoming text, flags what needs a human, and fixes the grammar on the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moderation queues:&lt;/strong&gt; catch generated spam and copied content across languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signed certificates:&lt;/strong&gt; turn a check into a PDF certificate with an Ed25519 signature that anyone can &lt;a href="https://probator.ai/verify/" rel="noopener noreferrer"&gt;verify&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Privacy, briefly
&lt;/h2&gt;

&lt;p&gt;Saved documents and the account database stay in the EU. Texts are never used to train models, and the language models it uses are called with no retention and no training. Probator reports hidden marks and AI labels but never removes them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; 5,000 credits a month in the &lt;a href="https://probator.ai/app/" rel="noopener noreferrer"&gt;web editor&lt;/a&gt;, no card needed. AI detection costs 1 credit per word.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API and MCP:&lt;/strong&gt; included in Pro (€12.99 a month, 500,000 credits) and Team (€39 a month for 3 seats, 2,000,000 shared credits).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://probator.ai/docs/api/" rel="noopener noreferrer"&gt;probator.ai/docs/api&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear what you'd plug it into, and what your agent would need from a tool like this. Drop it in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>mcp</category>
      <category>api</category>
    </item>
  </channel>
</rss>
