Skip to content

QUBS Integrations API (v1)

Partner-facing API providing read access to selected QUBS configuration and scheduling data, plus reporting submission endpoints for tele reporting workflows.

Authentication is via a bearer JWT in the Authorization header. Authorization is domain-scoped; all requests include a {domain} path parameter. Tokens are issued via the OAuth 2.0 client credentials flow (see Authentication below).

Token lifetimes:

  • Authentication flow session duration: 3 minutes.
  • Access token expiration: 60 minutes.
  • ID token expiration: 60 minutes.
  • Refresh token expiration: 5 days.

Refresh tokens (when issued) can be exchanged for new access tokens until they expire; after expiration, request a new token via the client credentials flow.

Scopes/audience: no additional scopes are required for current integrations; authorization is domain-scoped via claims. Audience is managed by QUBS; use the client credentials provisioned for your integration.

Sandbox: no public sandbox environment is currently available.

Errors are returned as RFC7807 Problem Details (application/problem+json) and include a requestId plus the X-Correlation-Id response header.

Data handling: responses may include PHI (patient name/date of birth). Treat all such data as sensitive, apply least-privilege access, and avoid logging or storing longer than required.

Date/time conventions: date values use ISO 8601 yyyy-MM-dd. time values use HH:mm:ss in the scheduled site's local timezone (see SiteSettings.timeZone). date-time values are returned in UTC. Numeric values are JSON numbers (integers/decimals), not strings.

Pagination: cursor endpoints return page objects with items and nextToken, while offset endpoints return arrays. For cursor paging, stop when nextToken is empty/omitted; for offset paging, stop when the response count is less than take. Ordering is not guaranteed and should not be assumed to be chronological.

Retry guidance: for 429 responses, honor the Retry-After header and use exponential backoff with jitter. GET requests are safe to retry. Reporting POST endpoints support the Idempotency-Key header; use a stable ASCII token (recommend a UUID) up to 128 characters and reuse the same key with the same payload to receive the original response. For timeouts or transient transport errors, retry the POST with the same key and exponential backoff; reuse with a different payload returns 409 Conflict. Keys are retained for 24 hours (comments/reports) or 15 minutes (report attachment uploads). Without the header, retries can create duplicates.

Rate limits: no fixed quotas or standard rate-limit headers are guaranteed. Use 429 responses and Retry-After when present.

Getting started

Base URL

  • Production: https://partners.qubs.io

Authentication

  1. Request an access token using the OAuth 2.0 client credentials flow.
  2. Send it in the Authorization header as Bearer <token>.

Token endpoint: https://authenticate.qubs.io/oauth2/token

Token request examples:

curl -X POST "https://authenticate.qubs.io/oauth2/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "grant_type=client_credentials" \
  --data-urlencode "client_id=<client_id>" \
  --data-urlencode "client_secret=<client_secret>"
Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.post("https://authenticate.qubs.io/oauth2/token")
  .header("Content-Type", "application/x-www-form-urlencoded")
  .field("grant_type", "client_credentials")
  .field("client_id", "<client_id>")
  .field("client_secret", "<client_secret>")
  .asString();
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://authenticate.qubs.io/oauth2/token");
request.Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
    ["grant_type"] = "client_credentials",
    ["client_id"] = "<client_id>",
    ["client_secret"] = "<client_secret>"
});
using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var tokenPayload = await response.Content.ReadAsStringAsync();

Use the access_token value from the response as your bearer token.

If a refresh_token is issued, you can exchange it for new access tokens until it expires (5 days). When a refresh token is expired or not provided, request a new token via client credentials.

Example requests

curl -X GET "https://partners.qubs.io/integrations/v1/acme/reporting/appointments/pending?pageSize=1" \
  -H "Authorization: Bearer <token>"
curl -X POST "https://partners.qubs.io/integrations/v1/acme/reporting/appointments/A123456/report" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"reportText":"Preliminary report text","reportStatus":"preliminary","reportedAtUtc":"2025-01-10T03:04:05Z"}'

Reporting workflow (example)

  1. List pending reporting appointments.
curl -X GET "https://partners.qubs.io/integrations/v1/acme/reporting/appointments/pending?pageSize=1" \
  -H "Authorization: Bearer <token>"

Example response:

