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):

https://www.demarches-simplifiees.fr/graphql

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.

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
GraphQL

https://www.demarches-simplifiees.fr/api/v2/graphql
Le point d'entrée de l'API GraphQL.
Request
Response
Request
Headers
Content-Type
required
string
application/json
Authorization
required
string
Le jeton de l'administrateur
Body Parameters
query
required
string
La requête GraphQL
variables
optional
object
Les variables de la requête
Response
200: OK
Cake successfully retrieved.
{
"data": {
"dossier": {
"id": "RG9zc2llci0xMDMyODgy",
"number": "1032882"
}
},
"errors": [
{
"message": "Field 'dosier' doesn't exist on type 'Query'",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"query getDossier",
"dosier"
],
"extensions": {
"code": "undefinedField",
"typeName": "Query",
"fieldName": "dosier"
}
}
]
}

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 :

curl 'https://www.demarches-simplifiees.fr/api/v2/graphql' \
--header 'Authorization: Bearer <votre_token>' \
--header 'Content-Type: application/json' \
--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> } }'

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

query getDemarche($demarcheNumber: Int!, $state: DossierState, $after: String) {
demarche(number: $demarcheNumber) {
id
number
title
publishedRevision {
...RevisionFragment
}
groupeInstructeurs {
id
number
label
instructeurs {
id
email
}
}
dossiers(state: $state, after: $after) {
nodes {
...DossierFragment
}
}
}
}
query getGroupeInstructeur($groupeInstructeureNumber: Int!, $state: DossierState, $after: String) {
groupeInstructeur(number: $groupeInstructeureNumber) {
id
number
label
instructeurs {
id
email
}
dossiers(state: $state, after: $after) {
nodes {
...DossierFragment
}
}
}
}
query getDossier($dossierNumber: Int!) {
dossier(number: $dossierNumber) {
...DossierFragment
}
}
fragment DossierFragment on Dossier {
id
number
archived
state
dateDerniereModification
datePassageEnConstruction
datePassageEnInstruction
dateTraitement
motivation
motivationAttachment {
...FileFragment
}
attestation {
...FileFragment
}
pdf {
url
}
instructeurs {
email
}
groupeInstructeur {
id
number
label
}
revision {
...RevisionFragment
}
champs {
...ChampFragment
...RootChampFragment
}
annotations {
...ChampFragment
...RootChampFragment
}
avis {
...AvisFragment
}
messages {
...MessageFragment
}
demandeur {
... on PersonnePhysique {
civilite
nom
prenom
dateDeNaissance
}
...PersonneMoraleFragment
}
}
fragment RevisionFragment on Revision {
id
champDescriptors {
...ChampDescriptorFragment
champDescriptors {
...ChampDescriptorFragment
}
}
annotationDescriptors {
...ChampDescriptorFragment
champDescriptors {
...ChampDescriptorFragment
}
}
}
fragment ChampDescriptorFragment on ChampDescriptor {
id
type
label
description
required
options
}
fragment AvisFragment on Avis {
id
question
reponse
dateQuestion
dateReponse
claimant {
email
}
expert {
email
}
attachment {
...FileFragment
}
}
fragment MessageFragment on Message {
id
email
body
createdAt
attachment {
...FileFragment
}
}
fragment GeoAreaFragment on GeoArea {
source
geometry {
type
coordinates
}
... on ParcelleCadastrale {
codeArr
codeCom
codeDep
feuille
nomCom
numero
section
surfaceParcelle
surfaceIntersection
}
}
fragment RootChampFragment on Champ {
... on RepetitionChamp {
champs {
...ChampFragment
}
}
... on SiretChamp {
etablissement {
...PersonneMoraleFragment
}
}
... on CarteChamp {
geoAreas {
...GeoAreaFragment
}
}
... on DossierLinkChamp {
dossier {
id
state
usager {
email
}
}
}
}
fragment ChampFragment on Champ {
id
label
stringValue
... on LinkedDropDownListChamp {
primaryValue
secondaryValue
}
... on MultipleDropDownListChamp {
values
}
... on PieceJustificativeChamp {
file {
...FileFragment
}
}
... on AddressChamp {
address {
...AddressFragment
}
}
}
fragment PersonneMoraleFragment on PersonneMorale {
siret
siegeSocial
naf
libelleNaf
address {
...AddressFragment
}
entreprise {
siren
capitalSocial
numeroTvaIntracommunautaire
formeJuridique
formeJuridiqueCode
nomCommercial
raisonSociale
siretSiegeSocial
codeEffectifEntreprise
dateCreation
nom
prenom
attestationFiscaleAttachment {
...FileFragment
}
attestationSocialeAttachment {
...FileFragment
}
}
association {
rna
titre
objet
dateCreation
dateDeclaration
datePublication
}
}
fragment FileFragment on File {
filename
contentType
checksum
byteSize
url
}
fragment AddressFragment on Address {
label
type
streetAddress
streetNumber
streetName
postalCode
cityName
cityCode
departmentName
departmentCode
regionName
regionCode
}
# Tout les dossiers d’une démarche
{
"query": <query>,
"operationName": "getDemarche",
"variables": {
"demarcheNumber": 1234
}
}
# Tout les dossiers "en_instruction" d’une démarche
{
"query": <query>,
"operationName": "getDemarche",
"variables": {
"demarcheNumber": 1234,
"state": "en_instruction"
}
}
# Tout les dossiers d’un groupe instructeur
{
"query": <query>,
"operationName": "getGroupeInstructeur",
"variables": {
"groupeInstructeureNumber": 1234
}
}
# Un dossier par son numero
{
"query": <query>,
"operationName": "getDossier",
"variables": {
"dossierNumber": 1234
}
}

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 :

