API Documentation

Integrate proofed.ai into your applications. Submit documents for AI-powered proofreading, receive structured corrections, optionally request a follow-on human review by proofed.com, and wire up webhooks for completion events.

Download OpenAPI spec

Authentication

All API requests require a Bearer token in the Authorization header. Generate API keys from your Settings page after logging in.

Authorization: Bearer your-api-token

Base URL

https://proofed.ai/api/v1

Remote file URLs

Every endpoint that accepts a multipart file (Submit Document, Submit Reviewer Feedback, Submit Fact Check) also accepts a _url companion field that we fetch on your behalf. Pass either the file or the URL — never both for the same slot.

Field pairs

Endpoint File field URL field
POST /documentsfilefile_url
POST /reviewer-feedbackeditor_fileeditor_file_url
reviewer_filereviewer_file_url
POST /fact-checksdocumentdocument_url

Rules

Example

curl -X POST https://proofed.ai/api/v1/documents \
  -H "Authorization: Bearer your-api-token" \
  -F "file_url=https://bucket.s3.amazonaws.com/uploads/report.pdf?X-Amz-Signature=..." \
  -F "language=en"

Errors

Policy and download failures surface as 422 validation errors attached to the URL field. Common messages:

Document Lifecycle

Every document moves through a series of statuses. Once submitted, our AI proofreading engine reads the document, identifies issues, and returns structured corrections.

pending
Document accepted and queued. Processing has not yet started.
processing
The AI is actively proofreading the document. A narrative field describes what is happening and updates every 15–30 seconds.
completed
Proofreading finished successfully. Corrections are available on the document.
failed
Processing failed. Check the narrative field for the reason.
cancelled
Processing was cancelled before completion.

Typical processing time: 30 seconds to 5 minutes depending on document length. Larger documents use an agentic reading mode and may take up to 30 minutes.

Submit a Document

POST /api/v1/documents

Upload a file for proofreading. Requires multipart/form-data. Consumes one token from your balance.

Parameters

Field Type Required Description
file file One of The document file (max 50MB). Supported: pdf, docx, pptx, html, htm, txt, rtf, odt, epub. For DOCX files with track changes, insertions are accepted and deletions discarded — we read the "final" version. PPTX is ingest-only: findings are returned as JSON and no annotated output file is produced. Required when file_url is not provided.
file_url string One of Public http(s) URL we fetch in place of an upload. May be a signed S3/GCS/Azure pre-signed link. URL path must end in an allowed extension. See Remote file URLs below for size, SSRF and redirect rules. Mutually exclusive with file and blocks.
blocks array One of Structured array of pre-segmented content blocks instead of a file. Each block is an object {name, type, content, comments?} where type is "html" or "text". Findings reference each block by its name. Max 1000 blocks. In multipart submissions, pass as a JSON-encoded string. Mutually exclusive with file and file_url.
style_guide_url string No Full URL of a Stylus style guide for the AI to enforce.
style_guide_id string No Either a full Stylus URL (used verbatim) or a Stylus UUID (resolved server-side). Accepted alongside style_guide_url for cross-compatibility with the Azure proofreading API.
variables object No Free-form key/value object merged into meta (meta keys win on conflict). Same validation rules as meta.
model / prompts / chain_prompts any No Cross-compat passthroughs accepted for compatibility with the Azure proofreading API. Currently ignored; the model is selected internally based on hyperpowered.
language string No Language code. Supported: en, en-GB, en-US, en-CA, en-IE, en-AU, en-NZ, en-ZA, en-IN, es, es-ES, es-MX, fr, fr-FR, fr-CA, de, de-DE, de-AT, de-CH, it, it-IT, pt, pt-BR, pt-PT. Default: en
editing_phase string No Which AI prompt set runs. One of pre-edit (first AI pass on raw copy) or post-edit (AI sanity check on already-edited copy). Default: pre-edit.
webhook_url string No URL to receive a POST when processing completes (success or failure). When review=true, this URL also receives a separate POST when the human review stage finishes. See Webhooks.
review boolean No Default false. When true, after the AI proofread completes the document is also sent to proofed.com for review by a human editor. The reviewed file is exposed via a signed download URL. Free add-on — does not consume an extra token. See Human Review.
review_brief string No Plain-text instructions for the human editor (max 500 chars). Only used when review=true. Forwarded verbatim in the order brief.
hyperpowered boolean No Default false. Run the proofread on the premium "hyperpowered" model — higher quality, higher cost. Requires the can_use_hyperpowered permission; setting it without permission returns 403. Echoed back as hyperpowered on the document. Also available on Submit Reviewer Feedback and Submit Fact Check.
meta object No Optional flat object of scalar values you want round-tripped back to you on the show endpoint, list endpoint, and in webhook payloads. Use for tracking IDs like {"jobid": 123}. Up to 20 keys; keys must match [A-Za-z0-9_-] and ≤ 64 chars; values must be string/number/boolean with strings ≤ 512 chars; total payload ≤ 4 KB. In multipart submissions, pass as a JSON string.