{
  "items": [
    {
      "domain": "acme",
      "appointmentId": "A123456",
      "status": "PENDING REPORTING",
      "scheduledSite": "Central Clinic",
      "appointmentDate": "2025-01-12",
      "startTime": "13:45:00",
      "patientName": "Jane Doe"
    }
  ],
  "nextToken": "DDB_NEXT_TOKEN"
}
  1. (Optional) Create report attachment upload URLs.
curl -X POST "https://partners.qubs.io/integrations/v1/acme/reporting/appointments/A123456/report/attachments" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <idempotency-key>" \
  -d '{"items":[{"fileName":"report.pdf","contentType":"application/pdf"}]}'

Example response:

{
  "items": [
    {
      "guid": "989dd0c7-13bb-4bba-b7a0-53a28bdf5155",
      "fileName": "report.pdf",
      "category": "report",
      "uploadUrl": "https://example.com/upload/report.pdf",
      "uploadUrlExpiresAtUtc": "2025-01-10T03:19:05Z"
    }
  ]
}
  1. Upload the report artifact bytes with a PUT to uploadUrl.
curl -X PUT "https://example.com/upload/report.pdf" \
  -H "Content-Type: application/pdf" \
  --data-binary "@report.pdf"
  1. Submit the report content. Submissions overwrite any existing report for the appointment; you can submit a preliminary report and later submit a final report.
curl -X POST "https://partners.qubs.io/integrations/v1/acme/reporting/appointments/A123456/report" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <idempotency-key>" \
  -d '{"reportText":"No acute abnormality detected.","reportStatus":"preliminary","reportedAtUtc":"2025-01-10T03:04:05Z"}'

Example response:

{
  "reportGuid": "4b7f0a91-b4f5-4f2a-9a21-23456789abcd",
  "reportStatus": "preliminary",
  "reportedAtUtc": "2025-01-10T03:04:05Z"
}
  1. (Optional) Create an appointment comment/alert.
curl -X POST "https://partners.qubs.io/integrations/v1/acme/reporting/appointments/A123456/comments" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <idempotency-key>" \
  -d '{"commentText":"Report sent to referrer.","commentType":"AC","isAlert":false}'
Download OpenAPI description
Languages
Servers
Mock server
https://partnerdocs.qubs.io/_mock/openapi
Production API
https://partners.qubs.io
Relative to the current host
https://partnerdocs.qubs.io

Partner-facing endpoints for listing sites and retrieving site configuration within a domain.

Operations

Partner-facing endpoints for retrieving exam code configuration for a site within a domain.

Operations

Partner-facing endpoints for retrieving the staff skill grid and related metadata for a site within a domain.

Operations

Partner-facing endpoints for retrieving appointments within a domain.

Operations

Partner-facing endpoints for retrieving appointment attachments and generating short-lived presigned URLs.

Operations

Partner-facing endpoints for retrieving appointment and patient comments/alerts associated with an appointment.

Operations

Partner-facing endpoints for retrieving patients within a domain.

Operations

Partner-facing endpoints for retrieving appointments that are pending reporting and submitting tele reporting artifacts. Typical workflow: list pending reporting appointments, create upload URLs for report artifacts (optional), upload with PUT, then submit report content.

Operations

List pending reporting appointments

Request

Returns the tele reporting appointment view for appointments in the PENDING REPORTING status. Supports cursor-based pagination via pageSize and nextToken.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
Query
pageSizeinteger(int32)[ 1 .. 500 ]

Maximum number of items to return in a page. Defaults to 100 when omitted. Must be between 1 and 500.

Default 100
Example: pageSize=100
nextTokenstring

Opaque, URL-safe continuation token returned as nextToken in a previous paged response. Omit for the first page.

Example: nextToken=DDB_NEXT_TOKEN
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
curl -i -X GET \
  'https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/pending?pageSize=100&nextToken=DDB_NEXT_TOKEN' \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a'

Responses

Page of appointments that are pending reporting for the requested domain.

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/json
itemsArray of objects(PendingReportingAppointmentResponse)required

Tele reporting appointments in the current page.

items[].​domainstringrequired

Domain this appointment belongs to.

Example: "Example domain"
items[].​appointmentIdstringrequired

Appointment identifier.

Example: "123"
items[].​statusstringrequired

Appointment status.

