API GraphQL
Pour être informé des évolutions de l'API, vous pouvez vous inscrire à notre newsletter dédiée
L'API GraphQL de demarches-simplifiees.fr permet de consulter :
  • les informations d'une démarche,
  • la liste et les détails des dossiers d'une démarche,
  • les détails d'un dossier spécifique.
Elle permet également de modifier certaines informations d'un dossier :
  • Envoyer un message à l'usager d'un dossier ;
  • Changer l'état d'un dossier (accepté, refusé, etc.)

Présentation de l'API

3 minutes pour tout savoir de notre API

Aperçu général de GraphQL

Cette API suit le paradigme GraphQL. Pour plus d'informations sur le fonctionnement de GraphQL en général, vous pouvez consulter les liens suivants :

Accéder à l’API GraphQL de demarches-simplifiees.fr

Point d'entrée de l’API

L’API est accessible à l’adresse https://www.demarches-simplifiees.fr/api/v2/graphql (cette adresse n’est pas visitable dans un navigateur). Elle renvoie des données au format JSON, à travers un transport HTTPS.
Pour construire une requête et interpréter les réponses, consultez la documentation complète du schéma de l’API.

Éditeur de requêtes en ligne

Une fois authentifié en tant qu’administrateur disposant d’un token, vous pouvez également accéder à l’éditeur de requêtes en ligne (attention, ne confondez pas cette adresse avec celle de l’endpoint, qui ressemble) :

Vous êtes un organisme public, un intégrateur, une SSII ou un éditeur, et vous souhaitez tester l’API Graph QL

Vous devez effectuer une démarche auprès des équipes DS et pour cela remplir une demande à l’adresse suivante.
Demande d'adhésion à "démarches-simplifiées" pour les organismes, privés et publics, qui veulent tester les API · demarches-simplifiees.fr
Votre demande sera examinée, et vous recevrez un token de test, ainsi qu'un accès à un formulaire de test qui vous permettra d’effectuer des saisies de dossiers puis de tester les API.

Authentification

Tous les appels sont authentifiés et doivent donc fournir un jeton valide qui est accessible dans la partie profil de l’administrateur. Ce jeton doit être fourni dans l’en-tête HTTP Authorization de la requête.
Authorization: Bearer token=valeur_du_jeton.
post
https://www.demarches-simplifiees.fr
/api/v2/graphql
GraphQL

Exemple de requête

Pour tester que tout fonctionne bien

Pour tester l’API, le plus simple est d’effectuer une requête curl telle que ci dessous. Le principe est le même avec un autre client HTTP : remplacez votre_token et votre_numero_de_demarche par les valeurs souhaitez, et n’oubliez pas de préciser le content-type :
1
curl 'https://www.demarches-simplifiees.fr/api/v2/graphql' \
2
--header 'Authorization: Bearer <votre_token>' \
3
--header 'Content-Type: application/json' \
4
--data '{ "query": "query getDemarche($demarcheNumber: Int!) { demarche(number: $demarcheNumber) { id dossiers { nodes { id demandeur { ... on PersonnePhysique { civilite nom prenom } ... on PersonneMorale { siret } } } } } }", "variables": { "demarcheNumber": <votre_numero_de_demarche> } }'
Copied!
Vous devriez alors obtenir des informations en sortie. S’il y a des dossiers dans votre démarche, cette requête vous donne les noms des demandeurs. Si la démarche s’adresse à des entreprises, vous aurez le numéro SIRET des demandeurs.

Récupérer les informations d’une démarche, et les dossiers associés

Voici une requête plus lisible, mais plus complexe, qui va chercher beaucoup d’informations sur les dossiers

Queries

