Skip to content

Fileverity API docs

API reference

Every Fileverity API endpoint with parameters, request and response schemas, error codes and examples, generated from the OpenAPI 3.1 specification.

View as MarkdownUpdated 2026-11-04

This reference is generated from the API's OpenAPI 3.1 document, available at https://api.fileverity.com/v1/openapi.json, so it always matches the API. For concepts and guides, start with the Overview.

Conventions

Base URL: https://api.fileverity.com/v1. Authenticate every request with Authorization: Bearer <key>. Errors share one format, described in Errors. Every response carries an x-request-id header, and authenticated responses carry the rate-limit headers described in Rate limits and headers. Nested objects open in collapsible sections under the table.

Text detections

Detect AI-written text

POST https://api.fileverity.com/v1/text/detections

Classifies plain text as AI-written, partly AI-written or human-written and returns the AI-written passages. The text is evaluated and discarded; it is not stored. Billing counts Unicode code points in units of 1,000 characters, rounded up per request. Requests rejected before evaluation are not charged. Test keys return a fixed human result without charge.

Parameters

NameInTypeRequiredDescription
Idempotency-KeyheaderstringNoUnique key of up to 255 characters. Repeating the request with the same key and body within 24 hours returns the first response with the header idempotent-replayed: true; the same key with a different body returns 409.

Request body: application/json, required

FieldTypeRequiredDescription
modelstringNoModel ID or snapshot ID. Default "fvdoc-3-text".
textstringYesPlain text, at least 100 words and at most 100,000 characters.
languageone of "en", "fr", "de", "es", "zh", nullNoISO 639-1 code. Detected automatically when omitted. Default null.

Responses

StatusDescriptionBody
200The detection result.TextDetection
400Invalid request. Error codes: invalid_json, missing_parameter, text_too_short, unsupported_language, invalid_parameter.Error
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
402The balance or the key's monthly spend limit cannot cover the request. Error codes: insufficient_balance, spend_limit_reached.Error
404Resource not found. Error codes: model_not_found.Error
409Conflict with the current state. Error codes: idempotency_mismatch, idempotency_in_progress.Error
413A size limit was exceeded. Error codes: text_too_long.Error
415Unsupported media type or file format. Error codes: unsupported_media_type.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error
502Analysis could not be completed; not charged. Error codes: analysis_failed.Error
503Temporarily unavailable or busy; not charged. Retry after the number of seconds in the retry-after header. Error codes: service_unavailable.Error

Response 200: TextDetection

FieldTypeRequiredDescription
idstringYes
object"text.detection"Yes
createdintegerYesUnix timestamp.
modelstringYesSnapshot that produced the result.
livemodebooleanYesFalse for test keys.
languageone of "en", "fr", "de", "es", "zh"Yes
verdictone of "ai", "mixed", "human"Yesai: the text reads as AI-written throughout; mixed: AI-written passages within human text; human: no AI-written passage found.
scorenumberYesModel score for the most AI-like passage. Minimum 0. Maximum 1.
ai_fractionnumberYesShare of the evaluated text inside AI-written segments. Minimum 0. Maximum 1.
segmentsarray of objectYesAI-written passages, as offsets into the submitted text in Unicode code points. Boundaries are approximate and can include adjacent sentences.
usageobjectYes
segments: fields
FieldTypeRequiredDescription
startintegerYes
endintegerYesExclusive.
scorenumberYesMinimum 0. Maximum 1.
usage: fields
FieldTypeRequiredDescription
charactersintegerYesUnicode code points evaluated.
free_charactersintegerYesCharacters covered by your free-start allowance, not billed.
billed_unitsintegerYesUnits of 1,000 characters actually charged, after free characters; billed_units × unit price is the cost.

Error codes

CodeStatus
invalid_json400
missing_parameter400
unsupported_media_type415
text_too_short400
text_too_long413
unsupported_language400
model_not_found404
insufficient_balance402
spend_limit_reached402
service_unavailable503
analysis_failed502
invalid_parameter400
idempotency_mismatch409
idempotency_in_progress409
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl https://api.fileverity.com/v1/text/detections \  -H "Authorization: Bearer $FILEVERITY_API_KEY" \  -H "Content-Type: application/json" \  -d "$(jq -Rs '{text: .}' essay.txt)"
{  "id": "tdet_8Hk2pQ4vN9sL1xR7cW3mY6zB",  "object": "text.detection",  "created": 1793664000,  "model": "fvdoc-3-text-2026-11-03",  "livemode": true,  "language": "en",  "verdict": "mixed",  "score": 0.97,  "ai_fraction": 0.41,  "segments": [    {      "start": 212,      "end": 433,      "score": 0.97    },    {      "start": 579,      "end": 790,      "score": 0.93    }  ],  "usage": {    "characters": 1412,    "free_characters": 0,    "billed_units": 2  }}

Files

Upload a file

POST https://api.fileverity.com/v1/files

Uploads a file for analysis. Send files up to 4 MB as multipart/form-data in the field file; the response has status uploaded. Files larger than 4 MB must be uploaded with a pre-signed URL. Send JSON with filename, content_type and bytes (documents up to 50 MB); the response has status pending and an upload object with a pre-signed URL: send the file bytes to it with PUT and the given headers before it expires. A file is deleted when an analysis starts and at the latest after 24 hours. A workspace can hold up to 50 unexpired files and 200 MB per mode at once.

Parameters

NameInTypeRequiredDescription
Idempotency-KeyheaderstringNoUnique key of up to 255 characters. Repeating the request with the same key and body within 24 hours returns the first response with the header idempotent-replayed: true; the same key with a different body returns 409.

Request body: multipart/form-data, required

FieldTypeRequiredDescription
filestringYesFormat binary.

Request body: application/json, required

FieldTypeRequiredDescription
filenamestringNo
content_typestringYesMIME type of the file, for example image/jpeg or application/pdf.
bytesintegerYesExact size in bytes. Minimum 1. Maximum 52,428,800.

Responses