Example

curl -X POST https://proofed.ai/api/v1/documents \
  -H "Authorization: Bearer your-api-token" \
  -F "file=@report.pdf" \
  -F "language=en" \
  -F "editing_phase=pre-edit" \
  -F "webhook_url=https://your-app.com/webhook" \
  -F "review=true" \
  -F "review_brief=Light proofread; preserve the author's voice." \
  -F 'meta={"jobid":123,"campaign":"Q3-2026"}'

Response 201 Created

{
  "data": {
    "uuid": "9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
    "filename": "report.pdf",
    "file_type": "pdf",
    "file_size": 102400,
    "language": "en",
    "editing_phase": "pre-edit",
    "meta": {"jobid": 123, "campaign": "Q3-2026"},
    "status": "pending",
    "source": "api",
    "correction_count": null,
    "webhook_url": "https://your-app.com/webhook",
    "submitted_at": null,
    "completed_at": null,
    "created_at": "2026-04-16T12:00:00+00:00"
  }
}

List Documents

GET /api/v1/documents

Returns a paginated list of your documents, newest first. 20 per page.

Example

curl https://proofed.ai/api/v1/documents \
  -H "Authorization: Bearer your-api-token"

Get Document

GET /api/v1/documents/{uuid}

Returns document details. The full corrections array is included on this endpoint but omitted from the list endpoint.

Response 200 OK

{
  "data": {
    "uuid": "9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
    "filename": "report.pdf",
    "file_type": "pdf",
    "file_size": 102400,
    "language": "en",
    "status": "completed",
    "source": "api",
    "correction_count": 5,
    "corrections_data": [
      {
        "type": "spelling",
        "original": "achivements",
        "corrected": "achievements",
        "context": "Misspelling",
        "page": 3
      }
    ],
    "webhook_url": "https://your-app.com/webhook",
    "submitted_at": "2026-04-16T12:00:05+00:00",
    "completed_at": "2026-04-16T12:00:42+00:00",
    "created_at": "2026-04-16T12:00:00+00:00",
    "download_url": "https://proofed.ai/api/v1/documents/9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c/download?expires=...&signature=...",
    "proofed_review": {
      "status": "delivered",
      "deadline": "2026-04-18T12:00:00+00:00",
      "word_count": 1234,
      "delivered_at": "2026-04-17T16:00:00+00:00",
      "download_url": "https://proofed.ai/api/v1/documents/9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c/proofed-review/download?expires=...&signature=..."
    }
  }
}

The proofed_review block is only present when the document was submitted with review=true. See Human Review for details.

Cancel Document

POST /api/v1/documents/{uuid}/cancel

Cancel a pending or processing document. Completed, failed, or already-cancelled documents cannot be cancelled (returns 422).

Cancellation is cooperative — if the AI is mid-call, it finishes that step and stops at the next turn boundary.

