any2md API
endpoints
production
https://any2md.sokrates.edupaas.no
staging
https://any2md-staging.sokrates.edupaas.no
simple conversion

single file returns .md, multiple files return .zip

curl - single file
curl -X POST https://any2md.sokrates.edupaas.no/api/convert/simple \ -F "files=@document.pdf" \ -o document.pdf.md
curl - multiple files
curl -X POST https://any2md.sokrates.edupaas.no/api/convert/simple \ -F "files=@file1.pdf" \ -F "files=@file2.docx" \ -o converted.zip
python
import requests with open('document.pdf', 'rb') as f: response = requests.post( 'https://any2md.sokrates.edupaas.no/api/convert/simple', files={'files': f} ) with open('document.pdf.md', 'wb') as f: f.write(response.content)
javascript
const formData = new FormData(); formData.append('files', fileInput.files[0]); const response = await fetch('https://any2md.sokrates.edupaas.no/api/convert/simple', { method: 'POST', body: formData }); const blob = await response.blob(); // download or process blob
chunked conversion

splits documents by headers, always returns .zip

parameters
split_level - header level to split on (default: 2)
max_chunk_lines - max lines per chunk (default: 500)
curl
curl -X POST https://any2md.sokrates.edupaas.no/api/convert/chunked \ -F "files=@document.pdf" \ -F "split_level=2" \ -F "max_chunk_lines=500" \ -o chunked_documents.zip
python
import requests with open('document.pdf', 'rb') as f: response = requests.post( 'https://any2md.sokrates.edupaas.no/api/convert/chunked', files={'files': f}, data={ 'split_level': 2, 'max_chunk_lines': 500 } ) with open('chunked.zip', 'wb') as f: f.write(response.content)
supported formats
pdf
docx
doc
pptx
ppt
xlsx
xls
html
jpg
png
mp3
wav
mp4
response
single file: Content-Type: text/markdown
multiple files or chunked: Content-Type: application/zip
error handling
response = requests.post(url, files=files) if response.status_code == 200: # success content = response.content elif response.status_code == 400: # bad request (no files provided) error = response.json() print(error['detail']) elif response.status_code == 500: # server error error = response.json() print(error['detail'])
rate limits

none currently, but be reasonable

authentication

none required