Archer Extract

Document Intelligence — rent roll & T-12 extraction

Local, offline, deterministic · arithmetic-verified (GREEN/YELLOW/RED)
Drop PDFs here, or click to choose
Source PDFTypeStatusUnits / Lines ReconciledReasonExcel

Status legend — GREEN footing proven   YELLOW unverifiable   RED stated total disagrees   UNREADABLE couldn't extract   UNVERIFIED generic table (no oracle).

Base URL is this server's origin. There is also a live OpenAPI explorer at /docs and ReDoc at /redoc.

POST/convert

Convert one PDF (rent roll or T-12) to a verified .xlsx. Routing (RR vs T-12) is automatic. Returns the workbook as a file download.

Request

Content-Typemultipart/form-data
field: filethe PDF (required). Non-PDF uploads are rejected with 400.

Response — 200 OK

Content-Typeapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Dispositionattachment; filename="<name>.xlsx"
X-Convert-StatusGREEN | YELLOW | RED | UNREADABLE | UNVERIFIED
X-Convert-TypeRR | T12 | GENERIC
X-Convert-Unitsunit count (RR) or line-item count (T-12)
X-Convert-Reasonnote when not cleanly verified (else empty)
bodythe .xlsx bytes

Response — 400 / 422

400  {"ok": false, "reason": "expected a .pdf file upload"}
422  {"ok": false, "type": "...", "status": "...", "reason": "...", ...}   (could not produce a workbook)

Example

curl -F "file=@RentRoll.pdf;type=application/pdf" -OJ http://HOST:8000/convert

# show the verdict headers and save the xlsx:
curl -s -D - -o out.xlsx -F "file=@RentRoll.pdf" http://HOST:8000/convert | grep -i x-convert
GET/api/files

Summary of every file converted since the server started (most-recent first). Backs the Home tab table.

Response — 200 OK (application/json)

{
  "count": 1,
  "files": [
    {
      "file": "RentRoll.xlsx",        // stored output name
      "source": "RentRoll.pdf",       // uploaded name
      "ok": true,
      "type": "RR",                   // RR | T12 | GENERIC
      "status": "YELLOW",             // GREEN | YELLOW | RED | UNREADABLE | UNVERIFIED
      "units": 224,                   // units (RR) or line items (T-12)
      "reconciled": "161/161",        // T-12 rows reconciled (null for RR)
      "reason": "",
      "download": "/download/RentRoll.xlsx"
    }
  ]
}

Example

curl http://HOST:8000/api/files
GET/download/{name}

Re-download a previously converted .xlsx by its stored name (the file field from /api/files). Path-traversal protected.

Response

200the .xlsx (spreadsheetml.sheet)
404{"ok": false, "reason": "not found"}

Example

curl -OJ http://HOST:8000/download/RentRoll.xlsx
GET/health

Response — 200 OK (application/json)

{"ok": true, "data_dir": "<path>", "output_dir": "<path>"}

An Archer product · local & offline · no cloud, no third-party APIs.