Aller au contenu
For the complete DHIS2 documentation index, see llms.txt.

Tracker

Note

Tracker has been re-implemented in DHIS2 2.36. This document describes the new tracker endpoints

  • POST /api/tracker
  • GET /api/tracker/trackedEntities
  • GET /api/tracker/enrollments
  • GET /api/tracker/events
  • GET /api/tracker/relationships

The deprecated tracker endpoints

  • GET/POST/PUT/DELETE /api/trackedEntityInstance
  • GET/POST/PUT/DELETE /api/enrollments
  • GET/POST/PUT/DELETE /api/events
  • GET/POST/PUT/DELETE /api/relationships

have been removed in version 42!

Migrating to new tracker endpoints should help you get started with your migration. Reach out on the community of practice if you need further assistance.

Tracker objects

Le Tracker est constitué de différents types d'objets interconnectés destinés à représenter les données. Dans cette section, nous montrerons et décrirons chacun des objets utilisés dans l'API du Tracker.

Tracked entities

Les entités suivies constituent la base du modèle Tracker.

Propriété Description Obligatoire Immuable Type Exemple
trackedEntity L’identifiant de l’entité suivie. Il est généré au cas où il n'est pas fourni Non Oui Chaîne : Uid ABCDEF12345
TrackedEntityType Le type d’entité suivie. Oui Oui Chaîne : Uid ABCDEF12345
créé à Date et heure à laquelle l'utilisateur a créé l'entité suivie. Elle est définie sur le serveur. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
crééAtClient (Création au niveau du client) Date et heure à laquelle l'utilisateur a créé l'entité suivie au niveau du client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Timestamp when the object or any enrollment, event, attribute or originating relationship, was last updated. Set on the server. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAtClient (mise à jour au niveau du client) Date et heure de la dernière mise à jour de l'objet au niveau du client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
orgUnit L'unité d'organisation dans laquelle l'utilisateur a créé l'entité suivie. Oui Oui Chaîne : Uid ABCDEF12345
inactif Indique si l'entité suivie est inactive ou non. Non Oui Booléen Par défaut: faux, vrai
supprimé Indique si l'entité suivie a été supprimée. Ne peut être modifié qu'au moment de la suppression. Non Non Booléen Faux jusqu'à suppression
potentialDuplicate Indique si l'entité suivie est un doublon potentiel Non Non Booléen Par défaut: faux
géométrie Il s'agit d'une représentation géographique de l'entité suivie. Elle se base sur le « type de fonctionnalité » du type d'entité suivie. Non Oui GeoJson {
"type": "POINT",
"coordonnées": [123.0, 123.0]
}
storedBy Client reference for who stored/created the tracked entity. Set on the server. Non Oui Chaîne : Toute John Doe
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
updatedBy (mis à jour par) Only for reading data. User that last updated the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
attributs Liste des valeurs d'attributs d'entité suivie appartenant à l'entité suivie. Non Oui Liste des valeurs d'attributs d'entité suivie Voir les attributs
inscriptions Liste des inscriptions appartenant à l’entité suivie. Non Oui Liste des inscriptions Voir les inscriptions
relations Liste de relations connectées à l'entité suivie. Non Oui Liste des relations Voir les relations
Propriétaires du programme A list of organisation units with access through specific programs to this tracked entity. See "Program Ownership". Non Oui Liste des propriétaires du programme Voir la section « Propriété du programme »

Remarque

Les entités suivies "possèdent" toutes les Valeurs d'attribut d'entités suivies (ou les "attributs" décrits dans le tableau précédent). Cependant, les attributs d'entités suivies sont soit connectés à une entité suivie via son type d'entité suivie soit à un programme. Nous désignons souvent cette séparation par Attributs de type d'entité suivi et Attributs de programme d'entité suivi. L'importance de cette distinction est liée au contrôle d'accès et à la limitation des informations que l'utilisateur peut voir.

Les "attributs" mentionnés dans Entité suivie sont des Attributs de type d'entité suivie.

Inscriptions

Tracked Entities can enroll into TRACKER PROGRAM for which they are eligible. Tracked entities are eligible as long as the program is configured with the same Tracked Entity Type as the tracked entity. We represent the enrollment with the Enrollment object, which we describe in this section.