Enum"NOT ARRIVED""ARRIVED""DID NOT ATTEND""APPPOINTMENT CANCELLED""CANCELLATION LIST""DICTATION INPROGRESS""DICTATED""TYPED""AUTHORISING""AUTHORISED"
Example: "NOT ARRIVED"
items[].​scheduledSitestringrequired

Scheduled site name.

Example: "Example scheduledSite"
items[].​appointmentDatenull or string(date)

Appointment date (ISO 8601, yyyy-MM-dd) in the scheduled site's local timezone.

Example: "2020-01-01"
items[].​startTimenull or string^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$

Scheduled start time (ISO 8601, HH:mm:ss) in the scheduled site's local timezone.

Example: "13:45:00"
items[].​endTimenull or string^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$

Scheduled end time (ISO 8601, HH:mm:ss) in the scheduled site's local timezone.

Example: "13:45:00"
items[].​patientIdstring

Patient identifier when available.

Example: "123"
items[].​patientNamestring

Patient display name.

Example: "Example Name"
items[].​firstNamestring

Patient first name.

Example: "Example Name"
items[].​lastNamestring

Patient last name.

Example: "Example Name"
items[].​dateOfBirthnull or string(date)

Patient date of birth (ISO 8601, yyyy-MM-dd).

Example: "2020-01-01"
items[].​genderstring

Patient gender/sex string as stored in QUBS.

Example: "Example gender"
items[].​modalitystring

Exam modality string as stored in QUBS.

Example: "Example modality"
items[].​studyDescriptionstring

Study description as stored in QUBS.

Example: "Example description"
items[].​clinicalInfostring

Clinical information text as stored in QUBS.

Example: "Example clinicalInfo"
items[].​doctorNamestring

Referring doctor display name.

Example: "Example Name"
items[].​clinicNamestring

Referring clinic name when available.

Example: "Example Name"
items[].​prioritystring

Appointment/reporting priority string as stored in QUBS.

Example: "Example priority"
items[].​reportNeededBynull or string(date-time)

Optional deadline timestamp for reporting (UTC, ISO 8601) when available.

Example: "2020-01-01T00:00:00Z"
items[].​studyInstanceUidstring

PACS study instance UID when available.

Example: "123"
items[].​radiologistUserobject(UserSummaryResponse)

Radiologist user assigned to the appointment when available.

items[].​serviceItemsArray of objects(PendingReportingServiceItemResponse)

Service items attached to the appointment.

nextTokennull or string

Opaque continuation token to fetch the next page, when more results are available.

Example: "Example nextToken"
Response
application/json
{ "items": [ {} ], "nextToken": "DDB_NEXT_TOKEN" }

Get a pending reporting appointment

Request

Returns the tele reporting appointment view for the specified appointment when it is in the PENDING REPORTING status.

Returns 404 when the appointment is not found or is not in the PENDING REPORTING status.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
appointmentIdstringrequired

Appointment identifier within the specified domain.

Example: A123456
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
curl -i -X GET \
  https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/A123456 \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a'

Responses

Pending reporting appointment view for the requested appointment id.

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/json
domainstringrequired

Domain this appointment belongs to.

Example: "Example domain"
appointmentIdstringrequired

Appointment identifier.

Example: "123"
statusstringrequired

Appointment status.

Enum"NOT ARRIVED""ARRIVED""DID NOT ATTEND""APPPOINTMENT CANCELLED""CANCELLATION LIST""DICTATION INPROGRESS""DICTATED""TYPED""AUTHORISING""AUTHORISED"
Example: "NOT ARRIVED"
scheduledSitestringrequired

Scheduled site name.

Example: "Example scheduledSite"
appointmentDatenull or string(date)

Appointment date (ISO 8601, yyyy-MM-dd) in the scheduled site's local timezone.

Example: "2020-01-01"
startTimenull or string^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$

Scheduled start time (ISO 8601, HH:mm:ss) in the scheduled site's local timezone.

Example: "13:45:00"
endTimenull or string^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$

Scheduled end time (ISO 8601, HH:mm:ss) in the scheduled site's local timezone.

Example: "13:45:00"
patientIdstring

Patient identifier when available.

Example: "123"
patientNamestring

Patient display name.

Example: "Example Name"
firstNamestring

Patient first name.

Example: "Example Name"
lastNamestring

Patient last name.

Example: "Example Name"
dateOfBirthnull or string(date)