1
query getDemarche(
2
$demarcheNumber: Int!
3
$state: DossierState
4
$order: Order
5
$after: String
6
) {
7
demarche(number: $demarcheNumber) {
8
id
9
number
10
title
11
publishedRevision {
12
...RevisionFragment
13
}
14
groupeInstructeurs {
15
id
16
number
17
label
18
instructeurs {
19
id
20
email
21
}
22
}
23
dossiers(state: $state, order: $order, after: $after) {
24
nodes {
25
...DossierFragment
26
}
27
}
28
}
29
}
30
31
query getGroupeInstructeur(
32
$groupeInstructeurNumber: Int!
33
$state: DossierState
34
$order: Order
35
$after: String
36
) {
37
groupeInstructeur(number: $groupeInstructeurNumber) {
38
id
39
number
40
label
41
instructeurs {
42
id
43
email
44
}
45
dossiers(state: $state, order: $order, after: $after) {
46
nodes {
47
...DossierFragment
48
}
49
}
50
}
51
}
52
53
query getDossier($dossierNumber: Int!) {
54
dossier(number: $dossierNumber) {
55
...DossierFragment
56
demarche {
57
...DemarcheDescriptorFragment
58
}
59
}
60
}
61
62
query getDeletedDossiers($demarcheNumber: Int!, $order: Order, $after: String) {
63
demarche(number: $demarcheNumber) {
64
deletedDossiers(order: $order, after: $after) {
65
nodes {
66
...DeletedDossierFragment
67
}
68
}
69
}
70
}
71
72
fragment DossierFragment on Dossier {
73
id
74
number
75
archived
76
state
77
dateDerniereModification
78
datePassageEnConstruction
79
datePassageEnInstruction
80
dateTraitement
81
motivation
82
motivationAttachment {
83
...FileFragment
84
}
85
attestation {
86
...FileFragment
87
}
88
pdf {
89
url
90
}
91
instructeurs {
92
email
93
}
94
groupeInstructeur {
95
id
96
number
97
label
98
}
99
revision {
100
...RevisionFragment
101
}
102
champs {
103
...ChampFragment
104
...RootChampFragment
105
}
106
annotations {
107
...ChampFragment
108
...RootChampFragment
109
}
110
avis {
111
...AvisFragment
112
}
113
messages {
114
...MessageFragment
115
}
116
demandeur {
117
... on PersonnePhysique {
118
civilite
119
nom
120
prenom
121
dateDeNaissance
122
}
123
...PersonneMoraleFragment
124
}
125
}
126
127
fragment DemarcheDescriptorFragment on DemarcheDescriptor {
128
id
129
number
130
title
131
description
132
state
133
declarative
134
dateCreation
135
datePublication
136
dateDerniereModification
137
dateDepublication
138
dateFermeture
139
}
140
141
fragment DeletedDossierFragment on DeletedDossier {
142
id
143
number
144
dateSupression
145
state
146
reason
147
}
148
149
fragment RevisionFragment on Revision {
150
id
151
champDescriptors {
152
...ChampDescriptorFragment
153
champDescriptors {
154
...ChampDescriptorFragment
155
}
156
}
157
annotationDescriptors {
158
...ChampDescriptorFragment
159
champDescriptors {
160
...ChampDescriptorFragment
161
}
162
}
163
}
164
165
fragment ChampDescriptorFragment on ChampDescriptor {
166
id
167
type
168
label
169
description
170
required
171
options
172
}
173
174
fragment AvisFragment on Avis {
175
id
176
question
177
reponse
178
dateQuestion
179
dateReponse
180
claimant {
181
email
182
}
183
expert {
184
email
185
}
186
attachment {
187
...FileFragment
188
}
189
}
190
191
fragment MessageFragment on Message {
192
id
193
email
194
body
195
createdAt
196
attachment {
197
...FileFragment
198
}
199
}
200
201
fragment GeoAreaFragment on GeoArea {
202
id
203
source
204
description
205
geometry {
206
type
207
coordinates
208
}
209
... on ParcelleCadastrale {
210
commune
211
numero
212
section
213
prefixe
214
surface
215
}
216
}
217
218
fragment RootChampFragment on Champ {
219
... on RepetitionChamp {
220
champs {
221
...ChampFragment
222
}
223
}
224
... on SiretChamp {
225
etablissement {
226
...PersonneMoraleFragment
227
}
228
}
229
... on CarteChamp {
230
geoAreas {
231
...GeoAreaFragment
232
}
233
}
234
... on DossierLinkChamp {
235
dossier {
236
id
237
state
238
usager {
239
email
240
}
241
}
242
}
243
}
244
245
fragment ChampFragment on Champ {
246
id
247
label
248
stringValue
249
... on DateChamp {
250
date
251
}
252
... on DatetimeChamp {
253
datetime
254
}
255
... on CheckboxChamp {
256
checked: value
257
}
258
... on DecimalNumberChamp {
259
decimalNumber: value
260
}
261
... on IntegerNumberChamp {
262
integerNumber: value
263
}
264
... on CiviliteChamp {
265
civilite: value
266
}
267
... on LinkedDropDownListChamp {
268
primaryValue
269
secondaryValue
270
}
271
... on MultipleDropDownListChamp {
272
values
273
}
274
... on PieceJustificativeChamp {
275
file {
276
...FileFragment
277
}
278
}
279
... on AddressChamp {
280
address {
281
...AddressFragment
282
}
283
}
284
... on CommuneChamp {
285
commune {
286
name
287
code
288
}
289
departement {
290
name
291
code
292
}
293
}
294
}
295
296
fragment PersonneMoraleFragment on PersonneMorale {
297
siret
298
siegeSocial
299
naf
300
libelleNaf
301
address {
302
...AddressFragment
303
}
304
entreprise {
305
siren
306
capitalSocial
307
numeroTvaIntracommunautaire
308
formeJuridique
309
formeJuridiqueCode
310
nomCommercial
311
raisonSociale
312
siretSiegeSocial
313
codeEffectifEntreprise
314
dateCreation
315
nom
316
prenom
317
attestationFiscaleAttachment {
318
...FileFragment
319
}
320
attestationSocialeAttachment {
321
...FileFragment
322
}
323
}
324
association {
325
rna
326
titre
327
objet
328
dateCreation
329
dateDeclaration
330
datePublication
331
}
332
}
333
334
fragment FileFragment on File {
335
filename
336
contentType
337
checksum
338
byteSizeBigInt
339
url
340
}
341
342
fragment AddressFragment on Address {
343
label
344
type
345
streetAddress
346
streetNumber
347
streetName
348
postalCode
349
cityName
350
cityCode
351
departmentName
352
departmentCode
353
regionName
354
regionCode
355
}
356
Copied!