If a human review is attached: when the review is pending or submitted, cancellation also cancels the review (and fires a proofed_review.canceled webhook). When the review is in_progress or delivered the cancel returns 422 — proofed.com cannot cancel it from our side; contact support.

Response 200 OK

{
  "message": "Document cancelled."
}

Document Fields

Field Type Description
uuid string Stable document identifier. Use this to reference documents in other API calls.
filename string Original filename as uploaded.
file_type string Lowercase extension, e.g. pdf, docx.
file_size integer Size in bytes.
language string Language code.
status string One of pending, processing, completed, failed, cancelled.
source string Where the document came from: api, web, email.
correction_count integer Number of corrections found. null while pending/processing.
corrections_data array Array of correction objects (only on the Get Document endpoint). See Correction Shape.
webhook_url string|null Webhook delivery target, if one was provided.
download_url string Time-limited signed URL (24h) for the AI-proofread output file. Present only once the processed file exists (status completed). The signature is the auth — do NOT send a Bearer token to this URL. This is the machine-edited file; proofed_review.download_url is the separate human-reviewed deliverable.
submitted_at ISO8601|null When the document was submitted to the AI provider.
completed_at ISO8601|null When processing completed (success or failure).
created_at ISO8601 When the document was uploaded.
proofed_review object Present only when the document was submitted with review=true. See Human Review for the block shape.

Correction Shape

Each entry in corrections_data follows this shape. The AI produces both replacement corrections (with a suggested fix) and comments (judgment calls flagged for a human editor to review).

Field Type Description
type string Category: spelling, grammar, punctuation, style, consistency, clarity, tone, word_choice, formatting, or other.
original string The text as it appears in the document.
corrected string The suggested replacement. For comments, this may be the comment text.
context string Short rationale explaining why this is an issue.
page integer|null Page number (when known).

Webhooks

If you provide a webhook_url when submitting a document, we will send a POST request to that URL when processing reaches a terminal state (completed or failed).

Webhook Payload

{
  "event": "document.completed",
  "document": {
    "uuid": "9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
    "filename": "report.pdf",
    "status": "completed",
    "correction_count": 5,
    "download_url": "https://proofed.ai/api/v1/documents/9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c/download?expires=...&signature=..."
  },
  "timestamp": "2026-04-16T12:00:42+00:00"
}

The event field is document.{status}, e.g. document.completed or document.failed. Webhook delivery is retried up to 3 times with a 30-second delay between attempts. Any non-2xx response is treated as a failure and retried.

document.completed payloads include a download_url — a time-limited signed URL (24h) for the AI-proofread output file. The signature is the auth; do NOT send a Bearer token to it. The field is absent if no processed file was produced.

To fetch the full corrections, call the Get Document endpoint using the uuid from the payload.

Download Proofread File

GET /api/v1/documents/{uuid}/download

Streams the AI-proofread output file. Filename is proofed-{original-name}.

Authentication is by signed URL only — do NOT send an Authorization header. Use the URL we provide in download_url on the Get Document response or in the document.completed webhook payload. The URL is valid for 24 hours from issue; each Get Document response generates a fresh URL with a fresh expiry.

Returns 403 if the signature is invalid or expired. Returns 404 if no processed file exists for the document or the file is missing on disk.

curl "$DOWNLOAD_URL" -o proofed-report.pdf

Polling & Live Status

If you cannot receive webhooks, poll the Get Document endpoint. We recommend a 15-second interval while status is pending or processing. Documents typically complete within 1–5 minutes.

Pseudocode

while document.status in ("pending", "processing"):
    sleep(15)
    document = get_document(uuid)

if document.status == "completed":
    process_corrections(document.corrections_data)
else:
    handle_failure(document.status)

Human Review (proofed.com)

Optional follow-on stage: after the AI proofread completes, send the document to proofed.com for review by a human editor. The editor returns a final reviewed file, which you fetch via a signed URL.

