| Source PDF | Type | Status | Units / Lines | Reconciled | Reason | Excel |
|---|
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.
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-Type | multipart/form-data |
| field: file | the PDF (required). Non-PDF uploads are rejected with 400. |
Response — 200 OK
| Content-Type | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
| Content-Disposition | attachment; filename="<name>.xlsx" |
| X-Convert-Status | GREEN | YELLOW | RED | UNREADABLE | UNVERIFIED |
| X-Convert-Type | RR | T12 | GENERIC |
| X-Convert-Units | unit count (RR) or line-item count (T-12) |
| X-Convert-Reason | note when not cleanly verified (else empty) |
| body | the .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
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
Re-download a previously converted .xlsx by its stored name
(the file field from /api/files). Path-traversal protected.
Response
| 200 | the .xlsx (spreadsheetml.sheet) |
| 404 | {"ok": false, "reason": "not found"} |
Example
curl -OJ http://HOST:8000/download/RentRoll.xlsx
Response — 200 OK (application/json)
{"ok": true, "data_dir": "<path>", "output_dir": "<path>"}
An Archer product · local & offline · no cloud, no third-party APIs.