StatusDescriptionBody
201The file.File
400Invalid request. Error codes: invalid_json, missing_parameter, invalid_parameter.Error
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
409Conflict with the current state. Error codes: idempotency_mismatch, idempotency_in_progress.Error
413A size limit was exceeded. Error codes: file_too_large.Error
415Unsupported media type or file format. Error codes: unsupported_media_type, unsupported_file.Error
422The file cannot be processed. Error codes: invalid_file.Error
429Too many requests. Error codes: pending_files_limit, rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Response 201: File

FieldTypeRequiredDescription
idstringYes
object"file"Yes
filenamestring or nullYes
bytesinteger or nullYes
content_typestringYes
statusone of "pending", "uploaded"Yespending until the bytes sent to the pre-signed URL have arrived.
livemodebooleanYesFiles are only visible to keys of the same mode.
createdintegerYesUnix timestamp.
expires_atintegerYesUnix timestamp after which the file is deleted.
uploadobjectNoPresent on the response to a JSON upload request.
upload: fields
FieldTypeRequiredDescription
urlstringYesTest keys get a placeholder URL (test: true); nothing is uploaded or stored.
method"PUT"Yes
headersobject of stringYes
expires_atintegerYesUnix timestamp.
testtrueNo

Error codes

CodeStatus
invalid_json400
missing_parameter400
unsupported_media_type415
unsupported_file415
invalid_file422
file_too_large413
pending_files_limit429
invalid_parameter400
idempotency_mismatch409
idempotency_in_progress409
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl https://api.fileverity.com/v1/files \  -H "Authorization: Bearer $FILEVERITY_API_KEY" \  -F file=@claim-photo.jpg
{  "id": "file_8Hk2pQ4vN9sL1xR7cW3mY6zB",  "object": "file",  "filename": "claim-photo.jpg",  "bytes": 2481920,  "content_type": "image/jpeg",  "status": "uploaded",  "livemode": true,  "created": 1793700000,  "expires_at": 1793786400}

Retrieve a file

GET https://api.fileverity.com/v1/files/{id}

Returns the file and whether its bytes have arrived.

Parameters

NameInTypeRequiredDescription
idpathstringYesFile ID.

Responses

StatusDescriptionBody
200The file.File
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
404Resource not found. Error codes: not_found.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Response 200: File

FieldTypeRequiredDescription
idstringYes
object"file"Yes
filenamestring or nullYes
bytesinteger or nullYes
content_typestringYes
statusone of "pending", "uploaded"Yespending until the bytes sent to the pre-signed URL have arrived.
livemodebooleanYesFiles are only visible to keys of the same mode.
createdintegerYesUnix timestamp.
expires_atintegerYesUnix timestamp after which the file is deleted.
uploadobjectNoPresent on the response to a JSON upload request.
upload: fields
FieldTypeRequiredDescription
urlstringYesTest keys get a placeholder URL (test: true); nothing is uploaded or stored.
method"PUT"Yes
headersobject of stringYes
expires_atintegerYesUnix timestamp.
testtrueNo

Error codes

CodeStatus
not_found404
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl https://api.fileverity.com/v1/files/file_8Hk2pQ4vN9sL1xR7cW3mY6zB \  -H "Authorization: Bearer $FILEVERITY_API_KEY"
{  "id": "file_8Hk2pQ4vN9sL1xR7cW3mY6zB",  "object": "file",  "filename": "claim-photo.jpg",  "bytes": 2481920,  "content_type": "image/jpeg",  "status": "uploaded",  "livemode": true,  "created": 1793700000,  "expires_at": 1793786400}

Delete a file

DELETE https://api.fileverity.com/v1/files/{id}

Deletes an uploaded file and its stored bytes.

Parameters

NameInTypeRequiredDescription
idpathstringYesFile ID.

Responses

StatusDescriptionBody
200The file was deleted.FileDeleted
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
404Resource not found. Error codes: not_found.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Response 200: FileDeleted

FieldTypeRequiredDescription
idstringYes
object"file"Yes
deletedtrueYes

Error codes

CodeStatus
not_found404
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl -X DELETE https://api.fileverity.com/v1/files/file_8Hk2pQ4vN9sL1xR7cW3mY6zB \  -H "Authorization: Bearer $FILEVERITY_API_KEY"
{  "id": "file_8Hk2pQ4vN9sL1xR7cW3mY6zB",  "object": "file",  "deleted": true}

Analyses

Create an analysis

POST https://api.fileverity.com/v1/analyses

Analyzes an uploaded file with fvimg-2 (images) or fvdoc-3 (documents). An analysis is one image or document check. The response is 202 with status processing; the result arrives by webhook or by polling GET /analyses/{id}. Send Prefer: wait=N (up to 60 seconds) to hold the request until the result is ready; a finished analysis returns 200. The price is reserved when the analysis is created and released if it fails or is canceled. Results are kept for 7 days. When capacity is busy the API returns 503 service_unavailable with a retry-after header and charges nothing: retry with the same Idempotency-Key, and run image analyses one after another for the best throughput. Test keys return a sample result and are never charged; the sample report contains only a few fields.

Parameters

NameInTypeRequiredDescription
Idempotency-KeyheaderstringNoUnique key of up to 255 characters. Repeating the request with the same key and body within 24 hours returns the first response with the header idempotent-replayed: true; the same key with a different body returns 409.
PreferheaderstringNowait=N holds the request for up to N seconds (maximum 60) until the analysis finishes.

Request body: application/json, required

FieldTypeRequiredDescription
modelone of "fvimg-2", "fvimg-2-2026-10-30", "fvdoc-3", "fvdoc-3-2026-11-03"YesModel ID or snapshot ID. fvimg-2 analyzes images, fvdoc-3 documents.
filestringYesID of an uploaded file.
metadataobject of stringNoUp to 16 string pairs (keys up to 40 characters, values up to 500) returned on the analysis and in webhooks.
optionsobjectNo
options: fields
FieldTypeRequiredDescription
passwordstringNoPassword of an encrypted document. Maximum length 256.
localeone of "en", "fr", "de", "es", "zh", "vi", "ar"NoLanguage of document findings. Default "en".