Patient date of birth (ISO 8601, yyyy-MM-dd).

Example: "2020-01-01"
genderstring

Patient gender/sex string as stored in QUBS.

Example: "Example gender"
modalitystring

Exam modality string as stored in QUBS.

Example: "Example modality"
studyDescriptionstring

Study description as stored in QUBS.

Example: "Example description"
clinicalInfostring

Clinical information text as stored in QUBS.

Example: "Example clinicalInfo"
doctorNamestring

Referring doctor display name.

Example: "Example Name"
clinicNamestring

Referring clinic name when available.

Example: "Example Name"
prioritystring

Appointment/reporting priority string as stored in QUBS.

Example: "Example priority"
reportNeededBynull or string(date-time)

Optional deadline timestamp for reporting (UTC, ISO 8601) when available.

Example: "2020-01-01T00:00:00Z"
studyInstanceUidstring

PACS study instance UID when available.

Example: "123"
radiologistUserobject(UserSummaryResponse)

Radiologist user assigned to the appointment when available.

serviceItemsArray of objects(PendingReportingServiceItemResponse)

Service items attached to the appointment.

Response
application/json
{ "domain": "acme", "appointmentId": "A123456", "status": "PENDING REPORTING", "scheduledSite": "Central Clinic", "appointmentDate": "2025-01-12", "startTime": "13:45:00", "endTime": "14:15:00", "patientId": "220000", "patientName": "Jane Doe", "firstName": "Jane", "lastName": "Doe", "dateOfBirth": "1988-03-03", "gender": "F", "modality": "CT", "studyDescription": "CT Chest", "clinicalInfo": "Shortness of breath", "doctorName": "Dr Smith", "clinicName": "Example Clinic", "priority": "Routine", "reportNeededBy": "2025-01-13T02:00:00Z", "studyInstanceUid": "1.2.3.4.5", "radiologistUser": { "username": "rsmith", "firstName": "Rory", "initials": "RS", "lastName": "Smith", "role": "Radiologist" }, "serviceItems": [ {} ] }

List attachments for a pending reporting appointment

Request

Returns appointment attachments (e.g. referrals, worksheets) for the specified appointment when it is in the PENDING REPORTING status.

Returns 404 when the appointment is not found or is not in the PENDING REPORTING status.

Response body is a JSON array. Fields below apply to each array item.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
appointmentIdstringrequired

Appointment identifier within the specified domain.

Example: A123456
Query
urlTtlSecondsinteger(int32)[ 60 .. 3600 ]

Optional presigned URL lifetime (in seconds). Defaults to 900 when omitted. Values outside 60-3600 are clamped.

Default 900
Example: urlTtlSeconds=900
dispositionstring

Optional content disposition for the presigned URL (inline for display, attachment for download). Defaults to inline.

Enum"inline""attachment"
Example: disposition=inline
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
curl -i -X GET \
  'https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/A123456/attachments?urlTtlSeconds=900&disposition=inline' \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a'

Responses

Array of attachments for the requested pending reporting appointment.

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/jsonArray [
guidstringrequired

Attachment GUID.

Example: "123"
categorystring

Attachment category (e.g. Referral, Worksheet).

Example: "Example category"
fileNamestring

Suggested filename for display/download.

Example: "Example Name"
addedDateTimenull or string(date-time)

When the attachment was added (UTC).

Example: "2020-01-01T00:00:00Z"
addedByobject(UserSummaryResponse)

Who added the attachment when available.

lastModifiedDateTimenull or string(date-time)

When the attachment was last modified (UTC).

Example: "2020-01-01T00:00:00Z"
urlnull or string

Short-lived presigned URL for retrieving the attachment content when available.

Example: "https://example.com"
urlExpiresAtUtcnull or string(date-time)

UTC expiry timestamp for the presigned URL when available.

Example: "2020-01-01T00:00:00Z"
]
Response
application/json
[ { "guid": "989dd0c7-13bb-4bba-b7a0-53a28bdf5155", "category": "Referral", "fileName": "referral.pdf", "addedDateTime": "2025-01-10T01:02:03Z", "addedBy": {}, "lastModifiedDateTime": "2025-01-10T01:02:03Z", "url": "https://example.com/attachments/referral.pdf", "urlExpiresAtUtc": "2025-01-10T01:17:03Z" } ]

Get a single attachment for a pending reporting appointment

