Partner-facing endpoints for listing sites and retrieving site configuration within a domain.
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.
- Request an access token using the OAuth 2.0 client credentials flow.
- Send it in the
Authorizationheader asBearer <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.
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"}'- 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"
}- (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"
}
]
}- 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"- 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"
}- (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}'Request
Returns the tele reporting appointment view for appointments in the PENDING REPORTING status. Supports cursor-based pagination via pageSize and nextToken.
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/pending
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/pending
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/pending
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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'Page of appointments that are pending reporting for the requested domain.
Tele reporting appointments in the current page.
Appointment status.
Appointment date (ISO 8601, yyyy-MM-dd) in the scheduled site's local timezone.
Scheduled start time (ISO 8601, HH:mm:ss) in the scheduled site's local timezone.
Scheduled end time (ISO 8601, HH:mm:ss) in the scheduled site's local timezone.
Patient date of birth (ISO 8601, yyyy-MM-dd).
Clinical information text as stored in QUBS.
Appointment/reporting priority string as stored in QUBS.
Optional deadline timestamp for reporting (UTC, ISO 8601) when available.
Radiologist user assigned to the appointment when available.
{ "items": [ { … } ], "nextToken": "DDB_NEXT_TOKEN" }
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.
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/{appointmentId}
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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'Pending reporting appointment view for the requested appointment id.
Appointment status.
Appointment date (ISO 8601, yyyy-MM-dd) in the scheduled site's local timezone.
Scheduled start time (ISO 8601, HH:mm:ss) in the scheduled site's local timezone.
Scheduled end time (ISO 8601, HH:mm:ss) in the scheduled site's local timezone.
Optional deadline timestamp for reporting (UTC, ISO 8601) when available.
Radiologist user assigned to the appointment when available.
{ "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": [ { … } ] }
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.
Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/{appointmentId}/attachments
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/attachments
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/attachments
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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'Array of attachments for the requested pending reporting appointment.
When the attachment was added (UTC).
When the attachment was last modified (UTC).
Short-lived presigned URL for retrieving the attachment content when available.
UTC expiry timestamp for the presigned URL when available.
[ { "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" } ]
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.
Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/{appointmentId}/attachments/{attachmentGuid}
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/attachments/{attachmentGuid}
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/attachments/{attachmentGuid}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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'Attachment metadata for the requested pending reporting appointment attachment.
When the attachment was added (UTC).
When the attachment was last modified (UTC).
Short-lived presigned URL for retrieving the attachment content when available.
{ "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" }
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.
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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'Array of appointment and patient comments/alerts for the requested pending reporting appointment.
Comment type. One of: AC (Appointment Comment), AA (Appointment Alert), PC (Patient Comment), PA (Patient Alert).
Appointment identifier for appointment comments; empty for patient-level comments.
When the comment was created (UTC) when available.
When the comment was last modified (UTC).
[ { "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" } ]
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.
Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.
Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.
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.
Comment text. Required; blank values are rejected.
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.
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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"
}'Created
Comment type. One of: AC (Appointment Comment), AA (Appointment Alert), PC (Patient Comment), PA (Patient Alert).
Appointment identifier for appointment comments; empty for patient-level comments.
When the comment was created (UTC) when available.
{ "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" }
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.
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments/{commentGuid}
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments/{commentGuid}
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/comments/{commentGuid}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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'Comment metadata for the requested pending reporting appointment comment (appointment or patient).
Comment type. One of: AC (Appointment Comment), AA (Appointment Alert), PC (Patient Comment), PA (Patient Alert).
Appointment identifier for appointment comments; empty for patient-level comments.
When the comment was created (UTC) when available.
{ "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" }
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.
Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.
Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.
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.
Report content text. Required. Stored as-is. ReportText must be 2097152 bytes or less when UTF-8 encoded.
Report status. One of: preliminary, final. Case-insensitive.
Optional report format or MIME type for the report content. Defaults to text/plain when omitted.
Interpreting clinician provider number.
Interpreting clinician email address.
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/{appointmentId}/report
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/report
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/report
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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"
}'{ "reportGuid": "4b7f0a91-b4f5-4f2a-9a21-23456789abcd", "reportStatus": "preliminary", "reportedAtUtc": "2025-01-10T03:04:05Z" }
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.
Partner domain identifier. Your bearer token is scoped to one or more domains and requests outside that scope are rejected.
Request correlation identifier. Echoes the incoming X-Correlation-Id header when provided.
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.
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.
File name for the report attachment. Path segments are stripped; if empty, a fallback name is generated. Max 255 characters.
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).
- Mock serverhttps://partnerdocs.qubs.io/_mock/openapi/integrations/v1/{domain}/reporting/appointments/{appointmentId}/report/attachments
- Production APIhttps://partners.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/report/attachments
- Relative to the current hosthttps://partnerdocs.qubs.io/integrations/v1/{domain}/reporting/appointments/{appointmentId}/report/attachments
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
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"
}
]
}'Created
Attachment upload response items.
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.
{ "items": [ { … } ] }
Comments
Partner-facing endpoints for retrieving appointment and patient comments/alerts associated with an appointment.