Responses

StatusDescriptionBody
200The finished analysis.Analysis
202The analysis is processing.Analysis
400Invalid request. Error codes: invalid_json, missing_parameter, file_not_found, invalid_parameter.Error
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
402The balance or the key's monthly spend limit cannot cover the request. Error codes: insufficient_balance, spend_limit_reached.Error
404Resource not found. Error codes: model_not_found.Error
409Conflict with the current state. Error codes: idempotency_mismatch, idempotency_in_progress.Error
413A size limit was exceeded. Error codes: file_too_large, too_many_pixels, too_many_pages, document_too_long.Error
415Unsupported media type or file format. Error codes: unsupported_media_type, unsupported_file.Error
422The file cannot be processed. Error codes: invalid_file, password_required, wrong_password, not_examinable.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error
502Analysis could not be completed; not charged. Error codes: analysis_failed.Error
503Temporarily unavailable or busy; not charged. Retry after the number of seconds in the retry-after header. Error codes: service_unavailable.Error

Response 200: Analysis

FieldTypeRequiredDescription
idstringYes
object"analysis"Yes
createdintegerYesUnix timestamp.
modelstringYesSnapshot that produced the result.
livemodebooleanYes
statusone of "processing", "succeeded", "failed", "canceled"Yes
fileobjectYes
report_idstring or nullYesVerifiable report ID, FV-XXXX-XXXX-XXXX.
report_urlstring or nullYesPublic verification page of the report.
summaryImageSummary or DocumentSummary or nullYesThe short, stable verdict: an ImageSummary for images, a DocumentSummary for documents, null until the analysis succeeds.
resultobject or nullYesPresent once status is succeeded and until the result expires.
errorobject or nullYes
progressobject or nullYes
usageobjectYes
metadataobject or nullYes
completed_atinteger or nullYes
expires_atinteger or nullYesUnix timestamp after which the result is deleted.
file: fields
FieldTypeRequiredDescription
namestring or nullNo
bytesinteger or nullNo
formatstring or nullNo
summary (ImageSummary): fields
FieldTypeRequiredDescription
levelone of "L0", "L1", "L2", "L3", "L4", "L5"YesRisk level, L0 to L5.
assessmentone of "authentic_untouched", "authentic_locally_edited", "ai_generated", "undetermined"Yes
actionone of "accept", "review", "reject", "resubmit"Yes
aione of "labelled", "very_likely", "suspected", "undecided", "low", "very_low", "not_evaluated"YesThe finding on AI generation.
editone of "detected", "suspected", "suspected_record", "review", "generative", "minor", "none", "not_applicable", "not_evaluated"YesThe finding on local editing.
summary (DocumentSummary): fields
FieldTypeRequiredDescription
kind"docpro"Yes
levelone of "L0", "L1", "L2", "L3", "L4", "L5"YesRisk level, L0 to L5.
actionone of "accept", "note", "review", "reject", "resubmit"Yesnote: check the AI content marked in the report against your policy.
reasonstring or nullYesThe finding or condition behind the level, for example clean or incomplete, or a finding ID.
findingsarray of stringYesIDs of the findings that matter.
pagesintegerYesPages in the document.
imagesintegerYesEmbedded photos examined.
textone of "ai_generated", "mixed", "human", "inconclusive", nullYesThe verdict on the document's text, or null when text was not evaluated.
strongtrueNoPresent when a listed finding is strong.
result: fields
FieldTypeRequiredDescription
reportImageReport or DocumentReportNoThe full report. report.schema is fileverity.report/1 for images and fileverity.docpro/1 for documents.
stamped_atinteger or nullNoUnix timestamp of the RFC 3161 timestamp issued for the report, or null.
report (ImageReport): fields
FieldTypeRequiredDescription
schema"fileverity.report/1"Yes
idstringYesReport ID, FV-XXXX-XXXX-XXXX.
sampletrueNoPresent on the fixed sample reports that test keys return.
issuedAtstringNoWhen the report was issued, ISO 8601 in UTC. Format date-time.
issuerobjectNoWho issued the report.
fileobjectNoThe checked image.
proobjectNoThe verdict. The same values as summary, with reason.
scoreinteger or nullNoAuthenticity score from 0 to 100 in steps of 5: how strongly the evidence supports the image as an authentic, unedited capture. null when not evaluated.
confidenceone of "high", "medium", "low"NoHow much this file allows the analysis to establish. Low confidence usually reflects the file itself, such as low resolution or heavy compression.
questionsobjectNoThe three questions the report answers.
generatorobject or nullNoThe AI generator named for the image, or null.
regionsarray of objectNoFlagged regions, in pixels of the displayed image.
provenanceobjectNoWhat the file's own records say about its origin.
digeststringNoFingerprint of the report content, used by the verification page.
issuer: fields
FieldTypeRequiredDescription
namestringNo
operatorstringNo
verifystringNoPublic verification page of the report.
file: fields
FieldTypeRequiredDescription
namestring or nullNo
sha256stringNoSHA-256 of the checked file, in hex.
bytesintegerNo
widthintegerNoWidth in pixels as displayed.
heightintegerNoHeight in pixels as displayed.
formatstringNo
pro: fields
FieldTypeRequiredDescription
levelone of "L0", "L1", "L2", "L3", "L4", "L5"NoRisk level, L0 to L5.
actionone of "accept", "review", "reject", "resubmit"No
assessmentone of "authentic_untouched", "authentic_locally_edited", "ai_generated", "undetermined"No
reasonstring or nullNo
questions: fields
FieldTypeRequiredDescription
aiobjectNo
editobjectNo
sourceobjectNo
ai: fields
FieldTypeRequiredDescription
keyone of "labelled", "very_likely", "suspected", "undecided", "low", "very_low", "not_evaluated"No
basisone of "verified", "detected", "declared", nullNoWhat the answer rests on.
strengthone of "strong", "moderate", "limited", nullNoHow strongly the evidence supports the answer.
likelihoodinteger or nullNoLikelihood of AI generation from 0 to 100 in steps of 5, or null.
edit: fields
FieldTypeRequiredDescription
keyone of "detected", "suspected", "suspected_record", "review", "generative", "minor", "none", "not_applicable", "not_evaluated"No
basisone of "verified", "detected", "declared", nullNoWhat the answer rests on.
strengthone of "strong", "moderate", "limited", nullNoHow strongly the evidence supports the answer.
regionsintegerNoNumber of flagged regions.
source: fields
FieldTypeRequiredDescription
keystringNo
basisone of "verified", "detected", "declared", nullNoWhat the answer rests on.
strengthone of "strong", "moderate", "limited", nullNoHow strongly the evidence supports the answer.
signerstring or nullNo
aiClaimbooleanNoWhether the file's own records claim AI generation.
generator: fields
FieldTypeRequiredDescription
namestringNo
basisstringNoHow the generator was identified.
regions: fields
FieldTypeRequiredDescription
idstringNo
xintegerNo
yintegerNo
wintegerNo
hintegerNo
strengthone of "high", "medium"No
provenance: fields
FieldTypeRequiredDescription
credentialsone of "valid", "unverified", "issues", "invalid", "removed", "none"NoState of the Content Credentials.
signerstring or nullNo
softwarearray of stringNoSoftware named in the file's records.
camerastring or nullNo
capturedstring or nullNoCapture time recorded in the file, if any.
report (DocumentReport): fields
FieldTypeRequiredDescription
schema"fileverity.docpro/1"Yes
idstringYesReport ID, FV-XXXX-XXXX-XXXX.
sampletrueNoPresent on the fixed sample reports that test keys return.
issuedAtstringNoWhen the report was issued, ISO 8601 in UTC. Format date-time.
receivedAtstringNoWhen the file was received, ISO 8601 in UTC. Format date-time.
issuerobjectNoWho issued the report.
fileobjectNoThe checked document.
levelone of "L0", "L1", "L2", "L3", "L4", "L5"NoRisk level, L0 to L5.
actionone of "accept", "note", "review", "reject", "resubmit"No
reasonstring or nullNoThe finding or condition behind the level.
findingsarray of objectNoThe findings behind the level, each with the pages and embedded photos it refers to.
textobjectNoThe result for the document's text.
imagesarray of objectNoThe embedded photos and graphics, numbered in document order.
structureobject or nullNoThe edit history of the file, or null when it was not examined.
provenanceobjectNoWhat the file's own records say about its origin.
digeststringNoFingerprint of the report content, used by the verification page.
issuer: fields
FieldTypeRequiredDescription
namestringNo
operatorstringNo
verifystringNoPublic verification page of the report.
file: fields
FieldTypeRequiredDescription
namestring or nullNo
sha256stringNoSHA-256 of the checked file, in hex.
bytesintegerNo
formatstringNo
pagesintegerNo
textLayerone of "present", "partial", "absent"NoWhether the document carries a text layer.
findings: fields
FieldTypeRequiredDescription
idstringNo
basisone of "verified", "detected", "declared"No
strengthone of "strong", "moderate", "limited"No
materialbooleanNoWhether the finding counts toward the level.
pagesarray of integerNo
imagesarray of integerNo
text: fields
FieldTypeRequiredDescription
statusone of "evaluated", "insufficient_text", "unsupported_language", "no_text"No
verdictone of "ai_generated", "mixed", "human", "inconclusive"NoPresent when status is evaluated.
wordsintegerNo
languagesarray of stringNo
passagesintegerNoNumber of marked passages.
images: fields
FieldTypeRequiredDescription
nintegerNo
pagesarray of integerNo
kindone of "photo", "graphic"No
widthintegerNo
heightintegerNo
levelone of "L0", "L1", "L2", "L3", "L4", "L5", nullNo
assessmentone of "authentic_untouched", "authentic_locally_edited", "ai_generated", "undetermined", nullNo
aione of "labelled", "very_likely", "suspected", "undecided", "low", "very_low", "not_evaluated", nullNo
editone of "detected", "suspected", "suspected_record", "review", "generative", "minor", "none", "not_applicable", "not_evaluated", nullNo
structure: fields
FieldTypeRequiredDescription
revisionsinteger or nullNo
changedPagesarray of integerNo
addedPagesintegerNo
signaturesintegerNo
provenance: fields
FieldTypeRequiredDescription
credentialsstringNoState of the Content Credentials.
signerstring or nullNo
aiClaimbooleanNoWhether the file's own records claim AI generation.
softwarearray of stringNo
createdstring or nullNo
modifiedstring or nullNo
revisionsinteger or nullNo
signedboolean or nullNo
error: fields
FieldTypeRequiredDescription
codeone of "invalid_json", "missing_parameter", "invalid_parameter", "text_too_short", "text_too_long", "unsupported_media_type", "unsupported_language", "file_not_found", "unsupported_file", "file_too_large", "too_many_pixels", "too_many_pages", "document_too_long", "invalid_file", "password_required", "wrong_password", "not_examinable", "missing_api_key", "invalid_api_key", "insufficient_balance", "spend_limit_reached", "not_found", "model_not_found", "not_cancelable", "canceled", "idempotency_mismatch", "idempotency_in_progress", "pending_files_limit", "rate_limited", "internal_error", "analysis_failed", "service_unavailable"No
messagestringNo
progress: fields
FieldTypeRequiredDescription
stageone of "queued", "reading", "analyzing", "reporting"No
doneintegerNoUnits finished in the current stage, when known; otherwise 0.
totalintegerNoUnits in the current stage, when known; otherwise 0.
positionintegerNoQueue position while the stage is queued.
usage: fields
FieldTypeRequiredDescription
amountintegerNoCharge in cents; 0 for free-start checks and failures.
currency"usd"No
fundingone of "trial", "balance", nullNo

