Get consultation result


Version Notice: SOFT Integration is available starting from API version 2026-08-01.
The API version you have selected does not include it. Switch to 2026-08-01 to access this functionality.

Retrieves the clinical result produced during a SOFT Integration consultation, identified by the requestId you generated when requesting the signature.

Use this endpoint after being notified that the result is ready, either through the WebSocket or through the webhook.

Request description

Endpoint: /api/v1/soft-integration/{requestId}/result
Method: GET

Path parameters

ParameterRequiredDescription
requestIdYesThe identifier you sent when generating the signature for this consultation.
{
  "Authorization": "Bearer <accessToken>"
}

The access token is the same one used to generate the signature. Access is scoped to the organization that owns the consultation: a token from a different organization is rejected.

To set the API version on a specific request, you can add a specific header named X-Invox-Medical-Api-Version with the value of the version you are targeting:

X-Invox-Medical-Api-Version: 2026-08-01

2026-08-01 is the only version this endpoint accepts. Omitting the header resolves to the latest version.

Result availability

The result is kept in temporary storage for 24 hours after the consultation finishes. Once that period elapses the result is removed and the endpoint responds 410.

Retrieve and persist the result in your own system as soon as you are notified. This endpoint is a recovery mechanism, not a long-term archive.

Responses

Correct response

Successful request

Describe the characteristics of a satisfactory response

200

Response structure:

{
  "result": {
    // identical payload to the onReportFinished webhook event
  }
}

Same contract as the webhook. The object inside result has the same clinical and correlation fields as the OnMedicalReportFinished webhook event, so you can process both with the same parser. If the organization has a webhook credential configured, it also includes requestSignature; otherwise that field is omitted. The payload structure is documented in Notifications — Webhook.
requestSignature is not the value the webhook delivered for the same consultation. Each channel signs the payload it sends, so the two signatures differ while both remain valid. Verify this one against the body of this response, exactly as received.

Wrong responses

Unauthorized request

Describe the characteristics of an unauthorized request

401

Response body

{
  // empty body
}

Description: no valid credential was supplied.


Forbidden request

Describe the characteristics of a forbidden request

403

Response body

{
  "message": "The requested consultation belongs to another organization.",
  "errorType": "invalidPermission"
}

Description: the requestId exists but belongs to a different organization.


Not found

Describe the characteristics of a request for an unknown consultation

404

Response body

{
  "message": "No consultation found for the provided requestId.",
  "errorType": "requestNotFound"
}


Conflict

Describe the characteristics of a request for a consultation still in progress

409

Response body

{
  "message": "The consultation has not finished yet.",
  "errorType": "resultNotReady"
}

Description: the consultation exists but has not produced a result yet. Wait for the notification instead of polling aggressively.


Gone

Describe the characteristics of a request for an expired result

410

Response body

{
  "message": "The result is no longer available.",
  "errorType": "resultExpired"
}

Description: the result was produced but has already been removed from temporary storage. It cannot be recovered; the consultation would have to be repeated.

Example

TypeScript
const response = await fetch(
  `https://api-suite.invoxmedical.com/api/v1/soft-integration/${requestId}/result`,
  { headers: { Authorization: `Bearer ${accessToken}` } },
);

switch (response.status) {
  case 200: {
    const { result } = await response.json();
    // persist the result in your EHR
    break;
  }
  case 409:
    // not finished yet — wait for the notification
    break;
  case 410:
    // expired — no longer recoverable
    break;
  default:
  // 401 / 403 / 404 — check credentials and requestId
}
C#
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;

using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", accessToken);

var response = await client.GetAsync(
    $"https://api-suite.invoxmedical.com/api/v1/soft-integration/{requestId}/result");

switch (response.StatusCode)
{
    case HttpStatusCode.OK:
        using (var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync()))
        {
            var result = doc.RootElement.GetProperty("result");
            // persist the result in your EHR
        }
        break;
    case HttpStatusCode.Conflict:
        // not finished yet — wait for the notification
        break;
    case HttpStatusCode.Gone:
        // expired — no longer recoverable
        break;
    default:
        // 401 / 403 / 404 — check credentials and requestId
        break;
}
Java
import java.net.URI;
import java.net.http.*;
import com.fasterxml.jackson.databind.*;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api-suite.invoxmedical.com/api/v1/soft-integration/"
        + requestId + "/result"))
    .header("Authorization", "Bearer " + accessToken)
    .GET()
    .build();

HttpResponse<String> response = client.send(
    request, HttpResponse.BodyHandlers.ofString());

switch (response.statusCode()) {
    case 200 -> {
        JsonNode result = new ObjectMapper().readTree(response.body()).get("result");
        // persist the result in your EHR
    }
    case 409 -> { /* not finished yet — wait for the notification */ }
    case 410 -> { /* expired — no longer recoverable */ }
    default -> { /* 401 / 403 / 404 — check credentials and requestId */ }
}
Python
import requests

response = requests.get(
    f"https://api-suite.invoxmedical.com/api/v1/soft-integration/{request_id}/result",
    headers={"Authorization": f"Bearer {access_token}"},
)

if response.status_code == 200:
    result = response.json()["result"]
    # persist the result in your EHR
elif response.status_code == 409:
    pass  # not finished yet — wait for the notification
elif response.status_code == 410:
    pass  # expired — no longer recoverable
else:
    pass  # 401 / 403 / 404 — check credentials and requestId