Free add-on for now — review=true does not consume an extra token.

Enable Human Review

Add review=true to your Submit Document request. Optionally provide a review_brief (max 500 chars) with instructions for the human editor.

curl -X POST https://proofed.ai/api/v1/documents \
  -H "Authorization: Bearer your-api-token" \
  -F "file=@report.pdf" \
  -F "webhook_url=https://your-app.com/webhook" \
  -F "review=true" \
  -F "review_brief=Light proofread; preserve the author's voice."

Review Lifecycle

The Document's own status moves to completed as soon as the AI proofread is done — independently of the review. Track the human review separately via the proofed_review.status field on the Document.

pending
Order created. The AI proofread is still running; nothing has been sent to proofed.com yet.
submitted
Sent to proofed.com, awaiting an editor.
in_progress
proofed.com has assigned an editor. deadline and word_count populate.
delivered
Editor returned the reviewed file. delivered_at and download_url populate.
failed
Submit failed or proofed.com reported an error. error_text on the webhook explains why.
canceled
The order was cancelled (by you, or by proofed.com).

Typical end-to-end runtime: AI proofread completes within minutes; the human review depends on proofed.com's queue but is generally returned within 24–48 hours.

proofed_review Block

The Get Document response includes a proofed_review object whenever review=true was set on submit. Most fields populate as the review progresses; only status is always present.

"proofed_review": {
  "status": "delivered",
  "deadline": "2026-04-18T12:00:00+00:00",
  "word_count": 1234,
  "delivered_at": "2026-04-17T16:00:00+00:00",
  "download_url": "https://proofed.ai/api/v1/documents/{uuid}/proofed-review/download?expires=...&signature=..."
}
Field Type Description
status string One of pending, submitted, in_progress, delivered, failed, canceled.
deadline ISO8601 Editor deadline reported by proofed.com. Populated once status is in_progress.
word_count integer Word count reported by proofed.com. Populated once status is in_progress.
delivered_at ISO8601 When the editor returned the reviewed file. Populated once status is delivered.
download_url string Time-limited signed URL (24h) for the reviewed file. Present only when status is delivered. The signature is the auth — do NOT send a Bearer token to this URL.

Download Reviewed File

GET /api/v1/documents/{uuid}/proofed-review/download

Streams the file the human editor returned. Filename is {original-name}-reviewed.{ext}.

Authentication is by signed URL only — do NOT send an Authorization header. Use the URL we provide in proofed_review.download_url or in the proofed_review.delivered webhook payload. The URL is valid for 24 hours from issue. Each Get Document response generates a fresh URL with a fresh expiry.

Returns 403 if the signature is invalid or expired. Returns 404 if the document has no review attached, the review has not yet delivered, or the file is missing on disk.

Example

curl "$DOWNLOAD_URL" -o report-reviewed.pdf

Human Review Webhooks

When you provide webhook_url with review=true, you receive TWO separate webhook deliveries: one when the AI proofread finishes (document.completed), and one when the human review reaches a terminal state. Retried up to 3 times with 30-second backoff.

proofed_review.delivered

{
  "event": "proofed_review.delivered",
  "document": {
    "uuid": "9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
    "filename": "report.pdf"
  },
  "proofed_review": {
    "status": "delivered",
    "delivered_at": "2026-04-17T16:00:00+00:00",
    "download_url": "https://proofed.ai/api/v1/documents/9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c/proofed-review/download?expires=...&signature=..."
  },
  "timestamp": "2026-04-17T16:00:01+00:00"
}

proofed_review.failed

{
  "event": "proofed_review.failed",
  "document": { "uuid": "...", "filename": "report.pdf" },
  "proofed_review": {
    "status": "failed",
    "error_text": "proofed.com submit failed: HTTP 502"
  },
  "timestamp": "2026-04-17T12:01:00+00:00"
}

proofed_review.canceled