Error codes

CodeStatus
invalid_json400
missing_parameter400
unsupported_media_type415
model_not_found404
file_not_found400
unsupported_file415
invalid_file422
file_too_large413
too_many_pixels413
too_many_pages413
document_too_long413
password_required422
wrong_password422
not_examinable422
insufficient_balance402
spend_limit_reached402
service_unavailable503
analysis_failed502
invalid_parameter400
idempotency_mismatch409
idempotency_in_progress409
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl https://api.fileverity.com/v1/analyses \  -H "Authorization: Bearer $FILEVERITY_API_KEY" \  -H "Content-Type: application/json" \  -H "Prefer: wait=60" \  -d '{"model": "fvimg-2", "file": "file_8Hk2pQ4vN9sL1xR7cW3mY6zB"}'
{  "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB",  "object": "analysis",  "created": 1793700120,  "model": "fvimg-2-2026-10-30",  "livemode": true,  "status": "succeeded",  "file": {    "name": "claim-photo.jpg",    "bytes": 2481920,    "format": "jpeg"  },  "report_id": "FV-7K2M-9QXD-4T8R",  "report_url": "https://fileverity.com/verify/FV-7K2M-9QXD-4T8R",  "summary": {    "level": "L2",    "assessment": "authentic_untouched",    "action": "accept",    "ai": "very_low",    "edit": "none"  },  "result": {    "report": {      "schema": "fileverity.report/1",      "id": "FV-7K2M-9QXD-4T8R"    },    "stamped_at": 1793700130  },  "error": null,  "progress": null,  "usage": {    "amount": 199,    "currency": "usd",    "funding": "balance"  },  "metadata": {    "order_id": "A-10492"  },  "completed_at": 1793700131,  "expires_at": 1794304931}

