Skip to main content
Specialized OCR for the messy reality of legal documents. We handle what generic providers can’t: handwriting, poor scans, fax headers, and complex tables.

Quick example

import Casedev from 'casedev';

const client = new Casedev({ apiKey: process.env.CASEDEV_API_KEY });

// Submit your user's document for processing
const job = await client.ocr.v1.process({
  document_url: uploadedDocumentUrl
});

// Poll for completion
let result = await client.ocr.v1.retrieve(job.id);
while (result.status === 'pending' || result.status === 'processing') {
  await new Promise(r => setTimeout(r, 2000));
  result = await client.ocr.v1.retrieve(job.id);
}

// Return extracted text to your user
const text = await client.ocr.v1.download(job.id, 'text');
console.log(text);
FeatureWhy it matters for your app
Handwriting RecognitionExtract notes and annotations from uploaded documents
Table ReconstructionPreserve structure for financial statements and forms
Bates Stamp HandlingIdentify and index reference numbers separately
Searchable PDF (HOCR)Return documents with text layers your users can search

Engine Selection

Choose based on your users’ document types:
EngineBest forSpeed
doctrStandard documents. High speed, good accuracy for typed text.Fast
tesseractOlder scans. Good for grainy or degraded documents.Medium
paddleTables and forms. Best-in-class table structure recognition.Slower

Output formats

FormatDescription
textPlain text extraction
jsonStructured output with coordinates, confidence scores
pdfSearchable PDF (original with text layer)

Endpoints

Common patterns

const job = await client.ocr.v1.process({
  document_url: uploadedDocumentUrl,
  callback_url: 'https://your-app.com/webhooks/ocr-complete'
});
// We POST results to your callback when done

From S3

const job = await client.ocr.v1.process({
  document_url: 's3://your-bucket/documents/upload.pdf'
});
// We handle presigning automatically

With table extraction

const job = await client.ocr.v1.process({
  document_url: uploadedDocumentUrl,
  engine: 'paddle',
  features: {
    tables: { format: 'csv' }
  }
});