Proofademic APIProofademic API

Plagiarism Checker

Scan text against web sources and receive a plagiarism score, matched sources, and highlighted passages.

POST /api/plagiarism/scan/

Scan text for plagiarism against web sources. Returns a plagiarism_score between 0 (original) and 1 (fully plagiarised), a verdict, the matched sources with URLs, and highlighted character ranges.

Authentication: X-API-Key header with plagiarism_checker scope

Request Parameters

ParameterTypeRequiredDescription
contentstringYesText to scan. Sent exactly as submitted — highlight offsets in the response refer to this text

Limits

LimitValue
Minimum length50 characters
Maximum length25,000 words

Words are counted script-aware: whitespace-separated words for most languages, one word per character for CJK scripts. The API's count may differ slightly from a simple space-split.

Pricing

Every scan costs a flat 2 credits, regardless of text length. If the scan fails, the credits are refunded automatically.

Idempotency

Scans are billed per request, so retrying a request that already succeeded would normally charge again. To make retries safe, send an Idempotency-Key header (any string up to 255 characters, e.g. a UUID):

  • Repeating the same key with the same text within 5 minutes returns the original response — nothing is re-scanned and nothing is charged.
  • Repeating the same key with different text is rejected with 409 idempotency_key_reuse, so a stale key can never silently return results for the wrong text.
curl -X POST https://developer-portal.proofademic.ai/api/plagiarism/scan/ \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Idempotency-Key: 3f6c1c1e-8f2a-4a9e-9b1c-1d2e3f4a5b6c" \
  -d '{ "content": "..." }'

Example

Request

curl -X POST https://developer-portal.proofademic.ai/api/plagiarism/scan/ \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "content": "The Eiffel Tower is a wrought-iron lattice tower on the Champ de Mars in Paris, France. It is named after the engineer Gustave Eiffel, whose company designed and built the tower from 1887 to 1889."
  }'

Response (200 OK)

{
  "status": "success",
  "scan_id": "scan_YYbWPwT4JHUabc12",
  "plagiarism_score": 0.99,
  "verdict": "severe_plagiarism",
  "summary": "Nearly all of the submitted text matches known sources.",
  "sources": [
    {
      "url": "https://en.wikipedia.org/wiki/Eiffel_Tower",
      "title": "Eiffel Tower - Wikipedia",
      "domain": "en.wikipedia.org",
      "similarity_score": 0.97,
      "matched_word_count": 34,
      "matched_percentage": 0.92,
      "matches": [
        {
          "submitted_range": { "start": 0, "end": 133 },
          "similarity": 0.97
        }
      ]
    }
  ],
  "highlights": [
    { "start": 0, "end": 133, "severity": "high", "source_index": 0 }
  ],
  "stats": {
    "word_count": 37,
    "input_chars": 196,
    "sentence_count": 2,
    "sources_checked": 24,
    "processing_time_ms": 3100
  },
  "execution_time": 3.4,
  "word_count": 37,
  "credits_remaining": 1998,
  "user": {
    "id": 12345
  }
}

Response Fields

FieldTypeDescription
statusstringAlways "success" for a completed scan
scan_idstringScan identifier — include it in support requests
plagiarism_scorefloat0.0 (original) to 1.0 (fully plagiarised)
verdictstringClassification of the score (see below)
summarystringHuman-readable summary of the result
sources[]arrayMatched sources, strongest first
sources[].urlstringSource URL
sources[].titlestringSource page title
sources[].domainstringSource domain
sources[].similarity_scorefloatHow closely this source matches (0–1)
sources[].matched_word_countintegerWords matched against this source
sources[].matched_percentagefloatShare of your text matched by this source
sources[].matches[]arrayMatched passages with submitted_range offsets
highlights[]arrayCharacter ranges to highlight in the submitted text
highlights[].start / endintegerOffsets into your text exactly as you submitted it
highlights[].severitystringhigh, medium, or low
highlights[].source_indexintegerIndex into sources[] for this highlight
statsobjectScan statistics (word_count, input_chars, sentence_count, sources_checked, processing_time_ms)
word_countintegerWord count of the submitted text (script-aware)
credits_remainingintegerCredit balance after this request
user.idintegerYour user ID

Verdicts

Score rangeVerdict
< 0.05original
0.05 – 0.15minor_similarity
0.15 – 0.40moderate_plagiarism
0.40 – 0.70significant_plagiarism
≥ 0.70severe_plagiarism

Highlight severity reflects how closely each passage matches its source: high ≥ 0.85, medium ≥ 0.70, low below that.

Errors

StatusCodeMeaning
400insufficient_contentThe text does not contain enough complete sentences to scan
400max_words_exceededOver the 25,000-word limit — details carries limit and actual
400invalid_payloadMissing or malformed content (including the 50-character minimum)
400invalid_idempotency_keyIdempotency-Key header longer than 255 characters
403insufficient_creditsNot enough credits — details carries credits and required
409idempotency_key_reuseThe Idempotency-Key was already used with different text
503service_unavailableScanning temporarily unavailable — retry after the Retry-After header when present
503service_errorScan failed — credits were refunded

See Error Handling for the general error format.

On this page