List analyses

GET https://api.fileverity.com/v1/analyses

Lists the image and document analyses of your workspace, newest first. Test keys always get an empty list.

Parameters

NameInTypeRequiredDescription
limitqueryintegerNoDefault 20. Minimum 1. Maximum 100.
starting_afterquerystringNoCursor: the next_cursor of the previous page.
typequeryone of "image", "document"No

Responses

StatusDescriptionBody
200A page of analyses.AnalysisList
400Invalid request. Error codes: invalid_parameter.Error
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Response 200: AnalysisList

FieldTypeRequiredDescription
object"list"Yes
dataarray of AnalysisYes
has_morebooleanYes
next_cursorstring or nullYesPass as starting_after to get the next page.
data: fields
FieldTypeRequiredDescription
idstringYes
object"analysis"Yes
createdintegerYesUnix timestamp.
modelstringYesSnapshot that produced the result.
livemodebooleanYes
statusone of "processing", "succeeded", "failed", "canceled"Yes
fileobjectYes
report_idstring or nullYesVerifiable report ID, FV-XXXX-XXXX-XXXX.
report_urlstring or nullYesPublic verification page of the report.
summaryImageSummary or DocumentSummary or nullYesThe short, stable verdict: an ImageSummary for images, a DocumentSummary for documents, null until the analysis succeeds.
resultobject or nullYesPresent once status is succeeded and until the result expires.
errorobject or nullYes
progressobject or nullYes
usageobjectYes
metadataobject or nullYes
completed_atinteger or nullYes
expires_atinteger or nullYesUnix timestamp after which the result is deleted.
file: fields
FieldTypeRequiredDescription
namestring or nullNo
bytesinteger or nullNo
formatstring or nullNo
result: fields
FieldTypeRequiredDescription
reportImageReport or DocumentReportNoThe full report. report.schema is fileverity.report/1 for images and fileverity.docpro/1 for documents.
stamped_atinteger or nullNoUnix timestamp of the RFC 3161 timestamp issued for the report, or null.
error: fields
FieldTypeRequiredDescription
codeone of "invalid_json", "missing_parameter", "invalid_parameter", "text_too_short", "text_too_long", "unsupported_media_type", "unsupported_language", "file_not_found", "unsupported_file", "file_too_large", "too_many_pixels", "too_many_pages", "document_too_long", "invalid_file", "password_required", "wrong_password", "not_examinable", "missing_api_key", "invalid_api_key", "insufficient_balance", "spend_limit_reached", "not_found", "model_not_found", "not_cancelable", "canceled", "idempotency_mismatch", "idempotency_in_progress", "pending_files_limit", "rate_limited", "internal_error", "analysis_failed", "service_unavailable"No
messagestringNo
progress: fields
FieldTypeRequiredDescription
stageone of "queued", "reading", "analyzing", "reporting"No
doneintegerNoUnits finished in the current stage, when known; otherwise 0.
totalintegerNoUnits in the current stage, when known; otherwise 0.
positionintegerNoQueue position while the stage is queued.
usage: fields
FieldTypeRequiredDescription
amountintegerNoCharge in cents; 0 for free-start checks and failures.
currency"usd"No
fundingone of "trial", "balance", nullNo

Error codes

CodeStatus
invalid_parameter400
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl "https://api.fileverity.com/v1/analyses?limit=20&type=image" \  -H "Authorization: Bearer $FILEVERITY_API_KEY"
{  "object": "list",  "data": [    {      "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB",      "object": "analysis",      "created": 1793700120,      "model": "fvimg-2-2026-10-30",      "livemode": true,      "status": "succeeded",      "file": {        "name": "claim-photo.jpg",        "bytes": 2481920,        "format": "jpeg"      },      "report_id": "FV-7K2M-9QXD-4T8R",      "report_url": "https://fileverity.com/verify/FV-7K2M-9QXD-4T8R",      "summary": {        "level": "L2",        "assessment": "authentic_untouched",        "action": "accept",        "ai": "very_low",        "edit": "none"      },      "result": {        "report": {          "schema": "fileverity.report/1",          "id": "FV-7K2M-9QXD-4T8R"        },        "stamped_at": 1793700130      },      "error": null,      "progress": null,      "usage": {        "amount": 199,        "currency": "usd",        "funding": "balance"      },      "metadata": {        "order_id": "A-10492"      },      "completed_at": 1793700131,      "expires_at": 1794304931    }  ],  "has_more": false,  "next_cursor": null}

