Base URL: http://localhost:8080 (or configured HTTP port)
Base URL (SSL): https://localhost:8443
Interactive API documentation: GET /openapi.json
Authentication
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
X-API-Key: your-api-key-here
DICOMweb — QIDO-RS
Search for studies
GET /wado/studies
Query parameters:
| Parameter | Description |
|---|---|
PatientName |
Patient name (wildcards supported) |
PatientID |
Patient identifier |
StudyDate |
Date or range (YYYYMMDD-YYYYMMDD) |
StudyInstanceUID |
Study instance UID |
ModalitiesInStudy |
Comma-separated modalities |
AccessionNumber |
Accession number |
limit |
Max results (default 100) |
offset |
Pagination offset |
curl "http://localhost:8080/wado/studies?PatientName=DOE*&StudyDate=20240101-20241231&limit=50"
Search for series
GET /wado/studies/{studyInstanceUID}/series
Search for instances
GET /wado/studies/{studyInstanceUID}/series/{seriesInstanceUID}/instances
DICOMweb — WADO-RS
Retrieve study / series / instance
GET /wado/studies/{studyInstanceUID}
GET /wado/studies/{studyInstanceUID}/series/{seriesInstanceUID}
GET /wado/studies/{studyInstanceUID}/series/{seriesInstanceUID}/instances/{sopInstanceUID}
Accept headers: application/dicom, multipart/related; type="application/dicom", application/json
Retrieve metadata
GET /wado/studies/{studyInstanceUID}/metadata
GET /wado/studies/{studyInstanceUID}/series/{seriesInstanceUID}/metadata
GET /wado/studies/{studyInstanceUID}/series/{seriesInstanceUID}/instances/{sopInstanceUID}/metadata
Retrieve rendered image
GET /wado/studies/{studyUID}/series/{seriesUID}/instances/{instanceUID}/rendered
Query parameters: viewport (e.g. 512,512), window (center,width), quality (1–100)
Accept headers: image/jpeg, image/png, image/gif
DICOMweb — STOW-RS
Store study
POST /wado/studies
Content-Type: multipart/related; type="application/dicom"
curl -X POST \
-H "Content-Type: multipart/related; type=\"application/dicom\"" \
--data-binary @study.dcm \
http://localhost:8080/wado/studies
Proxy APIs
C-ECHO — test connectivity
POST /proxy/echo/{serverid}
{ "success": true, "server_id": "pacs1", "response_time_ms": 45 }
C-STORE — store to specific PACS
POST /proxy/cstore/{serverid}
Content-Type: application/dicom
Proxy QIDO-RS / WADO-RS
GET /proxy/wado/{serverid}/rs/studies
GET /proxy/wado/{serverid}/rs/studies/{studyUID}/series
GET /proxy/wado/{serverid}/rs/studies/{studyUID}/series/{seriesUID}/instances
GET /proxy/wado/{serverid}/rs/studies/{studyUID}
Administrative APIs
System status
GET /api/status
{
"service_name": "DICOM Proxy",
"version": "1.09.1",
"uptime_seconds": 3600,
"studies_count": 1542,
"storage_used_gb": 156.7,
"license_status": "Valid"
}
Connection status
GET /api/connections
Configuration
GET /api/config
PUT /api/config
Server management
GET /api/servers
POST /api/servers
PUT /api/servers/{serverid}
DELETE /api/servers/{serverid}
Database operations
GET /api/database/studies
GET /api/database/series/{studyInstanceUID}
DELETE /api/database/studies/{studyInstanceUID}
POST /api/database/cleanup
POST /api/database/reindex
Metrics
GET /api/metrics
Returns CPU, memory, disk I/O, network stats, and per-DICOM-service request rates.
TUS resumable upload
POST /files/
PATCH /files/{upload-id}
HEAD /files/{upload-id}
Error format
{
"error": {
"code": "INVALID_DICOM_DATA",
"message": "The DICOM file contains invalid data",
"details": "Missing required tag: PatientID (0010,0020)",
"timestamp": "2024-03-15T14:30:00Z",
"request_id": "req-123456"
}
}
Common error codes
| Code | Description |
|---|---|
INVALID_PARAMETERS |
Request parameters are invalid |
INVALID_DICOM_DATA |
DICOM data is invalid or corrupted |
STORAGE_FULL |
Storage quota exceeded |
SERVER_UNREACHABLE |
Configured PACS server unreachable |
LICENSE_EXPIRED |
Software licence has expired |
RATE_LIMIT_EXCEEDED |
Too many requests |
Rate limiting
- Default: 1 000 requests/hour per IP
- Authenticated: 5 000 requests/hour
- Response headers:
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset
Pagination
?limit=100&offset=0
Response headers: X-Total-Count, Link (next/prev/first/last)
Quick client examples
JavaScript/Node.js
const axios = require('axios');
async function searchStudies(params = {}) {
const res = await axios.get('http://localhost:8080/wado/studies', { params });
return res.data;
}
async function storeStudy(dicomBuffer) {
const res = await axios.post('http://localhost:8080/wado/studies', dicomBuffer, {
headers: { 'Content-Type': 'application/dicom' }
});
return res.data;
}
Python
import requests
def search_studies(**params):
return requests.get('http://localhost:8080/wado/studies', params=params).json()
def store_study(dicom_bytes):
return requests.post(
'http://localhost:8080/wado/studies',
data=dicom_bytes,
headers={'Content-Type': 'application/dicom'}
).json()