Propriété Description Obligatoire Immuable Type Exemple
enrollment The identifier of the enrollment. Generated if not supplied. Non Oui Chaîne : Uid ABCDEF12345
program The tracker program the enrollment is enrolled into. Oui Non Chaîne : Uid ABCDEF12345
trackedEntity Une référence à l’entité suivie inscrite. Oui Oui Chaîne : Uid ABCDEF12345
status Statut de l'inscription. Il est ACTIF au cas où n'est pas fourni. Non Non Énumération ACTIF, EFFECTUÉ, ANNULÉ
orgUnit L'unité d'organisation dans laquelle l'utilisateur a inscrit l'entité suivie. Oui Non Chaîne : Uid ABCDEF12345
créé à Date et heure à laquelle l'utilisateur a créé l'objet. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
crééAtClient (Création au niveau du client) Timestamp when the user created the object on client. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Date et heure de la dernière mise à jour de l'objet. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAtClient (mise à jour au niveau du client) Timestamp when the object was last updated on client. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
inscrit à Date et heure à laquelle l'utilisateur a inscrit l'entité suivie. Oui Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
occurredAt (s'est produit à) Date et heure à laquelle l'inscription a eu lieu. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
completedAt (effectué à) Timestamp when the user completed the enrollment. Set on the server if not set by the client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
completedBy Only for reading data. User that completed the enrollment. Set on the server. Non Non Chaîne : Toute John Doe
followUp Indicates whether the enrollment requires follow-up. False if not supplied. Non Non Booléen Par défaut : Faux, Vrai
supprimé Indique si l'inscription a été supprimée. Ne peut être modifié qu'au moment de la suppression. Non Oui Booléen Faux jusqu'à suppression
géométrie A geographical representation of the enrollment. Based on the "featureType" of the program. Non Non GeoJson {
"type": "POINT",
"coordonnées": [123.0, 123.0]
}
storedBy Client reference for who stored/created the enrollment. Set on the server. Non Oui Chaîne : Toute John Doe
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
updatedBy (mis à jour par) Only for reading data. User that last updated the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
attributs Liste des valeurs d'attributs d'entité suivie associées à l'inscription. Non Non Liste des valeurs d'attributs d'entité suivie Voir les attributs
events Liste des événements appartenant à l'inscription. Non Non Liste des événements Voir les évènements
relations Liste des relations liées à l'inscription. Non Non Liste des relations Voir les relations
notes Notes liées à l'inscription. Elles ne peuvent qu'être créées. Non Oui Liste des notes Voir les notes
attributeOptionCombo (combinaison d'options d'attribut) Attribute option combo for the enrollment. If not supplied, the default value defined by the program’s category combo is used. Non Non Chaîne : Uid ABCDEF12345

Remarque

Les entités suivies "possèdent" toutes les Valeurs d'attribut d'entités suivies (ou les "attributs" décrits dans le tableau précédent). Cependant, les attributs d'entités suivies sont soit connectés à une entité suivie via son type d'entité suivie soit à un programme. Nous désignons souvent cette séparation par Attributs de type d'entité suivi et Attributs de programme d'entité suivi. L'importance de cette distinction est liée au contrôle d'accès et à la limitation des informations que l'utilisateur peut voir.

Les "attributs" mentionnés dans Inscription sont des Attributs de programmes d'entités suivies.

Events

Les Événements font partie d'un PROGRAMME D'ÉVÉNEMENT ou d'un PROGRAMME TRACKER. Pour le PROGRAMME TRACKER, les événements appartiennent à une Inscription, laquelle appartient à une Entité suivie. D'un autre côté, PROGRAMME D'ÉVÉNEMENT concerne les Événements non rattachées à une Inscription ou à une Entité suivie spécifique. La différence réside dans le fait que nous effectuons ou non un suivi pour une Entité suivie spécifique. Nous désignons parfois les événements PROGRAMME D'ÉVÉNEMENT "événements anonymes "ou "événements uniques" puisqu'ils ne se représentent qu'eux-mêmes et non une autre Entité suivie.

In the API, the significant difference is that events are either not linked to any enrollment (EVENT PROGRAM) or are linked to different enrollments (TRACKER PROGRAM). The table below will point out any exceptional cases between these two.

Propriété Description Obligatoire Immuable Type Exemple
event The identifier of the event. Generated if not supplied. Non Oui Chaîne : Uid ABCDEF12345
programStage L'étape du programme que représente l'événement. Oui Non Chaîne : Uid ABCDEF12345
enrollment A reference to the enrollment which owns the event. Not applicable for EVENT PROGRAM. Oui Oui Chaîne : Uid ABCDEF12345
program Uniquement pour lire les données. Il s'agit du type de programme de l'inscription qui possède l'événement. Non Oui Chaîne : Uid ABCDEF12345
trackedEntity Only for reading data. The tracked entity which owns the event. Not applicable for EVENT PROGRAM. Non Non Chaîne : Uid ABCDEF12345
status Status of the event. Default is ACTIVE. For EVENT PROGRAM only ACTIVE and COMPLETED statuses are allowed. Non Non Énumération ACTIF, EFFECTUÉ, VISITÉ, HORAIRE, EN RETARD, SAUTÉ
orgUnit Il s'agit de l'unité d'organisation dans laquelle l'utilisateur a enregistré l'événement. Oui Non Chaîne : Uid ABCDEF12345
créé à Uniquement pour lire des données. Date et heure à laquelle l'utilisateur a créé l'évènement. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
crééAtClient (Création au niveau du client) Timestamp when the user created the event on client. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Uniquement pour lire des données. Date et heure de la dernière mise à jour de l'évènement. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAtClient (mise à jour au niveau du client) Timestamp when the event was last updated on client. Non Non Date : ISO 8601 AAAA-MM-JJThh:mm:ss
scheduledAt (programmé à) Timestamp when the event was scheduled for. Not applicable for EVENT PROGRAM. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
occurredAt (s'est produit à) Date et heure à laquelle quelque chose se passe. Oui Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
completedAt (effectué à) Timestamp when the user completed the event. Set on the server if not set by the client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
completedBy Only for reading data. User that completed the event. Set on the server. Non Non Chaîne : Toute John Doe
followUp Uniquement pour lire les données. Indique si l'événement a été marqué pour un suivi. Non Non Booléen Faux, Vrai
supprimé Uniquement pour lire les données. Indique si l'évènement a été supprimée. Ne peut être modifié qu'au moment de la suppression. Non Oui Booléen Faux jusqu'à suppression
géométrie A geographical representation of the event. Based on the "featureType" of the program stage. Non Non GeoJson {
"type": "POINT",
"coordonnées": [123.0, 123.0]
}
storedBy Client reference for who stored/created the event. Set on the server. Non Oui Chaîne : Toute John Doe
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
updatedBy (mis à jour par) Only for reading data. User that last updated the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
attributeOptionCombo (combinaison d'options d'attribut) Attribute option combo for the event. If not supplied, the default value defined by the program’s category combo is used. Non Non Chaîne : Uid ABCDEF12345
attributeCategoryOptions (options de catégorie d'attribut) Attribute category option for the event. If not supplied, the default value defined by the program’s category combo is used Non Non Chaîne : Uid ABCDEF12345
assignedUser Fait référence à un utilisateur qui a été assigné à l'événement. Non Non Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
dataValues (Valeurs de données) Liste des valeurs de données liées à l'événement. Non Non Liste des valeurs d'attributs d'entité suivie Voir les attributs
relations Liste des relations liées à l'évènement. Non Non Liste des relations Voir les relations
notes Notes liées à l'évènement. Elles ne peuvent qu'être créées. Non Oui Liste des notes Voir les notes

Relations

Les Relations sont des objets qui relient deux autres objets Tracker. Les contraintes auxquelles chaque côté de la relation doit se conformer sont basées sur le Type de relation de la Relation.

Propriété Description Obligatoire Immuable Type Exemple
relation L'identifiant de la relation. Il est généré au cas où il n'est pas fourni Non Oui Chaîne : Uid ABCDEF12345
Type de relation Il s'agit du type de relation. Il détermine quels objets peuvent être reliés dans une relation. Oui Oui Chaîne : Uid ABCDEF12345
Nom de la relation Only for reading data. The name of the relationship type of this relationship. Non Non Chaîne : Toute Sibling
créé à Date et heure à laquelle l'utilisateur a créé la relation. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Date et heure de la dernière mise à jour de la relation. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
crééAtClient (Création au niveau du client) Date et heure à laquelle l'utilisateur a créé la relation au niveau du client. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
bidirectionnel Uniquement pour lire les données. Indique si le type de relation est bidirectionnel ou non. Non Non Booléen Vrai ou faux
de, à A reference to each side of the relationship. Must conform to the constraints set in the relationship type. Oui Oui Élément de la relation {"trackedEntity": {"trackedEntity": "ABCEF12345"}}, {"enrollment": {"enrollment": "ABCDEF12345"}} or {"event": {"event": "ABCDEF12345" }}

Note

Relationship item represents a link to an object. Since a relationship can be between any tracker object like tracked entity, enrollment, and event, the value depends on the relationship type. For example, if a relationship type connects from an event to a tracked entity, the format is strict:

{
  "from": {
    "event": { "event": "ABCDEF12345" }
  },
  "to": {
    "trackedEntity": { "trackedEntity": "FEDCBA12345" }
  }
}

Les attributs

Attributes are the values describing the tracked entities. Attributes can be associated either through a tracked entity type or a program. This implies that attributes can be part of both a tracked entity and an enrollment. Importantly, an attribute can only have one value, even if a tracked entity has multiple enrollments that define that attribute. This is because the tracked entity ultimately owns the attribute value.

Propriété Description Obligatoire Immuable Type Exemple
attribute Fait référence à l’attribut d’entité suivi représenté. Oui Oui Chaîne : Uid ABCDEF12345
code Uniquement pour lire les données. Il s'agit du code de l'attribut de l'entité suivie. Non Non Chaîne : Toute ABC
Nom d'affichage Uniquement pour lire les données. Il s'agit du nom d'affichage de l'attribut de l'entité suivie. Non Non Chaîne : Toute Nom
créé à Date et heure à laquelle la valeur a été ajoutée. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Date et heure de la dernière mise à jour de la valeur. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
storedBy Client reference for who stored/created the value. Set on the server. Non Oui Chaîne : Toute John Doe
Type de valeur Uniquement pour lire les données. Il s'agit du type de valeur que l'attribut représente. Non Non Énumération TEXTE, ENTIER et plus
value La valeur de l'attribut d'entité suivi. Non Non Chaîne : Toute John Doe

Note

When adding or updating an attribute, only the attribute and value properties are required. To remove an attribute from a tracked entity or enrollment, set the value to null example.

In the context of tracker, we refer to Tracked Entity Attributes and Tracked Entity Attribute Values simply as attributes. However, it's important to note that attributes and attribute values are also concepts within metadata. Therefore, distinguishing between tracker attributes and metadata attributes is essential. In the tracker API, you can reference metadata attributes by specifying the idScheme on import (see request parameters) and event export.

Data values

While attributes describe a tracked entity, data values describe an event.

Propriété Description Obligatoire Immuable Type Exemple
dataElement L'élément de données que cette valeur représente. Oui Oui Chaîne : Uid ABCDEF12345
value La valeur de données. Non Non Chaîne : Toute 123
providedElsewhere Indique si l'utilisateur a fourni la valeur ailleurs ou non. Faux si la valeur n'a pas été fournie. Non Non Booléen Faux ou vrai
créé à Date et heure à laquelle l'utilisateur a ajouté la valeur. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
updatedAt (mis à jour à) Date et heure de la dernière mise à jour de la valeur. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
storedBy Client reference for who stored/created the value. Set on the server. Non Oui Chaîne : Toute John Doe
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}
updatedBy (mis à jour par) Only for reading data. User that last updated the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}

Note

When adding or updating a data value, only the dataElement and value properties are required. To remove a data value from an event, set the value to null see example.

Remarques

In situations where additional information or notes about specific issues need to be recorded, these can be captured using notes.

There are two types of notes: enrollment-level notes and event-level notes. An enrollment can consist of one or more events, and notes can be recorded for each event to document reasons such as why an event was missed, rescheduled, or partially completed. Each event within an enrollment can have its own notes. Additionally, overall observations of these events can be recorded using a parent enrollment note. Enrollment notes are useful for documenting reasons such as why an enrollment was canceled. The use of notes is flexible and can be tailored to the user's needs and specific use cases.

Both enrollment and event notes can have an unlimited number of entries; there is no limit to the number of notes that can be added. However, it is not possible to delete or update these notes once they are created. They function like a logbook. To amend a note, a new note can be created. The only way to delete a note is by deleting the parent object, either the event or the enrollment.

Notes do not have a dedicated endpoint; they are exchanged as part of the parent event and/or enrollment payload. A sample payload is found below.

{
  "trackedEntity": "oi3PMIGYJH8",
  "enrollments": [
    {
      "enrollment": "EbRsJr8LSSO",
      "notes": [
        {
          "note": "vxmCvYcPdaW",
          "value": "Enrollment note 1"
        },
        {
          "value": "Enrollment note 2."
        }
      ],
      "events": [
        {
          "event": "zfzS9WeO0uM",
          "notes": [
            {
              "note": "MAQFb7fAggS",
              "value": "Event Note 1."
            },
            {
              "value": "Event Note 2."
            }
          ]
        }
      ]
    }
  ]
}
Propriété Description Obligatoire Immuable Type Exemple
note La référence de la note. Elle est générée si rien n'est fourni Non Oui Chaîne : Uid ABCDEF12345
value Le contenu de la note. Oui Oui Chaîne : Toute Ceci est une note
Stocké à Date et heure à laquelle l'utilisateur a ajouté la note. Elle est définie sur le serveur. Non Oui Date : ISO 8601 AAAA-MM-JJThh:mm:ss
storedBy Client reference for who stored/created the note. Set on the server. Non Oui Chaîne : Toute John Doe
createdBy (créé par) Only for reading data. User that created the object. Set on the server. Non Oui Utilisateur {
"uid": "ABCDEF12345",
"Nom d'utilisateur": "Nom d'utilisateur",
"Prénom": "John",
"Nom de famille": "Doe"
}

Utilisateurs

Propriété Description Obligatoire Immuable Type Exemple
uid L'identifiant de l'utilisateur. Oui* Oui Chaîne : Uid ABCDEF12345
Nom d'utilisateur Le nom d'utilisateur utilisé par l'utilisateur. Oui* Oui Chaîne : Toute 123
Prénom Uniquement pour lire les données. Il s'agit du prénom de l'utilisateur. Non Oui Chaîne : Toute John
Nom de famille Uniquement pour lire les données. Il s'agit du nom de famille de l'utilisateur. Non Oui Chaîne : Toute Doe

Note

Either uid or username must be provided. If both are provided, only username is considered.

ID schemes

Tracker supports different identifier schemes, referred to as ID schemes. The default ID scheme for import and export is UID.

ID schemes are supported in the following endpoints.

See each section for request parameters.

Only metadata fields directly on the entity are exported using the chosen idScheme. Metadata in collections are always exported using UIDs, except for:

  • TrackedEntity.attributes[].attribute
  • Event.dataValues[].dataElement

For example, metadata references in TrackedEntity.relationships or enrollments will always use UIDs for import/export.

The import expects metadata identifiers to only use the chosen idScheme. Similarly, metadata is exported only using the chosen idScheme. If metadata lacks identifiers for the chosen idScheme, you'll receive an error like the below.

{
  "httpStatus": "Unprocessable Entity",
  "httpStatusCode": 422,
  "status": "ERROR",
  "message": "Not all metadata has an identifier for the requested idScheme. Either change the requested idScheme or add the missing identifiers to the metadata.",
  "devMessage": "Following metadata listed using their UIDs is missing identifiers for the requested idScheme: ProgramStage[ATTRIBUTE:Y1LUDU8sWBR]=A03MvHHogjR .."
}

To resolve this, either:

  • Add the missing identifiers.
  • Change the idScheme parameters to use a scheme with complete information.

Tracker import

POST /api/tracker

The endpoint POST /api/tracker is also called the tracker importer. This endpoint allows clients to import i.e. create, update and delete

  • Entités suivies
  • Enrollments
  • Événements
  • Relations
  • Objects embedded in other tracker objects

Request parameters

The tracker importer supports the following parameters:

Paramètre de requête Description Type Valeurs autorisées Valeur par défaut
async Indique si l’importation doit avoir lieu de manière asynchrone ou synchrone. Booléen true, false true
Mode de rapport Uniquement lors d'une importation synchrone. Voir le "Récapitulatif de l'importation" pour plus d’informations. Énumération COMPLET, ERREURS, AVERTISSEMENTS ERRORS
Mode d'importation Peut être soit VALIDATE qui rapportera les erreurs dans la charge sans faire de changements dans la base de données, soit COMMIT (par défaut) qui validera la charge et fera des changements dans la base de données. Énumération VALIDER, COMMITER COMMIT
idScheme IdScheme used for all metadata references unless overridden by a metadata specific parameter. Default is UID. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} UID
dataElementIdScheme IdScheme used for data element references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
orgUnitIdScheme IdScheme used for organisation unit references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
programIdScheme IdScheme used for program references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
programStageIdScheme IdScheme used for program stage references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
categoryOptionComboIdScheme IdScheme used for category option combo references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
categoryOptionIdScheme (Schéma d'identification des options de catégorie) IdScheme used for category option references. Defaults to the idScheme parameter. Énumération UID, CODE, NAME, ATTRIBUTE:{uid} idScheme parameter
importStrategy (stratégie d'importation) Indique l'effet que l'importation doit avoir. Les différentes possibilités sont CRÉER, METTRE À JOUR, CRÉER_ET_METTRE À JOUR et SUPPRIMER. Respectivement, elles permettent d'importer de nouvelles données, d'importer des modifications à des données existantes, d'importer de nouvelles données ou des mises à jour à des données existantes et, enfin, de supprimer des données. Énumération CRÉER, METTRE À JOUR, CRÉER_ET_METTRE À JOUR et SUPPRIMER CRÉER
Mode atomique Indique comment l'importation répond aux erreurs de validation. S'il est défini sur TOUS, toutes les données importées doivent être valides avant que chaque donnée ne soit commitée. Par contre s'il est défini sur OBJET, seules les données commitées doivent être valides, tandis que d'autres données peuvent être invalides. Énumération TOUS, OBJET TOUS
flushMode (mode de vidage) Indique la fréquence de vidange. Il s'agit de la fréquence à laquelle les données sont introduites dans la base de données au cours de l'importation. Il est principalement utilisé à des fins de débogage et ne doit pas être modifié dans un environnement de production. Énumération AUTO, OBJET AUTO
Mode de validation Indicates the completeness of the validation step. It can be skipped, set to fail fast (Return on the first error), or full (default), which will return any errors found Énumération COMPLET, ÉCHOUER_RAPIDEMENT, SAUTER COMPLET
Validation du modèle de saut S'il est défini sur 'vrai', la validation du modèle des attributs générés sera sautée. Booléen true, false faux
Sauter les effets secondaires Si défini sur 'vrai', les effets secondaires de l'importation seront ignorés. Booléen true, false faux
Sauter les règles Si défini sur 'vrai', l'exécution des règles de programme pour l'importation sera ignorée. Booléen true, false faux

Sync and async

The main difference for the user between synchronous and asynchronous imports is the timing of the API response. Synchronous imports provide an immediate import summary once the import is finished. In contrast, asynchronous imports return a reference to the import job right away. The progress of the import job can be tracked using this response.location. An example of an asynchronous import response is found below.

{
  "httpStatus": "OK",
  "httpStatusCode": 200,
  "status": "OK",
  "message": "Tracker job added",
  "response": {
    "id": "cHh2OCTJvRw",
    "location": "https://play.im.dhis2.org/dev/api/tracker/jobs/cHh2OCTJvRw"
  }
}

For large imports, opting for asynchronous import can be advantageous, as it prevents long waiting times for a response.

Payload

The importer supports both flat and nested payloads.

Flat payload

The flat payload can include collections for each of the core tracker objects: tracked entities, enrollments, events, and relationships. This format integrates well with existing data that already has UIDs assigned. However, for new data, the client must provide new UIDs for any references between objects. For instance, if you import a new tracked entity with a new enrollment, the client must provide a UID for the tracked entity so that the enrollment can be linked to it.

{
  "trackedEntities": [
    {
      "orgUnit": "y77LiPqLMoq",
      "trackedEntity": "Kj6vYde4LHh",
      "trackedEntityType": "nEenWmSyUEp"
    },
    {
      "orgUnit": "y77LiPqLMoq",
      "trackedEntity": "Gjaiu3ea38E",
      "trackedEntityType": "nEenWmSyUEp"
    }
  ],
  "enrollments": [
    {
      "enrolledAt": "2019-08-19T00:00:00.000",
      "enrollment": "MNWZ6hnuhSw",
      "occurredAt": "2019-08-19T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh",
      "trackedEntityType": "nEenWmSyUEp",
      "attributeOptionCombo": "HllvX50cXC0",
    }
  ],
  "events": [
    {
      "attributeCategoryOptions": "xYerKDKCefk",
      "attributeOptionCombo": "HllvX50cXC0",
      "dataValues": [
        {
          "dataElement": "bx6fsa0t90x",
          "value": "true"
        },
        {
          "dataElement": "UXz7xuGCEhU",
          "value": "5.7"
        }
      ],
      "enrollment": "MNWZ6hnuhSw",
      "enrollmentStatus": "ACTIVE",
      "event": "ZwwuwNp6gVd",
      "occurredAt": "2019-08-01T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "programStage": "A03MvHHogjR",
      "scheduledAt": "2019-08-19T13:59:13.688",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh"
    },
    {
      "attributeCategoryOptions": "xYerKDKCefk",
      "attributeOptionCombo": "HllvX50cXC0",
      "enrollment": "MNWZ6hnuhSw",
      "enrollmentStatus": "ACTIVE",
      "event": "XwwuwNp6gVE",
      "occurredAt": "2019-08-01T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "programStage": "ZzYYXq4fJie",
      "scheduledAt": "2019-08-19T13:59:13.688",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh"
    }
  ],
  "relationships": [
    {
      "from": {
        "trackedEntity": {
          "trackedEntity": "Kj6vYde4LHh"
        }
      },
      "relationshipType": "dDrh5UyCyvQ",
      "to": {
        "trackedEntity": {
          "trackedEntity": "Gjaiu3ea38E"
        }
      }
    }
  ]
}

Nested payload

Nested payloads are the most commonly used structure, where tracker objects are embedded within their parent objects, such as an enrollment within a tracked entity. The advantage of this structure is that the client does not need to provide UIDs for these references, as this is handled automatically.

Note

Although nested payloads can be easier for clients to manage, the payload will always be flattened before the import. For large imports, using a flat structured payload offers more control and reduces overhead during the import process. However, you cannot nest new tracked entities, enrollments or events within a relationship.

{
  "trackedEntities": [
    {
      "enrollments": [
        {
          "attributes": [
            {
              "attribute": "zDhUuAYrxNC",
              "displayName": "Last name",
              "value": "Kelly"
            },
            {
              "attribute": "w75KJ2mc4zz",
              "displayName": "First name",
              "value": "John"
            }
          ],
          "enrolledAt": "2019-08-19T00:00:00.000",
          "events": [
            {
              "attributeCategoryOptions": "xYerKDKCefk",
              "attributeOptionCombo": "HllvX50cXC0",
              "dataValues": [
                {
                  "dataElement": "bx6fsa0t90x",
                  "value": "true"
                },
                {
                  "dataElement": "UXz7xuGCEhU",
                  "value": "5.7"
                }
              ],
              "enrollmentStatus": "ACTIVE",
              "notes": [
                {
                  "value": "need to follow up"
                }
              ],
              "occurredAt": "2019-08-01T00:00:00.000",
              "orgUnit": "y77LiPqLMoq",
              "program": "IpHINAT79UW",
              "programStage": "A03MvHHogjR",
              "scheduledAt": "2019-08-19T13:59:13.688",
              "status": "ACTIVE"
            }
          ],
          "occurredAt": "2019-08-19T00:00:00.000",
          "orgUnit": "y77LiPqLMoq",
          "program": "IpHINAT79UW",
          "status": "ACTIVE",
          "trackedEntityType": "nEenWmSyUEp"
        }
      ],
      "orgUnit": "y77LiPqLMoq",
      "trackedEntityType": "nEenWmSyUEp"
    }
  ]
}

Create

Make a POST request to /api/tracker with the importStrategy set to CREATE or CREATE_AND_UPDATE and a payload as described here.

Update

Make a POST request to /api/tracker with the importStrategy set to UPDATE or CREATE_AND_UPDATE and a payload as described here.

The payload must include all fields of the object you are updating, even if they have not been modified. The only exception is collections. Items in a collection that should not be changed can be omitted, as demonstrated in update attribute values and update data values.

Note

Deleted tracker objects and relationships cannot be updated.

Update attribute values

The following updates one of the attribute values of a tracked entity.

POST /api/tracker?async=false
{
  "trackedEntities": [
    {
      "trackedEntity": "PQfMcpmXeFE",
      "trackedEntityType": "nEenWmSyUEp",
      "orgUnit": "DiszpKrYNg8",
      "attributes": [
        {
          "attribute": "w75KJ2mc4zz",
          "code": "MMD_PER_NAM",
          "displayName": "First name",
          "createdAt": "2016-08-03T23:49:43.308",
          "updatedAt": "2016-08-03T23:49:43.308",
          "valueType": "TEXT",
          "value": "Johnny"
        }
      ]
    }
  ]
}

Note that it is not necessary to specify the tracked entity's enrollments. However, you must specify the non-collection fields of the tracked entity, even if you are not changing them.

Delete attribute values

The following deletes one of the attribute values of a tracked entity:

POST /api/tracker?async=false
{
  "trackedEntities": [
    {
      "trackedEntity": "PQfMcpmXeFE",
      "trackedEntityType": "nEenWmSyUEp",
      "orgUnit": "DiszpKrYNg8",
      "attributes": [
        {
          "attribute": "w75KJ2mc4zz",
          "value": null
        }
      ]
    }
  ]
}

Update data values

The following updates one of the data values of an event:

POST /api/tracker?async=false
{
  "events": [
    {
      "event": "ZwwuwNp6gVd",
      "dataValues": [
        {
          "dataElement": "bx6fsa0t90x",
          "value": "true"
        }
      ],
      "attributeOptionCombo": "HllvX50cXC0",
      "attributeCategoryOptions": "xYerKDKCefk",
      "enrollment": "MNWZ6hnuhSw",
      "enrollmentStatus": "ACTIVE",
      "occurredAt": "2019-08-01T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "programStage": "A03MvHHogjR",
      "scheduledAt": "2019-08-19T13:59:13.688",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh"
    }
  ]
}

Delete data values

The following deletes one of the data values of an event:

POST /api/tracker?async=false
{
  "events": [
    {
      "event": "ZwwuwNp6gVd",
      "dataValues": [
        {
          "dataElement": "bx6fsa0t90x",
          "value": null
        }
      ],
      "attributeOptionCombo": "HllvX50cXC0",
      "attributeCategoryOptions": "xYerKDKCefk",
      "enrollment": "MNWZ6hnuhSw",
      "enrollmentStatus": "ACTIVE",
      "occurredAt": "2019-08-01T00:00:00.000",
      "orgUnit": "y77LiPqLMoq",
      "program": "IpHINAT79UW",
      "programStage": "A03MvHHogjR",
      "scheduledAt": "2019-08-19T13:59:13.688",
      "status": "ACTIVE",
      "trackedEntity": "Kj6vYde4LHh"
    }
  ]
}

Delete

Make a POST to /api/tracker with importStrategy set to DELETE. The payload should include only the UIDs of the trackedEntities, enrollments, events or relationships you wish to delete.

The following deletes the events created with this payload:

POST /api/tracker?async=false&importStrategy=DELETE
{
  "events": [
    {
      "event": "ZwwuwNp6gVd",
    },
    {
      "event": "XwwuwNp6gVE",
    }
  ]
}

The following deletes the tracked entities and all its child tracker objects which are enrollments, events and relationships:

POST /api/tracker?async=false&importStrategy=DELETE
{
  "trackedEntities": [
    {
      "trackedEntity": "Kj6vYde4LHh",
    },
    {
      "trackedEntity": "Gjaiu3ea38E",
    }
  ]
}

All the children of a tracker object will be deleted if the user making the request has the authorities F_TEI_CASCADE_DELETE and F_ENROLLMENT_CASCADE_DELETE. Relationships linked to an entity are always deleted, without the need of any authority.

Importation CSV

To import events using CSV make a POST request with CSV body file and the Content-Type set to application/csv or text/csv.

Événements

Every row of the CSV payload represents an event and a data value. So, for events with multiple data values, the CSV file will have x rows per event, where x is the number of data values in that event.

CSV payload example

Votre fichier CSV peut se présenter comme suit :

event,status,program,programStage,enrollment,orgUnit,occurredAt,scheduledAt,geometry,latitude,longitude,followUp,deleted,createdAt,createdAtClient,updatedAt,updatedAtClient,completedBy,completedAt,updatedBy,attributeOptionCombo,attributeCategoryOptions,assignedUser,dataElement,value,providedElsewhere,storedByDataValue,updatedAtDataValue,createdAtDataValue
A7rzcnZTe2T,ACTIVE,eBAyeGv0exc,Zj7UnCAulEk,RiLEKhWHlxZ,DwpbWkiqjMy,2023-02-12T23:00:00Z,2023-02-12T23:00:00Z,"POINT (-11.468912037323042 7.515913998868316)",7.515913998868316,-11.468912037323042,false,false,2017-09-08T19:40:22Z,,2017-09-08T19:40:22Z,,,,,HllvX50cXC0,xYerKDKCefk,,F3ogKBuviRA,"[-11.4880220438585,7.50978830548003]",false,,2016-12-06T17:22:34.438Z,2016-12-06T17:22:34.438Z

Voir Événements CSV dans la section relative à l'exportation pour une définition plus détaillée des champs CSV.

Import summary

L'API du Tracker dispose de deux endpoints de base qui permettent aux consommateurs d'obtenir des commentaires sur leurs importations. Ces endpoints concernent plus les tâches d'importation asynchrone, mais ils sont également disponibles pour les importations synchrones. Ces endpoints renverront soit le journal de l'importation, soit le récapitulatif de l'importation lui-même.

Remarque

Ces endpoints s'appuient sur des informations stockées dans la mémoire de l'application. Cela signifie que les informations seront indisponibles après certaines situations, telle qu'un redémarrage de l'application ou après un grand nombre de requêtes d'importation qui commencent après celle-ci.

Après avoir soumis une requête d'importation Tracker, nous pouvons accéder aux endpoints suivants afin de surveiller la progression de la tâche en fonction des journaux:

GET /tracker/jobs/{uid}
Paramètre de requête Description Exemple
uid The UID of a tracker import job eAjkbUGBcZ5

Request example

GET /tracker/jobs/PQK63sMwjQp

Response example

[
  {
    "uid": "PQK63sMwjQp",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.370",
    "message": "Import complete with status OK, 0 created, 0 updated, 0 deleted, 0 ignored",
    "completed": true,
    "id": "PQK63sMwjQp"
  },
  {
    "uid": "XIfTJ1UUNcd",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.369",
    "message": "PostCommit",
    "completed": false,
    "id": "XIfTJ1UUNcd"
  },
  {
    "uid": "uCG4FNJLLBJ",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.364",
    "message": "Commit Transaction",
    "completed": false,
    "id": "uCG4FNJLLBJ"
  },
  {
    "uid": "xfOUv2Lk2MC",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.361",
    "message": "Running Rule Engine Validation",
    "completed": false,
    "id": "xfOUv2Lk2MC"
  },
  {
    "uid": "cSPfA776obb",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:16.325",
    "message": "Running Rule Engine",
    "completed": false,
    "id": "cSPfA776obb"
  },
  {
    "uid": "t9gOjotekQt",
    "level": "INFO",
    "category": "TRACKER_IMPORT_JOB",
    "time": "2024-03-19T13:18:15.837",
    "message": "Tracker import started",
    "completed": false,
    "dataType": "PARAMETERS",
    "data": {
      "userId": "xE7jOejl9FI",
      "importMode": "VALIDATE",
      "idSchemes": {
        "dataElementIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "orgUnitIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "programIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "programStageIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "idScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "categoryOptionComboIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        },
        "categoryOptionIdScheme": {
          "idScheme": "UID",
          "attributeUid": null
        }
      },
      "importStrategy": "CREATE_AND_UPDATE",
      "atomicMode": "ALL",
      "flushMode": "AUTO",
      "validationMode": "FULL",
      "skipPatternValidation": false,
      "skipSideEffects": false,
      "skipRuleEngine": false,
      "filename": null,
      "reportMode": "ERRORS"
    },
    "id": "t9gOjotekQt"
  }
]

De plus, le endpoint suivant renverra le récapitulatif de la tâche d’importation. Ce récapitulatif ne sera disponible qu'une fois l'importation terminée:

GET /tracker/jobs/{uid}/report
Paramètre de requête Description Exemple
path /{uid} ID of an existing tracker import job. ABCDEF12345
Mode de rapport Level of detail for the report. COMPLET, ERREURS, AVERTISSEMENTS

Request example

GET /tracker/jobs/mEfEaFSCKCC/report

Response example

La charge de la réponse est la même que celle renvoyée après une requête d'importation synchrone.

Remarque

Les deux endpoints sont principalement utilisés pour l'importation asynchrone. Cependant, GET /tracker/jobs/{uid} devrait également fonctionner pour les requêtes synchrones car au final il utilise le même processus d'importation et la même journalisation que les requêtes asynchrones.

Import summary response

La structure globale des récapitulatifs d'importation se présente comme suit, en fonction du mode de rapport faisant l'objet de la requête :

{
  "status": "OK",
  "validationReport": {
    "errorReports": [],
    "warningReports": []
  },
  "stats": {
    "created": 3,
    "updated": 0,
    "deleted": 0,
    "ignored": 0,
    "total": 3
  },
  "bundleReport": {
    "typeReportMap": {
      "EVENT": {
        "trackerType": "EVENT",
        "stats": {
          "created": 1,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 1
        },
        "objectReports": [
          {
            "trackerType": "EVENT",
            "uid": "gTZBPT3Jq39",
            "errorReports": []
          }
        ]
      },
      "ENROLLMENT": {
        "trackerType": "ENROLLMENT",
        "stats": {
          "created": 1,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 1
        },
        "objectReports": [
          {
            "trackerType": "ENROLLMENT",
            "uid": "ffcvJvWjiNZ",
            "errorReports": []
          }
        ]
      },
      "RELATIONSHIP": {
        "trackerType": "RELATIONSHIP",
        "stats": {
          "created": 0,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 0
        },
        "objectReports": []
      },
      "TRACKED_ENTITY": {
        "trackerType": "TRACKED_ENTITY",
        "stats": {
          "created": 1,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 1
        },
        "objectReports": [
          {
            "trackerType": "TRACKED_ENTITY",
            "uid": "aVcGf9iO8Xp",
            "errorReports": []
          }
        ]
      }
    }
  }
}

Statut

La propriété statut du récapitulatif d'importation indique l'état global de l'importation. Si aucune erreur ou avertissement n'est signalé(e) lors de l'importation, le statut est OK. Par contre, si une erreur ou un avertissement est signalé(e) lors de l'importation, le statut devient ERREUR ou AVERTISSEMENT.

Le statut dépend de la présence du Rapport de validation le plus important. ERREUR est le plus important, suivi de AVERTISSEMENT et enfin OK. Cela signifie que le statut est ERREUR si une seule erreur est détectée lors de l'importation, quel que soit le nombre d'avertissements.

Remarque

Si l'importation est faite selon le mode atomique "OBJET", où les données sont importées sans erreurs de validation, le statut sera toujours ERREUR si des erreurs sont détectées.

Validation report

Le Rapport de validation peut inclure des Rapports d'erreur et des Rapports d'avertissement si des erreurs ou des avertissements étaient présents lors de l'importation. Lorsqu'ils sont présents, ils fournissent une liste détaillée des erreurs ou avertissements rencontrés.

Prenons l'exemple d'une erreur de validation lors de l'importation d'une ENTIÉE_SUIVIE :

{
  "validationReport": {
    "errorReports": [
      {
        "message": "Could not find TrackedEntityType: `Q9GufDoplCL`.",
        "errorCode": "E1005",
        "trackerType": "TRACKED_ENTITY",
        "uid": "Kj6vYde4LHh"
      }
    ],
    "warningReports": [
    ]
  }
}

The report contains a message and a code describing the actual error (See the error codes section for more information about errors). Additionally, the report includes the trackerType and uid, which aims to describe where in the data the error was found. In this case, there was a TRACKED_ENTITY with the uid Kj6vYde4LHh, which had a reference to a tracked entity type that was not found.

Remarque

Les uid des objets trackers servent de noms à ces objets dans la charge. Par exemple, l'uid d'une entité suivie dans la charge serait "trackedEntity". La même chose s'applique aux inscriptions, aux événements et aux relations qui portent respectivement les noms "enrollment", "event" et "relationship".

Si aucun uid n'est fourni dans la charge, le processus d'importation générera de nouveaux uids. Cela signifie que le rapport d'erreur peut faire référence à un uid qui n'existe pas dans votre charge.

Les erreurs signalent des problèmes avec la charge que l'importateur ne peut pas contourner. Toute erreur empêchera l'importation de ces données. Les avertissements, en revanche, sont des problèmes qui peuvent être contournés en toute sécurité, mais dont l'utilisateur doit être informé. Les avertissements ne bloquent pas l'importation des données.

Statistiques

The stats object provides an overview of the import operation. After an import is completed, these will be the actual counts displaying how many objects were created, updated, deleted and ignored.

Exemple de réponse :

{
  "stats": {
    "created": 2,
    "updated": 2,
    "deleted": 1,
    "ignored": 5,
    "total": 10
  }
}

The created field refers to how many new objects were created. In general, objects without an existing uid in the payload will be treated as new objects.

The updated field refers to the number of objects updated. If an object has a uid set in the payload, it will be treated as an update as long as that same uid exists in the database.

The deleted field refers to the number of objects deleted during the import. Deletion only happens when the import is configured to delete data and only then when the objects in the payload have existing uids set.

The ignored field refers to objects that were not persisted. Objects can be ignored for several reasons, for example trying to create something that already exists. Ignores should always be safe, so if something was ignored, it was not necessary, or it was due to the configuration of the import.

Bundle report

Une fois l'importation terminée, le bundleReport contient tous les objets tracker importés.

An example for TRACKED_ENTITY:

{
  "bundleReport": {
    "typeReportMap": {
      "TRACKED_ENTITY": {
        "trackerType": "TRACKED_ENTITY",
        "stats": {
          "created": 1,
          "updated": 0,
          "deleted": 0,
          "ignored": 0,
          "total": 1
        },
        "objectReports": [
          {
            "trackerType": "TRACKED_ENTITY",
            "uid": "aVcGf9iO8Xp",
            "errorReports": []
          }
        ]
      }
    }
  }
}

Each type of tracker object will be reported, and each has its own stats and objectReports. These objectReports will provide details about each imported object, like their type, their uid, and any error or warning reports if applicable.

Message

Si l'importation se termine brusquement, le message va contenir des informations supplémentaires sur ce qui s'est passé.

Import summary report level

A import summary report can be retrieved using a specific reportMode parameter in a GET /tracker/jobs/{uid}/report request. By default the endpoint will return an importSummary with reportMode ERROR.

Valeur Description
FULL Renvoie tout à partir de AVERTISSEMENTS, en plus des timingsStats
WARNINGS Renvoie tout à partir de ERREURS, en plus de warningReports (rapports d'avertissements) dans validationReports (rapports de validation)
ERRORS (default) Renvoie uniquement errorReports (rapports d'erreurs) dans validationReports

De plus, tous les reportModes (modes de rapports) renverront statut, statistiques, bundleReport et message le cas échéant.

Error codes

There are various error codes for different error scenarios. The following table has the list of error codes thrown from the Tracker API, along with the error messages and some additional descriptions. The placeholders in the error messages ({0},{1},{2}..) are usually uids unless otherwise specified.

Code d'erreur Message d'erreur Description
E1000 L'utilisateur : {0} n'a pas d'accès en écriture sur l'unité d'organisation : {1}. Cela signifie que l'unité d'organisation {1} ne fait pas partie du champ de saisie de l'utilisateur {0} pour que l'opération d'écriture soit autorisée.
E1001 L'utilisateur : {0} n'a pas d'accès en écriture de données sur le Type d'entité suivie : {1}. The error occurs when the user is not authorized to create or modify data of the TrackedEntityType {1}
E1002 L'entité suivie {0} existe déjà. Cette erreur se produit lorsque l'on essaie de créer une nouvelle entité suivie avec un uid déjà existant. Veillez à utiliser un nouvel uid lors de l'ajout d'une nouvelle entité suivie.
E1003 User: {0}, has no write access to TrackedEntity: {1}.
E1005 Impossible de trouver le Type d'entité suivie : {0}. L'erreur se produit lorsque l'on essaie de récupérer un Type d'entité suivie qui n'existe pas avec l'uid {0}. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à ce Type d'entité suivie.
E1006 L'attribut : {0} n'existe pas. L'erreur se produit lorsque le système n'a pas pu trouver un attribut d'entité suivie correspondant avec l'uid {0}. Cela peut également signifier que l'utilisateur n'a pas accès à l'attribut d'entité suivie.
E1007 Erreur de validation du type de valeur d'attribut : {0} ; Erreur : {1}. Incompatibilité entre le type de valeur d'un attribut d'entité suivie et la valeur d'attribut qui lui est fournie. L'erreur de validation réelle sera affichée dans {1}.
E1008 L'étape de programme {0} n'a pas de référence à un programme. Vérifiez la configuration de l'étape du programme
E1009 La ressource de fichier : {0} a déjà été attribuée à un autre objet. L'uid de ressource de fichier {0} est déjà attribué à un autre objet du système.
E1010 Impossible de trouver le programme : {0} lié à l'événement. Le système n'a pas pu trouver un programme avec l'uid {0} spécifié dans la charge utile de l'événement. Cela peut également signifier que l'utilisateur connecté n'a pas accès à ce programme.
E1011 Impossible de trouver l'unité d'organisation : {0} lié à l'événement. Le système n'a pas pu trouver une unité d'organisation avec l'uid {0} spécifié dans la charge utile de l'événement.
E1012 La géométrie n'est pas conforme au FeatureType (type de fonctionnalité) : {0}. Le type de fonctionnalité fourni est soit NONE (aucun), soit incompatible avec la valeur géométrique fournie.
E1013 Impossible de trouver le ProgramStage (étape de programme) : {0} lié à l'événement. Le système n'a pas pu trouver une étape de programme avec l'uid {0} spécifié dans la charge utile de l'événement. Cela peut également signifier que l'utilisateur connecté n'a pas accès à l'étape de programme.
E1014 Un programme identifié {0} est un programme sans enregistrement. Aucune inscription ne peut être créée dans un programme sans enregistrement. Les inscriptions ne peuvent être créées que pour les programmes avec des enregistrements.
E1015 L'entité suivie : {0} a déjà une inscription active dans le programme {1}. Il est impossible de s'inscrire à un programme si une autre inscription active existe déjà pour le programme. L’inscription active devra au moins être terminée au préalable.
E1016 L'entité suivie : {0} a déjà une inscription active dans le programme: {1}, et ce programme n'autorise qu'une seule inscription . Conformément à la configuration du programme {1}, une entité suivie ne peut être inscrite qu'une seule fois à ce programme. Il semble que l'entité suivie {0} ait déjà une inscription ACTIVE ou TERMINÉE dans ce programme. Une autre inscription ne peut donc pas être ajoutée.
E1018 L'attribut : {0} est obligatoire dans le programme {1} mais il n'est pas déclaré dans l'inscription {2}. La valeur de l'attribut est manquante dans la charge utile, pour un attribut défini comme obligatoire pour un programme. Assurez-vous que les valeurs des attributs obligatoires sont fournies dans la charge utile.
E1019 Seuls les attributs du programme sont autorisés pour l'inscription ; attributs non valides : {0}. L'uid d'attribut {0} spécifié dans la charge utile d'inscription n'est pas associé au programme.
E1020 Enrollment date: {0}, cannot be a future date. Il est impossible de créer une inscription à une date ultérieure à moins que le Programme ne le permette dans sa configuration.
E1021 Incident date: {0}, cannot be a future date. La date d'incidence ne peut pas être une date ultérieure à moins que le Programme ne le permette dans sa configuration.
E1022 L'entité suivie {0} doit avoir le même type d'entité suivie que le programme {1}. Le programme est configuré pour accepter un UID de type d'entité suivie différent de celui fourni dans la charge utile d’inscription.
E1023 DisplayIncidentDate is true but property occurredAt is null. Program is configured with DisplayIncidentDate but it is null in the payload.
E1025 Property enrolledAt is null. EnrolledAt Date is mandatory for an Enrollment. Make sure it is not null.
E1029 L'unité d'organisation Évènement identifiée {0} et le Programme {1} ne correspondent pas. La charge utile de l'événement utilise un programme {1} qui n'est pas configuré pour être accessible par l'unité d'organisation {0}.
E1030 L'Événement {0} existe déjà. Cette erreur se produit lorsque l'on essaie d'ajouter un nouvel événement avec un uid déjà existant. Veillez à utiliser un nouvel uid lors de l'ajout d'un nouvel événement.
E1031 Event occurredAt date is missing. OccurredAt property is either null or has an invalid date format in the payload.
E1032 L'Événement {0} n'existe pas.
E1033 La valeur d'inscription de l'Événement {0} est NULLE.
E1039 L'Étape de programme {0} n'est pas répétable et un événement existe déjà. Un événement existe déjà pour l'étape de programme de l’inscription. Étant donné que l'étape de programme est configuré pour être non répétable, un autre événement ne peut pas être ajouté pour la même étape de programme.
E1041 L'unité d'organisation Inscription {0} et le Programme {1} ne correspondent pas. La charge utile de l'inscription contient un programme {1} qui n'est pas configuré pour être accessible par l'unité d'organisation {0}.
E1043 La date de fin de l'événement : {0}, a expiré ; il n'est donc plus possible d'apporter des modifications à cet événement. Un utilisateur qui ne dispose pas de l'autorité 'F_EDIT_EXPIRED' ne peut pas mettre à jour un événement dont les jours d'expiration, tels que configurés dans son programme, sont dépassés.
E1046 L'Événement : {0}, doit avoir au moins une date (d'événement ou de programmation). Either of occurredAt or scheduledAt property should be present in the Event payload.
E1047 La date de l'événement : {0}, appartient à une période expirée. Un tel événement ne peut être créé. Event occurredAt or scheduledAt has a value that is earlier than the PeriodType start date.
E1049 Impossible de trouver l'unité d'organisation : {0} lié à l'entité suivie. Le système n'a pas trouvé une Unité d'Organisation avec l'uid {0}.
E1050 La date à laquelle l'événement est programmé (ScheduledAt) est manquante. La propriété "ScheduledAt" dans la charge utile de l'événement est soit manquante, soit son format de date est invalide.
E1051 Event: {0}, completedAt must be null when status is {1}. Event completedAt can only be passed in the payload if status is COMPLETED
E1052 Enrollment: {0}, completedAt must be null when status is {1}. Enrollment completedAt can only be passed in the payload if status is COMPLETED
E1054 La combinaison d'options d'attributs {0} n'est pas dans la combinaison de catégories de programmes d'événements {1}.
E1055 La combinaison d'options d'attribut (AttributeOptionCombo) par défaut n'est pas autorisée car le programme ne dispose pas d'une combinaison de catégories (CategoryCombo) par défaut. Le programme est configuré pour contenir une combinaison de catégories différente de celle par défaut, mais la requête utilise la combinaison d'options d'attribut par défaut.
E1056 La date d'événement : {0}, est antérieure à la date de début : {1}, pour l'option d'attribut (AttributeOption) : {2}. L'option de catégorie a une date de début configurée ; la date de l'événement dans la charge utile ne peut pas être antérieure à cette date de début.
E1057 La date d'événement : {0}, est postérieure à la date de fin : {1}, pour l'option d'attribut (AttributeOption) : {2}. L'option de catégorie a une date de fin configurée ; la date de l'événement dans la charge utile ne peut pas être postérieure à cette date de fin.
E1063 L'entité suivie {0} n'existe pas. L'erreur se produit lorsque l'on essaie de récupérer une Entité suivie qui n'existe pas avec l'uid {0}. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à cette Entité suivie.
E1064 Valeur d'attribut non unique {0} pour l'attribut {1} La valeur de l'attribut doit être unique dans le champ d'application défini. L'erreur indique que la valeur de l'attribut existe déjà pour une autre Entité suivie.
E1068 Impossible de trouver l'entité suivie : {0}, lié à l'inscription. Le système n'a pas pu trouver l'entité suivie spécifiée dans la charge utile d'inscription. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à cette entité suivie.
E1069 Impossible de trouver le programme : {0} lié à l'inscription. Le système n'a pas pu trouver le programme spécifié dans la charge utile d'inscription. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à ce programme.
E1070 Impossible de trouver l'unité d'organisation : {0} lié à l'inscription. Le système n'a pas pu trouver l'unité d'organisation spécifiée dans la charge utile d'inscription.
E1074 FeatureType (Type de fonctionnalité) est manquant.
E1075 L'attribut : {0}, n'a pas d'uid.
E1076 {0} {1} est obligatoire et ne peut pas être nul
E1077 La valeur du texte de l'attribut : {0}, dépasse la longueur maximale autorisée : {0}.
E1079 Événement : {0}, le programme : {1} est différent du programme défini dans l'inscription {2}.
E1080 L'Inscription {0} existe déjà. This error is thrown when trying to create a new Enrollment with an already existing uid. Make sure a new uid is used when adding a new Enrollment.
E1081 L'Inscription {0} n'existe pas. L'erreur se produit lorsque l'on essaie de récupérer une Inscription qui n'existe pas avec l'uid {0}. Cela peut également signifier que l'utilisateur n'a pas d'accès en lecture à cette Inscription.
E1082 L'Événement : {0}, est déjà supprimé et ne peut donc plus être modifié. Si l’événement est supprimé de façon réversible (soft delete), aucune modification n’est autorisée sur cet événement.
E1083 L'Utilisateur : {0}, n'est pas autorisé à modifier les événements terminés. Seul un super utilisateur ou un utilisateur disposant de l'autorité "F_UNCOMPLETE_EVENT" peut modifier les événements terminés. Les événements terminés sont les événements dont le statut est "TERMINÉ".
E1089 L'Événement : {0}, fait référence à une Étape de programme {1} qui n'appartient pas au Programme {2}. L’uid de l'Étape de programme et l’uid de Programme présent dans la charge utile de l’Événement sont incompatibles.
E1090 L'attribut : {0} est obligatoire dans le type d'entité suivie {1} mais il n'est pas déclaré dans l'entité suivie {2}. Des valeurs manquent dans la charge utile pour les attributs de type d'entité suivie obligatoires.
E1091 L'utilisateur : {0} n'a pas d'accès en écriture de données sur le Programme : {1}. La configuration du partage du Programme est telle que l'utilisateur n'a pas d'accès en écriture pour ce programme.
E1095 L'utilisateur : {0} n'a pas d'accès en écriture de données sur l'Étape de programme : {1}. La configuration du partage de l'Étape de programme est telle que l'utilisateur n'a pas d'accès en écriture pour cette Étape de programme.
E1096 L'utilisateur : {0} n'a pas d'accès en lecture de données sur le Programme : {1}. La configuration du partage du Programme est telle que l'utilisateur n'a pas d'accès en lecture pour ce programme.
E1099 L'utilisateur : {0} n'a pas d'accès en écriture sur l'Option de catégorie : {1}. La configuration du partage de l'Option de catégorie est telle que l'utilisateur n'a pas d'accès en écriture pour cette Option de catégorie.
E1100 L'Utilisateur: {0}, ne dispose pas de l'autorité 'F_TEI_CASCADE_DELETE' pour supprimer l'entité suivie : {1}. Certaines Inscriptions n'ont pas été supprimées pour cette Entité suivie. Si l'utilisateur ne dispose pas de l'autorité "F_TEI_CASCADE_DELETE", ces inscriptions devront d'abord être supprimées explicitement avant qu'il puisse supprimer l'Entité suivie.
E1102 L'Utilisateur : {0}, n'a pas accès à la combinaison de l'Entité suivie : {1} et du Programme : {2}. Cette erreur se produit lorsque l'unité d'organisation de l'utilisateur ne possède pas cette entité suivie, pour ce programme spécifique. L'unité d'organisation propriétaire de la combinaison Entité Suivie-Programme (TrackedEntity-Program) doit se trouver dans le champ de saisie (dans certains cas, dans le champ de recherche) de l'utilisateur.
E1103 L'Utilisateur : {0}, ne dispose pas de l'autorité 'F_ENROLLMENT_CASCADE_DELETE' pour supprimer l'Inscription : {1}. Certains Événements n'ont pas été supprimées pour cette Inscription. Si l'utilisateur ne dispose pas de l'autorité 'F_ENROLLMENT_CASCADE_DELETE', ces Événements devront d'abord être supprimées explicitement avant qu'il puisse supprimer l'Inscription.
E1104 L'utilisateur : {0} n'a pas d'accès en lecture de données sur le programme : {1} et le type d'entité suivie : {2}. La configuration du partage du Type d'entité suivie associé au Programme est telle que l'utilisateur n'a pas d'accès en lecture de données pour ce type d'entité suivie.
E1112 La Valeur d'attribut : {0}, est définie sur 'confidentiel' mais le système n'est pas correctement configuré pour crypter les données. Soit les fichiers JCE sont manquants, soit la propriété de configuration encryption.password peut être manquante dans dhis.conf.
E1113 L'Inscription : {0}, est déjà supprimée et ne peut donc plus être modifiée. Si l'inscription est supprimée de façon réversible, aucune modification n’est autorisée sur cette inscription.
E1114 L'Entité suivie : {0}, est déjà supprimée et ne peut donc plus être modifiée. Si l'entité suivie est supprimée de façon réversible, aucune modification n’est autorisée sur cette entité suivie.
E1115 Impossible de trouver la Combinaison d'options de catégorie : {0}.
E1116 Impossible de trouver la l'Option de catégorie : {0}. Cela peut également signifier que l'utilisateur n'a pas accès à cette option de catégorie.
E1117 La Combinaison d'options de catégorie n'existe pas pour la combinaison de catégories et les options de catégorie fournies : {0}.
E1118 L'utilisateur assigné {0} n'est pas un uid valide.
E1119 Une note de Tracker avec l'uid {0} existe déjà.
E1120 L'Étape de programme {0} n'autorise pas l'assignation d'utilisateurs La charge utile d'événement a attribué un identifiant d'utilisateur (uid) mais l'étape de programme n’est pas configurée pour autoriser l'assignation d’utilisateurs.
E1121 La propriété d'entité suivie requise est manquante : {0}.
E1122 La propriété d'inscription requise est manquante : {0}.
E1123 La propriété d'événement requise est manquante : {0}.
E1124 La propriété de relation requise est manquante : {0}.
E1125 La valeur {0} n'est pas un code d'option valide dans l'ensemble d'options {1}
E1126 Il n'est pas autorisé de mettre à jour la propriété de l'entité suivie : {0}.
E1127 Il n'est pas autorisé de mettre à jour la propriété d'inscription : {0}.
E1128 Il n'est pas autorisé de mettre à jour la propriété de l'événement : {0}.
E1300 Généré par la règle de programme ({0}) - {1}
E1301 Généré par la règle de programme ({0}) - L'élément de données obligatoire {1} n'est pas présent
E1302 DataElement {0} is not valid: {1}
E1303 Mandatory DataElement {0} is not present
E1304 DataElement {0} is not a valid data element
E1305 DataElement {0} is not part of {1} program stage
E1306 Généré par la règle de programme ({0}) - L'attribut obligatoire {1} n'est pas présent
E1307 Généré par la règle de programme ({0}) - Impossible d'attribuer une valeur à l'élément de données {1}. La valeur fournie doit être vide ou correspondre à la valeur calculée {2}
E1308 Généré par la règle de programme ({0}) - L'élément de données {1} est remplacé dans l'événement {2}
E1309 Généré par la règle de programme ({0}) - Impossible d'attribuer une valeur à l'attribut {1}. La valeur fournie doit être vide ou correspondre à la valeur calculée {2}
E1310 Generated by program rule ({0}) - Attribute {1} is being replaced in te {2}
E1313 L'événement {0} d'une inscription ne renvoie pas à une entité suivie existante. Les données de votre système sont peut-être corrompues. Il s'agit d'une anomalie dans les données existantes, où les inscriptions peuvent ne pas faire référence à une entité suivie.
E1314 Generated by program rule ({0}) - DataElement {1} is mandatory and cannot be deleted.
E1315 Status {0} does not allow defining data values. Statuses that do allow defining data values are: {1}
E1316 No event can transition from status {0} to status {1}.
E1317 Generated by program rule ({0}) - Attribute {1} is mandatory and cannot be deleted.
E4000 La relation : {0} ne peut pas être reliée à elle-même
E4001 L'élément de relation {0} n'est pas valide pour la relation {1}  : un élément ne peut être relié qu'à une seule entité Tracker.
E4006 Impossible de trouver le Type de relation : {0}.
E4010 La contrainte du type de relation {0} nécessite un {1} mais un {2} a été trouvé .
E4012 Impossible de trouver {0} : {1}, liés à la relation.
E4014 La contrainte du type de relation {0} nécessite une entité suivie de type {1} mais c'est un type {2} qui a été trouvé.
E4015 La relation {0} existe déjà.
E4016 La relation {0} n'existe pas.
E4017 La relation: {0}, est déjà supprimé et ne peut donc plus être modifié.
E4018 La relation : {0}, liant {1} : {2} à {3} : {4} existe déjà.
E4020 User: {0}, has no write access to relationship: {1}.
E5000 "{0}" {1} ne peut pas être maintenu car "{2}" {3} référencé par lui ne peut pas être maintenu. L'importateur ne peut pas maintenir un objet tracker car une référence ne peut pas être maintenue.
E9999 N/A Message d'erreur non défini.

Validation

Lors de l'importation de données à l'aide de l'importateur du Tracker, une série de validations est effectuée pour garantir la validité des données. Cette section décrit certains types de validation effectués afin que vous puissiez mieux comprendre un échec de validation lors de votre importation.

Propriétés requises

Each of the tracker objects has a few required properties that need to be present when importing data. For an exhaustive list of required properties, have a look at the tracker objects section.

Lors de la validation des propriétés requises, nous parlons généralement de références à d'autres données ou métadonnées. Dans ces cas, on note trois critères principaux :

  1. La référence est présente dans la charge utile et est non nulle.
  2. La référence indique le bon type de données et existe dans la base de données
  3. L'utilisateur est autorisé à voir la référence

Si la première condition n'est pas remplie, l'importation échouera et un message indiquant une référence manquante sera généré. Cependant, si la référence indique un objet qui n'existe pas ou auquel l'utilisateur n'a pas accès, le message généré indiquera que la référence n'a pas été trouvée.

Formats

Certaines propriétés des objets Tracker requièrent un format spécifique. Lors de l'importation des données, chacune de ces propriétés est validée au regard du format attendu et renvoie des erreurs en fonction de la propriété dont le format est incorrect. Voici quelques exemples de propriétés validées de cette manière :

  • Les identifiants d'utilisateur ou UID (Ils couvrent toutes les références à d’autres données ou métadonnées dans DHIS2.)
  • Dates
  • Géométrie (Les coordonnées doivent correspondre au format spécifié par son type)

Accès des utilisateurs

All data imported will be validated based on the metadata (sharing) and the organisation units (scopes) referenced in the data. You can find more information about sharing and organisation unit scopes in the following sections.

Sharing is validated at the same time as references are looked up in the database. Metadata outside of the user access scope will be treated as if it does not exist. The import will validate any metadata referenced in the data.

Organisation units, on the other hand, serve a dual purpose. It will primarily make sure that data can only be imported when imported for an organisation unit the user has within their capture scope. Secondly, organisation units are also used to restrict what programs are available. That means if you are trying to import data for an organisation unit that does not have access to the Program you are importing, the import will be invalid.

Les utilisateurs disposant de l'autorité TOUS ne sont pas affectés par les limites des champs d'application de partage et d'unité d'organisation lorsqu'ils importent des données. Cependant, ils ne peuvent pas importer d'inscriptions dans des unités d'organisation qui n'ont pas accès au programme d'inscription.

Attributes and data values

Les attributs et les valeurs de données font partie respectivement d'une entité suivie et d'un événement. Cependant, les attributs peuvent être liés à une entité suivie soit par son type (TrackedEntityType), soit par son programme (Program). Les attributs peuvent également être uniques.

La première validation effectuée lors de l'importation consiste à s'assurer que la valeur fournie pour un attribut ou un élément de données est conforme au type de valeur attendu. Par exemple, supposons que vous importiez une valeur pour un élément de données de type numérique. Dans ce cas, la valeur doit être numérique. Toute erreur liée à une non-concordance entre un type et une valeur se traduira par le même code d'erreur, mais avec un message spécifique lié au type de violation.

Mandatory attributes and data values are also checked on creation, on update mandatory attributes and data values are not required in the payload. Currently, removing mandatory attributes and data values is never allowed. Some use-cases require values to be sent separately, while others require all values to be sent as one. Programs can be configured to either validate mandatory attributes ON_COMPLETE or ON_UPDATE_AND_INSERT to accommodate these use-cases.

The import will validate unique attributes at the time of import. That means as long as the provided value is unique for the attribute in the whole system, it will pass. However, if the unique value is found to be used by any other tracked entity other than the one being imported, it will fail.

Configuration

Les dernières validations dans l'importateur sont des validations basées sur la configuration des métadonnées pertinentes par l'utilisateur. Pour plus d'informations sur chaque configuration, consultez les sections correspondantes. Trouvez ci-après quelques exemples de validations configurables :

  • Feature type (geometry)
  • Événements attribuables à l'utilisateur
  • Autoriser les dates futures
  • Inscrire une fois

Ces configurations apporteront des modifications supplémentaires à la manière dont la validation est effectuée lors de l'importation.

Generated tracked entity attributes

Tracked entity attributes that use automatic generation of unique values have three endpoints utilized by apps for generating and reserving these values.

Required values

A TextPattern may include variables that change based on different factors. Some of these factors are unknown to the server; thus, the values for these variables must be supplied when generating and reserving values.

This endpoint returns a map of required and optional values that the server will inject into the TextPattern when generating new values. Required variables must be supplied for generation, whereas optional variables should only be provided if necessary.

GET /api/trackedEntityAttributes/Gs1ICEQTPlG/requiredValues
{
  "REQUIRED": [
    "ORG_UNIT_CODE"
  ],
  "OPTIONAL": [
    "RANDOM"
  ]
}

Point d'extrémité de de génération de valeur

Online web apps and other clients can use this endpoint to generate a unique value for immediate use. The generated value is guaranteed to be unique at the time of generation and is reserved for 3 days. If your TextPattern includes required values, they can be passed as parameters.

To override the expiration time, add ?expiration=<number-of-days> to the request.

GET /api/trackedEntityAttributes/Gs1ICEQTPlG/generate?ORG_UNIT_CODE=OSLO
{
  "ownerObject": "TRACKEDENTITYATTRIBUTE",
  "ownerUid": "Gs1ICEQTPlG",
  "key": "RANDOM(X)-OSL",
  "value": "C-OSL",
  "created": "2018-03-02T12:01:36.680",
  "expiryDate": "2018-03-05T12:01:36.678"
}

Point d'extrémité de génération et de réservation de valeur

Offline clients can use this endpoint to reserve a number of unique IDs for later use when registering new tracked entities. The number of IDs to generate can be specified with the numberToReserve parameter (default is 1).

To override the default expiration time of 60 days, add ?expiration=<number-of-days> to the request.

GET /api/trackedEntityAttributes/Gs1ICEQTPlG/generateAndReserve?numberToReserve=3&ORG_UNIT_CODE=OSLO
[
  {
    "ownerObject": "TRACKEDENTITYATTRIBUTE",
    "ownerUid": "Gs1ICEQTPlG",
    "key": "RANDOM(X)-OSL",
    "value": "B-OSL",
    "created": "2018-03-02T13:22:35.175",
    "expiryDate": "2018-05-01T13:22:35.174"
  },
  {
    "ownerObject": "TRACKEDENTITYATTRIBUTE",
    "ownerUid": "Gs1ICEQTPlG",
    "key": "RANDOM(X)-OSL",
    "value": "Q-OSL",
    "created": "2018-03-02T13:22:35.175",
    "expiryDate": "2018-05-01T13:22:35.174"
  },
  {
    "ownerObject": "TRACKEDENTITYATTRIBUTE",
    "ownerUid": "Gs1ICEQTPlG",
    "key": "RANDOM(X)-OSL",
    "value": "S-OSL",
    "created": "2018-03-02T13:22:35.175",
    "expiryDate": "2018-05-01T13:22:35.174"
  }
]

Valeurs réservées

Les valeurs réservées ne sont actuellement pas accessibles via l'API, mais elles sont renvoyées par les points d'extrémité generate (génération) et generate And Reserve (génération et réservation). Le tableau suivant explique les propriétés de l'objet de valeur réservée :

Tableau : Valeurs réservées

Propriété Description
ownerObject Le type de métadonnées référencé lors de la génération et de la réservation de la valeur. Actuellement, seul TRACKEDENTITYATTRIBUTE (attribut d'entité suivie) est pris en charge.
ownerUid L'uid de l'objet de métadonnées référencé lors de la génération et de la réservation de la valeur.
key Une valeur partiellement générée où les segments générés ne sont pas encore ajoutés.
value La valeur réservée. C'est la valeur que vous envoyez au serveur lorsque vous stockez des données.
created Date et heure à laquelle la réservation a été effectuée
expiryDate Date et heure à partir de laquelle la réservation ne sera plus valable.

Les réservations expirées sont supprimées quotidiennement. Si un modèle change, les valeurs déjà réservées seront acceptées lors du stockage des données, même si elles ne correspondent pas au nouveau modèle, tant que la réservation n'a pas expiré.

Program rules

Users can configure program rules, which adds conditional behavior to tracker forms. In addition to running these rules in the tracker apps, the tracker importer will also run a selection of these rules. Since the importer is also running these rules, we can ensure an additional level of validation.

Toutes les actions de règles de programme ne sont pas prises en charge, car elles ne sont adaptées qu'à une présentation de type « frontend ». Une liste complète des actions de règles de programme prises en charge est présentée ci-dessous.

Action de la règle du programme Pris en charge
DISPLAYTEXT
DISPLAYKEYVALUEPAIR
HIDEFIELD
HIDESECTION
ASSIGN X
SHOWWARNING X
SHOWERROR X
WARNINGONCOMPLETION X
ERRORONCOMPLETION X
CREATEEVENT
SETMANDATORYFIELD X
SENDMESSAGE X
SCHEDULEMESSAGE X

Program rules are evaluated in the importer in the same way they are evaluated in the tracker apps. To summarize, the following conditions are considered when enforcing the program rules:

  • La règle de programme doit être liée aux données importées ; par exemple, une étape de programme ou un élément de données.
  • The program rule condition must be evaluated to true.

Les résultats des règles de programme dépendent des actions définies dans ces règles :

  • Program rule actions may end in 2 different results: warnings or errors.
  • Les erreurs feront échouer la validation, tandis que les avertissements seront rapportés sous forme de message dans le récapitulatif de l'importation.
    • SHOWWARNING and WARNINGONCOMPLETION actions can generate only warnings.
    • SHOWERROR, ERRORONCOMPLETION, and SETMANDATORYFIELD actions can generate only errors.
    • ASSIGN action can generate both Warnings and Errors.
    • Lorsque l'action attribue une valeur à un attribut/élément de données vide, un avertissement est généré.
    • Lorsque l'action attribue une valeur à un attribut/élément de données qui a déjà la même valeur à attribuer, un avertissement est généré.
    • When the action is assigning a value to an attribute/data element that already has a value and the value to be assigned is different, an error is generated unless the RULE_ENGINE_ASSIGN_OVERWRITE system setting is true.

Les règles de programme peuvent également entraîner des effets secondaires, telles que l'envoi et la planification de messages. Pour plus d’informations sur les actions non voulues, veuillez consulter la section suivante.

Note

Program rules can be skipped during import using the skipProgramRules parameter.

Side effects

Une fois qu'une importation est terminée, des tâches spécifiques peuvent être déclenchées du fait de cette importation. Ces tâches sont ce que nous appelons des « effets secondaires ». Ces tâches exécutent des opérations qui n'affectent pas l'importation elle-même.

Les effets secondaires sont des tâches qui s'exécutent séparément de l'importation, mais qui sont toujours déclenchées par une importation. Étant donné que les effets secondaires sont dissociés de l'importation, ils peuvent échouer même si l'importation réussit. De plus, les effets secondaires ne sont exécutés que lorsque l'importation réussit ; ils ne peuvent donc pas échouer dans l'autre sens.

Voici donc les effets secondaires actuellement pris en charge :

Effets secondaires Pris en charge Description
Tracker Notification X Updates can trigger notifications. Updates which trigger notifications are enrollment, event update, event or enrollment completion.
ProgramRule Notification X Les règles de programme peuvent déclencher des notifications. Notez que ces notifications font partie des effets des règles de programme qui sont générés via le moteur de règles de DHIS2.

Note

Certain configurations can control the execution of side effects. skipSideEffects flag can be set during the import to skip side effects entirely. This parameter can be useful if you import something you don't want to trigger notifications for, as an example.

Assign user to events

Certains processus bénéficient du fait que des événements soient traités comme des tâches, et pour cette raison, vous pouvez assigner un utilisateur à un événement.

L'assignation d'un utilisateur à un événement ne modifie pas l'accès ou les autorisations des utilisateurs, mais crée un lien entre l'événement et l'utilisateur. Lorsqu'un utilisateur est assigné à un événement, vous pouvez lancer des requêtes sur les événements à partir de l'API en utilisant le champ assignedUser (utilisateur attribué) en tant que paramètre.

Lorsque vous voulez assigner un utilisateur à un événement, fournissez simplement l'UID de cet utilisateur dans le champ assignedUser. Voir l'exemple suivant:

{
  "events": [
    {
      "event": "ZwwuwNp6gVd",
      "programStage": "nlXNK4b7LVr",
      "orgUnit": "O6uvpzGd5pu",
      "enrollment": "MNWZ6hnuhSw",
      "assignedUser" : "M0fCOxtkURr"
    }
  ]
}

In this example, the user with uid M0fCOxtkURr will be assigned to the event with uid ZwwuwNp6gVd. Only one user can be assigned to a single event.

Pour utiliser cette fonctionnalité, l'assignation d'utilisateurs doit être activée pour l'étape de programme concernée et l'uid fourni pour l'utilisateur doit renvoyer à un utilisateur existant et valide.

Tracker export

Les points d'extrémité de l'exportation Tracker vous permettent de récupérer les objets précédemment importés, à savoir :

  • Entités suivies
  • Événements
  • Enrollments
  • Relations

Note

  • All tracker export endpoints default to a JSON response content. CSV is only supported by tracked entities and events.
  • You can export a CSV file by adding the Accept header text/csv or application/csv to the request.
  • You can download in zip and gzip formats:
  • CSV for Tracked entities
  • JSON and CSV for Events
  • You can export a Gzip file by adding the Accept header application/csv+gzip for CSV or application/json+gzip for JSON.
  • You can export a Zip file by adding the Accept header application/csv+zip for CSV or application/json+zip for JSON.

Paramètres de requête courants

The following endpoints support standard pagination parameters.

  • Tracked entities: GET /api/tracker/trackedEntities
  • Events: GET /api/tracker/events
  • Enrollments: GET /api/tracker/enrollments
  • Relationships: GET /api/tracker/relationships

Paramètres de requête pour la pagination

Paramètre de requête Type Valeurs autorisées Description
page Entier Tout entier positif Numéro de page à renvoyer. La valeur par défaut est 1 .
pageSize Entier Tout entier positif Taille de la page. La valeur par défaut est 50.
totalPages Booléen true, false Indique s'il faut renvoyer le nombre total d'éléments et de pages. La valeur par défaut est false car l'obtention des totaux est une opération coûteuse.
pagination Booléen true, false Indique si la pagination doit être ignorée et si toutes les lignes doivent être renvoyées. La valeur par défaut est true, ce qui signifie que par défaut toutes les requêtes sont paginées, sauf si paging=false (c'est-à-dire si le paramètre "pagination" est défini sur "faux")
order Chaîne Comma-separated list of field and sort direction pairs in format field:sortDirection. Example: createdAt:desc

Entities are ordered by newest (internal ID descending) by default. Note: field is case sensitive. Valid sortDirections are asc and desc, where sortDirection is case insensitive, and sortDirection defaults to asc for fields or UIDs without explicit sortDirection.

Note

Be aware that performance is directly related to the amount of data requested. Greater page sizes will take more time to return.

Organisation unit selection modes

The available organisation unit selection modes are SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE and ALL. Each mode is explained in detail in this section.

Field filter responses

Tous les points d'extrémité d'exportation acceptent un paramètre fields (champs) qui contrôle les champs qui seront renvoyés dans la réponse JSON. Le paramètre fields accepte une liste de noms de champs ou de modèles séparés par des virgules. Quelques filtres fields possibles sont présentés ci-dessous. Consultez la section [filtre de champ de métadonnées (#webapi_metadata_field_filter)] pour obtenir un guide plus complet sur l'utilisation du paramètre fields.

Exemples
Query parameter example Description
fields=* Returns all fields
fields=createdAt,uid Returns fields createdAt and uid
fields=enrollments[*,!uid] Returns all fields of enrollments except uid
fields=enrollments[uid] Returns enrollments field uid
fields=enrollments[uid,enrolledAt] Returns enrollments fields uid and enrolledAt

Tracked entities

GET /api/tracker/trackedEntities

Deux points d'extrémité sont dédiés aux entités suivies :

  • GET /api/tracker/trackedEntities
  • récupère les entités suivies correspondant aux critères donnés
  • GET /api/tracker/trackedEntities/{id}
  • retrieves a tracked entity given the provided ID

If not otherwise specified, JSON is the default response for the GET method. The API also supports CSV export for single and collection endpoints. Furthermore, compressed CSV types is an option for the collection endpoint.

CSV

In the case of CSV, the fields request parameter has no effect, and the response will always contain the following fields:

  • Entité suivie (UID)
  • trackedEntityType (identifier in requested idScheme)
  • createdAt (Date et heure)
  • createdAtClient (Date et heure)
  • updatedAt (Date et heure)
  • updatedAtClient (Date et heure)
  • orgUnit (identifier in requested idScheme)
  • inactif (booléen)
  • supprimé (booléen)
  • potentialDuplicate (booléen)
  • geometry (WKT) Vous pouvez l'omettre dans le cas d'un type de Point et si la latitude et la longitude sont fournies)
  • latitude (Latitude d'un type de géométrie Point)
  • longitude (Longitude d'un type de géométrie Point)
  • attribute (identifier in requested idScheme)
  • Afficher le nom (Chaîne)
  • attrCreatedAt (Date de création de l'attribut)
  • attrUpdatedAt (Date de la dernière mise à jour de l'attribut)
  • type de valeur (Chaîne)
  • valeur (Chaîne)
  • stockéBy (Chaîne)
  • createdBy (Nom d'utilisateur de l'utilisateur)
  • updatedBy (Nom d'utilisateur de l'utilisateur)

Voir Entités suivies et Attributs pour plus de descriptions de champs.

GZIP

La réponse est le fichier trackedEntities.csv.gz contenant le fichier trackedEntities.csv.

ZIP

La réponse est le fichier trackedEntities.csv.zip contenant le fichier trackedEntities.csv.

Tracked entity collections

GET /api/tracker/trackedEntities

Le but de ce point d'extrémité est de récupérer les entités suivies correspondant aux critères fournis par le client.

Le point d'extrémité renvoie une liste d'entités suivies qui correspondent aux paramètres de la requête.

Paramètre de requête Type Valeurs autorisées Description
filter Chaîne Comma separated values of attribute filters. Narrows response to tracked entities matching given filters. More on filters here
orgUnits Chaîne Liste des unités d'organisation UID séparées par des virgules. Renvoie uniquement les d'entités suivies appartenant aux unités d'organisation fournies
orgUnitMode Chaîne SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL Get tracked entities owned by given orgUnits relative to the orgUnitMode and program parameters. Defaults to ACCESSIBLE if no organisation unit(s) are set via orgUnits. Defaults to SELECTED if organisation unit(s) are set via orgUnits. See org unit modes.
program Chaîne UID de programme A tracker program UID for which tracked entities in the response must be enrolled into.
programStatus deprecated for removal in version 43 use enrollmentStatus String ACTIVE, COMPLETED, CANCELLED The status of the tracked entities enrollment in the given program.
programStage Chaîne UID un UID d'étape de programme pour lequel les entités suivies présentes dans la réponse doivent avoir des événements.
followUp Booléen true, false Indique si l'entité suivie est marquée pour le suivi du programme spécifié.
updatedAfter DateTime ISO-8601 Date et heure de début de la dernière mise à jour
updatedBefore DateTime ISO-8601 Date et heure de fin de la dernière mise à jour
updatedWithin Duration ISO-8601 Returns tracked entities not older than specified Duration
enrollmentStatus Chaîne ACTIVE, COMPLETED, CANCELLED The status of the tracked entities enrollment in the given program.
enrollmentEnrolledAfter DateTime ISO-8601 Date et heure de début de l’inscription au programme donné
enrollmentEnrolledBefore DateTime ISO-8601 Date et heure de fin de l’inscription au programme donné
enrollmentOccurredAfter DateTime ISO-8601 Start date for when the enrollment occurred in the given program
enrollmentOccurredBefore DateTime ISO-8601 End date for when the enrollment occurred in the given program
TrackedEntityType Chaîne UID du type d'entité suivi Renvoie uniquement les entités suivies d'un type donné
trackedEntities Chaîne Liste des UID des entités suivies, séparée par des virgules. Il est possible de filtrer le résultat de manière à obtenir un ensemble limité d'entités suivies qui utilisent les uids explicites des entités suivies. Vous pouvez le en utilisant le paramètre trackedEntity=id1;id2. Ce paramètre créera, au minimum, la limite externe des résultats, en constituant la liste de toutes les entités suivies à l'aide des uids fournis. Si d'autres paramètres/filtres de ce tableau sont utilisés, ils limiteront davantage les résultats à partir de la limite externe explicite.
assignedUserMode Chaîne CURRENT, PROVIDED, NONE, ANY, ALL Restricts result to tracked entities with events assigned based on the assigned user selection mode. See table below "Assigned user modes" for explanations. Default is ALL.
assignedUser Chaîne Liste des UID d'utilisateurs séparés par des virgules, à filtrer sur la base des événements affectés aux utilisateurs. Il est possible de filtrer le résultat pour obtenir un ensemble limité d'entités suivies avec des événements attribués aux UID donnés, à l'aide du paramètre assignedUser=id1;id2. Ce paramètre ne sera pris en compte que si le mode d'utilisateur assigné est FOURNI ou nul. L'API va générer une erreur si, par exemple, assignedUserMode=CURRENT et assignedUser=someId
order Chaîne Liste séparée par des virgules de paires de noms de propriétés, d'attributs ou d'UID et de directions de tri au format propName:sortDirection. Les valeurs prises en charge sont: createdAt (créé à) createdAtClient (créé au niveau du client), enrolledAt (inscrit à), inactive (inactif), trackedEntity (entité suivie), updatedAt (mis à jour à), updatedAtClient (mis à jour au niveau du client), .
eventStatus Chaîne ACTIVE, COMPLETED, VISITED, SCHEDULE, OVERDUE, SKIPPED Il s'agit du statut de tous les événements présents dans le programme spécifié
eventOccurredAfter DateTime ISO-8601 Date et heure de début de l'événement pour le programme donné
eventOccurredBefore DateTime ISO-8601 Date et heure de fin de l'événement pour le programme donné
includeDeleted Booléen true, false Indique s’il faut inclure les éléments supprimés de façon réversible
potentialDuplicate Booléen true, false Filter the result based on the fact that a tracked entities is a potential duplicate. true: returns tracked entities flagged as potential duplicates. false: returns tracked entities NOT flagged as potential duplicates.
idScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for all metadata references unless overridden by a metadata specific parameter. Default is UID. Note: only metadata in fields trackedEntity.trackedEntityType, orgUnit and attributes is exported in this idScheme. All other fields will always be exported using UIDs.
orgUnitIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for organisation unit references. Defaults to the idScheme parameter.

Les modes d'utilisateur assigné disponibles sont expliqués dans le tableau suivant.

Tableau : Modes d'utilisateur assigné

Mode Description
CURRENT Inclut les événements attribués à l’utilisateur actuellement connecté.
PROVIDED Inclut les événements attribués à l’utilisateur indiqué dans la requête.
NONE Inclut uniquement les événements non attribués.
ANY Includes all assigned events, regardless of who they are assigned to, as long as they are assigned to someone.
ALL Includes all events irrespective of whether a user is assigned. This is the default mode.

La requête n'est pas sensible à la casse. Les règles suivantes s'appliquent aux paramètres de requête.

  • Au moins une unité d'organisation doit être spécifiée avec le paramètre orgUnit (un ou plusieurs), ou orgUnitMode=ALL doit être spécifié.
  • Un seul des paramètres program et trackedEntity peut être spécifié (zéro ou un).
  • If programStatus is specified, then program must also be specified.
  • If enrollmentStatus is specified, then program must also be specified.
  • Si followUp est spécifié, alors program doit également être spécifié.
  • Si enrollmentEnrolledAfter ou enrollmentEnrolledBefore est spécifié, alors program doit également être spécifié.

  • Les éléments du filtre ne peuvent être spécifiés qu'une seule fois.

Exemples de requêtes

A query for all tracked entities associated with a specific organisation unit and tracker program can look like this:

GET /api/tracker/trackedEntities?program=IpHINAT79UW&orgUnits=DiszpKrYNg8

Pour lancer une requête sur les entités suivies en utilisant un attribut avec un filtre et un attribut sans filtre, avec une unité d'organisation en utilisant le mode de requête par unité d'organisation descendante :

GET /api/tracker/trackedEntities?program=IpHINAT79UW&orgUnits=DiszpKrYNg8&filter=w75KJ2mc4zz:EQ:John

Une requête dans laquelle plusieurs opérandes et filtres sont spécifiés pour un élément de filtre :

GET /api/tracker/trackedEntities?orgUnits=DiszpKrYNg8&program=ur1Edk5Oe2n&filter=lw1SqmMlnfh:GT:150&filter=lw1SqmMlnfh:LT:190

Un filtre de requête avec une valeur qui doit être échappée et qui sera interprétée comme :,/ :

GET /api/tracker/trackedEntities?orgUnits=DiszpKrYNg8&program=ur1Edk5Oe2n&filter=lw1SqmMlnfh:EQ:/:/,//

Pour spécifier les dates d'inscription au programme dans la requête :

GET /api/tracker/trackedEntities?orgUnits=DiszpKrYNg8&program=IpHINAT79UW&fields=trackedEntity,enrollments[enrolledAt]&enrollmentEnrolledAfter=2024-01-01

To query on an attribute using multiple values with an IN filter and semicolon-separated values:

GET /api/tracker/trackedEntities?trackedEntityType=nEenWmSyUEp&orgUnits=DiszpKrYNg8&filter=w75KJ2mc4zz:IN:Scott;Jimmy;Santiago

All of the following operators are supported regardless of the value type. Values are compared using text comparison unless stated otherwise. Integer and decimal value types are treated as PostgreSQL integer and numeric data types for the specified operators.

Supported binary operators:

Opérateur Description
eq equal to, uses integer/numeric semantics for integer/decimal value types
ieq equal to, ignoring case (use eq instead)*
ge greater than or equal to (uses integer/number semantics for integer/decimal value types)
gt greater than, uses integer/number semantics for integer/decimal value types
le less than or equal to, uses integer/number semantics for integer/decimal value types
lt less than (uses integer/number semantics for integer/decimal value types)
ne not equal to (uses integer/number semantics for integer/decimal value types)
neq not equal to (uses integer/number semantics for integer/decimal value types), use ne instead*
nieq not equal to, ignoring case (use ne instead)*
dans one of multiple values separated by semicolon ";", uses integer/number semantics for integer/decimal value types
like like text match
ilike like text match, ignoring case (use like instead)*
nlike not like
nilike not like, ignoring case (use nlike instead)*
sw starts with
ew ends with

*These operators are currently supported but may be removed in the future. We recommend using the operator mentioned in the description, as it provides the same functionality.

Matches are case-insensitive, for example eq and ieq (i for insensitive) behave in the same way. To ensure future compatibility, always use the non-i form (eq, like, etc.).

For instance, filter=w75KJ2mc4zz:eq:Scott would return values of the given attribute that match any variation of "Scott" regardless of case, such as SCOTT, scott, Scott...

Supported unary operators:

Opérateur Description
null has no value
!null has a value
Tracked entity attribute filtering

Filtering by a tracked entity attribute narrows the response to tracked entities matching given filters. A filter is a colon separated property or attribute UID with optional operator and value pairs.

Example: filter=H9IlTX2X6SL:sw:A with operator starts with sw followed by a value.

A filter like filter=H9IlTX2X6SL:!null returns all entries where the given attribute has a value.

Special characters like + need to be percent-encoded, so %2B instead of +. Characters such as : or ,, as part of the filter value, need to be escaped by /. Likewise, / needs to be escaped.

Multiple operators for the same attribute like filter=AuPLng5hLbE:gt:438901703:lt:448901704 are allowed.

Each tracked entity attribute can be configured with: - A minimum number of characters required to perform a search (0 means no minimum) - Blocked operators. Only sw, ew, and like can be blocked. All other operators cannot be blocked.

The following request:

GET /api/tracker/trackedEntities?program=IpHINAT79UW&orgUnits=DiszpKrYNg8&filter=w75KJ2mc4zz:EQ:John
would fail if the minimum character limit was set to 5 (since "John" has only 4 characters), or if the EQ operator was blocked for the specified tracked entity attribute.
Tracked entities response

The API supports CSV and JSON response for GET /api/tracker/trackedEntities.

JSON

Responses can be filtered on desired fields, see field filter for more information.

A JSON response looks like the following:

{
  "pager": {
    "page": 1,
    "pageSize": 1
  },
  "trackedEntities": [
    {
      "trackedEntity": "F8yKM85NbxW",
      "trackedEntityType": "Zy2SEgA61ys",
      "createdAt": "2019-08-21T13:25:38.022",
      "createdAtClient": "2019-03-19T01:12:16.624",
      "updatedAt": "2019-08-21T13:31:33.410",
      "updatedAtClient": "2019-03-19T01:12:16.624",
      "orgUnit": "DiszpKrYNg8",
      "inactive": false,
      "deleted": false,
      "potentialDuplicate": false,
      "geometry": {
        "type": "Point",
        "coordinates": [
          -11.7896,
          8.2593
        ]
      },
      "attributes": [
        {
          "attribute": "B6TnnFMgmCk",
          "displayName": "Age (years)",
          "createdAt": "2019-08-21T13:25:38.477",
          "updatedAt": "2019-08-21T13:25:38.477",
          "storedBy": "braimbault",
          "valueType": "INTEGER_ZERO_OR_POSITIVE",
          "value": "30"
        },
        {
          "attribute": "TfdH5KvFmMy",
          "displayName": "First Name",
          "createdAt": "2019-08-21T13:25:38.066",
          "updatedAt": "2019-08-21T13:25:38.067",
          "storedBy": "josemp10",
          "valueType": "TEXT",
          "value": "Sarah"
        },
        {
          "attribute": "aW66s2QSosT",
          "displayName": "Last Name",
          "createdAt": "2019-08-21T13:25:38.388",
          "updatedAt": "2019-08-21T13:25:38.388",
          "storedBy": "karoline",
          "valueType": "TEXT",
          "value": "Johnson"
        }
      ]
    }
  ]
}
CSV

A CSV response looks like the following:

trackedEntity,trackedEntityType,createdAt,createdAtClient,updatedAt,updatedAtClient,orgUnit,inactive,deleted,potentialDuplicate,geometry,latitude,longitude,storedBy,createdBy,updatedBy,attrCreatedAt,attrUpdatedAt,attribute,displayName,value,valueType
F8yKM85NbxW,Zy2SEgA61ys,2019-08-21T11:25:38.022Z,2019-03-19T00:12:16.624Z,2019-08-21T11:31:33.410Z,2019-03-19T00:12:16.624Z,DiszpKrYNg8,false,false,false,"POINT (-11.7896 8.2593)",8.2593,-11.7896,,,,2019-08-21T11:25:38.477Z,2019-08-21T11:25:38.477Z,B6TnnFMgmCk,"Age (years)",30,INTEGER_ZERO_OR_POSITIVE
F8yKM85NbxW,Zy2SEgA61ys,2019-08-21T11:25:38.022Z,2019-03-19T00:12:16.624Z,2019-08-21T11:31:33.410Z,2019-03-19T00:12:16.624Z,DiszpKrYNg8,false,false,false,"POINT (-11.7896 8.2593)",8.2593,-11.7896,,,,2019-08-21T11:25:38.066Z,2019-08-21T11:25:38.067Z,TfdH5KvFmMy,"First Name",Sarah,TEXT
F8yKM85NbxW,Zy2SEgA61ys,2019-08-21T11:25:38.022Z,2019-03-19T00:12:16.624Z,2019-08-21T11:31:33.410Z,2019-03-19T00:12:16.624Z,DiszpKrYNg8,false,false,false,"POINT (-11.7896 8.2593)",8.2593,-11.7896,,,,2019-08-21T11:25:38.388Z,2019-08-21T11:25:38.388Z,aW66s2QSosT,"Last Name",Johnson,TEXT
Tracked entities collection limits

The collection endpoint limits results in three ways:

  • KeyTrackedEntityMaxLimit in System settings: KeyTrackedEntityMaxLimit defines the maximum tracked entities in an API response, protecting database and server resources. No limit applies when set to 0. Configure it via /api/systemSettings as described in the documentation.

  • Max number of TEs to return in Program or tracked entity type: it limits results when searching outside the capture scope with a specified program or tracked entity type. The API returns an error if matches exceed this limit. No limit applies when searching within the capture scope or when set to 0. This limit is configurable in the maintenance app.

  • Pagination: As explained here.

For paginated requests with non-zero KeyTrackedEntityMaxLimit:

  • If pageSize ≤ KeyTrackedEntityMaxLimit: pageSize is enforced

  • If pageSize > KeyTrackedEntityMaxLimit: The API returns an error

Tracked entities single object endpoint

GET /api/tracker/trackedEntities/{uid}

This endpoint retrieves a tracked entity given by ID.

Syntaxe de la requête
GET /api/tracker/trackedEntities/{uid}?program={programUid}&fields={fields}
Paramètre de requête Type Valeurs autorisées Description
uid Chaîne uid Renvoie l'entité suivie disposant de l'uid spécifié
program Chaîne uid Inclut les attributs du programme dans la réponse (seuls ceux auxquels l'utilisateur a accès)
champs Chaîne Tout filtre de champ valide (par défaut *,!relationships,!enrollments,!events,!programOwners) Inclut les sous-objets spécifiés dans la réponse
Exemples de requêtes

Une requête pour une entité suivie:

GET /api/tracker/trackedEntities/PQfMcpmXeFE
Tracked Entity response

The API supports CSV and JSON response for GET /api/tracker/trackedEntities/{uid}

JSON

An example JSON response.

{
  "trackedEntity": "PQfMcpmXeFE",
  "trackedEntityType": "nEenWmSyUEp",
  "createdAt": "2014-03-06T05:49:28.256",
  "createdAtClient": "2014-03-06T05:49:28.256",
  "updatedAt": "2016-08-03T23:49:43.309",
  "orgUnit": "DiszpKrYNg8",
  "inactive": false,
  "deleted": false,
  "potentialDuplicate": false,
  "attributes": [
    {
      "attribute": "w75KJ2mc4zz",
      "code": "MMD_PER_NAM",
      "displayName": "First name",
      "createdAt": "2016-08-03T23:49:43.308",
      "updatedAt": "2016-08-03T23:49:43.308",
      "valueType": "TEXT",
      "value": "John"
    },
    {
      "attribute": "zDhUuAYrxNC",
      "displayName": "Last name",
      "createdAt": "2016-08-03T23:49:43.309",
      "updatedAt": "2016-08-03T23:49:43.309",
      "valueType": "TEXT",
      "value": "Kelly"
    }
  ],
  "enrollments": [
    {
      "enrollment": "JMgRZyeLWOo",
      "createdAt": "2017-03-06T05:49:28.340",
      "createdAtClient": "2016-03-06T05:49:28.340",
      "updatedAt": "2017-03-06T05:49:28.357",
      "trackedEntity": "PQfMcpmXeFE",
      "program": "IpHINAT79UW",
      "status": "ACTIVE",
      "orgUnit": "DiszpKrYNg8",
      "enrolledAt": "2024-03-06T00:00:00.000",
      "occurredAt": "2024-03-04T00:00:00.000",
      "attributeOptionCombo": "HllvX50cXC0",
      "followUp": false,
      "deleted": false,
      "events": [
        {
          "event": "Zq2dg6pTNoj",
          "status": "ACTIVE",
          "program": "IpHINAT79UW",
          "programStage": "ZzYYXq4fJie",
          "enrollment": "JMgRZyeLWOo",
          "trackedEntity": "PQfMcpmXeFE",
          "relationships": [],
          "scheduledAt": "2023-03-10T00:00:00.000",
          "followUp": false,
          "deleted": false,
          "createdAt": "2017-03-06T05:49:28.353",
          "createdAtClient": "2016-03-06T05:49:28.353",
          "updatedAt": "2017-03-06T05:49:28.353",
          "attributeOptionCombo": "HllvX50cXC0",
          "attributeCategoryOptions": "xYerKDKCefk",
          "dataValues": [],
          "notes": []
        }
      ],
      "relationships": [],
      "attributes": [
        {
          "attribute": "w75KJ2mc4zz",
          "code": "MMD_PER_NAM",
          "displayName": "First name",
          "createdAt": "2016-08-03T23:49:43.308",
          "updatedAt": "2016-08-03T23:49:43.308",
          "valueType": "TEXT",
          "value": "John"
        },
        {
          "attribute": "zDhUuAYrxNC",
          "displayName": "Last name",
          "createdAt": "2016-08-03T23:49:43.309",
          "updatedAt": "2016-08-03T23:49:43.309",
          "valueType": "TEXT",
          "value": "Kelly"
        },
        {
          "attribute": "AuPLng5hLbE",
          "code": "National identifier",
          "displayName": "National identifier",
          "createdAt": "2016-08-03T23:49:43.301",
          "updatedAt": "2016-08-03T23:49:43.301",
          "valueType": "TEXT",
          "value": "245435245"
        },
        {
          "attribute": "ruQQnf6rswq",
          "displayName": "TB number",
          "createdAt": "2016-08-03T23:49:43.308",
          "updatedAt": "2016-08-03T23:49:43.308",
          "valueType": "TEXT",
          "value": "1Z 1F2 A84 59 4464 173 6"
        },
        {
          "attribute": "cejWyOfXge6",
          "displayName": "Gender",
          "createdAt": "2016-08-03T23:49:43.307",
          "updatedAt": "2016-08-03T23:49:43.307",
          "valueType": "TEXT",
          "value": "Male"
        },
        {
          "attribute": "VqEFza8wbwA",
          "code": "MMD_PER_ADR1",
          "displayName": "Address",
          "createdAt": "2016-08-03T23:49:43.307",
          "updatedAt": "2016-08-03T23:49:43.307",
          "valueType": "TEXT",
          "value": "Main street 2"
        }
      ],
      "notes": []
    }
  ],
  "programOwners": [
    {
      "orgUnit": "DiszpKrYNg8",
      "trackedEntity": "PQfMcpmXeFE",
      "program": "ur1Edk5Oe2n"
    },
    {
      "orgUnit": "DiszpKrYNg8",
      "trackedEntity": "PQfMcpmXeFE",
      "program": "IpHINAT79UW"
    }
  ]
}
CSV

The response will be the same as the collection endpoint but referring to a single tracked entity, although it might have multiple rows for each attribute.

Tracked entity attribute value change logs

GET /api/tracker/trackedEntities/{uid}/changeLogs

This endpoint retrieves change logs for the attributes of a specific tracked entity. It returns a list of all tracked entity attributes that have changed over time for that entity.

Paramètre de requête Type Valeurs autorisées
path /{uid} Chaîne Tracked entity UID.
program String Program UID (optional).
order String Field and sort direction pair in the format field:sortDirection.

Change logs are ordered by newest (creation date in descending order) by default, when no order parameter is provided.

Example: createdAt:desc

field is case-sensitive. Valid sortDirection values are asc and desc. sortDirection is case-insensitive and defaults to asc for fields without explicit sortDirection. Supported fields are attribute, createdAt, and username.
filter Chaîne Colon-separated field name with the eq operator and value in the format field:eq:value.

Example: attribute:eq:w75KJ2mc4zz

Filtering is supported for attribute and username fields, one at a time. Only the eq (equals) operator is supported.
Tracked entity attribute value change logs

An example JSON response.

{
  "pager": {
    "page": 1,
    "pageSize": 10
  },
  "changeLogs": [
    {
      "createdBy": {
        "uid": "AIK2aQOJIbj",
        "username": "tracker",
        "firstName": "Tracker demo",
        "surname": "User"
      },
      "createdAt": "2024-06-20T14:51:16.433",
      "type": "UPDATE",
      "change": {
        "attributeValue": {
          "attribute": "w75KJ2mc4zz",
          "previousValue": "John",
          "currentValue": "Johnny"
        }
      }
    },
    {
      "createdBy": {
        "uid": "AIK2aQOJIbj",
        "username": "tracker",
        "firstName": "Tracker demo",
        "surname": "User"
      },
      "createdAt": "2024-06-20T14:50:32.966",
      "type": "CREATE",
      "change": {
        "attributeValue": {
          "attribute": "w75KJ2mc4zz",
          "currentValue": "John"
        }
      }
    }
  ]
}

The change log type can be CREATE, UPDATE, or DELETE. CREATE and DELETE will always hold a single value: the former shows the current value, and the latter shows the value that was deleted. UPDATE will hold two values: the previous and the current.

More on change log configuration here

Inscriptions

GET /api/tracker/enrollments

Two endpoints are dedicated to enrollments.

  • GET /api/tracker/enrollments
    • récupère les inscriptions correspondant aux critères donnés
  • GET /api/tracker/enrollments/{id}
    • retrieves an enrollment given the provided ID

Point d'extrémité de la collecte d'inscriptions GET /api/tracker/enrollments

Returns a list of enrollments based on filters.

Paramètre de requête Type Valeurs autorisées Description
orgUnits Chaîne Liste des unités d'organisation UID séparées par des virgules. Renvoie uniquement les inscriptions appartenant aux unités d'organisation fournies.
orgUnitMode (see orgUnitModes) Chaîne SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL The mode of selecting organisation units. Default is SELECTED.
program Chaîne uid Identifier of a tracker program the enrollment is enrolled into. This parameter is mandatory.
programStatus deprecated for removal in version 43 use status Chaîne ACTIVE, COMPLETED, CANCELLED The status of the enrollment.
status Chaîne ACTIVE, COMPLETED, CANCELLED The status of the enrollment.
followUp booléen true, false Follow up status of the tracked entity for the given program. Can be true, false or omitted.
updatedAfter DateTime ISO-8601 Seules les inscriptions mises à jour après cette date
updatedWithin Duration ISO-8601 Seules les inscriptions mises à jour depuis une durée donnée
enrolledAfter DateTime ISO-8601 Seules les inscriptions plus récentes que cette date
enrolledBefore DateTime ISO-8601 Seules les inscriptions antérieures à cette date
trackedEntity Chaîne uid Identifiant d'une entité suivie
order Chaîne Liste séparée par des virgules de paires de noms de propriétés, d'attributs ou d'UID et de directions de tri au format propName:sortDirection. Champs pris en charge : completedAt,(terminé à), createdAt (créé à), createdAtClient (créé au niveau du client), enrolledAt (inscrit à), updatedAt (mis à jour à), updatedAtClient (mis à jour au niveau du client).
inscriptions Chaîne Liste des UID des inscriptions, séparée par des virgules. Filtre le résultat pour obtenir un ensemble limité d’identifiants en utilisant enrollments=id1,id2.
attributeOptionCombo (combinaison d'options d'attribut) Chaîne uid Filters enrollments by the given attribute option combo. Only matching enrollments are returned.
includeDeleted Booléen S'il est défini sur "vrai", les événements supprimés de façon réversible seront inclus dans le résultat de votre requête.

The query is case-insensitive. The only requirement is that the program parameter must be provided.

Exemples de requêtes

Une requête pour toutes les inscriptions associées à une unité d'organisation spécifique peut ressembler à ceci :

GET /api/tracker/enrollments?orgUnits=DiszpKrYNg8

To constrain the response to enrollments which are part of a specific tracker program you can include a program query parameter:

GET /api/tracker/enrollments?orgUnits=O6uvpzGd5pu&orgUnitMode=DESCENDANTS&program=ur1Edk5Oe2n

Pour spécifier les dates d'inscription au programme dans la requête :

GET /api/tracker/enrollments?orgUnits=DiszpKrYNg8&program=M3xtLkYBlKI&enrolledAfter=2023-11-14&enrolledBefore=2024-02-07

Pour limiter la réponse aux inscriptions d'une entité suivie spécifique, vous pouvez inclure un paramètre de requête d'entité suivie:

GET /api/tracker/enrollments?trackedEntity=ClJ3fn47c4s

Pour limiter la réponse aux inscriptions d'une entité suivie spécifique, vous pouvez inclure un paramètre de requête d'entité suivie. Dans ce cas, nous avons limité la réponse aux inscriptions disponibles pour l'utilisateur actuel :

GET /api/tracker/enrollments?orgUnitMode=ACCESSIBLE&trackedEntity=tphfdyIiVL6
Format de réponse

The JSON response can look like the following.

{
  "pager": {
    "page": 1,
    "pageSize": 1
  },
  "enrollments": [
    {
      "enrollment": "TRE0GT7eh7Q",
      "createdAt": "2019-08-21T13:28:00.056",
      "createdAtClient": "2018-11-13T15:06:49.009",
      "updatedAt": "2019-08-21T13:29:44.942",
      "updatedAtClient": "2019-08-21T13:29:44.942",
      "trackedEntity": "s4NfKOuayqG",
      "program": "M3xtLkYBlKI",
      "status": "COMPLETED",
      "orgUnit": "DiszpKrYNg8",
      "enrolledAt": "2023-11-13T00:00:00.000",
      "occurredAt": "2023-11-13T00:00:00.000",
      "followUp": false,
      "deleted": false,
      "storedBy": "healthworker1",
      "notes": []
    }
  ]
}

Enrollments single object endpoint

GET /api/tracker/enrollments/{uid}

The purpose of this endpoint is to retrieve an enrollment given its ID.

Syntaxe de la requête
GET /api/tracker/enrollment/{uid}
Paramètre de requête Type Valeurs autorisées Description
uid Chaîne uid Renvoie l'inscription disposant de l'uid spécifié
champs Chaîne Tout filtre de champ valide (par défaut *,!relationships,!events,!attributes) Inclut les sous-objets spécifiés dans la réponse
Exemples de requêtes

A query for an enrollment.

GET /api/tracker/enrollments/JMgRZyeLWOo
Format de réponse
{
  "enrollment": "JMgRZyeLWOo",
  "createdAt": "2017-03-06T05:49:28.340",
  "createdAtClient": "2016-03-06T05:49:28.340",
  "updatedAt": "2017-03-06T05:49:28.357",
  "trackedEntity": "PQfMcpmXeFE",
  "program": "IpHINAT79UW",
  "status": "ACTIVE",
  "orgUnit": "DiszpKrYNg8",
  "enrolledAt": "2024-03-06T00:00:00.000",
  "occurredAt": "2024-03-04T00:00:00.000",
  "followUp": false,
  "deleted": false,
  "notes": []
}

Events (GET /api/tracker/events)

Two endpoints are dedicated to events. To retrieve events matching specific criteria:

GET /api/tracker/events

To retrieve an event with a specific ID:

GET /api/tracker/events/{id}

If not otherwise specified, JSON is the default response for the GET method. The API also supports CSV export for single and collection endpoints. Furthermore, it supports compressed JSON and CSV for the collection endpoint.

Événements CSV

In the case of CSV, the fields request parameter has no effect, and the response will always contain the following fields:

Propriété Type
event UID
status Chaîne
program Identifiant
programStage Identifiant
enrollment Identifiant
orgUnit Identifiant
occurredAt (s'est produit à) DateTime
scheduledAt (programmé à) DateTime
géométrie WKT, can be omitted it in case of a Point type and with latitude and longitude provided
latitude Latitude of a Point type of Geometry
longitude Longitude of a Point type of Geometry
followUp booléen
supprimé booléen
créé à DateTime
crééAtClient (Création au niveau du client) DateTime
updatedAt (mis à jour à) DateTime
updatedAtClient (mise à jour au niveau du client) DateTime
completedBy Nom d'utilisateur
completedAt (effectué à) DateTime
updatedBy (mis à jour par) Nom d'utilisateur
attributeOptionCombo (combinaison d'options d'attribut) Identifiant
attributeCategoryOptions (options de catégorie d'attribut) Identifiant
assignedUser Nom d'utilisateur
dataElement Identifiant
value Chaîne
storedBy Nom d'utilisateur
providedElsewhere booléen
storedByDataValue Chaîne
createdAtDataValue DateTime
updatedAtDataValue DateTime

See Events and Data Values for more field descriptions.

Événements GZIP

The response is file events.json.gz or events.csv.gz containing the events.json or events.csv file.

Événements ZIP

The response is file events.json.zip or events.csv.zip containing the events.json or events.csv file.

Point d'extrémité de la collecte d'événements GET /api/tracker/events

Renvoie une liste d'événements en fonction des filtres fournis.

Paramètre de requête Type Valeurs autorisées Description
program Chaîne uid Identifier of a tracker or event program. This parameter is mandatory.
programStage Chaîne uid Identifiant de l'étape de programme
programStatus deprecated for removal in version 43 use enrollmentStatus Chaîne ACTIVE, COMPLETED, CANCELLED The status of the events enrollment.
filter Chaîne Valeurs des filtres d'éléments de données, séparées par des virgules  Narrows response to events matching given filters. A filter is a colon separated property or data element UID with optional operator and value pairs. Example: filter=fazCI2ygYkq:eq:PASSIVE with operator starts with eq followed by a value. A filter like filter=fazCI2ygYkq:!null returns all events where the given data element has a value. Characters such as : or ,, as part of the filter value, need to be escaped by /. Likewise, / needs to be escaped. Multiple operators for the same data element like filter=qrur9Dvnyt5:gt:70:lt:80 are allowed. User needs access to the data element to filter on it.
filterAttributes Chaîne Valeurs des filtres d'attribut séparées par des virgules Narrows response to tracked entities matching given filters. Example: filterAttributes=H9IlTX2X6SL:eq:John. More on filters here
followUp booléen true, false Détermine si l'événement est pris en compte pour un suivi dans le programme. La valeur par défaut est vrai
trackedEntity Chaîne uid Identifiant d'une entité suivie
orgUnit Chaîne uid Identifiant de l'unité d'organisation
orgUnitMode see orgUnitModes Chaîne SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL Le mode de sélection des unités d'organisation peut l'être. La valeur par défaut est SÉLECTIONNÉ, qui fait uniquement référence aux unités d'organisation sélectionnées.
status Chaîne ACTIVE, COMPLETED, VISITED, SCHEDULE, OVERDUE, SKIPPED Statut de l'événement
occurredAfter DateTime ISO-8601 Filtre pour les événements survenus après cette date.
occurredBefore DateTime ISO-8601 Filtre pour les événements survenus jusqu'à cette date.
scheduledAfter DateTime ISO-8601 Filtre pour les événements programmés après cette date.
scheduledBefore DateTime ISO-8601 Filtre pour les événements programmés avant cette date.
updatedAfter DateTime ISO-8601 Filtre pour les événements qui ont été mis à jour après cette date. Ne peut pas être utilisé avec updatedWithin (mis à jour pendant).
updatedBefore DateTime ISO-8601 Filtre pour les événements qui ont été mis à jour jusqu'à cette date. Ne peut pas être utilisé avec updatedWithin.
updatedWithin Duration ISO-8601 Incluez uniquement les éléments mis à jour pendant la durée indiquée.

Le format est ISO-8601#Duration
enrollmentStatus Chaîne ACTIVE, COMPLETED, CANCELLED The status of the events enrollment.
enrollmentEnrolledAfter DateTime ISO-8601 Date et heure de début de l’inscription au programme donné
enrollmentEnrolledBefore DateTime ISO-8601 Date et heure de fin de l’inscription au programme donné
enrollmentOccurredAfter DateTime ISO-8601 Start date for when the enrollment occurred in the given program
enrollmentOccurredBefore DateTime ISO-8601 End date for when the enrollment occurred in the given program
idScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for all metadata references unless overridden by a metadata specific parameter. Default is UID. Note: metadata in event.relationships will always be exported using UIDs.
dataElementIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for data element references. Defaults to the idScheme parameter.
orgUnitIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for organisation unit references. Defaults to the idScheme parameter.
programIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for program references. Defaults to the idScheme parameter.
programStageIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for program stage references. Defaults to the idScheme parameter.
categoryOptionComboIdScheme Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for category option combo references. Defaults to the idScheme parameter.
categoryOptionIdScheme (Schéma d'identification des options de catégorie) Énumération UID, CODE, NAME, ATTRIBUTE:{uid} IdScheme used for category option references. Defaults to the idScheme parameter.
order Chaîne Liste de paires de noms de propriétés, d'attributs ou d'éléments de données UID et de directions de tri, séparées par des virgules, au format propName:sortDirection. Les champs pris en charge sont : assignedUser, assignedUserDisplayName, attributeOptionCombo, completedAt, completedBy, createdAt, createdAtClient, createdBy, deleted, enrolledAt, enrollment, enrollmentStatus, event, followUp, occurredAt, orgUnit, program, programStage, scheduledAt, status, storedBy, trackedEntity, updatedAt, updatedAtClient, updatedBy.
events Chaîne Liste des UID des événements, séparée par des virgules. Filtre le résultat pour obtenir un ensemble limité d’identifiants en utilisant event=id1,id2.
attributeCategoryCombo (see note) Chaîne Identifiant de la combinaison de catégories d'attributs. Doit être combiné avec attributeCategoryOptions.
attributeCategoryOptions (see note) Chaîne Identifiants d'options de catégories d'attributs séparés par des virgules. Doit être combiné avec attributeCategoryCombo.
includeDeleted Booléen S'il est défini sur "vrai", les événements supprimés de façon réversible seront inclus dans le résultat de votre requête.
assignedUserMode Chaîne CURRENT, PROVIDED, NONE, ANY Mode de sélection de l'utilisateur assigné
assignedUser Chaîne Liste des UID d'utilisateurs séparés par des virgules, à filtrer sur la base des événements affectés aux utilisateurs. Il est possible de filtrer le résultat pour obtenir un ensemble limité d'entités suivies avec des événements attribués aux UID donnés, à l'aide du paramètre assignedUser=id1;id2. Ce paramètre ne sera pris en compte que si le mode d'utilisateur assigné est FOURNI ou nul. L'API va générer une erreur si, par exemple, assignedUserMode=CURRENT et assignedUser=someId

Note

If the query contains neither attributeCategoryCombo nor attributeCategoryOptions, the server returns events for all attribute option combos where the user has read access.

Exemples de requêtes

La requête pour tous les événements associés aux subordonnées d'une unité d'organisation donnée :

GET /api/tracker/events?orgUnit=YuQRtpLP10I&orgUnitMode=CHILDREN

La requête pour tous les événements associés à tous les descendants d'une unité d'organisation donnée, c'est-à-dire toutes les unités d'organisation qui lui sont inférieurs dans la hiérarchie :

GET /api/tracker/events?orgUnit=O6uvpzGd5pu&orgUnitMode=DESCENDANTS

Requête pour tous les événements associés à un programme et à une unité d'organisation :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=eBAyeGv0exc

La requête pour tous les événements disposant d'un programme et d'une unité d'organisation, ordonnés par date programmée en ordre croissant :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=eBAyeGv0exc&order=scheduledAt

La requête pour les 10 événements dont la date de déroulement est la plus récente dans un programme et une unité d'organisation donné - par pagination et ordonnés par date de déroulement en ordre décroissant :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=eBAyeGv0exc&order=occurredAt:desc&pageSize=10&page=1

La requête pour tous les événements avec un programme et une unité d'organisation pour une entité suivie donnée :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=M3xtLkYBlKI&trackedEntity=dNpxRu1mWG5

Query for all events before or equal to 2024-02-03 and associated with a program and organisation unit:

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=eBAyeGv0exc&occurredBefore=2024-02-03

Une requête dans laquelle plusieurs opérandes et filtres sont spécifiés pour un UID d'élément de données :

GET /api/tracker/events?orgUnit=g8upMTyEZGZ&program=M3xtLkYBlKI&filter=rFQNCGMYud2:GT:35&filter=rFQNCGMYud2:LT:50

Un filtre de requête avec une valeur qui doit être échappée et qui sera interprétée comme :,/ :

GET /api/tracker/events?orgUnit=DiszpKrYNg8&program=lxAQ7Zs9VYR&filter=DanTR5x0WDK:EQ:/:/,//
Exemple de réponse des événements

L'API prend en charge les réponses CSV et JSON pour GET /api/tracker/events.

JSON

La réponse JSON peut ressembler à ce qui suit:

{
  "pager": {
    "page": 1,
    "pageSize": 1
  },
  "events": [
    {
      "event": "A7rzcnZTe2T",
      "status": "ACTIVE",
      "program": "eBAyeGv0exc",
      "programStage": "Zj7UnCAulEk",
      "enrollment": "RiLEKhWHlxZ",
      "orgUnit": "DwpbWkiqjMy",
      "occurredAt": "2023-02-13T00:00:00.000",
      "scheduledAt": "2023-02-13T00:00:00.000",
      "followUp": false,
      "deleted": false,
      "createdAt": "2017-09-08T21:40:22.000",
      "createdAtClient": "2016-09-08T21:40:22.000",
      "updatedAt": "2017-09-08T21:40:22.000",
      "attributeOptionCombo": "HllvX50cXC0",
      "attributeCategoryOptions": "xYerKDKCefk",
      "geometry": {
        "type": "Point",
        "coordinates": [-11.468912037323042, 7.515913998868316]
      },
      "dataValues": [
        {
          "createdAt": "2016-12-06T18:22:34.438",
          "updatedAt": "2016-12-06T18:22:34.438",
          "storedBy": "bjorn",
          "providedElsewhere": false,
          "dataElement": "F3ogKBuviRA",
          "value": "[-11.4880220438585,7.50978830548003]"
        },
        {
          "createdAt": "2013-12-30T14:23:57.423",
          "updatedAt": "2013-12-30T14:23:57.423",
          "storedBy": "lars",
          "providedElsewhere": false,
          "dataElement": "eMyVanycQSC",
          "value": "2018-02-07"
        },
        {
          "createdAt": "2013-12-30T14:23:57.382",
          "updatedAt": "2013-12-30T14:23:57.382",
          "storedBy": "lars",
          "providedElsewhere": false,
          "dataElement": "oZg33kd9taw",
          "value": "Male"
        }
      ],
      "notes": [],
      "followup": false
    }
  ]
}
CSV

La réponse CSV peut ressembler à ce qui suit:

event,status,program,programStage,enrollment,orgUnit,occurredAt,scheduledAt,geometry,latitude,longitude,followUp,deleted,createdAt,createdAtClient,updatedAt,updatedAtClient,completedBy,completedAt,updatedBy,attributeOptionCombo,attributeCategoryOptions,assignedUser,dataElement,value,storedBy,providedElsewhere,storedByDataValue,updatedAtDataValue,createdAtDataValue
A7rzcnZTe2T,ACTIVE,eBAyeGv0exc,Zj7UnCAulEk,RiLEKhWHlxZ,DwpbWkiqjMy,2023-02-12T23:00:00Z,2023-02-12T23:00:00Z,"POINT (-11.468912037323042 7.515913998868316)",7.515913998868316,-11.468912037323042,false,false,2017-09-08T19:40:22Z,,2017-09-08T19:40:22Z,,,,,HllvX50cXC0,xYerKDKCefk,,F3ogKBuviRA,"[-11.4880220438585,7.50978830548003]",admin,false,,2016-12-06T17:22:34.438Z,2016-12-06T17:22:34.438Z
A7rzcnZTe2T,ACTIVE,eBAyeGv0exc,Zj7UnCAulEk,RiLEKhWHlxZ,DwpbWkiqjMy,2023-02-12T23:00:00Z,2023-02-12T23:00:00Z,"POINT (-11.468912037323042 7.515913998868316)",7.515913998868316,-11.468912037323042,false,false,2017-09-08T19:40:22Z,,2017-09-08T19:40:22Z,,,,,HllvX50cXC0,xYerKDKCefk,,eMyVanycQSC,2018-02-07,admin,false,,2013-12-30T13:23:57.423Z,2013-12-30T13:23:57.423Z
A7rzcnZTe2T,ACTIVE,eBAyeGv0exc,Zj7UnCAulEk,RiLEKhWHlxZ,DwpbWkiqjMy,2023-02-12T23:00:00Z,2023-02-12T23:00:00Z,"POINT (-11.468912037323042 7.515913998868316)",7.515913998868316,-11.468912037323042,false,false,2017-09-08T19:40:22Z,,2017-09-08T19:40:22Z,,,,,HllvX50cXC0,xYerKDKCefk,,msodh3rEMJa,2018-02-13,admin,false,,2013-12-30T13:23:57.467Z,2013-12-30T13:23:57.467Z

Point d'extrémité d'objet unique d'événements GET /api/tracker/events/{uid}

Le but de ce point d'extrémité est de récupérer un événement en se basant sur son UID.

Syntaxe de la requête

GET /api/tracker/events/{uid}?fields={fields}

Paramètre de requête Type Valeurs autorisées Description
uid String uid Renvoie l'événement disposant de l'uid spécifié
champs String Tout filtre de champ valide (par défaut *,!relationships) Inclut les sous-objets spécifiés dans la réponse
Exemples de requêtes

Une requête pour un événement :

GET /api/tracker/events/rgWr86qs0sI
Exemple de réponse d'un événement

The API supports CSV and JSON response for GET /api/tracker/events/{uid}

JSON
{
  "event": "rgWr86qs0sI",
  "status": "ACTIVE",
  "program": "kla3mAPgvCH",
  "programStage": "aNLq9ZYoy9W",
  "enrollment": "Lo3SHzCnMSm",
  "orgUnit": "DiszpKrYNg8",
  "occurredAt": "2024-10-12T00:00:00.000",
  "followUp": false,
  "deleted": false,
  "createdAt": "2018-10-20T12:09:19.492",
  "createdAtClient": "2017-10-20T12:09:19.492",
  "updatedAt": "2018-10-20T12:09:19.492",
  "attributeOptionCombo": "amw2rQP6r6M",
  "attributeCategoryOptions": "RkbOhHwiOgW",
  "dataValues": [
    {
      "createdAt": "2015-10-20T12:09:19.640",
      "updatedAt": "2015-10-20T12:09:19.640",
      "storedBy": "system",
      "providedElsewhere": false,
      "dataElement": "HyJL2Lt37jN",
      "value": "12"
    }
  ],
  "notes": [],
  "followup": false
}
CSV

The response will be the same as the collection endpoint but referring to a single event, although it might have multiple rows for each data element value.

Event data value change logs

GET /api/tracker/events/{uid}/changeLogs

This endpoint retrieves change logs for the data values of a specific event. It returns a list of all event data values and event fields (occurredAt, scheduledAt, and geometry) that have changed over time for the specified event.

Paramètre de requête Type Valeurs autorisées
path /{uid} Chaîne Event UID.
order Chaîne Field and sort direction pair in the format field:sortDirection.

Change logs are ordered by newest (creation date in descending order) by default, when no order parameter is provided.

Example: createdAt:desc

field is case-sensitive. Valid sortDirection values are asc and desc. sortDirection is case-insensitive and defaults to asc for fields without explicit sortDirection. Supported fields are createdAt, change and username, only one at a time.
filter Chaîne Colon-separated field name with the eq operator and value in the format field:eq:value.

Example: dataElement:eq:w75KJ2mc4zz

Filtering is supported for field, dataElement and username fields, one at a time. Only the eq (equals) operator is supported.
Event data value change logs response example

An example of a JSON response:

{
   "pager":{
      "page":1,
      "pageSize":10
   },
   "changeLogs":[
      {
         "createdBy":{
            "uid":"AIK2aQOJIbj",
            "username":"tracker",
            "firstName":"Tracker demo",
            "surname":"User"
         },
         "createdAt":"2024-06-20T15:43:36.342",
         "type":"DELETE",
         "change":{
            "dataValue":{
               "dataElement":"UXz7xuGCEhU",
               "previousValue":"12"
            }
         }
      },
      {
         "createdBy":{
            "uid":"AIK2aQOJIbj",
            "username":"tracker",
            "firstName":"Tracker demo",
            "surname":"User"
         },
         "createdAt":"2024-06-20T15:43:27.175",
         "type":"CREATE",
         "change":{
            "dataValue":{
               "dataElement":"UXz7xuGCEhU",
               "currentValue":"12"
            }
         }
      },
      {
         "createdBy":{
            "uid":"AIK2aQOJIbj",
            "username":"tracker",
            "firstName":"Tracker demo",
            "surname":"User"
         },
         "createdAt":"2024-06-20T14:51:16.433",
         "type":"UPDATE",
         "change":{
            "dataValue":{
               "dataElement":"bx6fsa0t90x",
               "previousValue":"true",
               "currentValue":"false"
            }
         }
      }
   ]
}

The change log type can be CREATE, UPDATE, or DELETE. CREATE and DELETE will always hold a single value: the former shows the current value, and the latter shows the value that was deleted. UPDATE will hold two values: the previous and the current.

More on change log configuration here

Relations

GET /api/tracker/relationships

Les relations sont des liens entre deux entités dans le Tracker. Ces entités peuvent être des entités suivies, des inscriptions et des événements.

Le but de ce point d'extrémité est de récupérer les relations entre les objets.

Contrairement aux autres points d'extrémité d'objets suivis, les relations n'exposent qu'un seul point d'extrémité :

GET /api/tracker/relationships?[trackedEntity={trackedEntityUid}|enrollment={enrollmentUid}|event={eventUid}]&fields=[fields]

Paramètres de requête

Paramètre de requête Type Valeurs autorisées Description
trackedEntity Chaîne uid Identifiant d'une entité suivie
enrollment Chaîne uid Identifiant d'une inscription
event Chaîne uid Identifiant d'un événement
champs Chaîne Tout filtre de champ valide (par défaut relationship,relationshipType,createdAtClient,from[trackedEntity[trackedEntity],enrollment[enrollment],event[event]],to[trackedEntity[trackedEntity],enrollment[enrollment],event[event]]) Inclut les sous-objets spécifiés dans la réponse
order Chaîne Liste séparée par des virgules de paires de noms de propriétés, d'attributs ou d'UID et de directions de tri au format propName:sortDirection. Champs pris en charge : createdAt, createdAtClient.
includeDeleted Booléen true, false détermine s'il faut inclure dans le résultat de votre requête, des éléments supprimés mais pas définitivement

Les règles suivantes s'appliquent aux paramètres de requête.

Only one parameter among trackedEntity, enrollment, event can be passed.

Note

Using trackedEntity, enrollment or event params, will return any relationship where the trackedEntity, enrollment or event is part of the relationship (either from or to). As long as the user has access to it.

Exemple de réponse

{
  "pager": {
    "page": 1,
    "pageSize": 2
  },
  "relationships": [
    {
      "relationship": "oGtgtJpp6fG",
      "relationshipType": "Mv8R4MPcNcX",
      "from": {
        "trackedEntity": {
          "trackedEntity": "neR4cmMY22o"
        }
      },
      "to": {
        "trackedEntity": {
          "trackedEntity": "DsSlC54GNXy"
        }
      }
    },
    {
      "relationship": "SSfIicJKbh5",
      "relationshipType": "Mv8R4MPcNcX",
      "from": {
        "trackedEntity": {
          "trackedEntity": "neR4cmMY22o"
        }
      },
      "to": {
        "trackedEntity": {
          "trackedEntity": "rEYUGH97Ssd"
        }
      }
    }
  ]
}

Tracker access control

Le Tracker dispose de quelques concepts en ce qui concerne le contrôle d'accès, tels que le partage, les champs d'application des unités d'organisation, la propriété et les niveaux d'accès. Les sections suivantes fournissent une brève introduction aux différents sujets.

Metadata sharing

Le paramètre de partage est une fonctionnalité standard de DHIS2 qui s'applique aux métadonnées/données du Tracker et de l'Agrégé, ainsi qu'aux tableaux de bord et aux éléments de visualisation. Au cœur du partage se trouve la possibilité de définir qui peut voir/faire quoi. En général, il existe cinq configurations de partage possibles : aucun accès, lecture des métadonnées, écriture des métadonnées, lecture des données et écriture des données. Ces configurations d'accès peuvent être accordées au niveau de l'utilisateur et/ou du groupe d'utilisateurs (pour plus de flexibilité). En ce qui concerne le Tracker, les métadonnées suivantes et leur configuration de partage sont d'une importance particulière : Élément de données, option de catégorie, programme, étape de programme, type d'entité suivie, attribut d'entité suivie, ainsi que les tableaux de bord et les éléments de tableau de bord liés au Tracker.

Sharing settings are enforced during Tracker data import/export. Data read/write access is needed to read and write respectively. Similarly, if a user is expected to modify metadata, it is essential to grant metadata write access.

One critical point with Tracker data is the need to have a holistic approach. For example, a user won’t be able to see the Data Element value by having read access to just the Data Element. The user needs to have data read to access the parent Program Stage and Program where this Data Element belongs. This works the same way as for category option combinations. In Tracker, events and enrollments are associated with an AttributeOptionCombo, which is composed of multiple Category Options. To read an event or enrollment, a user must have data read access to all Category Options and their corresponding Categories that make up the AttributeOptionCombo of that object. If the user lacks access to even one of the required Category Options or Categories, they will not have access to the entire event or enrollment..

Lorsqu'il s'agit d'accéder aux données d'inscription, il est essentiel d'avoir d'abord accès à l'entité suivie. L'accès à une entité suivie est contrôlé par le partage des paramètres du programme, du type d'entité suivie et de l'attribut d'entité suivie. Une fois que l'on a accédé à l'inscription, il est possible d'accéder aux données d'événement, là encore en fonction de l'étape du programme et des paramètres de partage des éléments de données.

Un autre point essentiel à prendre en considération est la manière de définir l'accès aux différentes étapes d'un programme. Il peut arriver que nous devions accorder l'accès à une étape spécifique - par exemple, « Résultat de laboratoire » - à un groupe d'utilisateurs spécifique (techniciens de laboratoire). Dans ce cas, nous pouvons accorder un accès en écriture aux données de l'étape « Résultat du laboratoire », probablement un accès en lecture à une ou plusieurs étapes au cas où nous voudrions que les techniciens de laboratoire lisent d'autres résultats médicaux, ou aucun accès si nous pensons qu'il n'est pas nécessaire qu'ils consultent des données autres que celles relatives au laboratoire.

En résumé, DHIS2 dispose d'un paramètre de partage très précis que nous pouvons utiliser pour implémenter les mécanismes de contrôle d'accès au niveau des données et des métadonnées. Ces paramètres de partage peuvent être appliqués directement au niveau de l'utilisateur ou du groupe d'utilisateurs. Le paramètre de partage à appliquer dépend du cas d'utilisation.

Organisation unit scopes

Organisation units are one of the most fundamental objects in DHIS2. They define a universe under which a user is allowed to record and/or read data. There are three types of organisation units that can be assigned to a user. These are data capture, data view (not used in tracker), and tracker search. As the name implies, these organisation units define a scope under which a user is allowed to conduct the respective operations. A user can search for data in their search scope and capture scope organisation units.

Cependant, pour mieux affiner le champ d'application, DHIS2 Tracker introduit un concept que nous appelons OrganisationUnitSelectionMode (mode de sélection de l'unité d'organisation). Ce mode est souvent utilisé lors de l'exportation d'objets Tracker. Par exemple, si un utilisateur dispose d'un champ de recherche particulier, cela signifie-t-il que nous devons utiliser ce champ chaque fois que l'utilisateur tente de rechercher un objet Tracker, d'inscription ou d'événement ? Ou bien l'utilisateur souhaite-t-il limiter la recherche à l'unité d'organisation sélectionnée, ou à l'ensemble de l'unité d'organisation de saisie, etc.

Les utilisateurs peuvent affiner un champ d'application en transmettant une valeur spécifique de orgUnitMode (mode d'unité d'organisation) dans leur requête API:

/api/tracker/trackedEntities?orgUnit=UID&orgUnitMode=specific_organisation_unit_selection_mode

Actuellement, six modes de sélection sont disponibles: SÉLECTIONNÉ, SUBORDONNÉES, DESCENDANTS, SAISIE, ACCESSIBLE et TOUS.

Mode Description
SELECTED Specified organisation units.
CHILDREN Specified organisation unit including immediate children, i.e. organisation units at the immediate level below.
DESCENDANTS Specified organisation unit and all organisation units in the sub-hierarchy, i.e. at all organisation unit levels in the sub-hierarchy below the specified organisation units.
CAPTURE The data capture organisation units associated with the current user and all organisation units in the sub-hierarchy.
ACCESSIBLE The tracker search organisation units associated with the current user and all organisation units in the sub-hierarchy. This includes everything visible to the user, including open and audited programs within its search scope, as well as data in protected and closed programs within the user's capture scope. If a user lacks search organisation units, the system defaults to capture scope, ensuring that the user always has access to at least one universe. The capture scope, being mandatory, serves as a foundational element in guaranteeing a data environment for the user.
ALL All organisation units in the system. This mode is reserved for authorized users, specifically those with the authority ALL (super users). Users with the authority F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS can also search system-wide but need sharing access to the returned program, program stage, and/or tracked entity type. Non-authorized users are not permitted to search using this scope.

The first three modes, SELECTED, CHILDREN and DESCENDANTS, expect an organisation unit to be supplied in the request, while the last three, CAPTURE, ACCESSIBLE and ALL do not.

The organisation unit mode will be one of the ones listed above when it is explicitly provided in the API request. Since it is not a mandatory paramter, when not specified, the default value will be SELECTED if an organisation unit is present, and ACCESSIBLE if not.

Il n'est pas judicieux de transmettre ces modes lors des opérations d'importation du Tracker. En effet, lors de l'écriture des données Tracker, chaque objet doit être rattaché à une unité d'organisation spécifique. Le système vérifiera alors si chacune des unités d'organisation mentionnées relève du champ d'application de la SAISIE. Si ce n'est pas le cas, le système rejettera simplement l'opération d'écriture.

Note that there are four type of organisation unit associations relevant for tracker objects. A Tracked Entity has an organisation unit, commonly referred to as the Registration Organisation unit. Enrollments have an organisation unit associated with them. Events also have an organisation unit associated with them. There is also an Owner organisation unit for a tracker program combination.

Lors de la récupération des objets Tracker, selon le contexte, le champ d'application de l'unité d'organisation est appliquée à l'une des quatre associations d'unités d'organisation ci-dessus.

For example, when retrieving Tracked Entities without the context of a program, the organisation unit scope is applied to the registration organisation unit of the Tracked Entity. Whereas, when retrieving Tracked Entities, including specific program data, the organisation unit scope is applied to the owner organisation unit.

Tracker Program Ownership

Tracker Ownership, introduced in DHIS2 2.30, defines an organisation unit association for a TrackedEntity - Program combination. We call this the Owner (or Owning) Organisation unit of a TrackedEntity in the context of a Program. The Owner organisation unit is used to decide access privileges when reading and writing tracker data related to a program. This, along with the Program's Access Level configuration, decides the access behavior for Program-related data (Enrollments and Events). A user can access a TrackedEntity's Program data if the corresponding Owner OrganisationUnit for that TrackedEntity-Program combination falls under the user's organisation unit scope (Search/Capture). For Programs that are configured with access level OPEN or AUDITED , the Owner OrganisationUnit has to be in the user's search scope. For Programs that are configured with access level PROTECTED or CLOSED , the Owner OrganisationUnit has to be in the user's capture scope to be able to access the corresponding program data for the specific tracked entity. Irrespective of the program access level, to access Tracker objects, the requested organisation unit must always be within either the user's search scope or capture scope. A user cannot request objects outside these two scopes unless they are using the organisation unit mode ALL and have sufficient privileges to use that mode.

When requesting tracked entities without specifying a program, the response will include only tracked entities that satisfy metadata sharing settings and one of the following criteria:

  • The tracked entity is enrolled in at least one program the user has data access to, and the user has access to the owner organisation unit.
  • The tracked entity is not enrolled in any program the user has data access to, but the user has access to the tracked entity registering organisation unit.

Tracker Ownership Override: Break the Glass

It is possible to temporarily override the ownership privilege for a program that is configured with an access level of PROTECTED. Any user with the org unit owner within their search scope, can temporarily access the program-related data by providing a reason for accessing it.

This act of temporarily gaining access is termed breaking the glass. Currently, temporary access is granted for 3 hours. DHIS2 audit breaking the glass along with the reason specified by the user. This information is also stored in the database, but only if the tracked entity type is configured to allow auditing, which is disabled by default.

It is not possible to gain temporary access to a program that has been configured with an access level of CLOSED.

To break the glass for a TrackedEntity-Program combination, the following POST request can be used:

/api/tracker/ownership/override?trackedEntity=DiszpKrYNg8&program=eBAyeGv0exc&reason=patient+showed+up+for+emergency+care

Tracker Ownership Transfer

Il est possible de transférer la propriété d'une combinaison Entité suivie - Programme d'une unité d'organisation à une autre. Cela peut s'avérer utile en cas de transfert de patients ou de migration. Seul un utilisateur disposant d'un accès à la propriété (ou d'un accès temporaire en brisant la glace) peut transférer la propriété. Pour transférer la propriété d'une combinaison Entité suivie - Programme à une autre unité d'organisation, la requête "PUT" suivante peut être utilisée :

/api/tracker/ownership/transfer?trackedEntity=DiszpKrYNg8&program=eBAyeGv0exc&ou=EJNxP3WreNP

Access levels

Tracker data is handled with an extra level of protection. In addition to the standard feature of metadata and data protection through sharing settings, Tracker data are shielded with additional access level protection mechanisms. Currently, there are four access levels that can be configured for a Program: Open, Audited, Protected, and Closed.

Ces niveaux d'accès ne sont déclenchés que lorsque les utilisateurs tentent d'interagir avec les données du programme, c'est-à-dire les données relatives aux inscriptions et aux événements. La configuration des différents niveaux d'accès du programme correspond à un degré d'ouverture (ou de fermeture) des données du programme. Notez que tous les autres paramètres de partage sont toujours respectés et que le niveau d'accès n'est qu'une couche supplémentaire de contrôle d'accès. Voici une brève description des quatre niveaux d'accès qui peuvent être configurés pour un programme.

Ouvrir

Ce niveau d'accès est le moins restrictif des niveaux d'accès. Les utilisateurs peuvent accéder aux données d'un programme OUVERT et les modifier si l'unité d'organisation propriétaire fait partie du champ de recherche de l'utilisateur. Avec ce niveau d'accès, il est possible d'accéder à des données qui se trouvent hors du champ de saisie et de les modifier sans justification ni conséquence.

Audité

Il s'agit du même niveau d'accès que le niveau Ouvert. La différence est que le système ajoutera automatiquement une entrée dans le journal d'audit sur les données auxquelles l'utilisateur accède.

Protégé

This access level is slightly more restricted. Data inside a PROTECTED program can only be accessed by users if the Owner organisation unit falls under the user's capture scope. However, a user who only has the Owner organisation unit in the search scope can gain temporary ownership by breaking the glass. The user has to provide a justification of why they are accessing the data at hand. The system will then put a log of both the justification and access audit and provide temporary access for 3 hours to the user. Note that when breaking the glass, the Owner Organisation Unit remains unchanged, and only the user who has broken the glass gains temporary access.

Fermé

This is the most restricted access level. Data recorded under programs configured with access level CLOSED will not be accessible if the Owner Organisation Unit does not fall within the user's capture scope. It is also not possible to break the glass or gain temporary ownership in this configuration. Note that it is still possible to transfer the ownership to another organisation unit. Only a user who has access to the data can transfer the ownership of a TrackedEntity-Program combination to another Organisation Unit. If ownership is transferred, the Owner Organisation Unit is updated. trackedEntities

Working lists

Working lists allow users to efficiently organize their workflow by saving filters and sorting preferences for tracked entities, enrollments, and events. Each type of working list—tracked entities, enrollments, and events—has a dedicated API for management.

Working lists are metadata, making them shareable and subject to the same sharing patterns as other metadata. When using the /api/sharing endpoint, the type parameter should be set to the name of the working list API. For example, use trackedEntityInstanceFilter for tracked entity working lists.

Since working lists are metadata refer to metadata on how to create, update and delete metadata. The following sections describe the payloads of each of the working lists endpoints.

Tracked entity working lists

Create, update and delete tracked entity working lists using

/api/trackedEntityInstanceFilters

Payload

Tableau : Charge

Propriété Description Exemple
name Nom de la liste de tâches. Obligatoire.
description Il s'agit d'une description de la liste de tâches.
sortOrder The sort order of the working list.
style Objet contenant un style css. {"color": "blue", "icon": "fa fa-calendar"}
program Objet contenant l'identifiant du programme. Obligatoire. { "id" : "uy2gU8kTjF"}
entityQueryCriteria An object representing various possible filtering values. See Entity Query Criteria definition table below.
eventFilters Une liste de filtres d'événements. Voir le tableau de définition des filtres d'événements ci-dessous. [{"programStage": "eaDH9089uMp", "eventStatus": "OVERDUE", "eventCreatedPeriod": {"periodFrom": -15, "periodTo": 15}}]
Entity query criteria definition
Propriété Description Exemple
attributeValueFilters A list of attributeValueFilters. This is used to specify filters for attribute values when listing tracked entities "attributeValueFilters":[{"attribute": "abcAttributeUid","le": "20","ge": "10","lt": "20","gt": "10","in": ["India", "Norway"],"like": "abc","sw": "abc","ew": "abc","dateFilter": {"startDate": "2014-05-01","endDate": "2019-03-20","startBuffer": -5,"endBuffer": 5,"period": "LAST_WEEK","type": "RELATIVE"}}]
enrollmentStatus The tracked entities enrollment status. Can be none(any enrollmentstatus) or ACTIVE, COMPLETED, CANCELLED
followUp When this parameter is true, the working list only returns tracked entities that have an enrollment with followUp=true.
organisationUnit Permet de spécifier l'identifiant de l'unité d'organisation {"organisationUnit": "a3kGcGDCuk7"}
ouMode To specify the organisation unit selection mode. Options are SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL "ouMode": "SELECTED"
assignedUserMode To specify the assigned user selection mode for events. Options are CURRENT, PROVIDED, NONE, ANY. See table below to understand what each value indicates. If PROVIDED (or null), non-empty assignedUsers in the payload will be considered. "assignedUserMode": "PROVIDED"
assignedUser To specify a list of assigned users for events. To be used along with PROVIDED assignedUserMode above. "assignedUsers": ["a3kGcGDCuk7", "a3kGcGDCuk8"]
displayColumnOrder Permet de spécifier l'ordre de sortie des colonnes "displayOrderColumns": ["enrollmentDate", "program"]
order To specify ordering/sorting of fields and its directions in comma separated values. A single item in order is of the form "orderDimension:direction". Note: Supported orderDimensions are trackedEntity, created, createdAt, createdAtClient, updatedAt, updatedAtClient, enrolledAt, inactive and the tracked entity attributes "order":"a3kGcGDCuk6:desc"
programStage To specify a programStage uid to filter on. tracked entities will be filtered based on presence of enrollment in the specified program stage. "programStage":"a3kGcGDCuk6"
TrackedEntityType To specify a trackedEntityType filter tracked entities on. {"trackedEntityType":"a3kGcGDCuk6"}
trackedEntities To specify a list of tracked entities to use when querying tracked entities. "trackedEntities":["a3kGcGDCuk6","b4jGcGDCuk7"]
enrollmentCreatedDate DateFilterPeriod object date filtering based on enrollment created date. "enrollmentCreatedDate": { "period": "LAST_WEEK", "type": "RELATIVE" }
enrollmentIncidentDate DateFilterPeriod object date filtering based on enrollment incident date. "enrollmentIncidentDate": { "startDate": "2014-05-01", "endDate": "2019-03-20", "startBuffer": -5, "endBuffer": 5, "period": "LAST_WEEK", "type": "RELATIVE" }
eventStatus The event status. Options are ACTIVE, COMPLETED, VISITED, SCHEDULE, OVERDUE, SKIPPED and VISITED "status":"VISITED"
eventDate DateFilterPeriod object date filtering based on event date. "eventDate": {"startBuffer": -5,"endBuffer": 5, "type": "RELATIVE" }
lastUpdatedDate DateFilterPeriod object date filtering based on last updated date. "lastUpdatedDate": {"startDate": "2014-05-01", "endDate": "2019-03-20", "type": "ABSOLUTE" }

Tableau : Définition des filtres d'événements

Propriété Description Exemple
programStage Which programStage the tracked entity needs an event in to be returned. "eaDH9089uMp"
eventStatus The events status. Can be none(any event status) or ACTIVE, COMPLETED, SCHEDULE, OVERDUE ACTIVE
eventCreatedPeriod FilterPeriod object containing a period in which the event must be created. See Period definition below. { "periodFrom": -15, "periodTo": 15}
assignedUserMode To specify the assigned user selection mode for events. Options are CURRENT (events assigned to current user), PROVIDED (events assigned to users provided in "assignedUsers" list), NONE (events assigned to no one) , ANY (events assigned to anyone). If PROVIDED (or null), non-empty assignedUsers in the payload will be considered. "assignedUserMode": "PROVIDED"
assignedUser To specify a list of assigned users for events. To be used along with PROVIDED assignedUserMode above. "assignedUsers": ["a3kGcGDCuk7", "a3kGcGDCuk8"]
Period filter definition
Propriété Description Exemple
periodFrom Nombre de jours à partir du jour actuel. Il peut s'agir d'un nombre entier positif ou négatif. -15
periodTo Nombre de jours à partir du jour actuel. Doit être supérieur à periodFrom. Peut être un nombre entier positif ou négatif. 15

Query request parameters

Tableau : Paramètres de requête pour les filtres d'instances d'entités suivies

Paramètre de requête Description
program Identifiant du programme. Il limite le filtrage au programme donné.

Program stage working lists

Create, update and delete program stage working lists using

/api/programStageWorkingLists

Payload

Tableau : Charge

Valeurs de la charge Description Exemple
name Nom de la liste de tâches. Obligatoire.
description Il s'agit d'une description de la liste de tâches.
program Objet contenant l'identifiant du programme. Obligatoire. {"id" : "uy2gU8kTjF"}
programStage Objet contenant l'identifiant de l'étape de programme. Obligatoire. {"id" : "oRySG82BKE6"}
programStageQueryCriteria (Critères de requête de l'étape de programme) An object representing various possible filtering values. See Program Stage Query Criteria definition table below.

Tableau : Critères de requête de l'étape de programme

Valeurs des critères Description Exemple
eventStatus The event status. Options are ACTIVE, COMPLETED, VISITED, SCHEDULE, OVERDUE, SKIPPED and VISITED "status":"VISITED"
Évènement créé à DateFilterPeriod object filtering based on the event creation date. {"type":"ABSOLUTE","startDate":"2020-03-01","endDate":"2022-12-30"}
eventOccurredAt DateFilterPeriod object filtering based on the event occurred date. {"type":"RELATIVE","period":"TODAY"}
eventScheduledAt DateFilterPeriod object filtering based on the event scheduled date. {"type":"RELATIVE","period":"TODAY"}
enrollmentStatus Any valid EnrollmentStatus. Options are ACTIVE, COMPLETED and CANCELLED. "enrollmentStatus": "COMPLETED"
followUp Indique s'il faut filtrer ou non les inscriptions marquées pour le suivi "followUp":true
inscrit à DateFilterPeriod object filtering based on the event enrollment date. "enrolledAt": {"type":"RELATIVE","period":"THIS_MONTH"}
Inscription effectué à DateFilterPeriod object filtering based on the event occurred date. {"type":"RELATIVE","period":"THIS_MONTH"}
orgUnit Un UID d'unité d'organisation valide "orgUnit": "Rp268JB6Ne4"
ouMode Un mode de sélection d'unités d'organisation valide "ouMode": "SELECTED"
assignedUserMode A valid user selection mode for events. Options are CURRENT, PROVIDED, NONE, ANY and ALL. If PROVIDED (or null), non-empty assignedUsers in the payload will be expected. "Mode d'utilisateur assigné" : "FOURNI"
assignedUser A list of assigned users for events. To be used along with PROVIDED assignedUserMode above. "Utilisateurs assignés":["DXyJmlo9rge"]
order Liste des champs et de leurs directions en valeurs séparées par des virgules, les résultats seront triés en fonction de cette liste. Un seul élément dans l'ordre est de la forme « orderDimension:direction ». "ordre": "w75KJ2mc4zz:asc"
displayColumnOrder Ordre de sortie des colonnes "Ordre de sortie des colonnes":["w75KJ2mc4zz","zDhUuAYrxNC"]
dataFilters Une liste d'éléments contenant les filtres à utiliser lors de requêtes d'événements "Filtres de données":[{"dataItem": "GXNUsigphqK","ge": "10","le": "20"}]
attributeValueFilters Une liste de filtres de valeurs d'attribut. Elle est utilisée pour définir des filtres pour les valeurs d'attributs lors de l'établissement de la liste des entités suivies. "Filtres de valeurs d'attribut":[{"attribute": "ruQQnf6rswq","eq": "15"}]

See an example payload below.

{
  "name": "Test WL",
  "description": "Test WL definition",
  "program": {
    "id": "uy2gU8kT1jF"
  },
  "programStage": {
    "id": "oRySG82BKE6"
  },
  "programStageQueryCriteria": {
    "eventStatus": "VISITED",
    "eventCreatedAt": {
      "type": "ABSOLUTE",
      "startDate": "2020-03-01",
      "endDate": "2022-12-30"
    },
    "eventScheduledAt": {
      "type": "RELATIVE",
      "period": "TODAY"
    },
    "enrollmentStatus": "COMPLETED",
    "followUp": true,
    "enrolledAt": {
      "type": "RELATIVE",
      "period": "THIS_MONTH"
    },
    "enrollmentOccurredAt": {
      "type": "RELATIVE",
      "period": "THIS_MONTH"
    },
    "orgUnit": "Rp268JB6Ne4",
    "ouMode": "SELECTED",
    "assignedUserMode": "PROVIDED",
    "assignedUsers": [
      "DXyJmlo9rge"
    ],
    "order": "w75KJ2mc4zz:asc",
    "displayColumnOrder": [
      "w75KJ2mc4zz",
      "zDhUuAYrxNC"
    ],
    "dataFilters": [
      {
        "dataItem": "GXNUsigphqK",
        "ge": "10",
        "le": "20"
      }
    ],
    "attributeValueFilters": [
      {
        "attribute": "ruQQnf6rswq",
        "eq": "15"
      }
    ]
  }
}

Event working lists

Create, update and delete event working lists using the following endpoint.

/api/eventFilters

Payload

Tableau : Charge

Propriété Description Exemple
name Name of the working list. "name":"My working list"
description Il s'agit d'une description de la liste de tâches. "description":"for listing all events assigned to me".
program L'uid du programme. "program" : "a3kGcGDCuk6"
programStage L'uid de l'étape de programme. "programStage" : "a3kGcGDCuk6"
eventQueryCriteria Objet contenant des paramètres pour les requêtes, le tri et le filtrage des événements. "eventQueryCriteria": { "organisationUnit":"a3kGcGDCuk6", "status": "COMPLETED", "createdDate": { "from": "2014-05-01", "to": "2019-03-20" }, "dataElements": ["a3kGcGDCuk6:EQ:1", "a3kGcGDCuk6"], "filters": ["a3kGcGDCuk6:EQ:1"], "programStatus": "ACTIVE", "ouMode": "SELECTED", "assignedUserMode": "PROVIDED", "assignedUsers" : ["a3kGcGDCuk7", "a3kGcGDCuk8"], "followUp": false, "events": ["a3kGcGDCuk7", "a3kGcGDCuk8"], "fields": "eventDate,dueDate", "order": "dueDate:asc,createdDate:desc" }
Event query criteria definition
Propriété Description Exemple
followUp Used to filter events based on enrollment followUp flag. Options are true, false. "followUp": true
organisationUnit Permet de spécifier l'identifiant de l'unité d'organisation "organisationUnit": "a3kGcGDCuk7"
ouMode To specify the OU selection mode. Options are SELECTED, CHILDREN, DESCENDANTS, ACCESSIBLE, CAPTURE, ALL "ouMode": "SELECTED"
assignedUserMode To specify the assigned user selection mode for events. Options are CURRENT, PROVIDED, NONE, ANY. See table below to understand what each value indicates. If PROVIDED (or null), non-empty assignedUsers in the payload will be considered. "assignedUserMode": PROVIDED
assignedUser Permet de spécifier une liste d'utilisateurs assignés à des événements. À utiliser avec le mode d'utilisateur assigné PROVIDED ci-dessus. "assignedUsers": ["a3kGcGDCuk7", "a3kGcGDCuk8"]
displayColumnOrder Permet de spécifier l'ordre de sortie des colonnes "displayOrderColumns": ["eventDate", "dueDate", "program"]
order To specify ordering/sorting of fields and its directions in comma separated values. A single item in order is of the form "dataItem:direction". "order"="a3kGcGDCuk6:desc,eventDate:asc"
dataFilters Permet de spécifier les filtres à appliquer lors de l'établissement de la liste des événements "dataFilters"=[{ "dataItem": "abcDataElementUid", "le": "20", "ge": "10", "lt": "20", "gt": "10", "in": ["India", "Norway"], "like": "abc", "dateFilter": { "startDate": "2014-05-01", "endDate": "2019-03-20", "startBuffer": -5, "endBuffer": 5, "period": "LAST_WEEK", "type": "RELATIVE" } }]
status Tout statut d'événement valide "eventStatus": "COMPLETED"
events permet de spécifier une liste d'événements "events"=["a3kGcGDCuk6"]
completedDate DateFilterPeriod object date filtering based on completed date. "completedDate": { "startDate": "2014-05-01", "endDate": "2019-03-20", "startBuffer": -5, "endBuffer": 5, "period": "LAST_WEEK", "type": "RELATIVE" }
eventDate DateFilterPeriod object date filtering based on event date. "eventDate": { "startBuffer": -5, "endBuffer": 5, "type": "RELATIVE" }
dueDate DateFilterPeriod object date filtering based on due date. "dueDate": { "period": "LAST_WEEK", "type": "RELATIVE" }
lastUpdatedDate DateFilterPeriod object date filtering based on last updated date. "lastUpdatedDate": { "startDate": "2014-05-01", "endDate": "2019-03-20", "type": "ABSOLUTE" }

See an example payload below.

{
  "name": "event working list",
  "program": "VBqh0ynB2wv",
  "eventQueryCriteria": {
    "eventDate": {
      "period": "LAST_WEEK",
      "type": "RELATIVE"
    },
    "dataFilters": [
      {
        "ge": "35",
        "le": "70",
        "dataItem": "qrur9Dvnyt5"
      }
    ],
    "assignedUserMode": "PROVIDED",
    "assignedUsers": [
      "CotVI2NX0rI",
      "xE7jOejl9FI"
    ],
    "status": "ACTIVE",
    "order": "occurredAt:desc",
    "displayColumnOrder": [
      "occurredAt",
      "status",
      "assignedUser",
      "qrur9Dvnyt5",
      "oZg33kd9taw"
    ]
  }
}

Common objects

Tableau : Définition de l'objet DateFilterPeriod

Propriété Description Exemple
type Specify whether the date period type is ABSOLUTE, RELATIVE "type" : "RELATIVE"
period Specify if a relative system defined period is to be used. Applicable only when type is RELATIVE. (see Relative Periods for supported relative periods) "period" : "THIS_WEEK"
startDate Absolute start date. Applicable only when type is ABSOLUTE "startDate":"2014-05-01"
endDate Absolute end date. Applicable only when type is ABSOLUTE "startDate":"2014-05-01"
startBuffer Relative custom start date. Applicable only when type is RELATIVE "startBuffer":-10
endBuffer Relative custom end date. Applicable only when type is RELATIVE "startDate":+10

Potential duplicates

Potential duplicates are records identified by the data deduplication feature as possibly being duplicates. Due to the nature of this feature, the API endpoint has certain restrictions. A potential duplicate represents a pair of records suspected to be duplicates.

To retrieve a list of potential duplicates, use the following endpoint:

GET /api/potentialDuplicates

The response payload for a potential duplicate looks like this.

{
  "created": "2024-06-04T10:11:29.110",
  "lastUpdated": "2024-06-04T10:11:29.110",
  "original": "<UID>",
  "duplicate": "<UID>",
  "status": "OPEN|INVALID|MERGED",
  "id": "<id>"
}

These are the parameters this endpoint accepts:

Paramètre de requête Description Type Valeurs autorisées
trackedEntities List of tracked entities Liste de chaînes (séparées par une virgule) existing tracked entity UIDs
status Statut de doublon potentiel chaîne OPEN, INVALID, MERGED, ALL

To inspect individual potential duplicate records, use the following endpoint:

GET /api/potentialDuplicates/<{id}

To create a new potential duplicate, use this endpoint:

POST /api/potentialDuplicates

The payload you provide must include the UIDs of the original and duplicate tracked entities. New potential duplicates are open by default.

{
  "original": "<UID>",
  "duplicate": "<UID>"
}
Code de statut Description
400 Input original or duplicate is null or has invalid uid
403 User do not have access to read original or duplicate TEs
404 TE not found
409 Pair of original and duplicate TEs already existing

To update the status of a potential duplicate, use the following endpoint:

PUT /api/potentialDuplicates/<id>
Paramètre de requête Description Type Valeurs autorisées
status Statut de doublon potentiel chaîne OPEN, INVALID
Code de statut Description
400 Vous ne pouvez pas mettre à jour un doublon potentiel en le faisant passer à MERGED. Pour ce faire, vous devez effectuer une requête de fusion.
400 Vous ne pouvez pas mettre à jour un doublon potentiel qui a déjà le statut MERGED.

Merging tracked entities

Tracked entities can be merged together if they are deemed viable. To initiate a merge, the first step is to define two tracked entities as a Potential Duplicate. The merge endpoint moves data from the duplicate tracked entity to the original tracked entity and deletes the remaining data of the duplicate.

To merge a Potential Duplicate, i.e. the two tracked entities the Potential Duplicate represents, use the following endpoint:

POST /api/potentialDuplicates/<id>/merge
Paramètre de requête Description Type Valeurs autorisées
mergeStrategy Stratégie à utiliser pour fusionner le doublon potentiel chaîne AUTO (par défaut) ou MANUAL

The endpoint accepts a single parameter, mergeStrategy, which determines the strategy used when merging. For the AUTO strategy, the server will attempt to merge the two tracked entities automatically without user input. This strategy only allows merging tracked entities without conflicting data (see examples below). The MANUAL strategy requires the user to send in a payload describing how the merge should be done. For examples and rules for each strategy, see their respective sections below.

Merge strategy AUTO

The automatic merge evaluates the mergability of the two tracked entities and merges them if they are deemed mergeable. The mergability is based on whether the two tracked entities have any conflicts. Conflicts refer to data that cannot be merged automatically. Examples of possible conflicts include:

  • The same attribute has different values in each tracked entity.
  • Both tracked entities are enrolled in the same program.
  • Tracked entities have different types.

If any conflict is encountered, an error message is returned to the user.

When no conflicts are found, all data in the duplicate that is not already in the original will be moved to the original. This includes attribute values, enrollments (including events), and relationships. After the merge completes, the duplicate is deleted and the Potential Duplicate is marked as MERGED. When requesting an automatic merge, a payload is not required and will be ignored.

Merge strategy MANUAL

The manual merge is suitable when there are resolvable conflicts or when not all the data needs to be moved during the merge. For example, if an attribute has different values in both tracked entities , the user can specify whether to keep the original value or move over the duplicate's value. Since the manual merge involves the user explicitly requesting to move data, there are some additional checks:

  • Relationship cannot be between the original and the duplicate (This results in an invalid self-referencing relationship)
  • Relationship cannot be of the same type and to the same object in both tracked entities (IE. between original and other, and duplicate and other; This would result in a duplicate relationship)

Il existe deux façons d'effectuer une fusion manuelle : Avec et sans charge.

When a manual merge is requested without a payload, we are telling the API to merge the two tracked entities without moving any data. In other words, we are just removing the duplicate and marking the potentialDuplicate MERGED. This might be valid in a lot of cases where the tracked entity was just created, but not enrolled for example.

Otherwise, if a manual merge is requested with a payload, the payload refers to what data should be moved from the duplicate to the original. The payload looks like this:

{
  "trackedEntityAttributes": ["B58KFJ45L9D"],
  "enrollments": ["F61SJ2DhINO"],
  "relationships": ["ETkkZVSNSVw"]
}

This payload contains three lists, one for each of the types of data that can be moved. trackedEntityAttributes is a list of uids for tracked entity attributes, enrollments is a list of uids for enrollments and relationships a list of uids for relationships. The uids in this payload have to refer to data that actually exists on the duplicate. There is no way to add new data or change data using the merge endpoint - Only moving data.

Informations complémentaires sur la fusion

Currently it is not possible to merge tracked entities that are enrolled in the same program, due to the added complexity. A workaround is to manually remove the enrollments from one of the tracked entities before starting the merge.

All merging is based on data already persisted in the database, which means the current merging service is not validating that data again. This means if data was already invalid, it will not be reported during the merge. The only validation done in the service relates to relationships, as mentioned in the previous section.

Program notification template

The Program Notification Template allows you to create message templates that can be sent based on different types of events. The message and subject templates are translated into actual values and sent to the configured destination. Each program notification template is transformed into either a MessageConversation object or a ProgramMessage object, depending on whether the recipient is external or internal. These intermediate objects will contain only the translated message and subject text.

There are several configuration parameters in the Program Notification Template that are essential for the proper functioning of notifications. These parameters are explained in the table below.

POST /api/programNotificationTemplates
{
    "name": "Case notification",
    "notificationTrigger": "ENROLLMENT",
    "subjectTemplate": "Case notification V{org_unit_name}",
    "displaySubjectTemplate": "Case notification V{org_unit_name}",
    "notifyUsersInHierarchyOnly": false,
    "sendRepeatable": false,
    "notificationRecipient": "ORGANISATION_UNIT_CONTACT",
    "notifyParentOrganisationUnitOnly": false,
    "displayMessageTemplate": "Case notification A{h5FuguPFF2j}",
    "messageTemplate": "Case notification A{h5FuguPFF2j}",
    "deliveryChannels": [
        "EMAIL"
    ]
}

Table: Program Notification Template payload

Champ Obligatoire Description Valeurs
name Oui Name of the Program Notification Template case-notification-alert
notificationTrigger Oui When notification should be triggered. Options are ENROLLMENT, COMPLETION, PROGRAM_RULE, SCHEDULED_DAYS_DUE_DATE ENROLLMENT
subjectTemplate Non Subject template string Case notification V{org_unit_name}
messageTemplate Oui Chaîne du modèle de message Case notification A{h5FuguPFF2j}
notificationRecipient Oui Who is going to receive notification. Options are USER_GROUP, ORGANISATION_UNIT_CONTACT, TRACKED_ENTITY_INSTANCE, USERS_AT_ORGANISATION_UNIT, DATA_ELEMENT, PROGRAM_ATTRIBUTE, WEB_HOOK USER_GROUP
deliveryChannels Non Which channel should be used for this notification. It can be either SMS, EMAIL, or HTTP SMS
sendRepeatable Non Détermine si la notification doit être envoyée plusieurs fois false

The WEB_HOOK notificationRecipient is used exclusively for sending HTTP POST requests to external systems. Ensure that the HTTP delivery channel is selected when using this option.

Retrieving and Deleting Program Notification Template

As program notification template is a type of metadata, you can create, update, and delete it just like other metadata.

Messages de programme

The program message feature enables you to send messages to tracked entities, contact addresses associated with organisation units, phone numbers, and email addresses. Messages can be sent using the messages resource.

POST /api/messages

Envoi de messages de programme

Les messages de programme peuvent être envoyés à l'aide de deux canaux :

  • SMS (SMS)
  • Adresse électronique (EMAIL)

Recipients

Les messages de programme peuvent être envoyés à différents destinataires :

  • Tracked entity: The system will look up attributes of value type PHONE_NUMBER or EMAIL (depending on the specified delivery channels) and use the corresponding attribute values.
  • Organisation unit: The system will use the phone number or email information registered for the organisation unit.
  • List of phone numbers: The system will use the explicitly defined phone numbers.
  • List of email addresses: The system will use the explicitly defined email addresses.

Below is a sample JSON payload for sending messages using POST requests.

{
  "programMessages": [{
    "recipients": {
      "trackedEntity": {
        "id": "UN810PwyVYO"
      },
      "organisationUnit": {
        "id": "Rp268JB6Ne4"
      },
      "phoneNumbers": [
        "55512345",
        "55545678"
      ],
      "emailAddresses": [
        "johndoe@mail.com",
        "markdoe@mail.com"
      ]
    },
    "enrollment": {
      "id": "f3rg8gFag8j"
    },
    "event": {
      "id": "pSllsjpfLH2"
    },
    "deliveryChannels": [
      "SMS", "EMAIL"
    ],
    "notificationTemplate": "Zp268JB6Ne5",
    "subject": "Outbreak alert",
    "text": "An outbreak has been detected",
    "storeCopy": false
  }]
}

Table: Program message payload

Champ Obligatoire Description Valeurs
recipients² Oui Recipients of the program message. At least one recipient must be specified. Can be trackedEntity, organisationUnit, an array of phoneNumbers or an array of emailAddresses.
enrollment Non Enrollment which ProgramMessage is attached to. ID de l'inscription.
event Non Event which ProgramMessage is attached to. ID de l'événement.
deliveryChannels Oui Tableau des canaux d'envoi de messages. SMS, EMAIL
notificationTemplate Non ProgramNotificationTemplate UID is used to cross-check which program message belongs to which notification template. Text.
subject Non L'objet du message. Ne s'applique pas au canal SMS. Text.
text Oui Le texte du message. Text.
storeCopy Non Indique si une copie du message doit être stockée dans DHIS2. false, true

Requête pour des messages de programme

The program message API supports querying messages using specific request parameters.

GET /api/messages

To retrieve a specific message.

GET /api/messages/scheduled/sent?enrollment={uid}
GET /api/messages/scheduled/sent?event={uid}

To retrieve a specific message.

GET /api/messages/{uid}

To delete a message.

DELETE /api/messages/{uid}

The program message API supports querying messages using specific request parameters. You can filter messages based on the parameters listed below. All requests should use the GET HTTP verb to retrieve information.

Query program messages API
Paramètre URL
enrollment /api/messages?enrollment=6yWDMa0LP7
event /api/messages?event=SllsjpfLH2
trackedEntity /api/messages?trackedEntity=xdfejpfLH2
organisationUnit /api/messages?ou=Sllsjdhoe3
processedDate /api/messages?processedDate=2016-02-01

Program Notification Instance

/api/programNotificationInstances exposes program notification instances, i.e. concrete scheduled or sent notifications created from program notification templates.

Returns program notification instances, optionally filtered and paginated.

GET /api/programNotificationInstances
Query program notification instance API
Nom Type Obligatoire Description
scheduledAt date (ISO-8601) no Returns notification instances scheduled to be sent on the given date. Example: scheduledAt=2025-01-01.
paging boolean no Enables or disables pagination. Default is true. Use paging=false to return all matching instances without pagination.
page integer no Page number to return when pagination is enabled.
pageSize integer no Number of items per page when pagination is enabled.
event UID no Program notification instances attached to this event.
enrollment UID no Program notification instances attached to this enrollment.

Performance

This section covers general performance principles followed by endpoint-specific guidance for the tracker export endpoints. Further performance optimizations require knowledge of real-world access patterns and data distribution. If your implementation can share this information, it will help prioritize improvements.

For tracker performance improvements relative to previous releases, see the corresponding release note, e.g. 2.43.

Importation

Notifications

Notifications are dispatched asynchronously after import but compete with concurrent requests for database connections, CPU, and memory. With many entities and notification templates this can increase latency. For bulk imports where notifications are not needed, skip them:

POST /api/tracker?skipSideEffects=true

Règles de programme

The rule engine runs synchronously during import for every enrollment and event in the bundle, which can increase latency significantly for bulk imports. Skip it only if the programs have no rules with validations or assignments that must be enforced on import:

POST /api/tracker?skipRuleEngine=true

Exportation

General Principles

Export endpoint response times are typically dominated by database query execution. The recommendations below focus on reducing the amount of work the database has to do.

Query at the Right Level

The tracker data model has three levels: tracked entities, enrollments, and events. Always query at the lowest level that satisfies your need. Use GET /api/tracker/events instead of GET /api/tracker/trackedEntities?fields=enrollments[events]. Querying via a parent endpoint increases query complexity or the number of queries.

Use Explicit fields

By default, all endpoints exclude nested collections such as enrollments, events, and relationships. Each additional collection increases resource utilization and response times. Only request the fields you need and avoid fields=*.

Selectivity

Query performance depends on how many records the database must process before returning results. The fewer records to scan, sort, and deduplicate, the faster the response. This is selectivity: the fraction of total records that match the query conditions.

Selectivity comes from several sources, all of which compound: request parameters (such as program, filter, date ranges), user scope, and orgUnitMode.

Filters

Filters narrow the result set before sorting and pagination. They are most effective when backed by a database index. Broad filters (e.g., filter=w75KJ2mc4zz:like:J) may match a large portion of the dataset and provide little selectivity. Narrow filters (e.g., filter=w75KJ2mc4zz:eq:Jerald or a tight date range) reduce the working set significantly. like filters on tracked entity attributes can benefit from trigram indexing.

The "Minimum number of attributes required to search" setting on programs and tracked entity types requires a minimum number of attribute filters when searching outside the user's capture scope.

Program

Specifying program enables ownership-based access control. Without program, the system must evaluate access rules dynamically across all programs a tracked entity is enrolled in. Always include program when querying program-specific data.

Note that even with program specified, selectivity depends on how much data exists for that program. A program enrolling most tracked entities will not be very selective.

Organisation Unit Mode

orgUnitMode and the user's organisation unit scope directly affect how many records the database processes. Performance depends on how much data the included org units own. A user scoped to a single facility queries a small subset of records; a user with root-level access may scan the entire program. SELECTED is the most efficient as the database can seek directly to records owned by the specified org units.

CHILDREN is slow when the children do not own data. Data is typically captured at facilities (the lowest level). Using CHILDREN at a higher level (e.g. district) returns administrative org units that have no events, forcing the database to scan all events in the program to confirm this. CHILDREN is fast when the children are org units that actually capture data.

ALL includes no geographic restriction. ACCESSIBLE depends on the user's search scope, which for users with broad access can cover most of the program's data. Combine with selective filters to keep the working set manageable.

Ordering

The order parameter can significantly impact query performance. Order fields fall into performance tiers:

  • Fast (indexed): The database walks an index in order and stops after filling the requested page. Cost scales with page size and offset, not dataset size. This assumes the query conditions allow the database to use the index, which depends on filters and orgUnitMode.
  • Slow (no index): The database must scan and sort all matching records before returning the page. Cost is dominated by the total number of matching records.
  • Very slow (cross-resource): The sort value comes from a related resource (e.g., sorting tracked entities by enrolledAt or an attribute value). The database must look up these values for every matching record before sorting.

Selectivity matters more than order field choice. With selective filters or narrow user scope, even slow order fields are fast because the database only sorts a small set. Note that filters without a backing index still reduce the sort cost but not the scan cost.

See the endpoint-specific sections below for which order fields fall into which tier.

Pagination

DHIS2 uses offset-based pagination. High page numbers are inherently slower because the database must compute and discard all preceding rows. This is a fundamental property of offset-based pagination, not specific to DHIS2.

Recommandations : * Keep page sizes reasonable (default is 50) * Avoid navigating to very high page numbers * Avoid totalPages=true unless necessary as it runs an additional count query that must process all matching records regardless of page size * Avoid paging=false as it returns all matching records in a single response

Configure collection limits to cap the result set size and protect database and server resources.

/api/tracker/trackedEntities

Filters

Either program or trackedEntityType is required. Prefer program as it enables direct ownership-based access control.

Ordering
Tier Order fields Coût
Fast trackedEntity, createdAt Proportional to page (offset) + pageSize
Slow updatedAt, createdAtClient, updatedAtClient, inactive Proportional to total matching tracked entities
Very slow enrolledAt, tracked entity attribute UIDs Proportional to total matching tracked entities + per-record lookup in related tables

enrolledAt additionally requires deduplication when a tracked entity has multiple enrollments in the same program. Programs configured with "Only enroll once" avoid this deduplication cost.

/api/tracker/enrollments

Ordering
Tier Order fields Coût
Slow enrolledAt, createdAt, completedAt, updatedAt, createdAtClient, updatedAtClient Proportional to total matching enrollments

All enrollment order fields currently lack a composite index. The database must scan and sort all matching enrollments before returning the requested page.

/api/tracker/events (Tracker Programs)

Filters

program is mandatory and can be combined with programStage to narrow to a single stage.

Ownership

Every tracker event query must traverse enrollment and ownership records to enforce access control. On a program with hundreds of thousands of enrollments, broad queries (e.g., orgUnitMode=ALL without filters) must process all ownership records before any event-level work can begin. An index on the event table alone cannot help because the ownership check happens on a different table.

The most effective way to reduce cost is to provide a narrow org unit scope. A user scoped to a single facility produces a small ownership set, making the rest of the query fast regardless of other parameters.

Enrollment-level filters (enrollmentStatus, followUp, enrollment date ranges) are not backed by indexes. They can still reduce the result set but do not reduce the number of records the database scans.

Ordering
Tier Order fields Coût
Slow occurredAt, scheduledAt, createdAt, updatedAt, completedAt, createdAtClient, updatedAtClient, enrolledAt, data element UIDs Proportional to total matching events (after ownership join)
Very slow tracked entity attribute UIDs Proportional to total matching events + per-event cross-resource lookup

All tracker event order fields lack a composite index at the program level. The database must traverse enrollment and ownership records, collect all matching events, sort them, and return the requested page. Cost scales with total matching events, not page size.

Specifying programStage does not improve ordering performance because the bottleneck is the ownership join, not the event-level scan.

enrolledAt comes from the enrollment table which is already part of the ownership join, so it does not require an additional lookup. Attribute UIDs require a cross-resource lookup to the tracked entity for every matching event.

/api/tracker/events (Event Programs)

Event programs (programs without registration) have no enrollment or ownership overhead. The database goes directly from the event to its org unit, making these queries structurally faster than tracker program queries.

Filters

program is mandatory.

Organisation Unit Mode

With the default occurredAt order, the database walks the sorted index and filters each event by org unit. This is fast when matching events appear early in the index. For SELECTED, DESCENDANTS, and ACCESSIBLE, performance depends on how the matching org units' events are distributed across the sort order. If matching events are rare or concentrated at the end of the index, the database must scan many non-matching events first. On program stages with millions of events where the user's org units cover only a small fraction, this can result in scanning large portions of the index before filling a single page. Adding occurredAfter and/or occurredBefore limits the scan to a bounded window and is recommended for high-volume program stages.

ALL avoids org unit filtering entirely and is fast with the default order. CHILDREN is slow for the same reasons described in the general principles.

Without the default occurredAt order, all modes require scanning and sorting all matching events.

Ordering

The default order is occurredAt desc. This is the most efficient order for event programs.

Tier Order fields Coût
Fast (indexed) occurredAt Proportional to page (offset) + pageSize. Degrades when org unit filtering is active but matches are sparse — see Organisation Unit Mode above.
Slow (no index) createdAt, updatedAt, completedAt, createdAtClient, updatedAtClient Proportional to total events for the program stage
Slow (JSON extraction) Data element UIDs Requires extracting and sorting JSON values for every matching event