# How scanning works

> What an agent can send to Copyleaks, how it gets there, and what a scan costs.

## Three scan types

| Scan | Input | Answers |
|---|---|---|
| **`AI Detection`** | text | Which parts of this text were AI-written? |
| **`Plagiarism Detection`** | text | Which parts match something else, and what? |
| **AI image detection** | an image | Was this image AI-generated? |

<Note>
  **A scan is either text or image, never both.** The two text scans can run together on the same text; an image scan runs alone.
</Note>

Two things are part of a plagiarism scan rather than scans of their own: **`Cheat Detection`** (hidden characters, white ink, text manipulation) and the **`AI Source Match`** tag, which marks a matched source as itself AI-generated.

## OCR - PDFs, scans and photos

Both text scans accept files that are not plain text - a PDF, a scanned page, a photograph of a document. Copyleaks extracts the text and scans that. **That is still a text scan.**

| You want to know | Scan type |
|---|---|
| Is the writing in this PDF plagiarized? | **text** - extracted first |
| Is the text in this screenshot AI-written? | **text** - extracted first |
| Was this photo generated by AI? | **image** |

## The 350-word AI minimum

`AI Detection` needs at least **350 words**. Below that it does not run at all and no AI score comes back - the scan still runs for plagiarism, which has no minimum.

<Warning>
  **A blank AI score means *not measured*, never *nothing found*.** Your agent reports which checks actually ran.
</Warning>

## Long text goes as a file

Pasted text is capped at **25,000 characters**. A file has no character ceiling, so if a paste is refused for length, send the same content as a file instead.

## Getting a document to Copyleaks

An agent cannot pass a file from one connector to another. A Drive or Dropbox connection gives *your agent* the file; it does not give Copyleaks the file.

| Path | For | How |
|---|---|---|
| **Inline** | Small files | The file travels inside the scan request |
| **Upload** | Everything larger | Ask for an upload slot, send the file to it, then scan the handle |

**There is no fixed byte threshold between the two.** An inline file is encoded and crosses the agent's context twice, costing roughly **3.3 tokens per byte**, so the boundary is whatever the agent's remaining context can hold - which differs by client by more than two orders of magnitude. Your agent budgets against its own context and picks. Anything past a small file should go through the upload slot, where the bytes never enter the conversation.

The upload step needs a client that can run a command on your machine:

| Client | Upload step |
|---|---|
| **Claude Code** - terminal, **desktop app**, web, or IDE extension | ✅ all four forms |
| **Codex CLI · Gemini CLI · Antigravity · Cursor · VS Code** | ✅ |
| **The Claude chat apps** - claude.ai and Claude Desktop | ⛔ inline only, permanently |

On the two chat surfaces, larger files are uploaded in the Copyleaks web app instead. **Claude Code's desktop app is Claude Code and has the full capability** - it is not Claude Desktop.

## Images

<Warning>
  **Copyleaks scans the image you actually have, byte for byte.** Any alteration - resizing, cropping, converting, re-saving - changes the answer. Your agent will not modify an image to make it fit; if it cannot send the original, it says so.
</Warning>

**An image always travels through the upload step, never inline.** That means image scanning is unavailable on the two Claude chat surfaces, claude.ai and Claude Desktop - but works in Claude Code, including its desktop app.

| Bound | | Checked |
|---|---|---|
| Maximum size | 33,554,432 bytes | at the upload slot, before the image is sent |
| Formats | PNG · JPEG/JPG · BMP · WebP · HEIC · HEIF | at the upload slot, before the image is sent |
| Minimum dimensions | 512 × 512 pixels | after the image is sent |
| Maximum | 27 megapixels | after the image is sent |

**Size and format are checked before the image is sent**, so an image over the limit or in an unsupported format is refused without spending anything. **Dimensions and megapixels are checked afterwards** - the upload slot knows a file's byte count and extension, not its pixels. An image outside those bounds is sent, fails there, and **still spends no credit**; the failure comes back as a failed scan carrying its reason.

An image scan returns a score and confirmation the picture was checked - nothing pixel-level. Open the report for anything visual.

## Web addresses

Scanning a web address means Copyleaks fetches it, without your sign-ins. So **Google Docs and Drive, SharePoint and OneDrive, Notion, Dropbox and anything on a private network return a sign-in page, not your document.**

<Warning>
  Copyleaks cannot tell the difference, so it scans that sign-in page and spends credits on it. Send the document as a file instead. Addresses on a private or internal network are refused before any credit is spent.
</Warning>

## Several files at once

Up to **ten files** in one call, each its own scan, spending credits separately. Ten is a deliberate guard so one mistaken instruction cannot spend a large share of your balance - send the rest as a second call.
