{"id":1104,"date":"2026-07-12T16:26:42","date_gmt":"2026-07-12T16:26:42","guid":{"rendered":"https:\/\/www.stagereturn.com\/?page_id=1104"},"modified":"2026-07-14T11:43:05","modified_gmt":"2026-07-14T11:43:05","slug":"documentation-api","status":"publish","type":"page","link":"https:\/\/www.stagereturn.com\/en\/centre-aide\/documentation-api\/","title":{"rendered":"documentation-api"},"content":{"rendered":"\n<style>\n.sr-api-page{\n  max-width:1080px;\n  margin:0 auto;\n  padding:150px 20px 70px;\n  font-family:inherit;\n  color:#252b3a;\n}\n\n.sr-api-top{\n  display:flex;\n  justify-content:center;\n  align-items:center;\n  gap:16px;\n  flex-wrap:wrap;\n  margin-bottom:18px;\n}\n\n.sr-api-back{\n  color:#ff6a00;\n  font-weight:700;\n  text-decoration:none;\n}\n\n.sr-api-back:hover{\n  text-decoration:underline;\n}\n\n.sr-api-badge{\n  display:inline-flex;\n  align-items:center;\n  gap:8px;\n  background:#fff3e8;\n  color:#ff6a00;\n  font-weight:800;\n  padding:9px 16px;\n  border-radius:999px;\n}\n\n.sr-api-hero{\n  text-align:center;\n  margin-bottom:42px;\n}\n\n.sr-api-hero h1{\n  font-size:clamp(34px,5vw,56px);\n  line-height:1.1;\n  margin:0 0 18px;\n  color:#252b3a;\n}\n\n.sr-api-hero p{\n  max-width:850px;\n  margin:0 auto;\n  font-size:18px;\n  line-height:1.7;\n  color:#4b5565;\n}\n\n.sr-api-layout{\n  display:grid;\n  grid-template-columns:250px minmax(0,1fr);\n  gap:24px;\n  align-items:start;\n}\n\n.sr-api-nav{\n  position:sticky;\n  top:120px;\n  background:#fff;\n  border:1px solid rgba(255,106,0,.12);\n  border-radius:22px;\n  padding:22px;\n  box-shadow:0 14px 40px rgba(20,30,60,.08);\n}\n\n.sr-api-nav strong{\n  display:block;\n  margin-bottom:12px;\n  font-size:18px;\n  color:#252b3a;\n}\n\n.sr-api-nav a{\n  display:block;\n  color:#4b5565;\n  text-decoration:none;\n  font-size:14.5px;\n  line-height:1.45;\n  padding:8px 10px;\n  border-radius:10px;\n}\n\n.sr-api-nav a:hover{\n  color:#ff6a00;\n  background:#fff3e8;\n}\n\n.sr-api-content{\n  min-width:0;\n}\n\n.sr-api-section,\n.sr-api-summary,\n.sr-api-cta{\n  background:#fff;\n  border-radius:24px;\n  padding:30px;\n  margin-bottom:24px;\n  box-shadow:0 14px 40px rgba(20,30,60,.10);\n  border:1px solid rgba(255,106,0,.12);\n  scroll-margin-top:130px;\n}\n\n.sr-api-section h2,\n.sr-api-summary h2,\n.sr-api-cta h2{\n  margin:0 0 18px;\n  color:#252b3a;\n  font-size:28px;\n  line-height:1.25;\n}\n\n.sr-api-section h3{\n  margin:28px 0 12px;\n  color:#252b3a;\n  font-size:21px;\n}\n\n.sr-api-section p,\n.sr-api-summary p,\n.sr-api-cta p{\n  color:#4b5565;\n  line-height:1.75;\n  font-size:16.5px;\n}\n\n.sr-api-summary ul,\n.sr-api-section ul{\n  padding-left:20px;\n  line-height:1.85;\n  color:#4b5565;\n}\n\n.sr-api-endpoint-head{\n  display:flex;\n  align-items:center;\n  gap:12px;\n  flex-wrap:wrap;\n  margin-bottom:18px;\n}\n\n.sr-api-method{\n  display:inline-block;\n  background:#ff6a00;\n  color:#fff;\n  font-weight:900;\n  font-size:13px;\n  letter-spacing:.04em;\n  padding:8px 11px;\n  border-radius:10px;\n}\n\n.sr-api-route{\n  font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",monospace;\n  font-size:14px;\n  color:#252b3a;\n  background:#f7f8fb;\n  border:1px solid rgba(37,43,58,.08);\n  border-radius:10px;\n  padding:8px 11px;\n  overflow-wrap:anywhere;\n}\n\n.sr-api-note,\n.sr-api-warning,\n.sr-api-success{\n  border-radius:16px;\n  padding:18px 20px;\n  margin:18px 0;\n  line-height:1.7;\n}\n\n.sr-api-note{\n  background:#fff3e8;\n  border-left:5px solid #ff6a00;\n  color:#3b4252;\n}\n\n.sr-api-warning{\n  background:#fff8e6;\n  border-left:5px solid #e3a100;\n  color:#51461f;\n}\n\n.sr-api-success{\n  background:#eefbf3;\n  border-left:5px solid #2f9e5b;\n  color:#28523a;\n}\n\n.sr-code-wrap{\n  position:relative;\n  margin:16px 0 22px;\n}\n\n.sr-code-label{\n  position:absolute;\n  top:10px;\n  right:12px;\n  z-index:2;\n  color:#aab2c0;\n  font-size:12px;\n  font-weight:700;\n  text-transform:uppercase;\n  letter-spacing:.05em;\n}\n\n.sr-code{\n  margin:0;\n  background:#1f2430;\n  color:#eef2f7;\n  border-radius:16px;\n  padding:22px;\n  overflow:auto;\n  font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",monospace;\n  font-size:13.5px;\n  line-height:1.7;\n  white-space:pre;\n}\n\n.sr-inline-code{\n  font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",monospace;\n  background:#f5f6f9;\n  border:1px solid rgba(37,43,58,.08);\n  border-radius:7px;\n  padding:2px 7px;\n  font-size:.92em;\n  color:#252b3a;\n}\n\n.sr-api-table-wrap{\n  width:100%;\n  overflow-x:auto;\n  margin:16px 0 22px;\n  border:1px solid rgba(37,43,58,.08);\n  border-radius:16px;\n}\n\n.sr-api-table{\n  width:100%;\n  border-collapse:collapse;\n  min-width:680px;\n  background:#fff;\n}\n\n.sr-api-table th,\n.sr-api-table td{\n  text-align:left;\n  vertical-align:top;\n  padding:13px 15px;\n  border-bottom:1px solid rgba(37,43,58,.08);\n  color:#4b5565;\n  line-height:1.55;\n  font-size:14px;\n}\n\n.sr-api-table th{\n  background:#f8f9fc;\n  color:#252b3a;\n  font-weight:800;\n}\n\n.sr-api-table tr:last-child td{\n  border-bottom:none;\n}\n\n.sr-api-type{\n  color:#ff6a00;\n  font-weight:800;\n  white-space:nowrap;\n}\n\n.sr-api-required{\n  color:#b42318;\n  font-weight:800;\n}\n\n.sr-api-status{\n  display:inline-block;\n  min-width:46px;\n  text-align:center;\n  font-weight:900;\n  border-radius:8px;\n  padding:5px 8px;\n  background:#f2f4f7;\n  color:#344054;\n}\n\n.sr-api-cards{\n  display:grid;\n  grid-template-columns:repeat(2,minmax(0,1fr));\n  gap:16px;\n  margin-top:18px;\n}\n\n.sr-api-card{\n  background:#f8f9fc;\n  border:1px solid rgba(37,43,58,.08);\n  border-radius:18px;\n  padding:20px;\n}\n\n.sr-api-card h3{\n  margin:0 0 8px;\n  font-size:19px;\n}\n\n.sr-api-card p{\n  margin:0;\n  font-size:15px;\n}\n\n.sr-api-cta{\n  background:linear-gradient(135deg,#ff6a00,#ff8a1c);\n  color:#fff;\n}\n\n.sr-api-cta h2,\n.sr-api-cta p{\n  color:#fff;\n}\n\n.sr-api-button{\n  display:inline-block;\n  margin-top:10px;\n  background:#fff;\n  color:#ff6a00;\n  font-weight:800;\n  padding:13px 20px;\n  border-radius:999px;\n  text-decoration:none;\n}\n\n@media(max-width:900px){\n  .sr-api-layout{\n    grid-template-columns:1fr;\n  }\n\n  .sr-api-nav{\n    position:static;\n  }\n\n  .sr-api-nav div{\n    display:grid;\n    grid-template-columns:repeat(2,minmax(0,1fr));\n    gap:4px 10px;\n  }\n}\n\n@media(max-width:700px){\n  .sr-api-cards{\n    grid-template-columns:1fr;\n  }\n}\n\n@media(max-width:640px){\n  .sr-api-page{\n    padding:125px 14px 50px;\n  }\n\n  .sr-api-section,\n  .sr-api-summary,\n  .sr-api-cta{\n    padding:24px;\n    border-radius:20px;\n  }\n\n  .sr-api-hero p{\n    font-size:16.5px;\n  }\n\n  .sr-api-section h2,\n  .sr-api-summary h2,\n  .sr-api-cta h2{\n    font-size:25px;\n  }\n\n  .sr-api-nav div{\n    grid-template-columns:1fr;\n  }\n\n  .sr-code{\n    font-size:12px;\n    padding:18px;\n  }\n}\n<\/style>\n\n<section class=\"sr-api-page\">\n\n  <div class=\"sr-api-hero\">\n    <div class=\"sr-api-top\">\n      <a class=\"sr-api-back\" href=\"\/centre-aide\/api-integrations-erp\/\">\u2190 Retour \u00e0 API &amp; ERP<\/a>\n      <span class=\"sr-api-badge\">\ud83d\udcd6 Documentation API<\/span>\n    <\/div>\n\n    <h1>Documentation API StageReturn<\/h1>\n    <p>R\u00e9f\u00e9rence technique officielle des endpoints publics actuellement expos\u00e9s par StageReturn pour consulter le statut des \u00e9quipements s\u00e9rialis\u00e9s et des \u00e9quipements manquants.<\/p>\n  <\/div>\n\n  <div class=\"sr-api-layout\">\n\n    <aside class=\"sr-api-nav\">\n      <strong>Sommaire<\/strong>\n      <div>\n        <a href=\"#presentation\">Pr\u00e9sentation<\/a>\n        <a href=\"#base-url\">URL de base<\/a>\n        <a href=\"#request-contract\">Format des requ\u00eates<\/a>\n        <a href=\"#authentication\">Authentification<\/a>\n        <a href=\"#first-request\">Premier appel<\/a>\n        <a href=\"#serialized-equipment\">\u00c9quipement s\u00e9rialis\u00e9<\/a>\n        <a href=\"#missing-equipment\">\u00c9quipement manquant<\/a>\n        <a href=\"#statuses\">Valeurs retourn\u00e9es<\/a>\n        <a href=\"#http-status\">Codes HTTP<\/a>\n        <a href=\"#errors\">Erreurs<\/a>\n        <a href=\"#integration-rules\">R\u00e8gles d\u2019int\u00e9gration<\/a>\n        <a href=\"#integration-checklist\">Checklist production<\/a>\n      <\/div>\n    <\/aside>\n\n    <main class=\"sr-api-content\">\n\n      <div class=\"sr-api-summary\" id=\"presentation\">\n        <h2>Pr\u00e9sentation<\/h2>\n        <p>L\u2019API publique StageReturn est une API de consultation en lecture seule. La cl\u00e9 API d\u00e9termine automatiquement l\u2019entreprise dont les donn\u00e9es peuvent \u00eatre consult\u00e9es.<\/p>\n        <ul>\n          <li>Format des r\u00e9ponses : <strong>JSON<\/strong><\/li>\n          <li>Protocole : <strong>HTTPS<\/strong><\/li>\n          <li>Authentification : header <span class=\"sr-inline-code\">x-api-key<\/span><\/li>\n          <li>M\u00e9thode accept\u00e9e : <strong>GET<\/strong><\/li>\n          <li>Corps de requ\u00eate : <strong>aucun<\/strong><\/li>\n          <li>Param\u00e8tres : transmis dans la cha\u00eene de requ\u00eate de l\u2019URL<\/li>\n        <\/ul>\n\n        <div class=\"sr-api-note\">\n          Cette page documente uniquement les deux endpoints publics r\u00e9ellement disponibles : <span class=\"sr-inline-code\">equipmentStatusApi<\/span> et <span class=\"sr-inline-code\">missingEquipmentStatusApi<\/span>.\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"base-url\">\n        <h2>URL de base<\/h2>\n        <p>L\u2019URL officielle de l\u2019API StageReturn est :<\/p>\n\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">Base URL<\/span>\n          <pre class=\"sr-code\">https:\/\/api.stagereturn.com<\/pre>\n        <\/div>\n\n        <p>Cette adresse est le point d\u2019entr\u00e9e officiel de l\u2019API StageReturn. Toutes les requ\u00eates document\u00e9es ci-dessous utilisent ce domaine.<\/p>\n\n        <p>Les endpoints publics disponibles sont :<\/p>\n\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">Endpoints<\/span>\n          <pre class=\"sr-code\">GET \/equipmentStatusApi\nGET \/missingEquipmentStatusApi<\/pre>\n        <\/div>\n\n      <\/div>\n\n\n      <div class=\"sr-api-section\" id=\"request-contract\">\n        <h2>Format des requ\u00eates<\/h2>\n        <ul>\n          <li>Utilisez la m\u00e9thode <strong>GET<\/strong>.<\/li>\n          <li>Transmettez les param\u00e8tres dans l\u2019URL.<\/li>\n          <li>N\u2019envoyez aucun corps de requ\u00eate.<\/li>\n          <li>Envoyez la cl\u00e9 dans le header <span class=\"sr-inline-code\">x-api-key<\/span>.<\/li>\n          <li>Le header <span class=\"sr-inline-code\">Accept: application\/json<\/span> est recommand\u00e9.<\/li>\n          <li>Encodez les param\u00e8tres avec l\u2019encodage URL.<\/li>\n        <\/ul>\n\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">Exemple HTTP<\/span>\n          <pre class=\"sr-code\">GET \/equipmentStatusApi?serial=SN-123456 HTTP\/1.1\nHost: api.stagereturn.com\nx-api-key: VOTRE_CLE_API\nAccept: application\/json<\/pre>\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"authentication\">\n        <h2>Authentification<\/h2>\n        <p>Chaque requ\u00eate doit transmettre une cl\u00e9 API StageReturn valide dans le header HTTP <span class=\"sr-inline-code\">x-api-key<\/span>.<\/p>\n\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">Header requis<\/span>\n          <pre class=\"sr-code\">x-api-key: VOTRE_CLE_API<\/pre>\n        <\/div>\n\n        <p>La cl\u00e9 doit \u00eatre envoy\u00e9e telle quelle, sans pr\u00e9fixe <span class=\"sr-inline-code\">Bearer<\/span>.<\/p>\n\n        <h3>Obtenir une cl\u00e9 API<\/h3>\n        <p>Dans StageReturn, ouvrez l\u2019espace d\u2019administration puis la section <strong>API<\/strong>. La cl\u00e9 doit \u00eatre g\u00e9n\u00e9r\u00e9e et activ\u00e9e par un utilisateur autoris\u00e9 de l\u2019entreprise.<\/p>\n\n        <div class=\"sr-api-warning\">\n          Conservez la cl\u00e9 c\u00f4t\u00e9 serveur. Ne l\u2019int\u00e9grez pas dans un site public, une application frontend ou un d\u00e9p\u00f4t de code accessible.\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"first-request\">\n        <h2>Premier appel<\/h2>\n        <p>Ce premier appel consulte le statut associ\u00e9 au num\u00e9ro de s\u00e9rie <span class=\"sr-inline-code\">SN-123456<\/span>.<\/p>\n\n        <h3>cURL<\/h3>\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">Bash<\/span>\n          <pre class=\"sr-code\">curl --request GET \\\n  --url \"https:\/\/api.stagereturn.com\/equipmentStatusApi?serial=SN-123456\" \\\n  --header \"x-api-key: VOTRE_CLE_API\" \\\n  --header \"Accept: application\/json\"<\/pre>\n        <\/div>\n\n        <h3>JavaScript \/ Node.js<\/h3>\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">JavaScript<\/span>\n          <pre class=\"sr-code\">const url = new URL(\n  \"https:\/\/api.stagereturn.com\/equipmentStatusApi\"\n);\nurl.searchParams.set(\"serial\", \"SN-123456\");\n\nconst response = await fetch(url, {\n  method: \"GET\",\n  headers: {\n    \"x-api-key\": process.env.STAGERETURN_API_KEY,\n    \"Accept\": \"application\/json\"\n  }\n});\n\nconst data = await response.json();\n\nif (!response.ok) {\n  throw new Error(data.error || `HTTP ${response.status}`);\n}\n\nconsole.log(data);<\/pre>\n        <\/div>\n\n        <h3>PHP<\/h3>\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">PHP<\/span>\n          <pre class=\"sr-code\">&lt;?php\n$serial = rawurlencode(\"SN-123456\");\n$url = \"https:\/\/api.stagereturn.com\/equipmentStatusApi?serial={$serial}\";\n\n$ch = curl_init($url);\ncurl_setopt_array($ch, [\n    CURLOPT_RETURNTRANSFER =&gt; true,\n    CURLOPT_HTTPHEADER =&gt; [\n        \"x-api-key: \" . getenv(\"STAGERETURN_API_KEY\"),\n        \"Accept: application\/json\"\n    ],\n    CURLOPT_TIMEOUT =&gt; 15\n]);\n\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\n$data = json_decode($body, true);\n\nif ($status &lt; 200 || $status &gt;= 300) {\n    throw new Exception($data[\"error\"] ?? \"HTTP {$status}\");\n}<\/pre>\n        <\/div>\n\n        <h3>Python<\/h3>\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">Python<\/span>\n          <pre class=\"sr-code\">import os\nimport requests\n\nresponse = requests.get(\n    \"https:\/\/api.stagereturn.com\/equipmentStatusApi\",\n    params={\"serial\": \"SN-123456\"},\n    headers={\n        \"x-api-key\": os.environ[\"STAGERETURN_API_KEY\"],\n        \"Accept\": \"application\/json\",\n    },\n    timeout=15,\n)\n\ndata = response.json()\n\nif not response.ok:\n    raise RuntimeError(data.get(\"error\", f\"HTTP {response.status_code}\"))\n\nprint(data)<\/pre>\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"serialized-equipment\">\n        <div class=\"sr-api-endpoint-head\">\n          <span class=\"sr-api-method\">GET<\/span>\n          <span class=\"sr-api-route\">\/equipmentStatusApi?serial=XXXX<\/span>\n        <\/div>\n\n        <h2>Consulter le statut d\u2019un \u00e9quipement s\u00e9rialis\u00e9<\/h2>\n        <p>Recherche jusqu\u2019\u00e0 10 r\u00e9parations ouvertes de l\u2019entreprise pour le num\u00e9ro de s\u00e9rie fourni. Une r\u00e9paration est consid\u00e9r\u00e9e comme ouverte lorsque son statut est <span class=\"sr-inline-code\">todo<\/span> ou <span class=\"sr-inline-code\">in_progress<\/span>.<\/p>\n\n        <div class=\"sr-api-note\">\n          Si plusieurs r\u00e9parations ouvertes correspondent au m\u00eame num\u00e9ro de s\u00e9rie, une r\u00e9paration qui immobilise l\u2019\u00e9quipement est prioritaire. Si aucune r\u00e9paration ouverte ne l\u2019immobilise, l\u2019API retourne les informations de la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e.\n        <\/div>\n\n        <h3>Param\u00e8tre de requ\u00eate<\/h3>\n        <div class=\"sr-api-table-wrap\">\n          <table class=\"sr-api-table\">\n            <thead>\n              <tr>\n                <th>Param\u00e8tre<\/th>\n                <th>Type<\/th>\n                <th>Obligatoire<\/th>\n                <th>Traitement exact<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody>\n              <tr>\n                <td><span class=\"sr-inline-code\">serial<\/span><\/td>\n                <td><span class=\"sr-api-type\">string<\/span><\/td>\n                <td><span class=\"sr-api-required\">Oui<\/span><\/td>\n                <td>La valeur est convertie en cha\u00eene puis les espaces plac\u00e9s au d\u00e9but et \u00e0 la fin sont supprim\u00e9s. La recherche restante est exacte et sensible \u00e0 la casse. Le num\u00e9ro doit donc correspondre exactement \u00e0 <span class=\"sr-inline-code\">serialNumber<\/span> dans StageReturn.<\/td>\n              <\/tr>\n            <\/tbody>\n          <\/table>\n        <\/div>\n\n        <h3>R\u00e9ponse lorsqu\u2019une r\u00e9paration immobilise l\u2019\u00e9quipement<\/h3>\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">JSON \u2014 HTTP 200<\/span>\n          <pre class=\"sr-code\">{\n  \"success\": true,\n  \"serial\": \"SN-123456\",\n  \"erpImmobilized\": true,\n  \"erpImmobilizationEnabled\": true,\n  \"erpProvider\": \"rentman\",\n  \"erpSyncStatus\": \"synced\",\n  \"erpStatusReason\": \"repair_open\",\n  \"stockAvailable\": false,\n  \"reason\": \"repair_open\",\n  \"repairStatus\": \"in_progress\",\n  \"repairId\": \"abc123\",\n  \"repairTitle\": \"Projecteur LED\",\n  \"problemDescription\": \"Le projecteur ne s\u2019allume plus.\",\n  \"projectId\": \"project123\",\n  \"projectName\": \"Concert \u00e9t\u00e9\",\n  \"projectNumber\": \"PRJ-00124\",\n  \"repairCreatedAt\": \"2026-07-10T09:18:22.000Z\",\n  \"repairUpdatedAt\": \"2026-07-11T14:52:03.000Z\",\n  \"updatedAt\": \"2026-07-12T14:00:00.000Z\"\n}<\/pre>\n        <\/div>\n\n        <h3>R\u00e9ponse lorsqu\u2019aucune r\u00e9paration ouverte n\u2019est trouv\u00e9e<\/h3>\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">JSON \u2014 HTTP 200<\/span>\n          <pre class=\"sr-code\">{\n  \"success\": true,\n  \"serial\": \"SN-INCONNU\",\n  \"erpImmobilized\": false,\n  \"erpImmobilizationEnabled\": false,\n  \"erpProvider\": null,\n  \"erpSyncStatus\": null,\n  \"erpStatusReason\": \"none\",\n  \"stockAvailable\": true,\n  \"reason\": \"none\",\n  \"repairStatus\": null,\n  \"repairId\": null,\n  \"repairTitle\": null,\n  \"problemDescription\": null,\n  \"projectId\": null,\n  \"projectName\": null,\n  \"projectNumber\": null,\n  \"repairCreatedAt\": null,\n  \"repairUpdatedAt\": null,\n  \"updatedAt\": \"2026-07-12T14:00:00.000Z\"\n}<\/pre>\n        <\/div>\n\n        <div class=\"sr-api-warning\">\n          Cet endpoint ne v\u00e9rifie pas l\u2019existence d\u2019un \u00e9quipement dans un catalogue. Un num\u00e9ro sans r\u00e9paration ouverte retourne donc \u00e9galement HTTP 200 avec <span class=\"sr-inline-code\">stockAvailable: true<\/span> et les champs de r\u00e9paration \u00e0 <span class=\"sr-inline-code\">null<\/span>.\n        <\/div>\n\n        <h3>Champs retourn\u00e9s<\/h3>\n        <div class=\"sr-api-table-wrap\">\n          <table class=\"sr-api-table\">\n            <thead>\n              <tr>\n                <th>Champ<\/th>\n                <th>Type<\/th>\n                <th>Valeur exacte<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody>\n              <tr><td><span class=\"sr-inline-code\">success<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td>Toujours <span class=\"sr-inline-code\">true<\/span> pour une r\u00e9ponse HTTP 200.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">serial<\/span><\/td><td><span class=\"sr-api-type\">string<\/span><\/td><td>Num\u00e9ro de s\u00e9rie re\u00e7u apr\u00e8s suppression des espaces de d\u00e9but et de fin.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpImmobilized<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td><span class=\"sr-inline-code\">true<\/span> lorsqu\u2019une r\u00e9paration ouverte immobilise l\u2019\u00e9quipement. Les anciennes r\u00e9parations compatibles peuvent \u00e9galement \u00eatre prises en compte.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpImmobilizationEnabled<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td><span class=\"sr-inline-code\">true<\/span> si au moins une r\u00e9paration ouverte active l\u2019immobilisation ERP. Les anciennes r\u00e9parations compatibles peuvent \u00e9galement \u00eatre prises en compte.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpProvider<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Fournisseur ERP de la r\u00e9paration retenue. Si la r\u00e9paration immobilis\u00e9e ne contient pas cette valeur, l\u2019API peut conserver celle de la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e. Le connecteur actuellement produit par StageReturn utilise <span class=\"sr-inline-code\">rentman<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpSyncStatus<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Statut ERP de la r\u00e9paration retenue. Si la r\u00e9paration immobilis\u00e9e ne contient pas cette valeur, l\u2019API peut conserver celle de la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e. Les valeurs retourn\u00e9es par l\u2019API sont d\u00e9taill\u00e9es plus bas.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpStatusReason<\/span><\/td><td><span class=\"sr-api-type\">string<\/span><\/td><td><span class=\"sr-inline-code\">none<\/span>, <span class=\"sr-inline-code\">erp_immobilization_disabled_or_pending<\/span>, ou le motif enregistr\u00e9 sur la r\u00e9paration immobilis\u00e9e. La valeur par d\u00e9faut d\u2019une immobilisation est <span class=\"sr-inline-code\">repair_open<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">stockAvailable<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td><span class=\"sr-inline-code\">false<\/span> uniquement lorsqu\u2019une r\u00e9paration ouverte est consid\u00e9r\u00e9e comme immobilis\u00e9e ; sinon <span class=\"sr-inline-code\">true<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">reason<\/span><\/td><td><span class=\"sr-api-type\">string<\/span><\/td><td><span class=\"sr-inline-code\">none<\/span> sans r\u00e9paration ouverte, <span class=\"sr-inline-code\">repair_open<\/span> pour une r\u00e9paration ouverte non immobilis\u00e9e, ou le motif enregistr\u00e9 sur la r\u00e9paration immobilis\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">repairStatus<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td><span class=\"sr-inline-code\">todo<\/span>, <span class=\"sr-inline-code\">in_progress<\/span> ou <span class=\"sr-inline-code\">null<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">repairId<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Identifiant de la r\u00e9paration ouverte s\u00e9lectionn\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">repairTitle<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Premi\u00e8re valeur non vide trouv\u00e9e parmi le titre, le nom ou le nom d\u2019\u00e9quipement de la r\u00e9paration retenue. Si la r\u00e9paration immobilis\u00e9e ne fournit aucune valeur, l\u2019API peut conserver celle de la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">problemDescription<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Premi\u00e8re description non vide trouv\u00e9e parmi les champs de probl\u00e8me, diagnostic, description ou remarque de la r\u00e9paration retenue. Si la r\u00e9paration immobilis\u00e9e ne fournit aucune valeur, l\u2019API peut conserver celle de la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">projectId<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Identifiant du projet associ\u00e9 \u00e0 la r\u00e9paration retenue lorsqu\u2019il est enregistr\u00e9. Si la r\u00e9paration immobilis\u00e9e ne fournit pas d\u2019identifiant, l\u2019API peut conserver celui de la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">projectName<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Nom du projet associ\u00e9 \u00e0 la r\u00e9paration retenue lorsqu\u2019il est disponible. Il peut \u00eatre compl\u00e9t\u00e9 \u00e0 partir du projet li\u00e9 ou conserv\u00e9 depuis la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">projectNumber<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Num\u00e9ro du projet associ\u00e9 \u00e0 la r\u00e9paration retenue lorsqu\u2019il est disponible. Il peut \u00eatre compl\u00e9t\u00e9 \u00e0 partir du projet li\u00e9 ou conserv\u00e9 depuis la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">repairCreatedAt<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Date de cr\u00e9ation de la r\u00e9paration retenue convertie au format ISO 8601. Si la r\u00e9paration immobilis\u00e9e ne fournit aucune date exploitable, l\u2019API peut conserver celle de la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">repairUpdatedAt<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Premi\u00e8re date disponible parmi la mise \u00e0 jour de la r\u00e9paration retenue, la mise \u00e0 jour ERP ou la derni\u00e8re synchronisation ERP, convertie en ISO 8601. Si aucune date n\u2019est disponible sur la r\u00e9paration immobilis\u00e9e, l\u2019API peut conserver celle de la premi\u00e8re r\u00e9paration ouverte trouv\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">updatedAt<\/span><\/td><td><span class=\"sr-api-type\">string<\/span><\/td><td>Date de g\u00e9n\u00e9ration de la r\u00e9ponse au format ISO 8601.<\/td><\/tr>\n            <\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"missing-equipment\">\n        <div class=\"sr-api-endpoint-head\">\n          <span class=\"sr-api-method\">GET<\/span>\n          <span class=\"sr-api-route\">\/missingEquipmentStatusApi?projectId=&#8230;&amp;defectId=&#8230;<\/span>\n        <\/div>\n\n        <h2>Consulter un \u00e9quipement manquant<\/h2>\n        <p>Retourne la d\u00e9claration d\u00e9sign\u00e9e par un identifiant de projet et un identifiant de d\u00e9faut, \u00e0 condition qu\u2019elle appartienne \u00e0 l\u2019entreprise associ\u00e9e \u00e0 la cl\u00e9 API.<\/p>\n\n        <h3>Param\u00e8tres de requ\u00eate<\/h3>\n        <div class=\"sr-api-table-wrap\">\n          <table class=\"sr-api-table\">\n            <thead>\n              <tr>\n                <th>Param\u00e8tre<\/th>\n                <th>Type<\/th>\n                <th>Obligatoire<\/th>\n                <th>Traitement exact<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody>\n              <tr>\n                <td><span class=\"sr-inline-code\">projectId<\/span><\/td>\n                <td><span class=\"sr-api-type\">string<\/span><\/td>\n                <td><span class=\"sr-api-required\">Oui<\/span><\/td>\n                <td>Identifiant exact du projet. Les espaces de d\u00e9but et de fin sont supprim\u00e9s.<\/td>\n              <\/tr>\n              <tr>\n                <td><span class=\"sr-inline-code\">defectId<\/span><\/td>\n                <td><span class=\"sr-api-type\">string<\/span><\/td>\n                <td><span class=\"sr-api-required\">Oui<\/span><\/td>\n                <td>Identifiant exact de la d\u00e9claration dans le projet. Les espaces de d\u00e9but et de fin sont supprim\u00e9s.<\/td>\n              <\/tr>\n            <\/tbody>\n          <\/table>\n        <\/div>\n\n        <h3>Exemple de requ\u00eate<\/h3>\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">HTTP<\/span>\n          <pre class=\"sr-code\">GET \/missingEquipmentStatusApi?projectId=project123&amp;defectId=defect456\nx-api-key: VOTRE_CLE_API\nAccept: application\/json<\/pre>\n        <\/div>\n\n        <h3>Exemple de r\u00e9ponse compl\u00e8te<\/h3>\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">JSON \u2014 HTTP 200<\/span>\n          <pre class=\"sr-code\">{\n  \"success\": true,\n  \"projectId\": \"project123\",\n  \"defectId\": \"defect456\",\n  \"equipmentName\": \"C\u00e2ble XLR 10 m\",\n  \"isSerialized\": false,\n  \"serial\": null,\n  \"isMissingEquipment\": true,\n  \"missingQuantity\": 5,\n  \"returnedQuantity\": 2,\n  \"remainingMissingQuantity\": 3,\n  \"erpStockSyncEnabled\": true,\n  \"erpStockSynced\": true,\n  \"erpProvider\": \"rentman\",\n  \"erpConnectionId\": \"connection123\",\n  \"erpMappingId\": \"mapping123\",\n  \"erpItemId\": \"742\",\n  \"erpExternalItemId\": \"742\",\n  \"erpItemName\": \"C\u00e2ble XLR 10 m\",\n  \"erpSyncStatus\": \"reintegrated\",\n  \"erpLastSyncAt\": \"2026-07-12T10:30:00.000Z\",\n  \"erpLastError\": null,\n  \"erpQuantityRemoved\": 5,\n  \"erpQuantityReintegrated\": 2,\n  \"erpRemainingQuantity\": 3,\n  \"projectName\": \"Festival \u00e9t\u00e9\",\n  \"projectNumber\": \"PRJ-00130\",\n  \"entrepotId\": \"warehouse123\",\n  \"updatedAt\": \"2026-07-12T14:00:00.000Z\"\n}<\/pre>\n        <\/div>\n\n        <h3>Champs retourn\u00e9s<\/h3>\n        <div class=\"sr-api-table-wrap\">\n          <table class=\"sr-api-table\">\n            <thead>\n              <tr>\n                <th>Champ<\/th>\n                <th>Type exact<\/th>\n                <th>Valeur exacte<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody>\n              <tr><td><span class=\"sr-inline-code\">success<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td>Toujours <span class=\"sr-inline-code\">true<\/span> pour une r\u00e9ponse HTTP 200.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">projectId<\/span><\/td><td><span class=\"sr-api-type\">string<\/span><\/td><td>Identifiant du projet re\u00e7u apr\u00e8s suppression des espaces de d\u00e9but et de fin.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">defectId<\/span><\/td><td><span class=\"sr-api-type\">string<\/span><\/td><td>Identifiant de d\u00e9claration re\u00e7u apr\u00e8s suppression des espaces de d\u00e9but et de fin.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">equipmentName<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Nom de l\u2019\u00e9quipement, ou <span class=\"sr-inline-code\">null<\/span> s\u2019il est vide.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">isSerialized<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td><span class=\"sr-inline-code\">true<\/span> si la d\u00e9claration contient un num\u00e9ro de s\u00e9rie non vide dans <span class=\"sr-inline-code\">numeroSerie<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">serial<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Num\u00e9ro de s\u00e9rie de la d\u00e9claration, apr\u00e8s suppression des espaces de d\u00e9but et de fin, ou <span class=\"sr-inline-code\">null<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">isMissingEquipment<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td><span class=\"sr-inline-code\">true<\/span> uniquement si <span class=\"sr-inline-code\">equipementManquant<\/span> vaut strictement <span class=\"sr-inline-code\">true<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">missingQuantity<\/span><\/td><td><span class=\"sr-api-type\">integer<\/span><\/td><td>Valeur de <span class=\"sr-inline-code\">quantite<\/span> convertie en nombre entier tronqu\u00e9. Une valeur absente ou invalide devient <span class=\"sr-inline-code\">0<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">returnedQuantity<\/span><\/td><td><span class=\"sr-api-type\">integer<\/span><\/td><td>Valeur de <span class=\"sr-inline-code\">returnedQty<\/span> convertie en entier tronqu\u00e9. Une valeur absente ou invalide devient <span class=\"sr-inline-code\">0<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">remainingMissingQuantity<\/span><\/td><td><span class=\"sr-api-type\">integer<\/span><\/td><td><span class=\"sr-inline-code\">max(0, missingQuantity &#8211; returnedQuantity)<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpStockSyncEnabled<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td><span class=\"sr-inline-code\">true<\/span> uniquement si l\u2019option vaut strictement <span class=\"sr-inline-code\">true<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpStockSynced<\/span><\/td><td><span class=\"sr-api-type\">boolean<\/span><\/td><td><span class=\"sr-inline-code\">true<\/span> uniquement si le champ enregistr\u00e9 vaut strictement <span class=\"sr-inline-code\">true<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpProvider<\/span><\/td><td><span class=\"sr-api-type\">valeur JSON | null<\/span><\/td><td>Valeur ERP enregistr\u00e9e, renvoy\u00e9e telle quelle, ou <span class=\"sr-inline-code\">null<\/span>. Dans l\u2019usage StageReturn actuel, cette valeur est normalement une cha\u00eene comme <span class=\"sr-inline-code\">rentman<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpConnectionId<\/span><\/td><td><span class=\"sr-api-type\">valeur JSON | null<\/span><\/td><td>Identifiant de connexion ERP enregistr\u00e9, renvoy\u00e9 tel quel, ou <span class=\"sr-inline-code\">null<\/span>. Dans l\u2019usage StageReturn actuel, cette valeur est normalement une cha\u00eene.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpMappingId<\/span><\/td><td><span class=\"sr-api-type\">valeur JSON | null<\/span><\/td><td>Identifiant de mapping ERP enregistr\u00e9, renvoy\u00e9 tel quel, ou <span class=\"sr-inline-code\">null<\/span>. Dans l\u2019usage StageReturn actuel, cette valeur est normalement une cha\u00eene.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpItemId<\/span><\/td><td><span class=\"sr-api-type\">string | number | null<\/span><\/td><td><span class=\"sr-inline-code\">erpItemId<\/span>, sinon <span class=\"sr-inline-code\">erpExternalItemId<\/span>, sinon <span class=\"sr-inline-code\">null<\/span>. Le backend ne force pas ce champ en cha\u00eene.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpExternalItemId<\/span><\/td><td><span class=\"sr-api-type\">string | number | null<\/span><\/td><td><span class=\"sr-inline-code\">erpExternalItemId<\/span>, sinon <span class=\"sr-inline-code\">erpItemId<\/span>, sinon <span class=\"sr-inline-code\">null<\/span>. Le backend ne force pas ce champ en cha\u00eene.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpItemName<\/span><\/td><td><span class=\"sr-api-type\">valeur JSON | null<\/span><\/td><td>Nom d\u2019article ERP enregistr\u00e9, renvoy\u00e9 tel quel, ou <span class=\"sr-inline-code\">null<\/span>. Dans l\u2019usage StageReturn actuel, cette valeur est normalement une cha\u00eene.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpSyncStatus<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Statut ERP enregistr\u00e9. Les valeurs retourn\u00e9es par l\u2019API sont d\u00e9taill\u00e9es plus bas.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpLastSyncAt<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Date convertie au format ISO 8601, ou <span class=\"sr-inline-code\">null<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpLastError<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Derni\u00e8re erreur ERP enregistr\u00e9e, ou <span class=\"sr-inline-code\">null<\/span>. Ce champ peut contenir une erreur technique variable.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpQuantityRemoved<\/span><\/td><td><span class=\"sr-api-type\">integer<\/span><\/td><td>Quantit\u00e9 retir\u00e9e, convertie en entier tronqu\u00e9 ; valeur invalide ou absente : <span class=\"sr-inline-code\">0<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpQuantityReintegrated<\/span><\/td><td><span class=\"sr-api-type\">integer<\/span><\/td><td>Quantit\u00e9 r\u00e9int\u00e9gr\u00e9e, convertie en entier tronqu\u00e9 ; valeur invalide ou absente : <span class=\"sr-inline-code\">0<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">erpRemainingQuantity<\/span><\/td><td><span class=\"sr-api-type\">integer<\/span><\/td><td>Valeur enregistr\u00e9e dans <span class=\"sr-inline-code\">erpRemainingQuantity<\/span>, convertie en entier tronqu\u00e9 ; valeur invalide ou absente : <span class=\"sr-inline-code\">0<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">projectName<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Nom du projet, ou <span class=\"sr-inline-code\">null<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">projectNumber<\/span><\/td><td><span class=\"sr-api-type\">string | null<\/span><\/td><td>Num\u00e9ro du projet, ou <span class=\"sr-inline-code\">null<\/span>.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">entrepotId<\/span><\/td><td><span class=\"sr-api-type\">string | number | null<\/span><\/td><td>Identifiant du d\u00e9p\u00f4t de la d\u00e9claration, sinon celui du projet, sinon <span class=\"sr-inline-code\">null<\/span>. Le backend ne force pas ce champ en cha\u00eene.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">updatedAt<\/span><\/td><td><span class=\"sr-api-type\">string<\/span><\/td><td>Date de g\u00e9n\u00e9ration de la r\u00e9ponse au format ISO 8601.<\/td><\/tr>\n            <\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"statuses\">\n        <h2>Valeurs retourn\u00e9es par l\u2019API<\/h2>\n\n        <h3><span class=\"sr-inline-code\">repairStatus<\/span><\/h3>\n        <ul>\n          <li><span class=\"sr-inline-code\">todo<\/span> : r\u00e9paration ouverte \u00e0 faire.<\/li>\n          <li><span class=\"sr-inline-code\">in_progress<\/span> : r\u00e9paration ouverte en cours.<\/li>\n          <li><span class=\"sr-inline-code\">null<\/span> : aucune r\u00e9paration ouverte s\u00e9lectionn\u00e9e.<\/li>\n        <\/ul>\n\n        <h3><span class=\"sr-inline-code\">erpSyncStatus<\/span> d\u2019une r\u00e9paration s\u00e9rialis\u00e9e<\/h3>\n        <ul>\n          <li><span class=\"sr-inline-code\">syncing<\/span><\/li>\n          <li><span class=\"sr-inline-code\">not_required<\/span><\/li>\n          <li><span class=\"sr-inline-code\">not_configured<\/span><\/li>\n          <li><span class=\"sr-inline-code\">rate_limited<\/span><\/li>\n          <li><span class=\"sr-inline-code\">not_found<\/span><\/li>\n          <li><span class=\"sr-inline-code\">error<\/span><\/li>\n          <li><span class=\"sr-inline-code\">synced<\/span><\/li>\n          <li><span class=\"sr-inline-code\">released<\/span><\/li>\n          <li><span class=\"sr-inline-code\">null<\/span><\/li>\n        <\/ul>\n\n        <h3><span class=\"sr-inline-code\">erpSyncStatus<\/span> d\u2019un \u00e9quipement manquant<\/h3>\n        <ul>\n          <li><span class=\"sr-inline-code\">syncing<\/span><\/li>\n          <li><span class=\"sr-inline-code\">not_configured<\/span><\/li>\n          <li><span class=\"sr-inline-code\">rate_limited<\/span><\/li>\n          <li><span class=\"sr-inline-code\">error<\/span><\/li>\n          <li><span class=\"sr-inline-code\">synced<\/span><\/li>\n          <li><span class=\"sr-inline-code\">reintegrated<\/span><\/li>\n          <li><span class=\"sr-inline-code\">null<\/span><\/li>\n        <\/ul>\n\n        <div class=\"sr-api-note\">\n          Ces listes regroupent les valeurs produites par le fonctionnement actuel de l\u2019API. Une donn\u00e9e plus ancienne peut exceptionnellement contenir une valeur h\u00e9rit\u00e9e.\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"http-status\">\n        <h2>Codes HTTP r\u00e9ellement utilis\u00e9s<\/h2>\n\n        <div class=\"sr-api-table-wrap\">\n          <table class=\"sr-api-table\">\n            <thead>\n              <tr>\n                <th>Code<\/th>\n                <th>Endpoint<\/th>\n                <th>Cas exact<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody>\n              <tr><td><span class=\"sr-api-status\">200<\/span><\/td><td>Les deux<\/td><td>Requ\u00eate trait\u00e9e avec succ\u00e8s. Pour <span class=\"sr-inline-code\">equipmentStatusApi<\/span>, HTTP 200 est \u00e9galement retourn\u00e9 lorsqu\u2019aucune r\u00e9paration ouverte ne correspond au num\u00e9ro de s\u00e9rie.<\/td><\/tr>\n              <tr><td><span class=\"sr-api-status\">400<\/span><\/td><td>equipmentStatusApi<\/td><td>Param\u00e8tre <span class=\"sr-inline-code\">serial<\/span> absent ou vide.<\/td><\/tr>\n              <tr><td><span class=\"sr-api-status\">400<\/span><\/td><td>missingEquipmentStatusApi<\/td><td><span class=\"sr-inline-code\">projectId<\/span> ou <span class=\"sr-inline-code\">defectId<\/span> absent ou vide.<\/td><\/tr>\n              <tr><td><span class=\"sr-api-status\">401<\/span><\/td><td>Les deux<\/td><td>Cl\u00e9 API absente ou invalide.<\/td><\/tr>\n              <tr><td><span class=\"sr-api-status\">403<\/span><\/td><td>Les deux<\/td><td>Configuration API trouv\u00e9e mais d\u00e9sactiv\u00e9e.<\/td><\/tr>\n              <tr><td><span class=\"sr-api-status\">404<\/span><\/td><td>missingEquipmentStatusApi<\/td><td>Projet ou d\u00e9claration introuvable, ou ressource n\u2019appartenant pas \u00e0 l\u2019entreprise de la cl\u00e9 API.<\/td><\/tr>\n              <tr><td><span class=\"sr-api-status\">405<\/span><\/td><td>Les deux<\/td><td>M\u00e9thode HTTP diff\u00e9rente de GET.<\/td><\/tr>\n              <tr><td><span class=\"sr-api-status\">500<\/span><\/td><td>Les deux<\/td><td>Configuration API invalide ou erreur interne inattendue.<\/td><\/tr>\n            <\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"errors\">\n        <h2>R\u00e9ponses d\u2019erreur exactes<\/h2>\n        <p>Toutes les erreurs de ces deux endpoints sont renvoy\u00e9es sous cette forme :<\/p>\n\n        <div class=\"sr-code-wrap\">\n          <span class=\"sr-code-label\">JSON<\/span>\n          <pre class=\"sr-code\">{\n  \"success\": false,\n  \"error\": \"error_code\"\n}<\/pre>\n        <\/div>\n\n        <div class=\"sr-api-table-wrap\">\n          <table class=\"sr-api-table\">\n            <thead>\n              <tr>\n                <th>Valeur de <span class=\"sr-inline-code\">error<\/span><\/th>\n                <th>HTTP<\/th>\n                <th>Endpoint<\/th>\n                <th>Signification<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody>\n              <tr><td><span class=\"sr-inline-code\">method_not_allowed<\/span><\/td><td>405<\/td><td>Les deux<\/td><td>La m\u00e9thode utilis\u00e9e n\u2019est pas GET.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">missing_api_key<\/span><\/td><td>401<\/td><td>Les deux<\/td><td>Le header <span class=\"sr-inline-code\">x-api-key<\/span> est absent ou vide.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">invalid_api_key<\/span><\/td><td>401<\/td><td>Les deux<\/td><td>Aucune configuration API ne correspond \u00e0 la cl\u00e9.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">api_disabled<\/span><\/td><td>403<\/td><td>Les deux<\/td><td>La cl\u00e9 existe, mais l\u2019acc\u00e8s API n\u2019est pas activ\u00e9.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">missing_serial<\/span><\/td><td>400<\/td><td>equipmentStatusApi<\/td><td>Le param\u00e8tre <span class=\"sr-inline-code\">serial<\/span> est absent ou vide.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">missing_parameters<\/span><\/td><td>400<\/td><td>missingEquipmentStatusApi<\/td><td><span class=\"sr-inline-code\">projectId<\/span> ou <span class=\"sr-inline-code\">defectId<\/span> est absent ou vide.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">project_not_found<\/span><\/td><td>404<\/td><td>missingEquipmentStatusApi<\/td><td>Le projet n\u2019existe pas ou n\u2019appartient pas \u00e0 l\u2019entreprise de la cl\u00e9 API.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">equipment_not_found<\/span><\/td><td>404<\/td><td>missingEquipmentStatusApi<\/td><td>La d\u00e9claration n\u2019existe pas ou n\u2019appartient pas \u00e0 l\u2019entreprise de la cl\u00e9 API.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">invalid_enterprise_ref<\/span><\/td><td>500<\/td><td>Les deux<\/td><td>La configuration API est invalide. Le client doit contacter le support StageReturn.<\/td><\/tr>\n              <tr><td><span class=\"sr-inline-code\">internal_error<\/span><\/td><td>500<\/td><td>Les deux<\/td><td>Une erreur inattendue est survenue pendant le traitement.<\/td><\/tr>\n            <\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n\n      <div class=\"sr-api-section\" id=\"integration-rules\">\n        <h2>R\u00e8gles d\u2019int\u00e9gration \u00e0 respecter<\/h2>\n\n        <div class=\"sr-api-cards\">\n          <div class=\"sr-api-card\">\n            <h3>Disponibilit\u00e9 s\u00e9rialis\u00e9e<\/h3>\n            <p>Utilisez <span class=\"sr-inline-code\">stockAvailable<\/span> comme r\u00e9sultat principal. <span class=\"sr-inline-code\">erpImmobilized<\/span> indique la cause ERP de l\u2019indisponibilit\u00e9.<\/p>\n          <\/div>\n\n          <div class=\"sr-api-card\">\n            <h3>Num\u00e9ro inconnu<\/h3>\n            <p><span class=\"sr-inline-code\">equipmentStatusApi<\/span> ne poss\u00e8de pas de r\u00e9ponse 404. Une r\u00e9ponse disponible ne confirme pas que le num\u00e9ro existe dans un catalogue.<\/p>\n          <\/div>\n\n          <div class=\"sr-api-card\">\n            <h3>Identifiants manquants<\/h3>\n            <p>Pour appeler <span class=\"sr-inline-code\">missingEquipmentStatusApi<\/span>, l\u2019int\u00e9gration doit d\u00e9j\u00e0 conna\u00eetre le <span class=\"sr-inline-code\">projectId<\/span> et le <span class=\"sr-inline-code\">defectId<\/span>. Aucun endpoint public actuel ne permet de les rechercher ou de les lister.<\/p>\n          <\/div>\n\n          <div class=\"sr-api-card\">\n            <h3>Valeurs nulles<\/h3>\n            <p>Traitez tous les champs marqu\u00e9s <span class=\"sr-inline-code\">| null<\/span> comme r\u00e9ellement facultatifs.<\/p>\n          <\/div>\n\n          <div class=\"sr-api-card\">\n            <h3>Encodage des param\u00e8tres<\/h3>\n            <p>Encodez toujours les param\u00e8tres avec l\u2019encodage URL, notamment les num\u00e9ros de s\u00e9rie contenant des espaces ou des caract\u00e8res sp\u00e9ciaux.<\/p>\n          <\/div>\n\n          <div class=\"sr-api-card\">\n            <h3>Gestion des erreurs<\/h3>\n            <p>Basez la logique sur le code HTTP et la valeur du champ <span class=\"sr-inline-code\">error<\/span>. Ne tentez pas d\u2019interpr\u00e9ter le texte d\u2019une autre source.<\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"sr-api-warning\">\n          Avec les endpoints publics disponibles, une int\u00e9gration externe peut consulter un statut par num\u00e9ro de s\u00e9rie et consulter une d\u00e9claration connue par ses deux identifiants. Elle ne peut pas lister les projets, rechercher des d\u00e9clarations, cr\u00e9er un incident ni modifier une donn\u00e9e.\n        <\/div>\n      <\/div>\n\n\n      <div class=\"sr-api-section\" id=\"integration-checklist\">\n        <h2>Checklist avant mise en production<\/h2>\n        <ul>\n          <li>La cl\u00e9 API est stock\u00e9e uniquement c\u00f4t\u00e9 serveur.<\/li>\n          <li>Les param\u00e8tres sont encod\u00e9s dans l\u2019URL.<\/li>\n          <li>Le client traite les codes HTTP avant d\u2019utiliser les donn\u00e9es.<\/li>\n          <li>Les champs pouvant valoir <span class=\"sr-inline-code\">null<\/span> sont g\u00e9r\u00e9s.<\/li>\n          <li>Le statut d\u2019un \u00e9quipement s\u00e9rialis\u00e9 repose sur <span class=\"sr-inline-code\">stockAvailable<\/span>.<\/li>\n          <li>Une r\u00e9ponse HTTP 200 de <span class=\"sr-inline-code\">equipmentStatusApi<\/span> n\u2019est pas utilis\u00e9e comme preuve d\u2019existence dans un catalogue.<\/li>\n          <li>Les identifiants <span class=\"sr-inline-code\">projectId<\/span> et <span class=\"sr-inline-code\">defectId<\/span> sont conserv\u00e9s lorsque l\u2019int\u00e9gration doit consulter un \u00e9quipement manquant.<\/li>\n          <li>Les erreurs 500 sont journalis\u00e9es sans enregistrer la cl\u00e9 API.<\/li>\n        <\/ul>\n      <\/div>\n\n      <div class=\"sr-api-cta\">\n        <h2>Assistance technique<\/h2>\n        <p>En cas d\u2019\u00e9chec, transmettez au support l\u2019endpoint appel\u00e9, les param\u00e8tres utilis\u00e9s sans donn\u00e9es sensibles, le code HTTP et la valeur du champ <strong>error<\/strong>. Ne transmettez jamais votre cl\u00e9 API.<\/p>\n        <p><a class=\"sr-api-button\" href=\"https:\/\/www.stagereturn.com\/#contact\">Contacter StageReturn<\/a><\/p>\n      <\/div>\n\n    <\/main>\n  <\/div>\n<\/section>\n\n","protected":false},"excerpt":{"rendered":"<p>\u2190 Retour \u00e0 API &amp; ERP \ud83d\udcd6 Documentation API Documentation API StageReturn R\u00e9f\u00e9rence technique officielle des endpoints publics actuellement expos\u00e9s par StageReturn pour consulter le statut des \u00e9quipements s\u00e9rialis\u00e9s et des \u00e9quipements manquants. Sommaire Pr\u00e9sentation URL de base Format des requ\u00eates Authentification Premier appel \u00c9quipement s\u00e9rialis\u00e9 \u00c9quipement manquant Valeurs retourn\u00e9es Codes HTTP Erreurs R\u00e8gles d\u2019int\u00e9gration [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":949,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1104","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/pages\/1104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/comments?post=1104"}],"version-history":[{"count":4,"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/pages\/1104\/revisions"}],"predecessor-version":[{"id":1108,"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/pages\/1104\/revisions\/1108"}],"up":[{"embeddable":true,"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/pages\/949"}],"wp:attachment":[{"href":"https:\/\/www.stagereturn.com\/en\/wp-json\/wp\/v2\/media?parent=1104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}