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($demarcheNumber: Int!, $state: DossierState, $after: String) {
2
demarche(number: $demarcheNumber) {
3
id
4
number
5
title
6
publishedRevision {
7
...RevisionFragment
8
}
9
groupeInstructeurs {
10
id
11
number
12
label
13
instructeurs {
14
id
15
email
16
}
17
}
18
dossiers(state: $state, after: $after) {
19
nodes {
20
...DossierFragment
21
}
22
}
23
}
24
}
25
26
query getGroupeInstructeur($groupeInstructeurNumber: Int!, $state: DossierState, $after: String) {
27
groupeInstructeur(number: $groupeInstructeurNumber) {
28
id
29
number
30
label
31
instructeurs {
32
id
33
email
34
}
35
dossiers(state: $state, after: $after) {
36
nodes {
37
...DossierFragment
38
}
39
}
40
}
41
}
42
43
query getDossier($dossierNumber: Int!) {
44
dossier(number: $dossierNumber) {
45
...DossierFragment
46
}
47
}
48
49
fragment DossierFragment on Dossier {
50
id
51
number
52
archived
53
state
54
dateDerniereModification
55
datePassageEnConstruction
56
datePassageEnInstruction
57
dateTraitement
58
motivation
59
motivationAttachment {
60
...FileFragment
61
}
62
attestation {
63
...FileFragment
64
}
65
pdf {
66
url
67
}
68
instructeurs {
69
email
70
}
71
groupeInstructeur {
72
id
73
number
74
label
75
}
76
revision {
77
...RevisionFragment
78
}
79
champs {
80
...ChampFragment
81
...RootChampFragment
82
}
83
annotations {
84
...ChampFragment
85
...RootChampFragment
86
}
87
avis {
88
...AvisFragment
89
}
90
messages {
91
...MessageFragment
92
}
93
demandeur {
94
... on PersonnePhysique {
95
civilite
96
nom
97
prenom
98
dateDeNaissance
99
}
100
...PersonneMoraleFragment
101
}
102
}
103
104
fragment RevisionFragment on Revision {
105
id
106
champDescriptors {
107
...ChampDescriptorFragment
108
champDescriptors {
109
...ChampDescriptorFragment
110
}
111
}
112
annotationDescriptors {
113
...ChampDescriptorFragment
114
champDescriptors {
115
...ChampDescriptorFragment
116
}
117
}
118
}
119
120
fragment ChampDescriptorFragment on ChampDescriptor {
121
id
122
type
123
label
124
description
125
required
126
options
127
}
128
129
fragment AvisFragment on Avis {
130
id
131
question
132
reponse
133
dateQuestion
134
dateReponse
135
claimant {
136
email
137
}
138
expert {
139
email
140
}
141
attachment {
142
...FileFragment
143
}
144
}
145
146
fragment MessageFragment on Message {
147
id
148
email
149
body
150
createdAt
151
attachment {
152
...FileFragment
153
}
154
}
155
156
fragment GeoAreaFragment on GeoArea {
157
source
158
geometry {
159
type
160
coordinates
161
}
162
... on ParcelleCadastrale {
163
codeArr
164
codeCom
165
codeDep
166
feuille
167
nomCom
168
numero
169
section
170
surfaceParcelle
171
surfaceIntersection
172
}
173
}
174
175
fragment RootChampFragment on Champ {
176
... on RepetitionChamp {
177
champs {
178
...ChampFragment
179
}
180
}
181
... on SiretChamp {
182
etablissement {
183
...PersonneMoraleFragment
184
}
185
}
186
... on CarteChamp {
187
geoAreas {
188
...GeoAreaFragment
189
}
190
}
191
... on DossierLinkChamp {
192
dossier {
193
id
194
state
195
usager {
196
email
197
}
198
}
199
}
200
}
201
202
fragment ChampFragment on Champ {
203
id
204
label
205
stringValue
206
... on LinkedDropDownListChamp {
207
primaryValue
208
secondaryValue
209
}
210
... on MultipleDropDownListChamp {
211
values
212
}
213
... on PieceJustificativeChamp {
214
file {
215
...FileFragment
216
}
217
}
218
... on AddressChamp {
219
address {
220
...AddressFragment
221
}
222
}
223
}
224
225
fragment PersonneMoraleFragment on PersonneMorale {
226
siret
227
siegeSocial
228
naf
229
libelleNaf
230
address {
231
...AddressFragment
232
}
233
entreprise {
234
siren
235
capitalSocial
236
numeroTvaIntracommunautaire
237
formeJuridique
238
formeJuridiqueCode
239
nomCommercial
240
raisonSociale
241
siretSiegeSocial
242
codeEffectifEntreprise
243
dateCreation
244
nom
245
prenom
246
attestationFiscaleAttachment {
247
...FileFragment
248
}
249
attestationSocialeAttachment {
250
...FileFragment
251
}
252
}
253
association {
254
rna
255
titre
256
objet
257
dateCreation
258
dateDeclaration
259
datePublication
260
}
261
}
262
263
fragment FileFragment on File {
264
filename
265
contentType
266
checksum
267
byteSize
268
url
269
}
270
271
fragment AddressFragment on Address {
272
label
273
type
274
streetAddress
275
streetNumber
276
streetName
277
postalCode
278
cityName
279
cityCode
280
departmentName
281
departmentCode
282
regionName
283
regionCode
284
}
285
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 d’un groupe instructeur
21
{
22
"query": <query>,
23
"operationName": "getGroupeInstructeur",
24
"variables": {
25
"groupeInstructeurNumber": 1234
26
}
27
}
28
29
# Un dossier par son numero
30
{
31
"query": <query>,
32
"operationName": "getDossier",
33
"variables": {
34
"dossierNumber": 1234
35
}
36
}
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 5mo ago