Retrieve an analysis

GET https://api.fileverity.com/v1/analyses/{id}

Returns the analysis, with its result once it has succeeded and until it expires.

Parameters

NameInTypeRequiredDescription
idpathstringYesAnalysis ID.

Responses

StatusDescriptionBody
200The analysis.Analysis
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
404Resource not found. Error codes: not_found.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Response 200: Analysis

FieldTypeRequiredDescription
idstringYes
object"analysis"Yes
createdintegerYesUnix timestamp.
modelstringYesSnapshot that produced the result.
livemodebooleanYes
statusone of "processing", "succeeded", "failed", "canceled"Yes
fileobjectYes
report_idstring or nullYesVerifiable report ID, FV-XXXX-XXXX-XXXX.
report_urlstring or nullYesPublic verification page of the report.
summaryImageSummary or DocumentSummary or nullYesThe short, stable verdict: an ImageSummary for images, a DocumentSummary for documents, null until the analysis succeeds.
resultobject or nullYesPresent once status is succeeded and until the result expires.
errorobject or nullYes
progressobject or nullYes
usageobjectYes
metadataobject or nullYes
completed_atinteger or nullYes
expires_atinteger or nullYesUnix timestamp after which the result is deleted.
file: fields
FieldTypeRequiredDescription
namestring or nullNo
bytesinteger or nullNo
formatstring or nullNo
result: fields
FieldTypeRequiredDescription
reportImageReport or DocumentReportNoThe full report. report.schema is fileverity.report/1 for images and fileverity.docpro/1 for documents.
stamped_atinteger or nullNoUnix timestamp of the RFC 3161 timestamp issued for the report, or null.
error: fields
FieldTypeRequiredDescription
codeone of "invalid_json", "missing_parameter", "invalid_parameter", "text_too_short", "text_too_long", "unsupported_media_type", "unsupported_language", "file_not_found", "unsupported_file", "file_too_large", "too_many_pixels", "too_many_pages", "document_too_long", "invalid_file", "password_required", "wrong_password", "not_examinable", "missing_api_key", "invalid_api_key", "insufficient_balance", "spend_limit_reached", "not_found", "model_not_found", "not_cancelable", "canceled", "idempotency_mismatch", "idempotency_in_progress", "pending_files_limit", "rate_limited", "internal_error", "analysis_failed", "service_unavailable"No
messagestringNo
progress: fields
FieldTypeRequiredDescription
stageone of "queued", "reading", "analyzing", "reporting"No
doneintegerNoUnits finished in the current stage, when known; otherwise 0.
totalintegerNoUnits in the current stage, when known; otherwise 0.
positionintegerNoQueue position while the stage is queued.
usage: fields
FieldTypeRequiredDescription
amountintegerNoCharge in cents; 0 for free-start checks and failures.
currency"usd"No
fundingone of "trial", "balance", nullNo

Error codes

CodeStatus
not_found404
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl https://api.fileverity.com/v1/analyses/an_8Hk2pQ4vN9sL1xR7cW3mY6zB \  -H "Authorization: Bearer $FILEVERITY_API_KEY"
{  "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB",  "object": "analysis",  "created": 1793700120,  "model": "fvimg-2-2026-10-30",  "livemode": true,  "status": "succeeded",  "file": {    "name": "claim-photo.jpg",    "bytes": 2481920,    "format": "jpeg"  },  "report_id": "FV-7K2M-9QXD-4T8R",  "report_url": "https://fileverity.com/verify/FV-7K2M-9QXD-4T8R",  "summary": {    "level": "L2",    "assessment": "authentic_untouched",    "action": "accept",    "ai": "very_low",    "edit": "none"  },  "result": {    "report": {      "schema": "fileverity.report/1",      "id": "FV-7K2M-9QXD-4T8R"    },    "stamped_at": 1793700130  },  "error": null,  "progress": null,  "usage": {    "amount": 199,    "currency": "usd",    "funding": "balance"  },  "metadata": {    "order_id": "A-10492"  },  "completed_at": 1793700131,  "expires_at": 1794304931}

Cancel an analysis

POST https://api.fileverity.com/v1/analyses/{id}/cancel

Cancels a document analysis that is still processing and releases its charge. Image analyses cannot be canceled once created.

Parameters

NameInTypeRequiredDescription
idpathstringYesAnalysis ID.
Idempotency-KeyheaderstringNoUnique key of up to 255 characters. Repeating the request with the same key and body within 24 hours returns the first response with the header idempotent-replayed: true; the same key with a different body returns 409.

Responses

StatusDescriptionBody
200The canceled analysis.Analysis
400Invalid request. Error codes: invalid_parameter.Error
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
404Resource not found. Error codes: not_found.Error
409Conflict with the current state. Error codes: not_cancelable, idempotency_mismatch, idempotency_in_progress.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Response 200: Analysis