Variables

1
# Tout les dossiers d’une démarche
2
{
3
"query": <query>,
4
"operationName": "getDemarche",
5
"variables": {
6
"demarcheNumber": 1234
7
}
8
}
9
10
# Tout les dossiers "en_instruction" d’une démarche
11
{
12
"query": <query>,
13
"operationName": "getDemarche",
14
"variables": {
15
"demarcheNumber": 1234,
16
"state": "en_instruction"
17
}
18
}
19
20
# Tout les dossiers supprimés d’une démarche
21
{
22
"query": <query>,
23
"operationName": "getDeletedDossiers",
24
"variables": {
25
"demarcheNumber": 1234
26
}
27
}
28
29
# Tout les dossiers d’un groupe instructeur
30
{
31
"query": <query>,
32
"operationName": "getGroupeInstructeur",
33
"variables": {
34
"groupeInstructeurNumber": 1234
35
}
36
}
37
38
# Un dossier par son numero
39
{
40
"query": <query>,
41
"operationName": "getDossier",
42
"variables": {
43
"dossierNumber": 1234
44
}
45
}
Copied!

Pagination

La pagination sur l’API GraphQL se fait par "curseur". Ça veut dire que pour récupérer la prochaine page il faut passer à l’API le "curseur" de la fin de la page précédente.
Voici un exemple. On commence par faire une query pour récupérer les 100 premiers dossiers :
1
query getDemarche($demarcheNumber: Int!, $after: String) {
2
demarche(number: $demarcheNumber) {
3
dossiers(first: 100, after: $after) {
4
pageInfo {
5
endCursor
6
hasNextPage
7
}
8
nodes {
9
id
10
number
11
}
12
}
13
}
14
}
Copied!
1
{
2
"query": <query>,
3
"operationName": "getDemarche",
4
"variables": {
5
"demarcheNumber": 1234
6
}
7
}
Copied!
Dans le résultat obtenu il faut lire la valeur du "curseur" dans le champ demarche.dossiers.pageInfo.endCursor . On peut passer alors ce "curseur" comme argument after dans la prochaine query. Et ainsi de suite jusqu’à ce que le champ demarche.dossiers.pageInfo.hasNextPage soit égale à false.
1
query getDemarche($demarcheNumber: Int!, $after: String) {
2
demarche(number: $demarcheNumber) {
3
dossiers(first: 100, after: $after) {
4
pageInfo {
5
endCursor
6
hasNextPage
7
}
8
nodes {
9
id
10
number
11
}
12
}
13
}
14
}
Copied!
1
{
2
"query": <query>,
3
"operationName": "getDemarche",
4
"variables": {
5
"demarcheNumber": 1234,
6
"after" "abc"
7
}
8
}
Copied!

Modifier l’état ou les informations d’un dossier

Certaines opérations sur dossier sont accessibles via l’API :
  • Affecter un dossier à un groupe instructeur
  • Changer l’état du dossier
  • Envoyer un message à l’usager qui a déposé le dossier
  • Ajouter des annotations privées sur un dossier