{
  "event": "proofed_review.canceled",
  "document": { "uuid": "...", "filename": "report.pdf" },
  "proofed_review": { "status": "canceled" },
  "timestamp": "2026-04-17T12:01:00+00:00"
}

To fetch the full document state at any time, call Get Document with the uuid.

Editor Quality Reviews

Proofed.ai also offers an editor quality review feature: upload an original document and an editor's version, and the AI assesses the editor's work against a baseline proofread. The output is a structured feedback report with a score and categorised findings.

Admin-only — not currently available via the public API.

This feature is available to admin users through the proofed.ai web interface. Public API access is on the roadmap — contact support if you have a use case.

What it produces

How to access

Admin users can submit reviews at /admin/reviews/submit in the proofed.ai web app. Users with the George permission can submit at /reviews/submit. DOCX files with track changes are fully supported — we read the "final accepted" version of the editor's work.

Reviewer Feedback

Reviewer Feedback (internal codename "Huxley") compares a reviewer's final copy against the editor's final copy, infers why the reviewer made each change by matching it to the style guide, and returns rule-grouped feedback the reviewer can scan, adjust, and send to the editor. Designed to save reviewers time when giving constructive feedback.

Requires the Huxley permission on your account.

Admins grant this per-user. Without it, all reviewer-feedback endpoints return 403.

Lifecycle

Feedback jobs move through pending → processing → completed / failed / cancelled, the same states as documents. Typical runtime: 2–6 minutes depending on document length and number of differences.

Submit Reviewer Feedback

POST /api/v1/reviewer-feedback

Upload the editor's final copy and the reviewer's final copy. multipart/form-data. Both files should be the final versions — no track changes.

Parameters

Field Type Required Description
editor_file file One of The editor's final copy. Max 50MB. Supported: pdf, docx, pptx, html, htm, txt, rtf, odt, epub. Required when editor_file_url is not provided.
editor_file_url string One of Public http(s) URL we fetch in place of editor_file. Mutually exclusive with editor_file. See Remote file URLs below.
reviewer_file file One of The reviewer's final copy. Same constraints as editor_file. Required when reviewer_file_url is not provided.
reviewer_file_url string One of Public http(s) URL we fetch in place of reviewer_file. Mutually exclusive with reviewer_file. The two slots are independent — you can mix an upload with a URL.
language string No Language code. Supported: en, en-GB, en-US, en-CA, en-IE, en-AU, en-NZ, en-ZA, en-IN, es, es-ES, es-MX, fr, fr-FR, fr-CA, de, de-DE, de-AT, de-CH, it, it-IT, pt, pt-BR, pt-PT. Default: en
style_guide_url string No Optional Stylus style-guide URL. Huxley uses it to map reviewer changes to named rules. Without one, findings are grouped by theme.
webhook_url string No URL to POST when the job reaches a terminal state. See Reviewer Feedback Webhooks.
order_id string No Your reference for the order this feedback relates to. Max 255 chars. Echoed back in responses and webhooks.
job_id string No Your reference for the job this feedback relates to. Max 255 chars. Echoed back in responses and webhooks.

Example

curl -X POST https://proofed.ai/api/v1/reviewer-feedback \
  -H "Authorization: Bearer your-api-token" \
  -F "editor_file=@editor-final.docx" \
  -F "reviewer_file=@reviewer-final.docx" \
  -F "language=en" \
  -F "style_guide_url=https://stylus.proofedapps.com/api/style-guides/abc-123" \
  -F "webhook_url=https://your-app.com/webhook" \
  -F "order_id=ORD-2026-0417" \
  -F "job_id=JOB-9812"

Response 201 Created

{
  "data": {
    "uuid": "7c2a1d5e-3f4b-4c6d-8e9f-0a1b2c3d4e5f",
    "editor_filename": "editor-final.docx",
    "reviewer_filename": "reviewer-final.docx",
    "language": "en",
    "status": "pending",
    "style_guide_url": "https://stylus.proofedapps.com/api/style-guides/abc-123",
    "webhook_url": "https://your-app.com/webhook",
    "order_id": "ORD-2026-0417",
    "job_id": "JOB-9812",
    "narrative": null,
    "finding_count": null,
    "diff_count": null,
    "report_available": false,
    "submitted_at": null,
    "completed_at": null,
    "created_at": "2026-04-17T15:00:00+00:00"
  }
}

