Init Upload
Start a file upload and get a signed URL to PUT the bytes to.
This call does not carry the file itself. It returns a signed_url, the
required_headers you must send with it, an expires_at, and the max_size_bytes
ceiling. Upload the bytes directly to that URL, then poll
GET /v1/files/{file_id} for the status.
With embed true (the default) the file is chunked and embedded once the bytes
land, which makes it searchable through POST /v1/files/search. Any metadata you
pass is stored per chunk and can be filtered on at search time.
Accepted types: any text/*, PDF, DOC/DOCX, XLS/XLSX, PPTX, JSON, XML, SQL.
Anything else is a 422 here, before you spend bandwidth on the upload.
text/* is taken at face value: a text subtype with no dedicated parser — text/rtf
is the one to watch — is chunked exactly as sent, so its markup ends up in the
embeddings alongside the prose and dilutes search results. Convert such files to
plain text or PDF before uploading.
Authorizations
Enter your MeshAPI key (rsk_...) — sent as Authorization: Bearer <key>.
Headers
Dated version of the API contract to pin this request to. Omit it and the request is served under 2026-08 — the oldest supported version, so an existing integration is never moved by a release. A malformed or unsupported value is rejected with 400 invalid_api_version rather than falling back silently. The version actually served is echoed as X-Mesh-Version on every response, including errors.
2026-08