RECEIVE and SEND alike; a document never gates or delays a payment.x-amz-checksum-sha256 wire format). (2) POST filename, content_type, file_size (exact byte length), checksum and document_type; the response is 201 with status PENDING, upload_url, upload_expires_at and required_headers. (3) HTTP PUT the raw file bytes to upload_url before upload_expires_at, carrying exactly the three required_headers (Content-Type, Content-Length, x-amz-checksum-sha256) with the values returned and no other signed headers; storage rejects a PUT whose headers differ or whose body does not hash to the declared checksum. (4) GET /customers/v1/transactions/{id}/documents: the next list call that finds the object with the declared checksum flips the document to AVAILABLE.upload_url is valid until upload_expires_at (15 minutes by default; treat the timestamp as the upper bound and request a new upload if it lapses). Presigned URLs are not single-use: within the window the URL can be PUT again, but only with the identical bytes to the same location, because the checksum, length and content type are bound into the signature. Treat it as a secret and do not share it.Idempotency-Key; every POST reserves a new document, so a retry creates a second record. At most 20 documents per transaction: the 21st POST is rejected with 400 (Transaction already has 20 documents; the cap is 20 per transaction), so do not retry a POST whose 201 you already received. filename is stored sanitised to [A-Za-z0-9._-] and capped at 128 characters. Files are retained for the configured period (5 years by default, see retention_until) and are never served back through the API.