List Reviewer Feedback

GET /api/v1/reviewer-feedback

Paginated list of your reviewer-feedback jobs, newest first. 20 per page.

curl https://proofed.ai/api/v1/reviewer-feedback \
  -H "Authorization: Bearer your-api-token"

Get Reviewer Feedback

GET /api/v1/reviewer-feedback/{uuid}

Returns the full feedback draft, including the rule-grouped findings, summary, and reviewer-only tone notes. On in-progress jobs, findings/summary are null and narrative describes the current step.

Response 200 OK (completed)

{
  "data": {
    "uuid": "7c2a1d5e-3f4b-4c6d-8e9f-0a1b2c3d4e5f",
    "editor_filename": "editor-final.docx",
    "reviewer_filename": "reviewer-final.docx",
    "language": "en",
    "status": "completed",
    "style_guide_url": "https://stylus.proofedapps.com/api/style-guides/abc-123",
    "webhook_url": "https://your-app.com/webhook",
    "order_id": "ORD-2026-0417",
    "job_id": "JOB-9812",
    "narrative": null,
    "finding_count": 3,
    "diff_count": 14,
    "summary": "Three recurring themes across your edit...",
    "tone_notes": "Keep it constructive — the editor caught most of the heavy lifting.",
    "findings": [
      {
        "rule_slug": "currency-abbreviations",
        "rule_name": "Currency in Billions",
        "rule_description": "Abbreviate as bn.",
        "summary": "Use bn for currency in the billions.",
        "examples": [
          { "paragraph": "14", "from": "$4 billion", "to": "$4bn" }
        ]
      }
    ],
    "report_available": true,
    "submitted_at": "2026-04-17T15:00:05+00:00",
    "completed_at": "2026-04-17T15:03:42+00:00",
    "created_at": "2026-04-17T15:00:00+00:00"
  }
}

Finding Shape

Field Type Description
rule_slug string Machine-readable identifier for the rule or theme.
rule_name string Human-readable rule name (from the style guide if one was provided).
rule_description string The rule description from the style guide.
summary string One-sentence feedback the reviewer can send to the editor.
examples array Concrete examples showing paragraph number, original text, and the reviewer's change.

Cancel Reviewer Feedback

POST /api/v1/reviewer-feedback/{uuid}/cancel

Cancel a pending or processing job. Terminal jobs return 403.

{
  "message": "Reviewer feedback cancelled."
}

Download Report

GET /api/v1/reviewer-feedback/{uuid}/report

Returns the generated DOCX feedback report (application/vnd.openxmlformats-officedocument.wordprocessingml.document). Available once status is completed — returns 404 otherwise. The filename is derived from the reviewer file, suffixed with -huxley-feedback.docx.

curl https://proofed.ai/api/v1/reviewer-feedback/{uuid}/report \
  -H "Authorization: Bearer your-api-token" \
  -o feedback.docx

Reviewer Feedback Webhooks

If you provide a webhook_url on submit, we POST to it when the job reaches a terminal state. Retried up to 3 times with 30-second backoff.

{
  "event": "reviewer-feedback.completed",
  "reviewer_feedback": {
    "uuid": "7c2a1d5e-3f4b-4c6d-8e9f-0a1b2c3d4e5f",
    "editor_filename": "editor-final.docx",
    "reviewer_filename": "reviewer-final.docx",
    "status": "completed",
    "order_id": "ORD-2026-0417",
    "job_id": "JOB-9812",
    "finding_count": 3,
    "diff_count": 14
  },
  "timestamp": "2026-04-17T15:03:42+00:00"
}

