APIs for system administrators
Location REST API
You need access to the Location API for 3 important reasons...
1. In order to get IDs for locations required in Event Notification or deciphering location information from IDs returned from a Record Search
This API will help you configure integrating clients to understand the relationship to places referenced by ids in payloads such as "Place of birth", "Place of registration", or "Jurisdiction"
2. Changing administrative areas, civil registration offices or facilities
During the configuration step of OpenCRVS you import all administrative areas, civil registration offices and health facilities in CSV files. But over the years of operation, changes occur to your infrastructure and jurisdictional operations.
Sometimes you may wish to add a new office or health facility.
Sometimes you may wish to change the name of an area or health facility.
Sometimes a location may no longer be in use and you want it to not appear as a valid place of birth or death, or a valid area in an address in new event declaration forms.
Note, in OpenCRVS a Location cannot be deleted entirely, only archived. This is to protect the integrity of any older event registrations where the historical name of the facility or administrative area must be always remembered. That can only be changed via the correct record procedure.
3. Updating population and crude-birth-rate statistics to power the registration "completion rate" performance
During the configuration step of OpenCRVS you import all administrative areas with statistics that are used to calculate changing completeness rates over time. This calculation depends upon the yearly population of that area and its associated, and ever changing, "crude birth rate". These values are collected by statistical departments in government. To provide accurate performance analytics, the previous year's statistics should be added via this API on a yearly basis.
Using the Location REST API
Getting all Locations or getting a single Location by its id, can be performed by any client, publicly on the internet with no authorization headers necessary. If you wish to whitelist access for whatever reason, you can do so via Traefik in Docker compose files.
Only a National System Administrator's JWT token can be used to perform these actions as they are potentially destructive and can affect business operations. An Interoperability client does not have permission.
By adding the status=active property, you can filter out any deactivated locations that are no longer in use.
The unique identifier for a location
^[a-zA-Z0-9_]+$^[a-zA-Z0-9_,.\s]+$Number of locations to return per page, Use 0 to return all locations
OK
GET /locations HTTP/1.1
Host: localhost:7070
Accept: */*
OK
{
"resourceType": "Bundle",
"id": "123e4567-e89b-12d3-a456-426614174000",
"meta": {
"lastUpdated": "2025-12-07T01:30:47.576Z"
},
"type": "searchset",
"total": 1,
"link": [
{
"relation": "text",
"url": "text"
}
],
"entry": [
{
"fullUrl": "text",
"resource": {
"resourceType": "Location",
"identifier": [
{
"system": "text",
"value": "text"
}
],
"name": "text",
"alias": [
"text"
],
"status": "text",
"mode": "text",
"partOf": {
"reference": "text"
},
"type": {
"coding": [
{
"system": "text",
"code": "text"
}
]
},
"physicalType": {
"coding": [
{
"code": "text",
"display": "text"
}
]
},
"meta": {
"lastUpdated": "2025-12-07T01:30:47.576Z",
"versionId": "text"
},
"id": "123e4567-e89b-12d3-a456-426614174000"
}
}
]
}OK
GET /locations/{locationId} HTTP/1.1
Host: localhost:7070
Accept: */*
OK
{
"resourceType": "Bundle",
"id": "123e4567-e89b-12d3-a456-426614174000",
"meta": {
"lastUpdated": "2025-12-07T01:30:47.576Z"
},
"type": "searchset",
"total": 1,
"link": [
{
"relation": "self",
"url": "https://example.com"
}
],
"entry": [
{
"fullUrl": "text",
"resource": {
"resourceType": "Location",
"identifier": [
{
"system": "text",
"value": "text"
}
],
"name": "text",
"alias": [
"text"
],
"status": "text",
"mode": "text",
"partOf": {
"reference": "text"
},
"type": {
"coding": [
{
"system": "text",
"code": "text"
}
]
},
"physicalType": {
"coding": [
{
"code": "text",
"display": "text"
}
]
},
"meta": {
"lastUpdated": "2025-12-07T01:30:47.576Z",
"versionId": "text"
},
"id": "123e4567-e89b-12d3-a456-426614174000"
}
}
]
}When creating a new location, statisticalID is the adminPCode or custom id you set when importing administrative areas or facility CSVs respectively. We call that a statisticalID because it is generally used by statistics departments in government as opposed to a FHIR id.
OK
No content
POST /locations HTTP/1.1
Host: localhost:7070
Content-Type: application/json
Accept: */*
Content-Length: 228
{
"statisticalID": "text",
"name": "text",
"alias": "text",
"partOf": "text",
"code": "ADMIN_STRUCTURE",
"jurisdictionType": "DISTRICT",
"statistics": [
{
"year": 1,
"male_population": 1,
"female_population": 1,
"population": 1,
"crude_birth_rate": 1
}
]
}OK
No content
Optional secondary name for the location
OK
No content
PUT /locations/{locationId} HTTP/1.1
Host: localhost:7070
Content-Type: application/json
Accept: */*
Content-Length: 150
{
"name": "text",
"alias": "text",
"status": "active",
"statistics": {
"year": 1,
"male_population": 1,
"female_population": 1,
"population": 1,
"crude_birth_rate": 1
}
}OK
No content
Authorization to create, update and archive a FHIR Location
To retrieve a National System Administrators JWT token, login as the national system administrator. In our example, this is the user j.campbell.
In Chrome, right click anywhere on the page, choose "Inspect", and open "Chrome Developer Tools."
Open the "Application" tab and expand "Local Storage".
The JWT is the value for the key "opencrvs"
Double click inside the value and type Ctrl+A to select all, then Ctrl+C to copy the JWT into your clipboard.

Update or Archive a FHIR Location
Last updated