API des contacts¶
Structure d’un contact¶
Les routes de création et de modification utilisent les champs suivants. lastname ou company doit être renseigné. D’autres champs peuvent être obligatoires selon le paramétrage des contacts.
| Valeur | Type | Obligatoire | Description |
|---|---|---|---|
civility |
integer | Non | Identifiant dans contacts_civilities.id |
firstname |
string | Non | Prénom |
lastname |
string | Conditionnel | Nom ; obligatoire si company est vide |
company |
string | Conditionnel | Société ; obligatoire si lastname est vide |
department |
string | Non | Service de la société |
function |
string | Non | Fonction du contact |
addressNumber |
string | Non | Numéro de voie |
addressStreet |
string | Non | Voie |
addressAdditional1 |
string | Non | Point de remise |
addressAdditional2 |
string | Non | Complément d’acheminement |
addressPostcode |
string | Non | Code postal |
addressTown |
string | Non | Ville |
addressCountry |
string | Non | Pays |
email |
string | Non | Adresse électronique valide |
phone |
string | Non | Numéro de téléphone |
communicationMeans |
object | Non | Moyen Maarch2Maarch : email ou url, avec login et password facultatifs |
notes |
string | Non | Notes |
externalId |
object | Non | Identifiants externes, notamment m2m |
customFields |
object | Non | Valeurs indexées par identifiant de champ personnalisé |
isConfidential |
boolean | Non | Caractère confidentiel du contact |
Les champs texte contrôlés sont limités à 256 caractères. Les droits liés à la confidentialité sont détaillés dans l’index Contacts.
Lister les contacts¶
Route¶
Cette route nécessite le privilège admin_contacts.
Query string¶
| Valeur | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
offset |
integer | Non | 0 |
Décalage de pagination |
limit |
integer | Non | 25 |
Nombre de contacts retournés |
search |
string | Non | Recherche sur les champs standards et personnalisés | |
order |
string | Non | asc ou desc |
|
orderBy |
string | Non | id |
firstname, lastname, company ou filling |
Retour¶
| Code HTTP | Type | Description |
|---|---|---|
200 |
object | Liste paginée dans contacts et nombre total dans count |
403 |
object | Privilège insuffisant |
{
"contacts": [
{
"id": 21,
"firstname": "Clark",
"lastname": "Kent",
"company": "Daily Planet",
"enabled": true,
"sector": "Paris centre",
"isUsed": true,
"filling": {"rate": 75, "thresholdLevel": "second"}
}
],
"count": 1
}
Créer un contact¶
Route¶
Cette route nécessite create_contacts ou admin_contacts.
Body¶
Le body suit la structure d’un contact.
{
"civility": 1,
"firstname": "Clark",
"lastname": "Kent",
"company": "Daily Planet",
"department": "Rédaction",
"function": "Reporter",
"addressNumber": "30",
"addressStreet": "Rue des avions",
"addressPostcode": "75001",
"addressTown": "Paris",
"addressCountry": "France",
"email": "clark.kent@daily-planet.example",
"phone": "+33120212223",
"communicationMeans": {"url": "https://courrier.example/rest/"},
"externalId": {"companyId": "123456789"},
"customFields": {"2": "Fournisseur"},
"isConfidential": false
}
Pour un utilisateur REST, si un contact possède déjà le même courriel, son identifiant est retourné sans créer de doublon.
Retour¶
| Code HTTP | Description | Exemple |
|---|---|---|
200 |
Contact créé ou contact existant retrouvé | {"id":21,"warning":""} |
400 |
Body ou valeur invalide | {"errors":"Body lastname or company is mandatory"} |
403 |
Privilège insuffisant ou confidentialité non autorisée | {"errors":"Service forbidden"} |
Rechercher le secteur d’une adresse¶
Route¶
Query string¶
Au moins un paramètre doit être fourni. Tous sont des chaînes facultatives.
| Valeur | Description |
|---|---|
addressNumber |
Numéro de voie |
addressStreet |
Voie |
addressPostcode |
Code postal |
addressTown |
Ville |
Retour¶
| Code HTTP | Description |
|---|---|
200 |
Secteur correspondant, ou null si aucun secteur ne correspond |
400 |
Query string absente ou valeur invalide |
Consulter un contact¶
Route¶
Paramètres¶
| Valeur | Emplacement | Type | Obligatoire | Description |
|---|---|---|---|---|
id |
URL | integer | Oui | Identifiant du contact |
resourcesCount |
Query string | boolean | Non | Ajoute le nombre d’utilisations dans les courriers, accusés et pièces jointes |
Retour¶
| Code HTTP | Description |
|---|---|
200 |
Contact complet, avec civilité, créateur, dates, champs personnalisés, taux de complétude et éventuellement resourcesCount |
400 |
Identifiant invalide ou contact inexistant |
{
"id": 21,
"civility": {"id": 1, "label": "Monsieur", "abbreviation": "M."},
"firstname": "Clark",
"lastname": "Kent",
"company": "Daily Planet",
"communicationMeans": {"url": "https://courrier.example/rest/", "login": null},
"enabled": true,
"customFields": {"2": "Fournisseur"},
"externalId": {"companyId": "123456789"},
"sector": "Paris centre",
"isConfidential": false,
"fillingRate": {"rate": 75, "thresholdLevel": "second"}
}
Exporter les contacts¶
Route¶
Cette route nécessite admin_contacts.
Body¶
| Valeur | Type | Obligatoire | Description |
|---|---|---|---|
delimiter |
string | Oui | ,, ; ou TAB |
data |
array | Oui | Colonnes à exporter |
data[].value |
string | Oui | Identifiant du champ |
data[].label |
string | Oui | En-tête de la colonne CSV |
Les champs standards de la structure d’un contact sont acceptés, ainsi que id, creator, creatorLabel, creationDate, modificationDate, enabled, sector et contactCustomField_{id}.
{
"delimiter": ";",
"data": [
{"value": "lastname", "label": "Nom"},
{"value": "email", "label": "Courriel"},
{"value": "contactCustomField_2", "label": "Type de partenaire"}
]
}
Retour¶
| Code HTTP | Description |
|---|---|
200 |
Fichier export_maarch.csv, type application/vnd.ms-excel |
400 |
Délimiteur, colonne ou champ personnalisé invalide |
403 |
Privilège insuffisant |
Importer les contacts¶
Route¶
Cette route nécessite admin_contacts.
Body¶
| Valeur | Type | Obligatoire | Description |
|---|---|---|---|
contacts |
array | Oui | Contacts à créer ou modifier |
contacts[].id |
integer | Non | Présent pour modifier un contact existant |
contacts[].contactCustomField_{id} |
mixed | Non | Valeur d’un champ personnalisé |
Les autres propriétés correspondent aux champs standards. Lors d’une modification, la valeur booléenne false efface le champ concerné. Les champs personnalisés checkbox attendent un tableau ; integer, date, string, select et radio sont validés selon leur type.
{
"contacts": [
{
"lastname": "Kent",
"firstname": "Clark",
"email": "clark.kent@daily-planet.example",
"contactCustomField_2": "Fournisseur"
}
]
}
Retour¶
L’import continue après une ligne invalide et retourne un bilan détaillé.
| Code HTTP | Description |
|---|---|
200 |
Bilan des créations et modifications |
400 |
contacts n’est pas un tableau |
403 |
Privilège insuffisant |
Modifier un contact¶
Route¶
Cette route nécessite update_contacts ou admin_contacts. Le body suit la structure d’un contact.
Warning
Cette opération remplace la représentation du contact. Les champs absents sont enregistrés à null ou réinitialisés ; envoyer les valeurs à conserver.
Retour¶
| Code HTTP | Description |
|---|---|
204 |
Contact modifié, sans contenu |
200 |
Contact modifié avec un avertissement de synchronisation Maarch2Maarch |
400 |
Identifiant, format ou champ invalide ; contact inexistant |
403 |
Privilège ou droit de confidentialité insuffisant |
Supprimer un contact¶
Route¶
Cette route nécessite admin_contacts.
Paramètres¶
| Valeur | Emplacement | Type | Obligatoire | Description |
|---|---|---|---|---|
id |
URL | integer | Oui | Contact à supprimer |
redirect |
Query string | integer | Non | Contact qui reprend les liaisons du contact supprimé |
Le contact de redirection doit exister et être différent du contact supprimé. La suppression nettoie les liaisons aux courriers, pièces jointes et groupes ; avec redirect, les liaisons compatibles sont d’abord réaffectées.
Retour¶
| Code HTTP | Description |
|---|---|
204 |
Contact supprimé, sans contenu |
400 |
Identifiant ou redirection invalide ; contact inexistant |
403 |
Privilège insuffisant |
Activer ou désactiver un contact¶
Route¶
Cette route nécessite admin_contacts.
Une valeur absente ou fausse désactive le contact.
Retour¶
| Code HTTP | Description |
|---|---|
204 |
Statut modifié, sans contenu |
400 |
Identifiant invalide ou contact inexistant |
403 |
Privilège insuffisant |
Consulter un correspondant au format léger¶
Route¶
| Paramètre d’URL | Type | Description |
|---|---|---|
id |
integer | Identifiant du correspondant |
type |
string | contact, user ou entity |
Retour¶
| Code HTTP | Description |
|---|---|
200 |
Objet contact adapté au type demandé |
400 |
Identifiant invalide, type non reconnu ou correspondant inexistant |
Lister les départements disponibles pour la BAN¶
Route¶
La source dépend du paramètre addressSearch : liste nationale en mode online, collections Typesense BAN_* en mode local.
Retour¶
| Code HTTP | Description |
|---|---|
200 |
Liste departments et département default, éventuellement null |
500 |
Serveur d’index local indisponible |
Rechercher les doublons¶
Route¶
Cette route nécessite admin_contacts.
Query string¶
| Valeur | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
criteria[] |
array | Oui | Critères de rapprochement | |
limit |
integer | Non | 500 |
Nombre maximal de groupes, plafonné à 500 |
offset |
integer | Non | 0 |
Décalage par groupes de doublons |
Critères standards : civility, firstname, lastname, company, addressNumber, addressStreet, addressAdditional1, addressAdditional2, addressPostcode, addressTown, addressCountry, department, function, email, phone et notes. Un champ personnalisé se note contactCustomField_{id}.
Exemple :
Retour¶
{
"returnedCount": 1,
"realCount": 1,
"contacts": [
{"duplicateId": 1, "id": 21, "lastname": "Kent", "email": "clark@example.org"},
{"duplicateId": 1, "id": 45, "lastname": "Kent", "email": "clark@example.org"}
]
}
| Code HTTP | Description |
|---|---|
200 |
Groupes de doublons paginés |
400 |
Critère absent ou inconnu |
403 |
Privilège insuffisant |
Fusionner des contacts¶
Route¶
Cette route nécessite admin_contacts. id désigne le contact maître.
Les champs vides du maître sont complétés depuis les doublons. Les champs personnalisés et identifiants externes sont fusionnés, les liaisons sont transférées, puis les doublons sont supprimés.
Retour¶
| Code HTTP | Description |
|---|---|
204 |
Fusion effectuée, sans contenu |
400 |
Identifiant invalide, tableau absent ou contact inexistant |
403 |
Privilège insuffisant |
Consulter le paramétrage des contacts¶
Route¶
Retour¶
| Code HTTP | Type | Description |
|---|---|---|
200 |
object | Seuils de complétude, paramètres des champs et état de l’annuaire Maarch2Maarch |
| Donnée | Type | Description |
|---|---|---|
contactsFilling.enable |
boolean | Active le calcul de complétude |
contactsFilling.first_threshold |
integer | Premier seuil, en pourcentage |
contactsFilling.second_threshold |
integer | Second seuil, en pourcentage |
contactsParameters[].id |
integer | Identifiant du paramètre |
contactsParameters[].identifier |
string | Champ standard ou contactCustomField_{id} |
contactsParameters[].mandatory |
boolean | Champ obligatoire |
contactsParameters[].filling |
boolean | Champ pris en compte dans la complétude |
contactsParameters[].searchable |
boolean | Champ utilisé par l’autocomplétion |
contactsParameters[].displayable |
boolean | Champ affiché par l’autocomplétion |
contactsParameters[].label |
string ou null | Libellé du champ personnalisé |
annuaryEnabled |
boolean | Annuaire Maarch2Maarch activé |
{
"contactsFilling": {"id":1,"enable":true,"first_threshold":33,"second_threshold":66},
"contactsParameters": [
{"id":9,"identifier":"lastname","mandatory":true,"filling":true,"searchable":true,"displayable":true,"label":null}
],
"annuaryEnabled": false
}
Modifier le paramétrage des contacts¶
Route¶
Cette route nécessite admin_contacts. Le body reprend contactsFilling et contactsParameters retournés par la route de consultation.
Les seuils doivent être des entiers tels que 0 < first_threshold < second_threshold < 100.
Retour¶
| Code HTTP | Description | Exemple |
|---|---|---|
200 |
Paramétrage enregistré | {"success":"success"} |
400 |
Structure ou seuils invalides | {"errors":"Bad Request"} |
403 |
Privilège insuffisant | {"errors":"Service forbidden"} |