ITS-AI Python SDK
Typed, ergonomic Python client for the ITS-AI API with sync and async interfaces, robust error mapping, attempts, and helpful docs.
- Sync and async clients:
ItsAIClient(requests) andAsyncItsAIClient(httpx) - Strongly-typed results via dataclasses
- Attempts on 5xx and rate limits, with exponential backoff and
Retry-Aftersupport - Rich, typed error hierarchy mapped from API
typeand HTTP status - Safe logging with masked API keys
Installation
pip install its-ai
Quick start
Single text analysis
from its_ai import ItsAIClient, AnalyzeTextResult
client = ItsAIClient(api_key="api_key")
try:
result: AnalyzeTextResult = client.analyze_text("Your English text here.")
print(result.answer)
finally:
client.close()
With deep scan:
with ItsAIClient(api_key="api_key") as client:
result = client.analyze_text("Your English text here.", deep_scan=True)
print(result.answer, result.segmentation_tokens)
Batch analysis
from its_ai import ItsAIClient, AnalyzeBatchItemResult
texts = [
"Short text", # might trigger LowWords
"A sufficiently long English text ...",
]
with ItsAIClient(api_key="api_key") as client:
items: list[AnalyzeBatchItemResult] = client.analyze_batch(texts, deep_scan=False)
for item in items:
print(item.text, item.answer)
Chunking large batches automatically:
with ItsAIClient(api_key="api_key") as client:
results = client.analyze_batch(texts, max_batch_size=50)
Plagiarism
A plagiarism check costs twice the words of an AI scan of the same text and can take
minutes, so it uses its own generous timeout (PLAGIARISM_TIMEOUT) and is not
retried — a retry cannot resume the abandoned scan, it starts a second one that is
billed again. Pass timeout only to go higher.
with ItsAIClient(api_key="api_key") as client:
result = client.check_plagiarism("Your text here.")
print(result.score) # 0.0 original – 1.0 fully copied
for source in result.results:
print(source.score, source.link, source.title)
for match in source.matches: # the fragments that matched this source
print(match.match_score, match.text_sentence, match.link)
Grammar & style
Unlike AI detection, the grammar endpoints are multilingual and accept short texts (from 20 characters). There is no score — the result is the list of issues.
with ItsAIClient(api_key="api_key") as client:
result = client.check_grammar("She go to school every day.")
print(result.language, result.stats.errors)
for match in result.matches:
print(match.severity, match.message, match.replacements)
# Several texts at once — a failing text carries `error` instead of matches
for item in client.check_grammar_batch(["First text ...", "Second text ..."]):
print(item.error or item.stats.total)
report_id opens the web report, but the PDF certificate covers AI and plagiarism only —
downloading it for a grammar-only scan returns 404.
PDF certificate
Every AI and plagiarism scan returns a report_id you can exchange for the PDF certificate.
The endpoint is authenticated like every other one, and it serves the account whose key ran
the scan: a report_id from someone else's account raises PermissionDenied. Sharing the
certificate itself still works — the report page its QR code links to opens for anyone.
with ItsAIClient(api_key="api_key") as client:
result = client.analyze_text_v2("Your text here ...")
pdf = client.download_report(result.report_id, lang="fr", tz="Europe/Paris")
open("certificate.pdf", "wb").write(pdf)
lang and tz are optional (English / UTC by default). An unknown report_id, or one from
a grammar-only check, raises NotFound; a report_id belonging to another account raises
PermissionDenied.
Async usage
import asyncio
from its_ai import AsyncItsAIClient
async def main():
async with AsyncItsAIClient(api_key="api_key") as client:
res = await client.analyze_text("hello world", deep_scan=True)
print(res)
asyncio.run(main())
Errors and attempts
The client raises typed exceptions derived from ItsAIError based on the API error type and HTTP status. Common ones include:
ValidationError,AuthenticationFailed,PermissionDenied,NotFound,NotAcceptable- Domain errors:
LowWords,ManyWords,OnlyEnglish,RateLimitExceeded, etc. - Transport failures:
RequestTimeout,NetworkError
API errors arrive as <type>:<code> (e.g. validation:low_words, server:server) and are
matched on both halves, so an unfamiliar code still lands on its category's class rather than
on the bare ItsAIError.
Idempotent POSTs are retried up to 3 times on 5xx and on a rate limit, with exponential backoff and Retry-After respected. A rate limit arrives as HTTP 400 with code validation:rate_limit (not 429) and is raised as RateLimitExceeded; every other 4xx is final. Plagiarism checks are never retried — see below.
from its_ai import ItsAIClient, LowWords, ManyWords, OnlyEnglish, AuthenticationFailed
try:
with ItsAIClient() as client: # reads ITS_AI_API_KEY from env by default
client.analyze_text("too short")
except LowWords as e:
print("Text too short:", e.message)
except ManyWords:
print("Text too long")
except OnlyEnglish:
print("Only English is supported")
except AuthenticationFailed:
print("Invalid/absent API key")
Configuration
api_key: string, required (defaults fromITS_AI_API_KEY)base_url: defaults tohttps://api.its-ai.org(trailing slashes trimmed)timeout: default 10s (override per-call viatimeout=)max_attempts: default 3 (5xx and rate limits)max_batch_size(batch-only): optional chunking of input texts
Headers are set automatically: User-Agent: its-ai-python-sdk/<version>, Accept: application/json, Content-Type: application/json.
Logging
The package uses Python's logging under the logger name its_ai. Enable DEBUG to see request URLs, status codes, and trimmed payloads. The api_key is masked.
import logging
logging.basicConfig(level=logging.DEBUG)
Environment
ITS_AI_API_KEY– used by default ifapi_keyis not passed.ITS_AI_E2E=1– enable smoke tests to hit the real API in CI (optional).
Testing
Run unit tests:
python -m pytest -q
Run smoke (real API) tests when you have a valid key:
export ITS_AI_API_KEY="api_key"
export ITS_AI_E2E=1
python -m pytest -q
API Reference (brief)
Every method has an await-able twin with the same signature on AsyncItsAIClient.
AI detection
analyze_text(text, deep_scan=False, *, timeout=None) -> AnalyzeTextResult— v1analyze_batch(texts, deep_scan=False, *, timeout=None, max_batch_size=None) -> list[AnalyzeBatchItemResult]— v1analyze_text_v2(text, *, timeout=None) -> AnalyzeTextV2Result— richer result (score,ai_percentage,probabilities,segments), always a deep scananalyze_batch_v2(texts, *, timeout=None, max_batch_size=None) -> list[AnalyzeBatchV2ItemResult]— per-texterrorinstead of one error for the whole batch
Plagiarism
check_plagiarism(text, *, timeout=None) -> PlagiarismResult
Grammar & style
check_grammar(text, *, timeout=None) -> GrammarResultcheck_grammar_batch(texts, *, timeout=None, max_batch_size=None) -> list[GrammarBatchItemResult]
Reports
download_report(report_id, *, lang=None, tz=None, timeout=None) -> bytes— the PDF certificate
Note that API access is an Enterprise-plan feature, enforced per request: a key issued on
Enterprise stops working after a downgrade (PermissionDenied).
License
MIT
For API details and the hosted endpoint see https://api.its-ai.org.
Metadata
Release files for its-ai 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| its_ai-0.2.1.tar.gz | 32.3 kB | Without provenance | Details for its_ai-0.2.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| its_ai-0.2.1-py3-none-any.whl | Python 3 | none | any | Details for its_ai-0.2.1-py3-none-any.whl |
Total release size: 52.6 kB
Release files / its_ai-0.2.1.tar.gz
| Download URL | its_ai-0.2.1.tar.gz |
|---|---|
| Size | 32.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
215dee7d7299de0282fc84617da01af5d329720d6e6e6918aae09d138be3b2f3
|
|
BLAKE2b-256 checksum How to use checksums |
84fa1db93b3ad254560d8c64e5b70ad2df517465dc3f21480f05010f93f4255e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.18
|
Release files / its_ai-0.2.1-py3-none-any.whl
| Download URL | its_ai-0.2.1-py3-none-any.whl |
|---|---|
| Size | 20.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
04c7017b07e6d0419365f5ce6609e076176722e9dd25fde22304a7c5d99f9ddf
|
|
BLAKE2b-256 checksum How to use checksums |
110f27db6d85872009cc3a356ded7349c394605b278d0a9d420b527b6b22ffc0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.18
|
Security for its-ai 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.