Metadata-Version: 2.4
Name: hardparse
Version: 0.1.0
Summary: Turn any PDF or image into clean Markdown. Free keyless API.
Author-email: Hardparse <hi@hardparse.com>
License: MIT
Project-URL: Homepage, https://hardparse.com
Project-URL: Documentation, https://hardparse.com#api
Project-URL: Source, https://hardparse.com
Keywords: ocr,pdf,markdown,document-parsing,vlm
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Text Processing
Requires-Python: >=3.9
Description-Content-Type: text/markdown

# hardparse

Turn any PDF or image into clean Markdown — tables as real Markdown tables, formulas as LaTeX, handwriting as readable text.

Free, keyless API. 100 requests/day per IP. Zero dependencies.

## Install

```bash
pip install hardparse
```

## Use

```python
from hardparse import parse

md = parse("invoice.pdf")
print(md)
```

That's it. No key. No signup.

## More

```python
from hardparse import parse_full

result = parse_full("scan.png")
print(result.markdown)
print(result.page_count, "pages,", result.processing_time_ms, "ms")
print("remaining today:", result.remaining)
```

Works with paths, bytes, or any file-like object:

```python
parse(Path("doc.pdf"))
parse(open("doc.pdf", "rb"))
parse(b"...raw bytes...")
```

## Rate limits

Anonymous, per-IP: **100 requests / 24h rolling window**. On exceed:

```python
from hardparse import parse, RateLimitError

try:
    md = parse("doc.pdf")
except RateLimitError as e:
    print(f"hit limit: used {e.used}/{e.limit}, retry in {e.retry_after}s")
```

Need more? Email [hi@hardparse.com](mailto:hi@hardparse.com).

## Self-host / custom endpoint

```python
from hardparse import Client
client = Client(base_url="https://your-host")
md = client.parse("doc.pdf")
```

Or set `HARDPARSE_BASE_URL`.

## Supported inputs

PDF, PNG, JPG, TIFF, HEIC, WEBP, BMP. 200 MB max.
