Ranger des fiches dans un classeur
Créer un classeur, y ranger des contacts, des parcours ou des documents, les en retirer, et lire ce qu'il contient.
Un classeur réunit autour d'une même affaire des fiches de types différents : des contacts, des parcours, des documents, des emails… Il les range, il ne les possède pas : une fiche peut être dans plusieurs classeurs, et l'en retirer — ou mettre le classeur à la corbeille — ne touche pas à la fiche.
Dix types se rangent :
| Type | Fiches |
|---|---|
Contact |
contacts |
Company |
sociétés |
Group |
groupes de contacts |
Document |
documents |
Mail |
emails |
Form |
formulaires |
Transaction |
parcours |
PipelineItem |
cartes |
CustomObject |
fiches d'objets personnalisés |
DocageUser |
utilisateurs |
Ranger exige de pouvoir modifier le classeur et de voir la fiche.
1Créer le classeur
Cherchez d'abord s'il existe, par son nom :
QUERY https://staging-api.docage.com/Boxes
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"Filter": { "PropertyName": "Name", "Comparison": "=", "Value": "Dossier Martin — vente appartement" },
"Take": 10
}curl -X QUERY "https://staging-api.docage.com/Boxes" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"Filter": {"PropertyName": "Name", "Comparison": "=", "Value": "Dossier Martin — vente appartement"},
"Take": 10
}'using HttpClient client = new();
using HttpRequestMessage request = new(new HttpMethod("QUERY"), "https://staging-api.docage.com/Boxes");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"Filter": {
"PropertyName": "Name",
"Comparison": "=",
"Value": "Dossier Martin — vente appartement"
},
"Take": 10
}
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Boxes", {
method: "QUERY",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"Filter": {"PropertyName": "Name", "Comparison": "=", "Value": "Dossier Martin — vente appartement"},
"Take": 10
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Sinon, créez-le :
POST https://staging-api.docage.com/Boxes
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{
"Name": "Dossier Martin — vente appartement",
"Description": "Pièces et échanges de la vente"
}curl -X POST "https://staging-api.docage.com/Boxes" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"Name": "Dossier Martin — vente appartement",
"Description": "Pièces et échanges de la vente"
}'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Post, "https://staging-api.docage.com/Boxes");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"Name": "Dossier Martin — vente appartement",
"Description": "Pièces et échanges de la vente"
}
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Boxes", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"Name": "Dossier Martin — vente appartement",
"Description": "Pièces et échanges de la vente"
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;La réponse est l'identifiant du classeur ; Name est obligatoire. Pour partir d'un modèle de classeur, dont le contenu pré-rangé est
recopié dans chaque classeur produit, voir Modèles et instances : "TemplateId" désigne un modèle de
classeur de votre organisation, ou un modèle de la plateforme. Un modèle introuvable, ou que vous ne voyez pas, répond 404 ; un
classeur qui n'est pas un modèle, ou le modèle d'une autre organisation, 422 — rien n'est créé.
Le classeur d'un nom se lit aussi par GET https://staging-api.docage.com/Boxes/ByName/{name} : 404 si vous n'en voyez aucun, 409 si plusieurs le
portent — lisez alors la liste ci-dessus, filtrée par le nom.
2Ranger plusieurs fiches d'un type
PUT https://staging-api.docage.com/Boxes/AddEntities/00000000-0000-4000-8000-000000000a01/Transaction
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
["00000000-0000-4000-8000-000000000981", "00000000-0000-4000-8000-000000000982"]curl -X PUT "https://staging-api.docage.com/Boxes/AddEntities/00000000-0000-4000-8000-000000000a01/Transaction" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '["00000000-0000-4000-8000-000000000981", "00000000-0000-4000-8000-000000000982"]'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Put, "https://staging-api.docage.com/Boxes/AddEntities/00000000-0000-4000-8000-000000000a01/Transaction");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
[
"00000000-0000-4000-8000-000000000981",
"00000000-0000-4000-8000-000000000982"
]
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Boxes/AddEntities/00000000-0000-4000-8000-000000000a01/Transaction", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify(["00000000-0000-4000-8000-000000000981", "00000000-0000-4000-8000-000000000982"])
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Le dernier segment de l'adresse est le type des fiches, tel qu'écrit dans le tableau, à sa casse exacte. 200 : les fiches sont
rangées ; 404 : le classeur est introuvable, ou vous ne le voyez pas ; 403 : vous ne pouvez pas le modifier ; 422 : un type qui ne
se range pas — la réponse le nomme et liste ceux qui se rangent ; 400 : liste vide. Une fiche introuvable, que vous ne voyez pas,
d'une autre organisation que le classeur, ou déjà rangée est passée sans erreur.
3Ranger une fiche dans plusieurs classeurs
Depuis la fiche, par la route de son type :
PUT https://staging-api.docage.com/Contacts/AddToBoxes/00000000-0000-4000-8000-000000000201
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
["00000000-0000-4000-8000-000000000a01", "00000000-0000-4000-8000-000000000a02"]curl -X PUT "https://staging-api.docage.com/Contacts/AddToBoxes/00000000-0000-4000-8000-000000000201" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '["00000000-0000-4000-8000-000000000a01", "00000000-0000-4000-8000-000000000a02"]'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Put, "https://staging-api.docage.com/Contacts/AddToBoxes/00000000-0000-4000-8000-000000000201");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
[
"00000000-0000-4000-8000-000000000a01",
"00000000-0000-4000-8000-000000000a02"
]
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Contacts/AddToBoxes/00000000-0000-4000-8000-000000000201", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify(["00000000-0000-4000-8000-000000000a01", "00000000-0000-4000-8000-000000000a02"])
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;La même route existe pour les dix types (PUT https://staging-api.docage.com/Transactions/AddToBoxes/{id}, PUT https://staging-api.docage.com/Documents/AddToBoxes/{id}…). La
réponse est l'identifiant de la fiche. Un classeur introuvable, ou que vous ne pouvez pas modifier, est passé sans erreur : la
réponse ne dit pas ce qui a été rangé.
À la création d'une fiche, le rangement part avec elle : "AddToBoxIds": ["…"] dans le corps du POST.
4Retirer des fiches
- Plusieurs fiches d'un type :
PUT https://staging-api.docage.com/Boxes/RemoveEntities/{id}/{entityTypeName}, avec la liste des fiches. Mêmes réponses que pour ranger ; une fiche que vous ne voyez pas, ou qui n'est pas rangée dans le classeur, est passée sans erreur. - Une fiche de plusieurs classeurs :
PUT https://staging-api.docage.com/Contacts/RemoveFromBoxes/{id}(ou la route de son type), avec la liste des classeurs ; ou"RemoveFromBoxIds"dans unPUTde la fiche, qui exige alors de pouvoir la modifier.
La fiche reste intacte, dans ses autres classeurs comme ailleurs. Ne passez jamais par un DELETE de la fiche : il la met elle-même
à la corbeille.
5Lire le contenu
Les fiches d'un type, rangées dans le classeur :
QUERY https://staging-api.docage.com/Contacts/BoxList/00000000-0000-4000-8000-000000000a01
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{ "SortOrder": "LastModificationDate_Desc", "Skip": 0, "Take": 50 }curl -X QUERY "https://staging-api.docage.com/Contacts/BoxList/00000000-0000-4000-8000-000000000a01" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"SortOrder": "LastModificationDate_Desc",
"Skip": 0,
"Take": 50
}'using HttpClient client = new();
using HttpRequestMessage request = new(new HttpMethod("QUERY"), "https://staging-api.docage.com/Contacts/BoxList/00000000-0000-4000-8000-000000000a01");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"SortOrder": "LastModificationDate_Desc",
"Skip": 0,
"Take": 50
}
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Contacts/BoxList/00000000-0000-4000-8000-000000000a01", {
method: "QUERY",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"SortOrder": "LastModificationDate_Desc",
"Skip": 0,
"Take": 50
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Le corps est celui d'une liste (filtre, tri, pagination) ; l'en-tête Docage-TotalItems donne le total. Seules sont rendues les fiches
que vous voyez, modèles rangés compris. Chaque type a sa liste : QUERY https://staging-api.docage.com/Transactions/BoxList/{boxid},
QUERY https://staging-api.docage.com/Documents/BoxList/{boxid}, QUERY https://staging-api.docage.com/Mails/BoxList/{boxid}…
La liste ordinaire d'un type rend les mêmes fiches quand son corps porte le classeur, "BoxId" :
QUERY https://staging-api.docage.com/Contacts
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
{ "BoxId": "00000000-0000-4000-8000-000000000a01", "Take": 50 }curl -X QUERY "https://staging-api.docage.com/Contacts" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '{
"BoxId": "00000000-0000-4000-8000-000000000a01",
"Take": 50
}'using HttpClient client = new();
using HttpRequestMessage request = new(new HttpMethod("QUERY"), "https://staging-api.docage.com/Contacts");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
{
"BoxId": "00000000-0000-4000-8000-000000000a01",
"Take": 50
}
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Contacts", {
method: "QUERY",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"BoxId": "00000000-0000-4000-8000-000000000a01",
"Take": 50
})
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Les compteurs du classeur, par GET https://staging-api.docage.com/Boxes/{id} : ContactsNb, CompaniesNb, DocageUsersNb, PipelineItemsNb,
TransactionsNb et DocumentsNb. Ils comptent toutes les fiches actives rangées, même celles que vous ne voyez pas ; GroupsNb et
MailsNb restent à 0, et formulaires et objets personnalisés n'ont pas de compteur : lisez leur liste.
Les classeurs d'une fiche : BoxIds, dans sa lecture par identifiant (GET https://staging-api.docage.com/Contacts/{id}…).
6Supprimer un classeur avec son contenu
DELETE https://staging-api.docage.com/Boxes/BatchDeleteWithContent
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json
["00000000-0000-4000-8000-000000000a01"]curl -X DELETE "https://staging-api.docage.com/Boxes/BatchDeleteWithContent" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "Content-Type: application/json" \
-d '["00000000-0000-4000-8000-000000000a01"]'using HttpClient client = new();
using HttpRequestMessage request = new(HttpMethod.Delete, "https://staging-api.docage.com/Boxes/BatchDeleteWithContent");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("""
[
"00000000-0000-4000-8000-000000000a01"
]
""", Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException(result);const response = await fetch("https://staging-api.docage.com/Boxes/BatchDeleteWithContent", {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify(["00000000-0000-4000-8000-000000000a01"])
});
const text = await response.text();
if (!response.ok) throw new Error(text);
const result = text ? JSON.parse(text) : null;Chaque classeur part à la corbeille avec, parmi les fiches actives qu'il range, les contacts, les parcours et les utilisateurs, ainsi que les fichiers déposés sur lui. Les autres fiches rangées — documents, emails, formulaires, sociétés, groupes, cartes, fiches d'objets personnalisés — restent en place, comme les fiches que vous ne voyez pas. Rien ne part pour de bon : chaque fiche se restaure depuis la corbeille. Un parcours en cours est annulé avant d'y aller.
Chaque classeur est traité à part. 200 : tout est parti. 400 : une liste vide, ou des refus, un par ligne — un classeur introuvable
ou que vous ne voyez pas (le même refus pour les deux), un classeur ou une fiche que vous n'avez pas le droit de supprimer —, et tout le
reste est bien à la corbeille.
Les pièges
- Rien n'avertit d'un rangement sauté : vérifiez que
BoxIdsde la fiche contient le classeur, ou relisez la liste du classeur. BoxIddans le corps d'une liste ordinaire : un classeur introuvable ou que vous ne voyez pas, ou un type qui ne se range pas, rend une liste vide ; la listeBoxList, elle, répond404à un classeur introuvable ou invisible.- Mettre un classeur à la corbeille (
DELETE https://staging-api.docage.com/Boxes/BatchDelete) n'y met pas les fiches qu'il range ; pour emporter son contenu, voir la section 6. Un classeur à la corbeille ne paraît plus dansBoxIds. - Les fichiers déposés sur un classeur ne sont pas des fiches rangées : les listes
BoxListne les rendent pas.