API for the Exchange of Medicinal Product Information (APIX)
0.1.0 - ci-build
API for the Exchange of Medicinal Product Information (APIX), published by HL7 International / Biomedical Research and Regulation. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/APIX---API-Exchange-for-Medicinal-Products/ and changes regularly. See the Directory of published versions
| Page standards status: Informative |
APIX defines a modern, eventādriven interaction model for regulatory communication. The following illustrates key details of the Regulator-Applicant Exchange
At its core, the APIX pattern is a structured conversation between an Applicant and a Regulator, expressed entirely through FHIR Tasks, FHIR Endpoints, FHIR Organizations, SubscriptionTopics, and Subscriptions.
Task.owner is the Applicant.Task.input.Task.output.Task.status of the original Task to complete and providing documentation or a final response in Task.output.This creates a realātime, traceable, lineageāpreserving conversationāall driven by FHIR R5 Subscriptions.
The Regulator:
SubscriptionTopicSubscriptionOptional regulatorāside Subscriptions may monitor:
Task.owner = nullTask.owner = RegulatorTask.requester = RegulatorThe Applicant:
Task.ownerTask.owner or Task.requestorAccess rules ensure security, privacy, and roleāappropriate visibility.
The Applicant prepares a Task with:
Task.requester = Applicant FHIR Organization instanceTask.identifier = globally unique identifier to be used to filter the Task status update Subscription. Task.identifier includes an identifier (system, value pair) known to the Applicant Organization and is unique. (There is an alternative where Task.id is used but this requires discussion in testing. A Task.identifier is globally unique, whereas Task.id is locally unique to a specific FHIR server. The Applicant will benefit from having this identifier available for connecting their internal data with the FHIR server data. And, importantly, the Task.id is not known when the Task is created. However, the Applicant can create a Subscription at the same time as the Task that is filtered by a Task.identifier. This is an area where FHIR offers us different business perspectives, but the pattern of having a Task and Subscription to that specific Task.status is key.)Task.status = requested`Task.code = type of requestTask.requestedPerformer = Regulator FHIR OrganizationTask.owner = Regulator Organization (optional)Task.input = documentation or materials supporting the request (see Post-then-Link for detials on use of DocumentReference)The Task is posted to the Regulatorās FHIR server.
To receive realātime updates, the Applicant (or Regulator's system) creates a Subscription Example:
Subscription.topic = Taskāstatus SubscriptionTopic URLSubscription.filter_by = the Taskās identifierSubscription.endpoint = Applicantās Endpoint which contains the Endpoint.address from the Applicant Endpoint FHIR Resource created at registrationSubscription.managingEntity = Applicant OrganizationSubscription.content = full-resource or id-only
The choice here is based on business agreements. A Regulator and/or Applicant may wish to keep the size of the notifications smaller (not include the entire Task). This would be choosing the id_only option, and would require the retrieval of the Task subsequent to receiving the notification. With the entire_resource option, the recipient receives the entire Task in its current state, along with the notification.A second Subscription is created for Task creation by the Regulator where:
Task.owner = ApplicantThis ensures the Applicant is notified whenever the Regulator assigns them new work. It is useful to have this Subscription created concurrenlty with the Task (thus use of Task.identifier for filtering).
The Regulator updates:
Task.status = accepted
This triggers the Applicantās Subscription for Task status updates filtered by the Task.identifier, generating a SubscriptionNotification Example.
The Applicant now knows the request has been received and accepted.
To request additional work, the Regulator creates a Task:
Task.owner = ApplicantTask.requestor = RegulatorTask.status = requestedTask.input = instructions, questions, or required documentationTask.basedOn = lineage of previous Tasks
Posting this Task triggers the Taskācreation Subscription filtered by Task.owner = Applicant Organization.
The Applicant receives a SubscriptionNotification at the endpoint used in the Subscription, and then retrieves the Task and processes it. Note: the Subscription can be set to either send the id only or the entire Resource. The Applicant retrieves the Task from the notifications and parses it, paying particular attention to the artifacts in Task.input. The input, description, code and potentially other fields help direct the Applicant as to what action they need to take.
After performing the requested action, the Applicant:
Task.status = completedTask.output
The Regulator reviews the output and either:
This iterative loop continues until all requirements are satisfied. Depending on the evolution of the business use there may be branches of Tasks and groups of Tasks. However, the essential pattern of Task based request with input and output and status is expected to be used.
Once all followāup Tasks are resolved, the Regulator:
Task.output
Task.output supports references to FHIR Resources, such as DocumentReference.Task.status = completeThis triggers the Applicantās statusāupdate Subscription, signaling that the entire request is finished, and indicaiting the Task where the final Regulator documentation is found.