query getDemarche($demarcheNumber: Int!, $after: String) {
demarche(number: $demarcheNumber) {
dossiers(first: 100, after: $after) {
pageInfo {
endCursor
hasNextPage
}
nodes {
id
number
}
}
}
}
{
"query": <query>,
"operationName": "getDemarche",
"variables": {
"demarcheNumber": 1234
}
}

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.

query getDemarche($demarcheNumber: Int!, $after: String) {
demarche(number: $demarcheNumber) {
dossiers(first: 100, after: $after) {
pageInfo {
endCursor
hasNextPage
}
nodes {
id
number
}
}
}
}
{
"query": <query>,
"operationName": "getDemarche",
"variables": {
"demarcheNumber": 1234,
"after" "abc"
}
}

Mutations

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

mutation dossierArchiver($input: DossierArchiverInput!) {
dossierArchiver(input: $input) {
dossier {
id
}
errors {
message
}
}
}
mutation dossierPasserEnInstruction($input: DossierPasserEnInstructionInput!) {
dossierPasserEnInstruction(input: $input) {
dossier {
id
}
errors {
message
}
}
}
mutation dossierAccepter($input: DossierAccepterInput!) {
dossierAccepter(input: $input) {
dossier {
id
}
errors {
message
}
}
}
mutation dossierRefuser($input: DossierRefuserInput!) {
dossierRefuser(input: $input) {
dossier {
id
}
errors {
message
}
}
}
mutation dossierClasserSansSuite($input: DossierClasserSansSuiteInput!) {
dossierClasserSansSuite(input: $input) {
dossier {
id
}
errors {
message
}
}
}
# Archiver un dossier
{
"query": <query>,
"operationName": "dossierArchiver",
"variables": {
"input": {
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
"instructeurId": "OPJvtN7kdXKlLTI4NTlf"
}
}
}
# Passer un dossier en instruction
{
"query": <query>,
"operationName": "dossierPasserEnInstruction",
"variables": {
"input": {
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
"instructeurId": "OPJvtN7kdXKlLTI4NTlf"
}
}
}
# Accepter un dossier
{
"query": <query>,
"operationName": "dossierAccepter",
"variables": {
"input": {
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
"instructeurId": "OPJvtN7kdXKlLTI4NTlf",
"motivation": "J’accepte ce dossier"
}
}
}
# Refuser un dossier
{
"query": <query>,
"operationName": "dossierRefuser",
"variables": {
"input": {
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
"instructeurId": "OPJvtN7kdXKlLTI4NTlf",
"motivation": "Je refuse ce dossier"
}
}
}
# Classer un dossier sans suite
{
"query": <query>,
"operationName": "dossierClasserSansSuite",
"variables": {
"input": {
"dossierId": "UHJvY4VkdXKlLTI5NTgw",
"instructeurId": "OPJvtN7kdXKlLTI4NTlf",
"motivation": "Je classe ce dossier sans suite"
}
}
}

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