event is reviewer-feedback.{status}, e.g. reviewer-feedback.completed or reviewer-feedback.failed. To fetch findings, call Get Reviewer Feedback with the uuid.

Fact Check

Verify factual claims in a document against your Stylus style guide's ground truth and the live web. Requires the Fact Check permission on your account. Findings are returned per-claim with a verdict (verified, contradicted, or unverifiable), the reasoning, and source citations.

Submit Fact Check

POST /api/v1/fact-checks

Submit a document to fact-check. Job runs asynchronously — poll Get Fact Check or register a webhook_url.

Parameters

Field Type Required Description
document file One of The document to fact-check. Max 50MB. Supported: pdf, docx, pptx, html, htm, txt, rtf, odt, epub. Required when document_url is not provided.
document_url string One of Public http(s) URL we fetch in place of document. Mutually exclusive with document. See Remote file URLs.
language string No Language code. Supported: en, en-GB, en-US, en-CA, en-IE, en-AU, en-NZ, en-ZA, en-IN, es, es-ES, es-MX, fr, fr-FR, fr-CA, de, de-DE, de-AT, de-CH, it, it-IT, pt, pt-BR, pt-PT. Default: en
style_guide_url string No Optional Stylus style-guide URL. Ground-truth facts and uploaded reference documents take precedence over the web for any claim they cover.
webhook_url string No URL to POST when the job reaches a terminal state.
order_id string No Your reference for the order. Max 255 chars. Echoed back in responses and webhooks.
job_id string No Your reference for the job. Max 255 chars. Echoed back in responses and webhooks.

Example

curl -X POST https://proofed.ai/api/v1/fact-checks \
  -H "Authorization: Bearer your-api-token" \
  -F "document=@article.pdf" \
  -F "language=en" \
  -F "style_guide_url=https://stylus.proofedapps.com/api/style-guides/abc-123" \
  -F "webhook_url=https://your-app.com/webhook"

List Fact Checks

GET /api/v1/fact-checks

Paginated list of your fact-check jobs, newest first. 20 per page.

Get Fact Check

GET /api/v1/fact-checks/{uuid}

Returns the full findings list once status is completed, or progress narrative while processing. Each finding has a verdict (verified, contradicted, or unverifiable), the reasoning the model used, and a sources array (Stylus ground-truth citations or web links).

Download Report

GET /api/v1/fact-checks/{uuid}/report

Streams the generated DOCX report. Returns 404 if the job has not yet completed. The filename is the source document name suffixed with -fact-check.docx.

Error Codes

Code Description
401 Unauthorized — invalid or missing API token
402 Payment Required — insufficient tokens. Top up to submit more documents.
403 Forbidden — you do not have access to this resource
404 Not Found — the resource does not exist
422 Unprocessable Entity — validation errors or invalid state transition (e.g. cancelling a completed document)
429 Too Many Requests — rate limit exceeded

Code Examples

PHP

$client = new \GuzzleHttp\Client();

$response = $client->post('https://proofed.ai/api/v1/documents', [
    'headers' => [
        'Authorization' => 'Bearer ' . $apiToken,
    ],
    'multipart' => [
        [
            'name'     => 'file',
            'contents' => fopen('/path/to/report.pdf', 'r'),
            'filename' => 'report.pdf',
        ],
        [
            'name'     => 'language',
            'contents' => 'en',
        ],
    ],
]);

$document = json_decode($response->getBody(), true)['data'];

JavaScript (Node.js)

const form = new FormData();
form.append('file', fs.createReadStream('./report.pdf'));
form.append('language', 'en');

const response = await fetch('https://proofed.ai/api/v1/documents', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiToken}`,
  },
  body: form,
});

const { data } = await response.json();

Python

import requests

response = requests.post(
    'https://proofed.ai/api/v1/documents',
    headers={'Authorization': f'Bearer {api_token}'},
    files={'file': open('report.pdf', 'rb')},
    data={'language': 'en'},
)

document = response.json()['data']