Request

Returns a single appointment attachment for the specified appointment when it is in the PENDING REPORTING status.

Returns 404 when the appointment is not found or is not in the PENDING REPORTING status.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
appointmentIdstringrequired

Appointment identifier within the specified domain.

Example: A123456
attachmentGuidstringrequired

Attachment GUID for the requested appointment.

Example: 989dd0c7-13bb-4bba-b7a0-53a28bdf5155
Query
urlTtlSecondsinteger(int32)[ 60 .. 3600 ]

Optional presigned URL lifetime (in seconds). Defaults to 900 when omitted. Values outside 60-3600 are clamped.

Default 900
Example: urlTtlSeconds=900
dispositionstring

Optional content disposition for the presigned URL (inline for display, attachment for download). Defaults to inline.

Enum"inline""attachment"
Example: disposition=inline
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
curl -i -X GET \
  'https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/A123456/attachments/989dd0c7-13bb-4bba-b7a0-53a28bdf5155?urlTtlSeconds=900&disposition=inline' \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a'

Responses

Attachment metadata for the requested pending reporting appointment attachment.

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/json
guidstringrequired

Attachment GUID.

Example: "123"
categorystring

Attachment category (e.g. Referral, Worksheet).

Example: "Example category"
fileNamestring

Suggested filename for display/download.

Example: "Example Name"
addedDateTimenull or string(date-time)

When the attachment was added (UTC).

Example: "2020-01-01T00:00:00Z"
addedByobject(UserSummaryResponse)

Who added the attachment when available.

lastModifiedDateTimenull or string(date-time)

When the attachment was last modified (UTC).

Example: "2020-01-01T00:00:00Z"
urlnull or string

Short-lived presigned URL for retrieving the attachment content when available.

Example: "https://example.com"
urlExpiresAtUtcnull or string(date-time)

UTC expiry timestamp for the presigned URL when available.

Example: "2020-01-01T00:00:00Z"
Response
application/json
{ "guid": "989dd0c7-13bb-4bba-b7a0-53a28bdf5155", "category": "Referral", "fileName": "referral.pdf", "addedDateTime": "2025-01-10T01:02:03Z", "addedBy": { "username": "jchen", "firstName": "Jesse", "initials": "JC", "lastName": "Chen", "role": "Scheduler" }, "lastModifiedDateTime": "2025-01-10T01:02:03Z", "url": "https://example.com/attachments/referral.pdf", "urlExpiresAtUtc": "2025-01-10T01:17:03Z" }

List comments for a pending reporting appointment

Request

Returns appointment comments/alerts plus patient comments/alerts for the specified appointment when it is in the PENDING REPORTING status.

Returns 404 when the appointment is not found or is not in the PENDING REPORTING status.

Response body is a JSON array. Fields below apply to each array item.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
appointmentIdstringrequired

Appointment identifier within the specified domain.

Example: A123456
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
curl -i -X GET \
  https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/A123456/comments \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a'

Responses

Array of appointment and patient comments/alerts for the requested pending reporting appointment.

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/jsonArray [
guidstringrequired

Comment GUID.

Example: "123"
commentTypestringrequired

Comment type. One of: AC (Appointment Comment), AA (Appointment Alert), PC (Patient Comment), PA (Patient Alert).

Enum"AC""AA""PC""PA"
Example: "AC"
appointmentIdstring

Appointment identifier for appointment comments; empty for patient-level comments.

Example: "123"
patientIdstring

Patient identifier associated with the comment when available.

Example: "123"
commentTextstring

Comment text.

Example: "Example commentText"
commentDateTimenull or string(date-time)

When the comment was created (UTC) when available.

Example: "2020-01-01T00:00:00Z"
isAlertboolean

Whether this comment should be treated as an alert.

Example: true
commentByobject(UserSummaryResponse)

Who created the comment when available.

lastModifiedDateTimenull or string(date-time)

When the comment was last modified (UTC).

Example: "2020-01-01T00:00:00Z"
]
Response
application/json
[ { "guid": "ed6ef45a-4e3d-41b2-8049-7aec53bb9ab1", "commentType": "AC", "appointmentId": "A123456", "patientId": "220000", "commentText": "Patient requires wheelchair access.", "commentDateTime": "2025-01-10T02:03:04Z", "isAlert": false, "commentBy": {}, "lastModifiedDateTime": "2025-01-10T02:03:04Z" } ]

