{"info":{"_postman_id":"07df0702-2834-4498-ac83-e936f63233e3","name":"quarksUp Api","description":"<html><head></head><body><p>L'API REST vous permet d'interagir programmatiquement avec quarksUp, vous pouvez utiliser cette API pour construire vos propres applications ou simplement extraire les données qui vous intéressent.</p>\n<p>Vous trouverez dans cette documentation le détail des ressources REST disponibles ainsi que des exemples d'utilisation.</p>\n<p>Si vous ne connaissez pas l'url de votre api merci de vous rapprocher de votre consultant quarksUp.</p>\n<h2 id=\"url\">URL</h2>\n<p>L'url des apis quarksUp dépend de l'environnement sur lequel vous requêtez :</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>production : https://service-tenant.quarksup.net/api/v2\nstaging : https://service-tenant-staging.quarksup.net/api/v2\ntraining : {{api-url-training}}/api/v2\n</code></pre><h2 id=\"version\">Version</h2>\n<p>La version est à indiquer directement dans un segment de l'url comme suit :</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>https://service-tenant.quarksup.net/api/v2\n</code></pre><h1 id=\"authentification\">Authentification</h1>\n<p>Trois types d'authentification sont supportées par l'api:</p>\n<ul>\n<li>OAuth 2.0 Implicit flow</li>\n<li>OAuth 2.0 Code flow with PKCE</li>\n<li>OAuth 2.0 Client Credentials flow</li>\n</ul>\n<p>Il est nécessaire de spécifier l'entête <em>Authorization</em> en settant sa valeur avec le Bearer token généré par l'IDP.</p>\n<p>Lors de l'utilisation du Client Credentials Grant flow, il est possible d'indiquer à l'API sur quel espace la requête est à exécuter en spécifiant le paramètre \"<em>spaceId</em>\" dans la query. Ce paramètre permet de contextualiser la requête en terme de données à traiter.</p>\n<p>Les endpoints situés dans des routes \"<em>public</em>\" sont accessibles de manière basique en précisant simplement une clé d'api dans l'entête de requête, utiliser l'entête \"api-key\" pour préciser la clé.</p>\n<p>Si vous ne possédez pas de clé d'api ou si vous cherchez à vous authentifier en Credentials Grant Flow merci de vous rapprocher de votre consultant quarksUp.</p>\n<p>Des URL présignées sont également utilisées ; elles ne requièrent aucune authentification mais expirent rapidement.</p>\n<h1 id=\"conventions\">Conventions</h1>\n<h2 id=\"requêtes\">Requêtes</h2>\n<ul>\n<li>les types de contenu de requêtes supportées sont:<ul>\n<li>application/json</li>\n<li>application/json-patch+json</li>\n<li>application/json-merge-patch</li>\n</ul>\n</li>\n<li>tous les champs date/heure doivent être en UTC et au format ISO 8601</li>\n<li>de manière générale les reqûetes doivent être localisées en spécifiant le paramètre \"<em>locale</em>\" dans la query. Ce paramètre doit être consituté d'une combinaison d'un code culture ISO 639 à 2 lettres suivi d'un code de sous culture ISO 3166 à 2 lettres (\"<em>fr-FR</em>\", \"<em>en-US</em>\", ...)</li>\n<li>les champs notés <code>required</code> sont des champs requis</li>\n<li>les champs notés <code>restricted</code> sont des champs soumis à permissions</li>\n<li>les champs notés <code>versatile</code> sont des champs capables de gérer un id <em>ou</em> un libellé (spécifier et l'id et le libellé n'est pas autorisé). Dans le cas ou le libellé est spécifié, l'api se charge de vérifier si un élément ayant le même libellé existe déjà dans l'orgnisation et si tel est le cas elle attribue automatique son id à l'élément soumis dans la requête</li>\n<li>les champs notés <code>enum</code> sont des champs ayant des valeurs prédéfinies immuables</li>\n<li>les champs notés <code>[,]</code> indiquent qu'une saisie d'une liste de valeurs séprarées par une virgule est autorisée</li>\n<li>l'entête <code>prefer</code> est spécifiable sur certains endpoints PATCH/PUT, l'indiquer permettra d'obtenir en retour de requête l'objet nouvellement modifié (return=minimal pour un fragment d'objet et return=representation pour l'objet complet).</li>\n</ul>\n<h2 id=\"réponses\">Réponses</h2>\n<ul>\n<li>tous les champs sont au format camelCase</li>\n<li>tous les champs \"<em>url</em>\" retournent des urls complètes, il en est de même pour les champs \"<em>_links</em>\"</li>\n<li>tous les champs date/heure sont en UTC et au format ISO 8601</li>\n<li>tous les champs préfixés par \"<em>_</em>\" sont des champs en lecture seule (\"<em>_links</em>\", \"<em>_audit</em>\", \"<em>_metrics</em>\"...)</li>\n<li>tous les champs de type images contenant des url retournent des urls signées qui ne nécessitent pas d'authentification, ces urls sont valides sur la journée en cours.</li>\n<li>tous les champs \"<em>_links</em>\" sont à null par défaut sur les endpoints de types <em>reports</em> ou <em>query</em> odata, le paramètre de query \"<em>includeLinks</em>\" peut être utilisé pour modifier ce comportement et inclure les liens.</li>\n<li>tous les champs de type metadata ne sont véhiculés que par leur id, il est nécessaire de requêter le endpoint metadata du module Organization pour obtenir plus d’informations au besoin (le nom de la collection metadata à spécifier est documentée sur chaque définition d’objet).</li>\n<li>certains endpoints ne renvoient que les éléments dit \"actifs\" (<em>isActive=true</em>), il est parfois possible de spécifier le paramètre de query \"<em>includeInactive</em>\" pour modifier ce comportement et inclure dans la réponse les éléménts inactifs.</li>\n<li>certains endpoints supportent un paramètre de query \"expand\" qui permet d'inclure plus d'informations dans de la réponse. Le fonctionnement est similaire à celui de Odata.</li>\n<li>à partir de la version 3 des apis quarksUp les valeurs nulles ne seront plus retournées dans les payloads json</li>\n</ul>\n<blockquote>\n<p><strong>Note</strong> : par défaut, les retours sont formattés en JSON.</p>\n</blockquote>\n<h2 id=\"statuts-de-réponses\">Statuts de réponses</h2>\n<p>En cas de succès les codes suivant sont retournés :</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>200</td>\n<td>OK - La requête a été traitée avec succès</td>\n</tr>\n<tr>\n<td>201</td>\n<td>Created - La requête a été traitée avec succès et une nouvelle ressource a été créée. L'entête HTTP 'Location' du retour contient l'URI permettant d'y accéder</td>\n</tr>\n<tr>\n<td>204</td>\n<td>NoContent - La requête a été traitée avec succès mais pas d'information à renvoyer</td>\n</tr>\n</tbody>\n</table>\n</div><p>En cas d'erreur les codes suivant seront retournés :</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td>BadRequest - La syntaxe de la requête est erronée, la requête doit être modifiée</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Unauthorized - Une authentification est requise pour accéder à la ressource demandée</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Forbidden - Le compte authentifié n'est pas autorisé à exécuter l'action demandée</td>\n</tr>\n<tr>\n<td>404</td>\n<td>NotFound - La ressource demandée n'a pas été trouvée</td>\n</tr>\n<tr>\n<td>409</td>\n<td>Conflict - La requête ne peut être traitée dans son état actuel, elle doit être modifiée</td>\n</tr>\n<tr>\n<td>422</td>\n<td>UnprocessableEntity - L'entité décrite dans la requête n'est pas conforme aux attentes, vérifier les champs obligatoires et les règles métiers à respecter</td>\n</tr>\n<tr>\n<td>429</td>\n<td>TooManyRequests - Trop de requêtes ont été envoyées dans un temps donné</td>\n</tr>\n<tr>\n<td>500</td>\n<td>InternalServerError - Erreur interne du serveur</td>\n</tr>\n<tr>\n<td>503</td>\n<td>ServiceUnavailable - Service temporairement indisponible ou en maintenance</td>\n</tr>\n</tbody>\n</table>\n</div><h1 id=\"erreurs\">Erreurs</h1>\n<p>Les erreurs sont retournées dans le format suivant :</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{ \n    \"status\": \"UnprocessableEntity\", \n    \"code\": 422, \n    \"errors\": \n    [ \n        {\n            \"field\": \"login\",  \n            \"message\": \"Le login existe déjà.\" \n        } \n    ] \n}\n</code></pre><blockquote>\n<p><strong>Note</strong> : les messages renvoyés sont directement dans la locale d'appel</p>\n</blockquote>\n<h1 id=\"batching\">Batching</h1>\n<p>Il est possible de regrouper plusieurs requêtes en une seule, pour cela il convient d'utiliser un type de contenu spécifique \"<em>multipart/mixed; boundary=</em>\".</p>\n<p><strong>Url</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>https://service-tenant.quarksup.net/api/$batch\n</code></pre><p><strong>Entête</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>multipart/mixed; boundary=\"api_request\"\n</code></pre><p><strong>Corps</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>--api_request\nContent-Type: application/http; msgtype=request\n\nGET /api/v2/recruitment/candidates/10341?locale=fr-fr HTTP/1.1\nHost: {api-url}\n\n\n--api_request\nContent-Type: application/http; msgtype=request\n\nGET /api/v2/people/companies/2?locale=fr-fr HTTP/1.1\nHost: {api-url}\n\n\n--api_request--\n</code></pre><blockquote>\n<p><strong>Note</strong> : le formattage de la requête est important, les sauts de lignes et espacements sont à respecter. Nous recommandons de ne pas batcher plus de 10 appels à la fois. Le batching imbriqué est interdit.</p>\n</blockquote>\n<h1 id=\"pagination\">Pagination</h1>\n<p>La majorité des endpoints pouvant renvoyer une grosse volumétrie de données, une pagination des retours est en place. Par défaut, le maximum d'éléments autorisé par page est retourné par l'api.</p>\n<p>La pagination est modifiable en utilisant 2 paramètres de query :</p>\n<ul>\n<li><p><strong>skip</strong> - Nombre d'éléments à ignorer</p>\n</li>\n<li><p><strong>top</strong> - Nombre d'éléments à renvoyer</p>\n<blockquote>\n<p>Note : la valeur par défaut est de 100 pour les endpoints métiers classiques (valeur maximale autorisée 500) et de 1000 pour les endpoints de type <em>reports</em> (valeur maximale autorisée 2000). Toute valeur supérieure aux valeurs maximales autorisées sera ignorée, aucune erreur ne sera générée.</p>\n</blockquote>\n</li>\n</ul>\n<p>Il est recommandé de préciser le paramètre <strong>top</strong> de manière à ce que le comportement des applications clientes ne change pas si ces limites étaient amenées à évoluer.</p>\n<h1 id=\"limitations\">Limitations</h1>\n<p>Pour éviter que l'api ne soit submergée par un trop grand nombre de requêtes, les limites d'appel suivantes sont en place :</p>\n<ul>\n<li>10 appels par seconde et par application cliente</li>\n<li>5000 appels par jour et par application cliente</li>\n</ul>\n<blockquote>\n<p>Note: Si l'api retourne un code 429, vérifier l'entête <strong>Retry-After</strong> pour obtenir le nombre de secondes à attendre avant de renouveler l'appel.</p>\n</blockquote>\n<h1 id=\"odata\">Odata</h1>\n<p>Les endpoints de type \"<em>Query</em>\" sont des endpoints Odata avec le paramétrage suivant :</p>\n<ul>\n<li>opérateur logiques autorisés : tous</li>\n<li>opérateur arithmétiques autorisés : tous</li>\n<li>fonctions autorisées : toutes</li>\n<li>options autorisées : count, filter, orderBy, select, skip, skipToken, top</li>\n</ul>\n<h1 id=\"workflows\">Workflows</h1>\n<p>Un workflow est la représentation d'une suite de tâches aboutissant à la réalisation d'un processus métier. Les workflows quarksUp sont paramétrables par statut de ressource, groupe de rôle et espace, la combinaison de ces éléments se nomme une \"sequence\".</p>\n<p>Les ressources supportant les workflows exposent des endpoints spécifiques qui permettent d'obtenir :</p>\n<ul>\n<li>la liste des actions engendrant la création d'une nouvelle ressource (\"[resource]/workflows\")</li>\n<li>la liste des actions engendrant la mise à jour d'une ressource existante (\"[resource]/{resourceId}/workflows\")</li>\n<li>la liste des modèles d'emails liés à l'action (\"[resource]/{resourceId}/workflows/{sequenceId}/emails\")</li>\n</ul>\n<h1 id=\"emails\">Emails</h1>\n<p>Les ressources supportant l'envoi d'emails exposent des endpoints spécifiques qui permettent :</p>\n<ul>\n<li>l'envoi d'un email basé sur la fusion des données et d'un modèle d'email (\"[resource]/emails\")</li>\n<li>la génération d'un email basé sur la fusion des données et d'un modèle d'email (\"[resource]/emails/preview\")</li>\n</ul>\n<h1 id=\"fusion\">Fusion</h1>\n<p>Les ressources supportant la fusion avec des modèles de documents exposent un endpoint spécifique qui permet :</p>\n<ul>\n<li>la génération d'un document basée sur la fusion des données et d'un modèle de document (\"[resource]/render\")</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Authentification","slug":"authentification"},{"content":"Conventions","slug":"conventions"},{"content":"Erreurs","slug":"erreurs"},{"content":"Batching","slug":"batching"},{"content":"Pagination","slug":"pagination"},{"content":"Limitations","slug":"limitations"},{"content":"Odata","slug":"odata"},{"content":"Workflows","slug":"workflows"},{"content":"Emails","slug":"emails"},{"content":"Fusion","slug":"fusion"}],"owner":"7443498","collectionId":"07df0702-2834-4498-ac83-e936f63233e3","publishedId":"TzRU9Rap","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"0B6BD3"},"publishDate":"2021-05-11T13:10:37.000Z"},"item":[{"name":"Authentification","item":[{"name":"OAuth 2.0 Client Credentials flow","event":[{"listen":"test","script":{"id":"97311871-60d6-451b-8a46-bf112e21a8f9","exec":["var jsonData = pm.response.json();\r","var token = jsonData.access_token;\r","pm.environment.set(\"token\", token);\r","console.log(token)"],"type":"text/javascript"}}],"id":"566883fd-dcfe-4ea1-aeba-154e1353d4d7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","type":"text"},{"key":"client_id","value":"","type":"text"},{"key":"client_secret","value":"","type":"text"},{"key":"resource","value":"https://service-tenant.quarksup.net/","type":"text"}]},"url":"https://login.quarksup.net/adfs/oauth2/token","description":"<p>Génère un access token pour un client de confiance.</p>\n<p>Pour utiliser ce mode d'authentification vous devez obtenir de votre consultant quarksUp les informations nécessaires :</p>\n<ul>\n<li>client-id : identifiant de l'application cliente</li>\n<li>client-secret : code secret lié à l'application cliente</li>\n<li>tenant : le nom de votre tenant</li>\n<li>resource : identifiant de la ressource api</li>\n</ul>\n<p>Si vous utilisez Postman vous pourrez paramétrer ces variables au niveau de la collection et de l'environnement sélectionné (Production ou Staging) et simplement exécuter la requête pour être authentifié et placer le token automatiquement en variable utilisable sur les requêtes suivantes.</p>\n","urlObject":{"path":["oauth2","token"],"host":["https://login.quarksup.net/adfs"],"query":[],"variable":[]}},"response":[],"_postman_id":"566883fd-dcfe-4ea1-aeba-154e1353d4d7"}],"id":"d2c97d20-b574-4ab7-a4c3-dc3525737297","_postman_id":"d2c97d20-b574-4ab7-a4c3-dc3525737297","description":""},{"name":"Gets the instance information.","id":"b98472ef-b540-4800-a4a0-e9659ac1bb45","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://service-tenant.quarksup.net/api/v2/organization/info","description":"<p>Retourne les détails de paramétrage de l'instance.</p>\n","urlObject":{"path":["api","v2","organization","info"],"host":["https://service-tenant.quarksup.net"],"query":[],"variable":[]}},"response":[{"id":"5ace8682-c037-47c1-b736-b25c2207e486","name":"Gets the instance information","originalRequest":{"method":"GET","header":[],"url":"https://service-tenant.quarksup.net/api/v2/organization/info"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"tenant\": \"<string>\",\n    \"customer\": \"<string>\",\n    \"environment\": \"<string>\",\n    \"version\": \"<string>\",\n    \"apiUrl\": \"<string>\",\n    \"url\": \"<string>\"\n}"}],"_postman_id":"b98472ef-b540-4800-a4a0-e9659ac1bb45"}],"event":[{"listen":"prerequest","script":{"id":"1a4e3f94-3e2a-480d-8498-e13fd139d042","type":"text/javascript","exec":[""]}},{"listen":"test","script":{"id":"a3f3ab65-2d38-4e2b-84c8-ece44f82499b","type":"text/javascript","exec":[""]}}],"variable":[{"key":"tenant","value":"tenant","type":"string"},{"key":"client-id","value":""},{"key":"client-secret","value":""},{"key":"idp-url","value":"https://login.quarksup.net/adfs"},{"key":"api-url","value":"https://service-tenant.quarksup.net"},{"key":"api-url-staging","value":"https://service-tenant-staging.quarksup.net"},{"key":"api-version","value":"2"},{"key":"resource","value":"https://service-tenant.quarksup.net/"},{"key":"token","value":""}]}