Skip to main content

Capability Statement

The CapabilityStatement describes what the Ignixa FHIR server can do. Access it at:

GET /metadata

Server Information​

{
"resourceType": "CapabilityStatement",
"status": "active",
"kind": "instance",
"fhirVersion": "4.0.1",
"format": ["json"],
"software": {
"name": "Ignixa FHIR Server",
"version": "1.0.0"
}
}

Supported Interactions​

Instance Level​

InteractionSupportNotes
read✅Retrieve by ID
vread✅Retrieve specific version
update✅Full resource replacement
patch✅FHIRPath Patch, JSON Patch
delete✅Soft delete
history-instance✅Version history

Type Level​

InteractionSupportNotes
create✅Server-assigned ID
search-type✅Search with parameters
history-type✅Type history

System Level​

InteractionSupportNotes
transaction✅ACID bundles
batch✅Independent operations
history-system✅Full history
search-system✅Cross-resource search

REST Capabilities​

{
"rest": [{
"mode": "server",
"security": {
"cors": true,
"service": [{
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/restful-security-service",
"code": "SMART-on-FHIR"
}]
}]
},
"resource": [
// Per-resource capabilities
]
}]
}

Package-Defined Resource Types​

Concrete custom StructureDefinition specializations can contribute resource types without a server restart. Their snapshot root supplies the simple type name, while rest.resource.profile retains the actual package canonical. For the embedded ViewDefinition model this is https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition, not a core FHIR URL.

Profiles and abstract definitions do not create resource-type aliases. A package ID cannot replace a core type, and conflicting canonicals declaring the same custom type name do not receive an ambiguous alias. Capability enforcement remains active for all requests. Admitted custom types inherit universal Resource search parameters even when their package does not define any additional SearchParameters.

A successful package load or unload refreshes the affected tenant's schema and capability caches before returning, including when /metadata was already requested. Unsupported resource types remain rejected with HTTP 404 and a FHIR OperationOutcome, not an empty JSON object.

Operations​

OperationLevelDescription
$validateType, InstanceValidate resource against specs/profiles
$everythingInstanceRetrieve all patient data
$member-matchTypeMatch patients across payer systems
$exportSystem, GroupAsync bulk data export
$importSystemAsync bulk data import
$summaryInstanceGenerate International Patient Summary
$expandType, InstanceExpand ValueSet to codes
$translateTypeTranslate codes via ConceptMap
$subsumesTypeTest code subsumption
$transformType, InstanceTransform data via StructureMap

See Operations for detailed usage and examples.

Versioning​

Ignixa supports resource versioning:

  • versionId auto-increments on each update
  • lastUpdated timestamp on every modification
  • Full version history accessible via /_history

Version identifiers in vread URLs are opaque FHIR id values: 1-64 ASCII letters, digits, hyphens or periods. SQL Server generates canonical positive integer versions, but a legal unavailable identifier (including a UUID) returns HTTP 404, not a malformed-input error. Alternate spellings such as 01 do not alias stored version 1. Invalid FHIR ID syntax returns HTTP 400.

A successful PUT-as-create, including conditional PUT creation, returns a version-specific Location ending in /{resourceType}/{id}/_history/{versionId}. This URL continues to identify that created version after later updates.

Version-Aware Updates​

Use If-Match header for optimistic concurrency:

PUT /Patient/123
If-Match: W/"5"
Content-Type: application/fhir+json

{ ... }

Conditional Operations​

Conditional Create​

POST /Patient
If-None-Exist: identifier=12345

{ ... }

Conditional Update​

PUT /Patient?identifier=12345

{ ... }

Conditional Delete​

DELETE /Patient?identifier=12345

No matches is a successful no-op, not a search-not-found error. In default single mode, zero or one match returns HTTP 204 without a body; ambiguous multiple matches return HTTP 412, consistent with conditionalDelete: single.

Ignixa's optional _count deletion-limit extension returns HTTP 200 with an informational OperationOutcome, including when zero resources match. This partial-deletion limit is not an R4 requirement. Microsoft-specific hardDelete and _includesCount cascade semantics are not implemented by this contract.

Formats​

FormatMIME TypeSupport
JSONapplication/fhir+json✅ Primary
NDJSONapplication/fhir+ndjson✅ Bulk operations

:::note JSON Only Ignixa supports JSON format only. XML is not supported. :::

HTTP Headers​

Request Headers​

Prefer (RFC 7240)​

Controls response behavior and validation level:

# Return full resource in response
Prefer: return=representation

# Return minimal response (headers only)
Prefer: return=minimal

# Return OperationOutcome
Prefer: return=OperationOutcome

# Control validation level (used with $validate operations)
Prefer: mode=minimal # Structure only (fastest)
Prefer: mode=spec # FHIR specification compliance (default)
Prefer: mode=full # Full profile validation with terminology

# Combine preferences
Prefer: return=representation, mode=spec
PreferenceValuesDescription
returnrepresentation, minimal, OperationOutcomeResponse body content
modeminimal, spec, fullValidation depth (for $validate operations)

X-Provenance​

Submit provenance alongside create/update operations:

POST /Patient
Content-Type: application/fhir+json
X-Provenance: {"resourceType":"Provenance","recorded":"2024-01-15T10:30:00Z","agent":[{"who":{"reference":"Practitioner/123"}}]}

{ "resourceType": "Patient", ... }

The X-Provenance header:

  • MUST contain a valid Provenance resource
  • MUST NOT include target (server auto-fills with created resource)
  • Maximum size: 16KB

Conditional Headers​

HeaderPurposeExample
If-MatchOptimistic concurrencyIf-Match: W/"5"
If-None-MatchConditional read (304)If-None-Match: W/"3"
If-Modified-SinceDate-based conditionalIf-Modified-Since: Wed, 17 Oct 2025 14:30:00 GMT
If-None-ExistConditional createIf-None-Exist: identifier=12345

Content Negotiation​

HeaderSupported Values
Acceptapplication/fhir+json, application/json, */*
Content-Typeapplication/fhir+json, application/json

Response Headers​

HeaderDescriptionExample
ETagWeak ETag for versioningW/"5"
Last-ModifiedResource modification timeWed, 17 Oct 2025 14:30:00 GMT
LocationCreated/updated resource URL/Patient/123/_history/1
Preference-AppliedPreferences honoredreturn=representation, validation=spec

Query Parameters​

_pretty​

Pretty-print JSON output for debugging:

GET /Patient/123?_pretty=true

# Presence implies true
GET /Patient/123?_pretty

_format​

Specify response format (JSON only supported):

GET /Patient/123?_format=json
GET /Patient/123?_format=application/fhir+json