Create a comment for a pending reporting appointment

Request

Creates an appointment comment/alert for a pending reporting appointment.

Idempotency: supports the Idempotency-Key header. Reuse the same key with the same payload to receive the original response; reuse with a different payload returns 409 Conflict. Keys are retained for 24 hours. Without the header, retries can create duplicate comments.

Returns 404 when the appointment is not found or is not in the PENDING REPORTING status.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
appointmentIdstringrequired

Appointment identifier within the specified domain.

Example: A123456
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
Idempotency-Keystring

Idempotency key for safely retrying POST requests. Use a stable ASCII token (recommend a UUID) up to 128 characters. Reuse the same key with the same request payload to receive the original response; reuse with a different payload returns 409 Conflict. For timeouts or transient errors, retry with the same key and exponential backoff.

Example: cd4a859c7a1f4b44b765a8fe17bb44c1
Bodyapplication/jsonrequired
commentTextstringnon-emptyrequired

Comment text. Required; blank values are rejected.

Example: "Example commentText"
commentTypenull or string

Optional comment type. One of: AC (Appointment Comment), AA (Appointment Alert), PC (Patient Comment), PA (Patient Alert). Defaults to AA when isAlert is true, otherwise AC.

Enum"AC""AA""PC""PA"
Example: "AC"
isAlertnull or boolean

Whether this comment should be treated as an alert.

Example: true
commentDateTimenull or string(date-time)

When the comment was created (UTC) when available.

Example: "2020-01-01T00:00:00Z"
curl -i -X POST \
  https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/A123456/comments \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cd4a859c7a1f4b44b765a8fe17bb44c1' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a' \
  -d '{
    "commentText": "Please prioritize this study.",
    "commentType": "AA",
    "isAlert": true,
    "commentDateTime": "2025-01-10T02:03:04Z"
  }'

Responses

Created

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/json
guidstringrequired

Comment GUID.

Example: "123"
commentTypestringrequired

Comment type. One of: AC (Appointment Comment), AA (Appointment Alert), PC (Patient Comment), PA (Patient Alert).

Enum"AC""AA""PC""PA"
Example: "AC"
appointmentIdstring

Appointment identifier for appointment comments; empty for patient-level comments.

Example: "123"
patientIdstring

Patient identifier associated with the comment when available.

Example: "123"
commentTextstring

Comment text.

Example: "Example commentText"
commentDateTimenull or string(date-time)

When the comment was created (UTC) when available.

Example: "2020-01-01T00:00:00Z"
isAlertboolean

Whether this comment should be treated as an alert.

Example: true
commentByobject(UserSummaryResponse)

Who created the comment when available.

lastModifiedDateTimenull or string(date-time)

When the comment was last modified (UTC).

Example: "2020-01-01T00:00:00Z"
Response
application/json
{ "guid": "ed6ef45a-4e3d-41b2-8049-7aec53bb9ab1", "commentType": "AA", "appointmentId": "A123456", "patientId": "220000", "commentText": "Please prioritize this study.", "commentDateTime": "2025-01-10T02:03:04Z", "isAlert": true, "commentBy": { "username": "mbrown", "firstName": "Maya", "initials": "MB", "lastName": "Brown", "role": "Reception" }, "lastModifiedDateTime": "2025-01-10T02:03:04Z" }

Get a single comment for a pending reporting appointment

Request

