/v2/claims/{claim_id}/documents/; review movement never changes that URL.
Your integration sends the file contents to paywise. A successful upload
creates the document and attaches it to its parent in one transaction;
malware scanning and page processing continue asynchronously.
Uploading documents
Choose the format that fits the operation:
Supply exactly one content source per document. Multipart files are accepted
only by the dedicated document endpoints; inline documents use base64.
Base64 content may be line-wrapped.
There is no upload-by-URL option: a
url field returns 400 as an unknown
field. If your source system provides a download link, retrieve the file in
your integration and upload its bytes. Existing document IDs cannot be used
as upload input, and there is no standalone upload to attach later.
Use an Idempotency-Key for each create command. A dedicated document upload
returns 201 with the document resource and a Location header. Keep its
id so you can read its processing status. For request examples, see
Manage documents.
File validation and limits
The API validates content before creating the document. Invalid content
returns
400 on file or base64, or on documents[i].base64 for an inline
attachment. Content errors include unsupported, corrupt, encrypted,
and page_limit_exceeded; invalid base64 and oversized files also fail
during upload. Correct the input before submitting a new command.
The split between synchronous and asynchronous checks is fixed: the byte
sniff (unsupported, corrupt), the PDF structure checks (encrypted,
page_limit_exceeded), size, and base64 decoding run synchronously and
answer 400 — no document is created. Only the malware scan and page
processing run asynchronously after the 201, and they surface as the
document’s rejected or failed status. The bytes are stored before the
response: if document storage is briefly unavailable, the upload — or the
command that carries inline documents — answers 503 service_unavailable
with Retry-After: 1, creates nothing, and releases its Idempotency-Key;
retry the same command with the same key. A command carries at most 20
documents; the 21st is refused before any document is decoded.
A multipart upload sends each part once: a repeated type, filename,
base64, or file part is 400 on that part name with code
duplicate_part. A multipart body that ends before the file part is
complete reads as a missing file and is 400 on file.
The supplied filename and media type do not determine the file format.
paywise removes path components and control characters from filename and
adjusts its extension to match the detected content, so the returned name
can differ from the one you sent.
Processing and downloads
An accepted upload starts aspending. Its status describes whether the
file is safe and available to use:
failure_reason is populated only for failed documents. Its values are
page_limit_exceeded, encrypted, corrupt, unsupported, or
processing_failed; it is null for other statuses. Follow status and
updated_at through the document resources. Document processing does not
emit public webhooks.
download_url is null until the document is ready, and stays null for
rejected and failed documents because their bytes are no longer stored.
Once available, it points to an authenticated API download route: send your
Bearer credential just as you would for other reads. A download before
readiness, or of a rejected/failed document, returns 404. The API
streams the file as an attachment with nosniff and no-store headers. Use
this route instead of constructing or saving a storage-provider URL.
Every download route — documents, mandate history attachments, request
attachments, and statement files — serves Accept: */*,
application/octet-stream, application/pdf, image/*, and
application/json; any other value such as text/html is
406 not_acceptable. An object that is missing in storage is
404 not_found; a storage fault is 503 service_unavailable with
Retry-After: 1, so retry after the interval.
DELETE of an unknown claim, rental-agreement, or enforceable-title document
is a neutral 404: the response does not reveal whether the document ever
existed under another parent.
Replacing an attachment
Documents have noPATCH or ingestion retry operation. To replace a file,
delete it from its parent, then upload the replacement with a new idempotency
key. The replacement has its own document ID and processing status. Retrying
an upload whose HTTP response was lost is different: resend the same command
with the same key to recover its result.
The parent determines when documents can be added or deleted:
Mutations outside these windows return
409. Finalizing an order does not
wait for scanning; poll its evidence before finalization if you need to be
able to replace a file that fails processing. Reviewers can access the bytes
only after scanning and page processing succeed.
Rental and title evidence
Use the document route for the resource the evidence describes:rental_agreement and enforceable_title are rejected with invalid_choice
on the generic claim document route. Creating a second file in an occupied
primary slot returns 409; delete the old file before uploading its replacement.
Rental-agreement documents are optional at finalization. Keep each rental
month’s statement on its claim; the receivable claim’s subject-matter-or-document
readiness rule still applies. A titled claim requires its primary title
document at finalization, with status pending or ready.
Messages
Send a message below/v2/orders/{order_id}/messages/ or
/v2/mandates/{mandate_id}/messages/ with title, body, and optional inline
documents. The 201 response contains the message resource, including its
id, editable flag, and attachments. Supported HTML in body is sanitized;
a body that is empty after sanitization is 400 on body with code
blank, on create and on PATCH alike. body follows the multi-line rule:
TAB, LF, and CR are accepted, other control characters are 400 with code
control_characters.
An API-created message belongs to the company’s API principal, so rotating
the API key does not change ownership. While editable is true, you can
update its title or body and add or delete documents through the message’s
document routes. Staff review closes that window; portal-authored messages
and paywise replies cannot be edited through the API. Withdrawn, rejected,
merged, and expired orders reject message changes with 409
(order_expired for an expired draft). When messaging is disabled for a
mandate, creating or editing a message there and adding or deleting its
documents answer 409 conflict (Messages are disabled for this mandate.).
Messages are written below an order or a main case: creating one below a
subcase answers 404 (No mandate found for the given reference.), while an
existing subcase thread stays readable.
Message creation acknowledges receipt while attachments are still processing.
paywise takes the message into case processing right away, as it does a
message written in the paywise portal: it hands the attachments over as they
are at that moment and leaves out files already failed or rejected.
Replace such a file while the message remains editable if the evidence still
needs to be sent. Downloads through the API still require ready.
Published paywise replies appear in the message collection; internal notes
do not. The order.message.created and mandate.message.created events
acknowledge client-authored messages received by paywise, so they are not
notifications of a paywise reply. Read the thread to retrieve replies.
Requests to client
A request to client is a published question from paywise that needs an answer. Read it below/v2/orders/{order_id}/requests-to-client/ during order review,
or /v2/mandates/{mandate_id}/requests-to-client/ for a mandate. Use the
parent identified by the request; order and mandate UUIDs are not interchangeable.
The request includes allowed_answer_types, question_attachments, and its
current answer. Download question attachments through their authenticated
download links. Submit the answer once at the request’s /answer/ endpoint;
the 200 response is the updated request. A second answer with a different
idempotency key returns 409. Sending an ordinary message does not answer
the request.
Build the payload for the advertised answer type:
booking_date is forbidden for all other answer types. Inline documents
are accepted only on fileupload, freetext, yes-no-freetext-on-no, and
yes-with-date-no-freetext-on-no answers; on any other type they are 400
on documents with code not_allowed. They use the same base64 format and
limits as other uploads. After answering, files can be added or deleted
through /answer/documents/ while the answer remains editable.
text on the free-text types and additional_comment are plain text: markup
is removed and HTML entities are decoded before validation. A value that is
empty after stripping is 400 with code blank; markup that does not
converge to plain text is 400 with code invalid. Both fields follow the
multi-line rule (TAB, LF, and CR accepted; other control characters are
control_characters).
For order requests, answering creates a staff review task. Once all
published requests on the order are answered, claims waiting for a client
response return to review. This does not wait for attachment processing.
Closed orders reject new answers and answer-document changes with 409.
For mandate requests, staff notification is scheduled immediately, while
downstream answer processing waits for all attached documents to be ready.
Any failed or rejected attachment blocks that processing. Delete it and
upload a corrected replacement while the review task is open. Files added
after the initial answer are subject to the same processing rule.
See Messages and client requests
for request examples. To follow the case as a whole, use
mandate history: published
history entries can link messages, requests, emails, or single-mandate
statements in related_resources. An underlying record alone does not
create a history entry.
Related reference
- POST
/v2/claims/{claim_id}/documents/ - POST
/v2/orders/{order_id}/rental-agreement/documents/ - POST
/v2/claims/{claim_id}/enforceable-title/documents/ - POST
/v2/orders/{order_id}/messages/ - POST
/v2/mandates/{mandate_id}/requests-to-client/{id}/answer/ - POST
/v2/orders/{order_id}/requests-to-client/{id}/answer/