FieldTypeRequiredDescription
idstringYes
object"analysis"Yes
createdintegerYesUnix timestamp.
modelstringYesSnapshot that produced the result.
livemodebooleanYes
statusone of "processing", "succeeded", "failed", "canceled"Yes
fileobjectYes
report_idstring or nullYesVerifiable report ID, FV-XXXX-XXXX-XXXX.
report_urlstring or nullYesPublic verification page of the report.
summaryImageSummary or DocumentSummary or nullYesThe short, stable verdict: an ImageSummary for images, a DocumentSummary for documents, null until the analysis succeeds.
resultobject or nullYesPresent once status is succeeded and until the result expires.
errorobject or nullYes
progressobject or nullYes
usageobjectYes
metadataobject or nullYes
completed_atinteger or nullYes
expires_atinteger or nullYesUnix timestamp after which the result is deleted.
file: fields
FieldTypeRequiredDescription
namestring or nullNo
bytesinteger or nullNo
formatstring or nullNo
result: fields
FieldTypeRequiredDescription
reportImageReport or DocumentReportNoThe full report. report.schema is fileverity.report/1 for images and fileverity.docpro/1 for documents.
stamped_atinteger or nullNoUnix timestamp of the RFC 3161 timestamp issued for the report, or null.
error: fields
FieldTypeRequiredDescription
codeone of "invalid_json", "missing_parameter", "invalid_parameter", "text_too_short", "text_too_long", "unsupported_media_type", "unsupported_language", "file_not_found", "unsupported_file", "file_too_large", "too_many_pixels", "too_many_pages", "document_too_long", "invalid_file", "password_required", "wrong_password", "not_examinable", "missing_api_key", "invalid_api_key", "insufficient_balance", "spend_limit_reached", "not_found", "model_not_found", "not_cancelable", "canceled", "idempotency_mismatch", "idempotency_in_progress", "pending_files_limit", "rate_limited", "internal_error", "analysis_failed", "service_unavailable"No
messagestringNo
progress: fields
FieldTypeRequiredDescription
stageone of "queued", "reading", "analyzing", "reporting"No
doneintegerNoUnits finished in the current stage, when known; otherwise 0.
totalintegerNoUnits in the current stage, when known; otherwise 0.
positionintegerNoQueue position while the stage is queued.
usage: fields
FieldTypeRequiredDescription
amountintegerNoCharge in cents; 0 for free-start checks and failures.
currency"usd"No
fundingone of "trial", "balance", nullNo

Error codes

CodeStatus
not_found404
not_cancelable409
invalid_parameter400
idempotency_mismatch409
idempotency_in_progress409
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl -X POST https://api.fileverity.com/v1/analyses/an_8Hk2pQ4vN9sL1xR7cW3mY6zB/cancel \  -H "Authorization: Bearer $FILEVERITY_API_KEY"
{  "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB",  "object": "analysis",  "created": 1793700120,  "model": "fvimg-2-2026-10-30",  "livemode": true,  "status": "canceled",  "file": {    "name": "claim-photo.jpg",    "bytes": 2481920,    "format": "jpeg"  },  "report_id": null,  "report_url": null,  "summary": null,  "result": null,  "error": {    "code": "canceled",    "message": "The analysis was canceled. You were not charged."  },  "progress": null,  "usage": {    "amount": 0,    "currency": "usd",    "funding": null  },  "metadata": null,  "completed_at": 1793700135,  "expires_at": null}

Download the PDF report

GET https://api.fileverity.com/v1/analyses/{id}/report.pdf

Returns the sealed PDF report of a succeeded analysis while its result is kept. Test keys get 404. Document evidence such as page images is available for 3 hours after the analysis; after that the PDF omits it, signaled by x-evidence-included: false.

Parameters

NameInTypeRequiredDescription
idpathstringYesAnalysis ID.
localequeryone of "en", "fr", "de", "es", "zh", "vi", "ar"NoDefault "en".

Responses

StatusDescriptionBody
200The PDF report.PDF file
400Invalid request. Error codes: invalid_parameter.Error
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
404Resource not found. Error codes: not_found.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Error codes

CodeStatus
invalid_parameter400
not_found404
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl "https://api.fileverity.com/v1/analyses/an_8Hk2pQ4vN9sL1xR7cW3mY6zB/report.pdf?locale=en" \  -H "Authorization: Bearer $FILEVERITY_API_KEY" \  -o Fileverity-FV-7K2M-9QXD-4T8R.pdf

Models

List models

GET https://api.fileverity.com/v1/models

Lists the models available to your API key.

Responses

StatusDescriptionBody
200The available models.ModelList
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Response 200: ModelList

FieldTypeRequiredDescription
object"list"Yes
dataarray of ModelYes
data: fields
FieldTypeRequiredDescription
idstringYes
object"model"Yes
createdintegerYesUnix timestamp of the current snapshot.
owned_bystringYes
namestringYes
typeone of "image", "document", "text"Yes
descriptionstringYes
snapshotstringYesDated snapshot the ID currently points to.
statusone of "available", "preview", "deprecated"Yes
inputobjectYesAccepted input. Files list formats and size limits; text lists languages and length limits.
outputobjectYes
pricingobjectYes
input: fields
FieldTypeRequiredDescription
formatsarray of stringNo
max_bytesintegerNo
max_megapixelsintegerNo
max_pagesintegerNo
languagesarray of stringNo
min_wordsintegerNo
max_charactersintegerNo
output: fields
FieldTypeRequiredDescription
schemastringYesSchema of the report in analysis results.
pricing: fields
FieldTypeRequiredDescription
currency"usd"Yes
unitstringYes
unit_amountintegerYesPrice per unit in cents.

Error codes

CodeStatus
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl https://api.fileverity.com/v1/models \  -H "Authorization: Bearer $FILEVERITY_API_KEY"
{  "object": "list",  "data": [    {      "id": "fvimg-2",      "object": "model",      "created": 1793318400,      "owned_by": "fileverity",      "name": "FVIMG V2",      "type": "image",      "description": "Image authenticity analysis. Detects AI generation and local edits, checks content credentials and metadata, and returns a verifiable report.",      "snapshot": "fvimg-2-2026-10-30",      "status": "available",      "input": {        "formats": [          "jpeg",          "png",          "webp"        ],        "max_bytes": 10485760,        "max_megapixels": 40      },      "output": {        "schema": "fileverity.report/1"      },      "pricing": {        "currency": "usd",        "unit": "image",        "unit_amount": 199      }    },    {      "id": "fvdoc-3",      "object": "model",      "created": 1793664000,      "owned_by": "fileverity",      "name": "FVDOC V3",      "type": "document",      "description": "Document fraud analysis. Evaluates AI-written text, embedded photos, edit history and signatures, and returns a verifiable report.",      "snapshot": "fvdoc-3-2026-11-03",      "status": "available",      "input": {        "formats": [          "pdf",          "docx",          "doc",          "rtf",          "odt",          "pptx",          "txt"        ],        "max_bytes": 52428800,        "max_pages": 100      },      "output": {        "schema": "fileverity.docpro/1"      },      "pricing": {        "currency": "usd",        "unit": "document",        "unit_amount": 599      }    },    {      "id": "fvdoc-3-text",      "object": "model",      "created": 1793664000,      "owned_by": "fileverity",      "name": "FVDOC V3 Text",      "type": "text",      "description": "AI-written text detection. Classifies plain text as AI-written, partly AI-written or human-written and marks the AI-written passages.",      "snapshot": "fvdoc-3-text-2026-11-03",      "status": "available",      "input": {        "languages": [          "en",          "fr",          "de",          "es",          "zh"        ],        "min_words": 100,        "max_characters": 100000      },      "output": {        "schema": "fileverity.text-detection/1"      },      "pricing": {        "currency": "usd",        "unit": "1000_characters",        "unit_amount": 14      }    }  ]}

