POST Completar Upload Direto
Finaliza o upload direto: completa as sessões multipart pendentes no R2, registra os arquivos e os associa à consulta. Também enfileira cada arquivo para processamento OCR assíncrono.
Esta rota requer o header Authorization: Bearer {accessToken}
A key de cada arquivo é recalculada no servidor (path/sha256(fileName)) e comparada com a informada — isso impede registrar objetos fora do escopo da consulta/paciente/exame declarados. Se não bater, retorna 400.
Endpoint
POST https://api-dev.imagemais.com.br/api/consultations/direct-upload/complete
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
patientId | number | ✅ | Mesmo valor enviado em Iniciar Upload Direto |
examType | string | ✅ | Mesmo valor enviado no initiate |
consultationId | number | ✅ | ID da consulta vinculada |
files | array | ✅ | 1 a 10 arquivos |
files[].key | string | ✅ | key retornada pelo initiate |
files[].fileName | string | ✅ | fileName (uuid + extensão) retornado pelo initiate |
files[].originalName | string | ✅ | Nome original do arquivo |
files[].uploadId | string | ❌ | Presente apenas em uploads multipart |
files[].parts | array | ❌ | Obrigatório se uploadId for enviado — partes com partNumber e etag |
files[].parts[].partNumber | number | ✅* | Número da parte (dentro de parts) |
files[].parts[].etag | string | ✅* | ETag retornado pelo PUT de cada parte |
Requisição
Upload single:
curl -X 'POST' \
'https://api-dev.imagemais.com.br/api/consultations/direct-upload/complete' \
-H 'accept: application/json' \
-H 'Authorization: Bearer {accessToken}' \
-H 'Content-Type: application/json' \
-d '{
"patientId": 9,
"examType": "Raio-X",
"consultationId": 17,
"files": [
{
"key": "consultation/9/17/raio-x/7f8ea8ab9c3767608d05671d0ae2e1c367d34164572bfe159b5bbfe90c518bc8",
"fileName": "bd7495aa-e483-4c88-8ce8-378671f77f53.pdf",
"originalName": "exame.pdf"
}
]
}'
Upload multipart (mesmo corpo, acrescentando uploadId e parts):
{
"patientId": 9,
"examType": "Raio-X",
"consultationId": 17,
"files": [
{
"key": "consultation/9/17/raio-x/7fc828818eed96c3b3c7a94c8118a3e7b95156b5425fddc91e2a854c11631ad8",
"fileName": "29f685f3-c12f-41f3-ab87-ec062e14582f.pdf",
"originalName": "exame-grande.pdf",
"uploadId": "AEI2gpj0SABougXtRKFai2E2lCdp3hfiLrcjmemx5KhFwoY2wpUp...",
"parts": [
{ "partNumber": 1, "etag": "\"9bb58f26192e4ba00f01e2e7b136bbd8\"" },
{ "partNumber": 2, "etag": "\"a1b2c3d4e5f60718293a4b5c6d7e8f90\"" }
]
}
]
}
Respostas
201 Criado
Retorna um array com os arquivos registrados (mesmo formato de Upload de Arquivos de Consulta).
[
{
"id": 12,
"url": "https://storagedev.imagemaislaboratorio.com.br/consultation/9/17/raio-x/7f8ea8ab9c...",
"fileType": "pdf",
"name": "Raio-X - exame.pdf",
"createdAt": "2026-07-18T15:00:04.256Z",
"updatedAt": "2026-07-18T15:00:04.256Z",
"deletedAt": null,
"accountId": null
}
]
400 Key inválida
Retornado quando a key informada não corresponde a {patientId}/{consultationId}/{examType} combinados com o hash de fileName.
{
"message": "Key inválida para o arquivo: exame.pdf",
"error": "Bad Request",
"statusCode": 400
}
400 Partes ausentes
Retornado quando uploadId é enviado sem parts (upload multipart incompleto).
{
"message": "Partes ausentes para o arquivo: exame-grande.pdf",
"error": "Bad Request",
"statusCode": 400
}
404 Consulta não encontrada
{
"message": "Consulta não encontrada",
"error": "Not Found",
"statusCode": 404
}