Skip to main content

Provider Directory Service — API Contracts

Status: populated Owner: TBD Last updated: 2026-04-17 Companion: 05 API Design · API_PATH_CONVENTIONS

1. Conventions

  • Base path: /api/v1
  • Auth: Bearer JWT; required scopes below.
  • Idempotency: Idempotency-Key on POST/PUT.
  • Optimistic lock: If-Match: "<version>" on PUT/PATCH.
  • Pagination: page + limit (default 20, max 200).
  • Errors: { error: { code, message, details? } }.

2. Practitioners

MethodPathScopeNotes
POST/api/v1/practitionersprovider_directory:writeCreate
GET/api/v1/practitioners?q=&kind=&specialty=&status=&nodeId=provider_directory:readSearch + filter
GET/api/v1/practitioners/{id}provider_directory:readGet
PUT/api/v1/practitioners/{id}provider_directory:writeReplace
POST/api/v1/practitioners/{id}/deactivateprovider_directory:adminDeactivate
POST/api/v1/practitioners/{id}/suspendprovider_directory:adminSuspend
POST/api/v1/practitioners/{id}/reinstateprovider_directory:adminReinstate

POST body (excerpt):

{
"kind": "physician",
"names": [{"use":"official","family":"احمدی","given":["محمد"],"scriptCode":"ps"},
{"use":"official","family":"Ahmadi","given":["Mohammad"],"scriptCode":"en"}],
"identifiers": [{"system":"urn:oid:afg:mcn","value":"MCN-00123","authority":"AFG-MC","use":"official"}],
"telecom": [{"system":"email","value":"m.ahmadi@ibnsina.health"}],
"specialties": [{"system":"http://snomed.info/sct","code":"394802001","display":"General medicine"}],
"preferredLanguage": "ps"
}

Errors: 409 IDENTIFIER_CONFLICT, 422 SPECIALTY_UNKNOWN.

3. Credentials

MethodPathScopeNotes
POST/api/v1/practitioners/{id}/credentialsprovider_directory:writeAdd
PATCH/api/v1/practitioners/{id}/credentials/{credId}provider_directory:writeUpdate
POST/api/v1/practitioners/{id}/credentials/{credId}/revokeprovider_directory:adminRevoke
GET/api/v1/practitioners/{id}/credentialsprovider_directory:readList

4. Practitioner Roles

MethodPathScopeNotes
POST/api/v1/practitioner-rolesprovider_directory:writeAssign
GET/api/v1/practitioner-roles?practitionerId=&nodeId=&active=provider_directory:readList
PATCH/api/v1/practitioner-roles/{id}provider_directory:writeUpdate privileges/period
POST/api/v1/practitioner-roles/{id}/endprovider_directory:adminEnd

Errors: 422 CREDENTIAL_REQUIRED, 409 PRACTITIONER_DEACTIVATED.

5. Healthcare Services

MethodPathScopeNotes
POST/api/v1/healthcare-servicesprovider_directory:writeCreate
GET/api/v1/healthcare-services?nodeId=&category=&active=provider_directory:readList
PATCH/api/v1/healthcare-services/{id}provider_directory:writeUpdate
DELETE/api/v1/healthcare-services/{id}provider_directory:adminDeactivate

6. Service Endpoints

MethodPathScopeNotes
POST/api/v1/endpointsprovider_directory:writeRegister
GET/api/v1/endpoints?orgNodeId=&type=&status=provider_directory:readList
PATCH/api/v1/endpoints/{id}provider_directory:writeUpdate
POST/api/v1/endpoints/{id}/healthcheckprovider_directory:writeTrigger manual check

7. Privileges (hot path)

MethodPathScopeNotes
GET/api/v1/internal/practitioners/{id}/privileges?nodeId=internal:any-serviceReturns effective privileges at scope; p99 ≤ 30ms

8. FHIR Projection

FHIRMethodPath
PractitionerGET/POST/PUT/fhir/R4/Practitioner[/{id}]
PractitionerRoleGET/POST/PUT/fhir/R4/PractitionerRole[/{id}]
HealthcareServiceGET/POST/PUT/fhir/R4/HealthcareService[/{id}]
EndpointGET/POST/PUT/fhir/R4/Endpoint[/{id}]

Search parameters per FHIR R4 spec; name, identifier, specialty, active supported.

9. Rate Limits

ClassLimit
Reads500 rps / tenant
Writes100 rps / tenant
Internal privilege check5000 rps / caller

10. Error Response Example

{ "error": { "code": "CREDENTIAL_REQUIRED", "message": "Role 'consultant' requires an active 'license' credential", "details": { "missing": ["license"], "practitionerId": "prc_01H..." } } }