Retrieve a model

GET https://api.fileverity.com/v1/models/{model}

Retrieves a model by its ID or snapshot ID.

Parameters

NameInTypeRequiredDescription
modelpathstringYesModel ID or snapshot ID.

Responses

StatusDescriptionBody
200The model.Model
401Missing or invalid API key. Error codes: missing_api_key, invalid_api_key.Error
404Resource not found. Error codes: model_not_found.Error
429Too many requests. Error codes: rate_limited.Error
500Internal error; not charged. Error codes: internal_error.Error

Response 200: Model

FieldTypeRequiredDescription
idstringYes
object"model"Yes
createdintegerYesUnix timestamp of the current snapshot.
owned_bystringYes
namestringYes
typeone of "image", "document", "text"Yes
descriptionstringYes
snapshotstringYesDated snapshot the ID currently points to.
statusone of "available", "preview", "deprecated"Yes
inputobjectYesAccepted input. Files list formats and size limits; text lists languages and length limits.
outputobjectYes
pricingobjectYes
input: fields
FieldTypeRequiredDescription
formatsarray of stringNo
max_bytesintegerNo
max_megapixelsintegerNo
max_pagesintegerNo
languagesarray of stringNo
min_wordsintegerNo
max_charactersintegerNo
output: fields
FieldTypeRequiredDescription
schemastringYesSchema of the report in analysis results.
pricing: fields
FieldTypeRequiredDescription
currency"usd"Yes
unitstringYes
unit_amountintegerYesPrice per unit in cents.

Error codes

CodeStatus
model_not_found404
missing_api_key401
invalid_api_key401
rate_limited429
internal_error500

Example

curl https://api.fileverity.com/v1/models/fvimg-2 \  -H "Authorization: Bearer $FILEVERITY_API_KEY"
{  "id": "fvimg-2",  "object": "model",  "created": 1793318400,  "owned_by": "fileverity",  "name": "FVIMG V2",  "type": "image",  "description": "Image authenticity analysis. Detects AI generation and local edits, checks content credentials and metadata, and returns a verifiable report.",  "snapshot": "fvimg-2-2026-10-30",  "status": "available",  "input": {    "formats": [      "jpeg",      "png",      "webp"    ],    "max_bytes": 10485760,    "max_megapixels": 40  },  "output": {    "schema": "fileverity.report/1"  },  "pricing": {    "currency": "usd",    "unit": "image",    "unit_amount": 199  }}

Webhook events

Fileverity sends these events to your webhook endpoints. Verification and delivery rules are in Webhooks.

Event analysis.completed

Delivered to your webhook endpoints following the Standard Webhooks specification: the headers webhook-id, webhook-timestamp and webhook-signature (v1,<base64 HMAC-SHA256 of id.timestamp.body>, keyed with the base64 part of your whsec_ secret). Respond with any 2xx within 10 seconds; failures are retried with exponential backoff for 3 days.

Request body: application/json, required

FieldTypeRequiredDescription
idstringYesAlso sent as the webhook-id header; use it to deduplicate retries.
object"event"Yes
typeone of "analysis.completed", "analysis.failed", "balance.low"Yes
createdintegerYesUnix timestamp.
dataAnalysis or BalanceLowYesanalysis.* events carry the same object as GET /analyses/{id}, with result always null; fetch the result with that endpoint. balance.low events carry the balance and threshold in cents.
data (BalanceLow): fields
FieldTypeRequiredDescription
balanceintegerYesBalance in cents.
thresholdintegerYesAlert threshold in cents.

Event analysis.failed

Delivered to your webhook endpoints following the Standard Webhooks specification: the headers webhook-id, webhook-timestamp and webhook-signature (v1,<base64 HMAC-SHA256 of id.timestamp.body>, keyed with the base64 part of your whsec_ secret). Respond with any 2xx within 10 seconds; failures are retried with exponential backoff for 3 days.

Request body: application/json, required

FieldTypeRequiredDescription
idstringYesAlso sent as the webhook-id header; use it to deduplicate retries.
object"event"Yes
typeone of "analysis.completed", "analysis.failed", "balance.low"Yes
createdintegerYesUnix timestamp.
dataAnalysis or BalanceLowYesanalysis.* events carry the same object as GET /analyses/{id}, with result always null; fetch the result with that endpoint. balance.low events carry the balance and threshold in cents.

Event balance.low

Delivered to your webhook endpoints following the Standard Webhooks specification: the headers webhook-id, webhook-timestamp and webhook-signature (v1,<base64 HMAC-SHA256 of id.timestamp.body>, keyed with the base64 part of your whsec_ secret). Respond with any 2xx within 10 seconds; failures are retried with exponential backoff for 3 days.

Request body: application/json, required

FieldTypeRequiredDescription
idstringYesAlso sent as the webhook-id header; use it to deduplicate retries.
object"event"Yes
typeone of "analysis.completed", "analysis.failed", "balance.low"Yes
createdintegerYesUnix timestamp.
dataAnalysis or BalanceLowYesanalysis.* events carry the same object as GET /analyses/{id}, with result always null; fetch the result with that endpoint. balance.low events carry the balance and threshold in cents.
curl https://api.fileverity.com/v1/openapi.json