Skip to content

Paperless-ngx — Reference

  • Website: https://docs.paperless-ngx.com
  • API docs: https://docs.paperless-ngx.com/api/
  • GitHub: https://github.com/paperless-ngx/paperless-ngx

Authentication

API requests use either a token or basic auth. Get a token via the /api/token/ endpoint.

# Get API token
TOKEN=$(curl -s -X POST https://paperless.eva-00.network/api/token/ \
  -d "username=claude&password=<password>" | python3 -c "import json,sys; print(json.load(sys.stdin)['token'])")

# Use token in requests
curl -s -H "Authorization: Token $TOKEN" https://paperless.eva-00.network/api/...

API — Documents

List documents

curl -s -H "Authorization: Token $TOKEN" \
  "https://paperless.eva-00.network/api/documents/" | python3 -c \
  "import json,sys; [print(f'{d[\"id\"]} {d[\"title\"]}') for d in json.load(sys.stdin)['results']]"

Search documents (full-text)

curl -s -H "Authorization: Token $TOKEN" \
  "https://paperless.eva-00.network/api/documents/?query=tax+return+2025"

Find similar documents

curl -s -H "Authorization: Token $TOKEN" \
  "https://paperless.eva-00.network/api/documents/?more_like_id=42"

Upload a document

curl -s -X POST -H "Authorization: Token $TOKEN" \
  -F "document=@/path/to/file.pdf" \
  -F "title=Invoice 2025-03" \
  -F "tags=5" \
  -F "tags=12" \
  https://paperless.eva-00.network/api/documents/post_document/

Returns a task UUID. The document is queued for OCR and processing.

Download a document

# Original file
curl -s -H "Authorization: Token $TOKEN" \
  -o document.pdf \
  https://paperless.eva-00.network/api/documents/42/download/

# Archived (OCR'd) version
curl -s -H "Authorization: Token $TOKEN" \
  -o document_archived.pdf \
  https://paperless.eva-00.network/api/documents/42/download/?original=false

Get document metadata

curl -s -H "Authorization: Token $TOKEN" \
  https://paperless.eva-00.network/api/documents/42/metadata/

Update document fields

curl -s -X PATCH -H "Authorization: Token $TOKEN" \
  -H "Content-Type: application/json" \
  https://paperless.eva-00.network/api/documents/42/ \
  -d '{"title": "New Title", "correspondent": 3}'

API — Organization

List correspondents / tags / document types

curl -s -H "Authorization: Token $TOKEN" https://paperless.eva-00.network/api/correspondents/
curl -s -H "Authorization: Token $TOKEN" https://paperless.eva-00.network/api/tags/
curl -s -H "Authorization: Token $TOKEN" https://paperless.eva-00.network/api/document_types/

Create a tag

curl -s -X POST -H "Authorization: Token $TOKEN" \
  -H "Content-Type: application/json" \
  https://paperless.eva-00.network/api/tags/ \
  -d '{"name": "receipts", "color": "#ff0000"}'

API — Tasks

Check consumption task status

curl -s -H "Authorization: Token $TOKEN" \
  https://paperless.eva-00.network/api/tasks/?task_id=<uuid>

CLI — manage.py

Run via Docker exec on LXC 124.

ssh [email protected] "pct exec 124 -- docker exec paperless python3 manage.py <command>"

Common commands

# Create superuser
docker exec -it paperless python3 manage.py createsuperuser

# Rebuild search index
docker exec paperless python3 manage.py document_index reindex

# Re-run OCR on all documents
docker exec paperless python3 manage.py document_retagger --use-first

# Export all documents
docker exec paperless python3 manage.py document_exporter /opt/paperless/export/

# Import documents from export
docker exec paperless python3 manage.py document_importer /opt/paperless/export/

# Check database consistency
docker exec paperless python3 manage.py document_sanity_checker

What the API/CLI Cannot Do

Gap Workaround
Cannot configure OCR settings via API Set via environment variables in docker-compose
Cannot manage mail rules via API Use the web UI (Settings → Mail)
Cannot bulk-delete documents via API Delete one by one, or use manage.py
Cannot configure matching algorithms via API Use the web UI
No CLI for remote administration Must docker exec into the container on LXC 124
Cannot preview document thumbnails via API Use /api/documents/{id}/thumb/ (undocumented but works)
Task queue status not exposed via API Check Redis or Loki logs: {container="paperless"} \|= "task"