Returns a single appointment comment/alert or patient comment/alert (for the appointment's patient) when the appointment is in the PENDING REPORTING status.

Returns 404 when the appointment is not found or is not in the PENDING REPORTING status.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
appointmentIdstringrequired

Appointment identifier within the specified domain.

Example: A123456
commentGuidstringrequired

Comment GUID for the requested appointment/patient comment.

Example: ed6ef45a-4e3d-41b2-8049-7aec53bb9ab1
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
curl -i -X GET \
  https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/A123456/comments/ed6ef45a-4e3d-41b2-8049-7aec53bb9ab1 \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a'

Responses

Comment metadata for the requested pending reporting appointment comment (appointment or patient).

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/json
guidstringrequired

Comment GUID.

Example: "123"
commentTypestringrequired

Comment type. One of: AC (Appointment Comment), AA (Appointment Alert), PC (Patient Comment), PA (Patient Alert).

Enum"AC""AA""PC""PA"
Example: "AC"
appointmentIdstring

Appointment identifier for appointment comments; empty for patient-level comments.

Example: "123"
patientIdstring

Patient identifier associated with the comment when available.

Example: "123"
commentTextstring

Comment text.

Example: "Example commentText"
commentDateTimenull or string(date-time)

When the comment was created (UTC) when available.

Example: "2020-01-01T00:00:00Z"
isAlertboolean

Whether this comment should be treated as an alert.

Example: true
commentByobject(UserSummaryResponse)

Who created the comment when available.

lastModifiedDateTimenull or string(date-time)

When the comment was last modified (UTC).

Example: "2020-01-01T00:00:00Z"
Response
application/json
{ "guid": "ed6ef45a-4e3d-41b2-8049-7aec53bb9ab1", "commentType": "AA", "appointmentId": "A123456", "patientId": "220000", "commentText": "Please prioritize this study.", "commentDateTime": "2025-01-10T02:03:04Z", "isAlert": true, "commentBy": { "username": "mbrown", "firstName": "Maya", "initials": "MB", "lastName": "Brown", "role": "Reception" }, "lastModifiedDateTime": "2025-01-10T02:03:04Z" }

Submit a report for a pending reporting appointment

Request

Submits preliminary/final report content and interpreting clinician details for a pending reporting appointment.

Report submissions overwrite any existing report for the appointment. You can submit a preliminary report and later submit a final report; resubmissions update the report content. Idempotency: supports the Idempotency-Key header. Reuse the same key with the same payload to receive the original response; reuse with a different payload returns 409 Conflict. Keys are retained for 24 hours. Without the header, retries can create duplicate reports.

Returns 404 when the appointment is not found or is not in the PENDING REPORTING status.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
appointmentIdstringrequired

Appointment identifier within the specified domain.

Example: A123456
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
Idempotency-Keystring

Idempotency key for safely retrying POST requests. Use a stable ASCII token (recommend a UUID) up to 128 characters. Reuse the same key with the same request payload to receive the original response; reuse with a different payload returns 409 Conflict. For timeouts or transient errors, retry with the same key and exponential backoff.

Example: cd4a859c7a1f4b44b765a8fe17bb44c1
Bodyapplication/jsonrequired
reportTextstring[ 1 .. 2097152 ] charactersrequired

Report content text. Required. Stored as-is. ReportText must be 2097152 bytes or less when UTF-8 encoded.

Example: "Example reportText"
reportStatusstringnon-emptyrequired

Report status. One of: preliminary, final. Case-insensitive.

Enum"preliminary""final"
Example: "preliminary"
reportFormatnull or string

Optional report format or MIME type for the report content. Defaults to text/plain when omitted.

Default "text/plain"
Example: "text/plain"
interpretingClinicianNamenull or string

Interpreting clinician display name.

Example: "Example Name"
interpretingClinicianProviderNumbernull or string

Interpreting clinician provider number.

Example: "Example interpretingClinicianProviderNumber"
interpretingClinicianEmailnull or string

Interpreting clinician email address.

Example: "user@example.com"
reportedAtUtcnull or string(date-time)

UTC timestamp for when the report was created or submitted.

Example: "2020-01-01T00:00:00Z"
curl -i -X POST \
  https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/A123456/report \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cd4a859c7a1f4b44b765a8fe17bb44c1' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a' \
  -d '{
    "reportText": "No acute abnormality detected.",
    "reportStatus": "preliminary",
    "reportFormat": "text/plain",
    "interpretingClinicianName": "Dr Smith",
    "interpretingClinicianProviderNumber": "1234567A",
    "interpretingClinicianEmail": "dr.smith@example.com",
    "reportedAtUtc": "2025-01-10T03:04:05Z"
  }'

Responses

Created

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/json
reportGuidstringrequired

Report GUID.

Example: "123"
reportStatusstring

Report status as stored.

Enum"preliminary""final"
Example: "preliminary"
reportedAtUtcnull or string(date-time)

UTC timestamp for when the report was created or submitted.

Example: "2020-01-01T00:00:00Z"
Response
application/json
{ "reportGuid": "4b7f0a91-b4f5-4f2a-9a21-23456789abcd", "reportStatus": "preliminary", "reportedAtUtc": "2025-01-10T03:04:05Z" }

