# jextract > Taxonomy-driven document extraction. LiteParse reads the PDF locally, then TypeSafe's Jev model locates each field and picks the exact span, with a probability and a bounding box. Values are chosen from text on the page, never generated. ## Pages - [Overview](https://jextract.com/): what jextract does, with a real run on a sample invoice - [Extract a document](https://jextract.com/extract): the app; upload a PDF or use a sample, pick or edit a taxonomy - [Architecture](https://jextract.com/architecture): the pipeline request by request: parse, locate, pick, refine - [Blog](https://jextract.com/blog): guides on extraction, taxonomies and confidence ## Blog - [PDF data extraction without generation: choosing spans instead of writing JSON](https://jextract.com/blog/pdf-extraction-without-generation): Extraction without generation means the model never writes a value. Code cuts candidate spans out of the document, and a model picks one of them with a probability. Every returned value is text that exists on the page, with the box it was read from, so it can be checked instead of trusted. - [How to write a taxonomy for invoice extraction](https://jextract.com/blog/invoice-extraction-taxonomy): A taxonomy is a list of fields, each with an id, a name, a one-sentence description and a type. Pick the narrowest type that fits, describe the field the way the document would label it, and add hints for the words that usually sit next to the value. Twelve well-described fields are enough for most invoices. - [What a confidence score means in document extraction](https://jextract.com/blog/extraction-confidence-scores): In jextract, a field's confidence is the probability the model gave to the chosen span, multiplied by the probability that the field is present in the document at all. Fields below 0.55 are marked low-confidence, and a field is reported absent when "none" wins or reaches 0.6. The number comes from the model's answer distribution, not from asking it how sure it feels. - [Contract data extraction: pulling parties, dates and terms from agreements](https://jextract.com/blog/contract-data-extraction): Contract fields that are a short span on the page extract well: party names, effective and end dates, fee amounts, notice periods in days, governing law and signatories. Fields that are a whole clause, such as a liability cap written as a sentence, are the weak spot of span-based extraction and should go to review. - [Résumé parsing with a taxonomy: structured candidate data from PDFs](https://jextract.com/blog/resume-parsing-api): Define the candidate fields you need as a taxonomy, and jextract returns each one as a span from the résumé with a confidence and a bounding box. Email, phone, name, location and degree extract cleanly. Fields that depend on interpretation, such as the current job title, are the ones to review. - [Purchase order extraction: PO numbers, parties, totals and delivery terms](https://jextract.com/blog/purchase-order-extraction): For a purchase order, extract the PO number, order and delivery dates, buyer, supplier, order total, currency, payment terms and shipping method as single fields. Describe buyer and supplier by role so they are not swapped, and treat line items as out of scope for span extraction: ask for the total and the count instead. - [Extracting data from scanned PDFs: when to turn OCR on](https://jextract.com/blog/scanned-pdf-ocr-extraction): A text PDF already contains its characters and positions, so it parses in milliseconds. A scanned PDF is a picture of a page and needs OCR first. In jextract, OCR is off by default; turn it on for scans with the ocr=1 option. It runs locally with Tesseract, takes seconds instead of milliseconds, and is less accurate than a born-digital file. - [Why every extracted value should come with a bounding box](https://jextract.com/blog/bounding-boxes-document-extraction): A bounding box is the rectangle on the page where a value was read: a page number plus x, y, width and height in page points. It lets a reviewer check a field by looking at one highlighted spot instead of searching the document. jextract returns one for every picked value because values are chosen from positioned text, never written. - [Extracting fields from long documents: chunks, windows and parallel search](https://jextract.com/blog/long-document-extraction): jextract splits a document into chunks of nearby lines, groups the chunks into windows of about 22k tokens, and asks Jev to locate every field in each window in parallel. The per-window answers are merged, and the value is then picked once from the best chunk. Length adds requests that run side by side, not time in sequence. - [PDF extraction API: from curl to structured JSON](https://jextract.com/blog/pdf-extraction-api-curl): Send one multipart POST to /api/extract with a PDF and a taxonomy. Add stream=0 for a single JSON response. You get a flat data object keyed by field id, plus per-field detail: the span, a normalised value, confidence, page, bounding box, status and the candidates it was chosen from. ## API - POST https://jextract.com/api/extract — multipart form: `file` (PDF, up to 8 MB / 40 pages), `taxonomy` (a preset id or a JSON object with `fields[]`), optional `ocr=1`, `refine=0`, `stream=0` - Presets: invoice, contract, resume, purchase_order - Field types: string, id, date, money, number, percent, email, phone, enum, boolean