Purchase document endpoints attach files to /api/v1/purchases/{purchaseId} records.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v1/purchases/{purchaseId}/documents | List documents attached to a purchase |
POST | /api/v1/purchases/{purchaseId}/documents | Upload a purchase document with multipart form data |
POST | /api/v1/purchases/{purchaseId}/documents/presign | Create a direct-storage upload |
POST | /api/v1/purchases/{purchaseId}/documents/{documentId}/complete | Complete a direct-storage upload |
DELETE | /api/v1/purchases/{purchaseId}/documents/{documentId} | Remove a document from a purchase |
Multipart upload
Shell
curl -X POST {{BASE_URL}}/api/v1/purchases/{purchaseId}/documents \-H "Authorization: Bearer $CONFORMA_PAT" \-F "category=INVOICE" \-F "file=@invoice.pdf"
The multipart body requires category and file. 201 Created returns DocumentDto.
Presigned upload
Request body (PresignPurchaseDocumentRequestDto)
| Field | Type | Required | Description |
|---|---|---|---|
category | string | yes | Document category |
fileName | string | yes | Original filename |
contentType | string | yes | MIME type |
sizeBytes | integer | yes | File size, max 26214400 |
Call POST /api/v1/purchases/{purchaseId}/documents/presign, upload bytes to presignedUrl, then call POST /api/v1/purchases/{purchaseId}/documents/{documentId}/complete with checksumSha256.
Responses
List returns DocumentListResponseDto. Upload and complete return DocumentDto. Delete returns 204 No Content.