Create upload URLs for pending reporting report attachments

Request

Creates attachment metadata and returns presigned upload URLs for report artifacts (PDF/DICOM SR) for a pending reporting appointment. Upload the raw file bytes with an HTTP PUT to uploadUrl; if contentType was provided, include the same Content-Type header in the upload. Constraints: max 20 items per request, fileName length <= 255 characters, and contentType must be application/pdf or application/dicom when provided. Uploads use a single PUT (max object size 2 MB) and must complete before uploadUrlExpiresAtUtc (metadata is created immediately but content is available only after the PUT succeeds).

Idempotency: supports the Idempotency-Key header. Reuse the same key with the same payload to receive the original response; reuse with a different payload returns 409 Conflict. Keys are retained for 15 minutes (matches upload URL TTL). Without the header, retries can create duplicate attachment metadata and upload URLs.

Upload guidance: send a single PUT to the uploadUrl with Content-Length; if contentType was provided, include the same Content-Type header. Upload URLs are intended for a single successful PUT; request a new URL if an upload fails or expires. Storage locations are managed by QUBS and are not supplied by clients.

Returns 404 when the appointment is not found or is not in the PENDING REPORTING status.

Security
Bearer
Path
domainstringrequired

Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.

Example: acme
appointmentIdstringrequired

Appointment identifier within the specified domain.

Example: A123456
Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: 4b7f0a91b4f54f2a
Idempotency-Keystring

Idempotency key for safely retrying POST requests. Use a stable ASCII token (recommend a UUID) up to 128 characters. Reuse the same key with the same request payload to receive the original response; reuse with a different payload returns 409 Conflict. For timeouts or transient errors, retry with the same key and exponential backoff.

Example: cd4a859c7a1f4b44b765a8fe17bb44c1
Bodyapplication/jsonrequired
itemsArray of objects(PendingReportingReportAttachmentUploadRequest)[ 1 .. 20 ] itemsrequired

Attachment upload request items. Each item creates a new attachment GUID and presigned upload URL. Up to 20 items per request. File names max 255 characters.

items[].​fileNamestring[ 1 .. 255 ] charactersrequired

File name for the report attachment. Path segments are stripped; if empty, a fallback name is generated. Max 255 characters.

Example: "Example Name"
items[].​contentTypenull or string

Optional content type for upload; when provided it must be application/pdf or application/dicom, and the PUT upload must include the same Content-Type header. Supported report artifact content types: application/pdf, application/dicom (DICOM SR).

Enum"application/pdf""application/dicom"
Example: "application/pdf"
items[].​categorynull or string

Optional attachment category. Defaults to report when omitted.

Default "report"
Example: "report"
curl -i -X POST \
  https://partnerdocs.qubs.io/_mock/openapi/integrations/v1/acme/reporting/appointments/A123456/report/attachments \
  -H 'Authorization: Bearer <YOUR_JWT_HERE>' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cd4a859c7a1f4b44b765a8fe17bb44c1' \
  -H 'X-Correlation-Id: 4b7f0a91b4f54f2a' \
  -d '{
    "items": [
      {
        "fileName": "report.pdf",
        "contentType": "application/pdf",
        "category": "report"
      }
    ]
  }'

Responses

Created

Headers
X-Correlation-Idstring

Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.

Example: "4b7f0a91b4f54f2a"
Bodyapplication/json
itemsArray of objects(PendingReportingReportAttachmentUploadResponse)[ 1 .. 20 ] itemsrequired

Attachment upload response items.

items[].​guidstringrequired

Attachment GUID.

Example: "123"
items[].​fileNamestring

File name for the report attachment.

Example: "Example Name"
items[].​categorystring

Attachment category.

Example: "Example category"
items[].​uploadUrlstring

Presigned URL to upload the attachment with an HTTP PUT request. Uploads use a single PUT request (max object size 2 MB). Include Content-Length with the byte size; if contentType is provided, send the same Content-Type header. Upload URLs are intended for a single successful PUT; request a new URL if an upload fails or expires.

Example: "https://example.com"
items[].​uploadUrlExpiresAtUtcstring(date-time)

UTC expiry timestamp for the presigned upload URL; the upload must complete before this time.

Example: "2020-01-01T00:00:00Z"
Response
application/json
{ "items": [ {} ] }