Attention ! Les identifiants utilisés dans les variables input des mutations sont les identifiants « technique » que vous devez récupérer dans les réponses des requêtes précédentes. En particulier, l'identifiant du dossier est différent du « numéro de dossier » :
1
query getDossierIdByNumber($dossierNumber: Int!) {
2
dossier(number: $dossierNumber) {
3
id
4
}
5
}
6
7
{
8
"query": <query>,
9
"operationName": "getDossierIdByNumber",
10
"variables": {
11
"dossierNumber": 1234
12
}
13
}
Copied!
Si un identifiant d’instructeur est demandé, il s’agit d’identifier l’instructeur qui sera enregistré dans le système comme responsable de l’opération. Pour récupérer la liste des instructeurs avec leurs identifiants, vous avez plusieurs possibilités.
Vous pouvez récupérer tous les instructeurs qui suivent un dossier :
1
query getInstructeursForDossier($dossierNumber: Int!) {
2
dossier(number: $dossierNumber) {
3
instructeurs {
4
id
5
email
6
}
7
}
8
}
9
10
{
11
"query": <query>,
12
"operationName": "getInstructeursForDossier",
13
"variables": {
14
"dossierNumber": 1234
15
}
16
}
Copied!
Vous pouvez récupérer tous les instructeurs d'un « groupe instructeur » :
1
query getInstructeursForGroupeInstructeur($groupeInstructeurNumber: Int!) {
2
groupeInstructeur(number: $groupeInstructeurNumber) {
3
instructeurs {
4
id
5
email
6
}
7
}
8
}
9
10
{
11
"query": <query>,
12
"operationName": "getInstructeursForGroupeInstructeur",
13
"variables": {
14
"groupeInstructeurNumber": 1234
15
}
16
}
Copied!

Queries

1
mutation dossierArchiver($input: DossierArchiverInput!) {
2
dossierArchiver(input: $input) {
3
dossier {
4
id
5
}
6
errors {
7
message
8
}
9
}
10
}
11
12
mutation dossierPasserEnInstruction($input: DossierPasserEnInstructionInput!) {
13
dossierPasserEnInstruction(input: $input) {
14
dossier {
15
id
16
}
17
errors {
18
message
19
}
20
}
21
}
22
23
mutation dossierAccepter($input: DossierAccepterInput!) {
24
dossierAccepter(input: $input) {
25
dossier {
26
id
27
}
28
errors {
29
message
30
}
31
}
32
}
33
34
mutation dossierRefuser($input: DossierRefuserInput!) {
35
dossierRefuser(input: $input) {
36
dossier {
37
id
38
}
39
errors {
40
message
41
}
42
}
43
}
44
45
mutation dossierClasserSansSuite($input: DossierClasserSansSuiteInput!) {
46
dossierClasserSansSuite(input: $input) {
47
dossier {
48
id
49
}
50
errors {
51
message
52
}
53
}
54
}
55
Copied!

Variables

1
# Archiver un dossier
2
{
3
"query": <query>,
4
"operationName": "dossierArchiver",
5
"variables": {
6
"input": {
7
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
8
"instructeurId": "OPJvtN7kdXKlLTI4NTlf"
9
}
10
}
11
}
12
13
# Passer un dossier en instruction
14
{
15
"query": <query>,
16
"operationName": "dossierPasserEnInstruction",
17
"variables": {
18
"input": {
19
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
20
"instructeurId": "OPJvtN7kdXKlLTI4NTlf"
21
}
22
}
23
}
24
25
# Accepter un dossier
26
{
27
"query": <query>,
28
"operationName": "dossierAccepter",
29
"variables": {
30
"input": {
31
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
32
"instructeurId": "OPJvtN7kdXKlLTI4NTlf",
33
"motivation": "J’accepte ce dossier"
34
}
35
}
36
}
37
38
# Refuser un dossier
39
{
40
"query": <query>,
41
"operationName": "dossierRefuser",
42
"variables": {
43
"input": {
44
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
45
"instructeurId": "OPJvtN7kdXKlLTI4NTlf",
46
"motivation": "Je refuse ce dossier"
47
}
48
}
49
}
50
51
# Classer un dossier sans suite
52
{
53
"query": <query>,
54
"operationName": "dossierClasserSansSuite",
55
"variables": {
56
"input": {
57
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
58
"instructeurId": "OPJvtN7kdXKlLTI4NTlf",
59
"motivation": "Je classe ce dossier sans suite"
60
}
61
}
62
}
Copied!
Pour plus d’informations sur le format des requêtes et des réponses, consultez la documentation complète du schéma de l’API.
Pour être informé des évolutions de l’API, vous pouvez vous inscrire à notre newsletter dédiée
Dernière mise à jour 3d ago