[{"data":1,"prerenderedAt":433},["ShallowReactive",2],{"page:\u002Fintegration\u002Fbonnes-pratiques":3},{"id":4,"title":5,"body":6,"description":423,"download":424,"extension":425,"meta":426,"navigation":427,"path":428,"section":429,"seo":430,"sourceTitle":424,"sourceUpdatedAt":424,"sourceUrl":424,"stem":431,"version":424,"__hash__":432},"docs\u002Fintegration\u002Fbonnes-pratiques.md","Bonnes pratiques et gestion des erreurs",{"type":7,"value":8,"toc":415},"minimark",[9,14,61,65,88,91,95,122,126,147,151,160,276,279,309,392,396,411],[10,11,13],"h2",{"id":12},"suivre-le-traitement","Suivre le traitement",[15,16,17,18,22,23,26,27,32,33,36,37,40,41,44,45,48,49,52,53,56,57,60],"p",{},"Conservez le ",[19,20,21],"code",{},"RUN_ID"," dès la réponse ",[19,24,25],{},"202",". Si la ",[28,29,31],"a",{"href":30},"\u002Fintegration\u002Fnotifications","notification"," est configurée, attendez le callback et prévoyez une reprise par ",[19,34,35],{},"\u002Fstatus"," et ",[19,38,39],{},"\u002Foutput"," en son absence. Sans notification, interrogez le statut toutes les quelques secondes, puis espacez les appels si nécessaire. Dédupliquez les résultats de ces deux parcours avec le même ",[19,42,43],{},"run_id",", pour éviter une double importation. Sur ",[19,46,47],{},"completed",", récupérez le résultat ; sur ",[19,50,51],{},"failed"," ou ",[19,54,55],{},"cancelled",", arrêtez le suivi automatique. Sur ",[19,58,59],{},"paused",", conservez le suivi sans resoumettre.",[10,62,64],{"id":63},"reprendre-un-téléchargement","Reprendre un téléchargement",[15,66,67,68,72,73,76,77,79,80,83,84,87],{},"Téléchargez les pièces dès que le résultat est disponible. Si un lien expire, obtenez-en un nouveau via ",[28,69,71],{"href":70},"\u002Fintegration\u002Fobtenir-un-lien","\u002Ffile",", ou relisez ",[28,74,39],{"href":75},"\u002Fintegration\u002Frecuperer-le-resultat",". Conservez le JSON, le ",[19,78,21],{},", la ",[19,81,82],{},"reference_piece"," et le ",[19,85,86],{},"file_id"," pour reprendre uniquement les fichiers manquants.",[15,89,90],{},"Un nouveau POST crée un nouveau traitement. Il ne doit pas servir à renouveler une URL ou à reprendre un téléchargement. Avant de resoumettre après une interruption réseau, vérifiez si vous avez déjà obtenu un identifiant de suivi et évitez une double importation.",[10,92,94],{"id":93},"vérifier-et-importer","Vérifier et importer",[96,97,98,102,110,113,116,119],"ul",{},[99,100,101],"li",{},"Conservez le token côté serveur et les liens signés confidentiels.",[99,103,104,105,109],{},"Pour recevoir un webhook, utilisez une ",[28,106,108],{"href":107},"\u002Fintegration\u002Fnotifications#s%C3%A9curiser-le-retour-vers-le-logiciel-m%C3%A9tier","URL de notification unique, signée et temporaire",", puis vérifiez sa signature et son expiration côté logiciel métier.",[99,111,112],{},"Validez les chemins : les fichiers doivent rester dans le répertoire de la demande.",[99,114,115],{},"Vérifiez la taille et le SHA-256 lorsqu’ils sont fournis, puis validez le JSON et les règles métier avant import.",[99,117,118],{},"Distinguez la fin du traitement Raydocs de la réussite de l’import dans votre logiciel métier.",[99,120,121],{},"Conservez les identifiants des fichiers, pas les URL signées comme références durables.",[10,123,125],{"id":124},"erreurs-http","Erreurs HTTP",[15,127,128,129,132,133,135,136,139,140,142,143,146],{},"Les erreurs de transfert multipart sont rejetées avec HTTP ",[19,130,131],{},"422"," avant création du run. Corrigez la requête ; aucun ",[19,134,21],{}," n’a été créé et aucun callback n’est envoyé. Ne comptez pas non plus sur une notification pour une annulation manuelle. Un fichier inconnu ou inaccessible peut renvoyer ",[19,137,138],{},"404"," depuis ",[19,141,71],{},". Le téléchargement d’un lien signé expiré ou invalide peut être refusé avec ",[19,144,145],{},"401"," ; demandez un nouveau lien si le fichier reste disponible.",[10,148,150],{"id":149},"erreurs-metier","Erreurs métier",[15,152,153,154,156,157,159],{},"Un traitement ",[19,155,51],{}," n'a pas d'output métier. Si le workflow échoue volontairement avec un code métier public, ",[19,158,39],{}," renvoie ce code:",[161,162,167],"pre",{"className":163,"code":164,"language":165,"meta":166,"style":166},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"status\": \"failed\",\n  \"error\": {\n    \"code\": \"UNSUPPORTED_ACT_TYPE\",\n    \"message\": \"Type d'acte non supporté par ce workflow.\"\n  }\n}\n","json","",[19,168,169,178,207,222,244,264,270],{"__ignoreMap":166},[170,171,174],"span",{"class":172,"line":173},"line",1,[170,175,177],{"class":176},"sP7_E","{\n",[170,179,181,185,189,192,195,199,202,204],{"class":172,"line":180},2,[170,182,184],{"class":183},"s39Yj","  \"",[170,186,188],{"class":187},"sseR_","status",[170,190,191],{"class":183},"\"",[170,193,194],{"class":176},":",[170,196,198],{"class":197},"sjJ54"," \"",[170,200,51],{"class":201},"s_sjI",[170,203,191],{"class":197},[170,205,206],{"class":176},",\n",[170,208,210,212,215,217,219],{"class":172,"line":209},3,[170,211,184],{"class":183},[170,213,214],{"class":187},"error",[170,216,191],{"class":183},[170,218,194],{"class":176},[170,220,221],{"class":176}," {\n",[170,223,225,228,231,233,235,237,240,242],{"class":172,"line":224},4,[170,226,227],{"class":183},"    \"",[170,229,19],{"class":230},"sZMiF",[170,232,191],{"class":183},[170,234,194],{"class":176},[170,236,198],{"class":197},[170,238,239],{"class":201},"UNSUPPORTED_ACT_TYPE",[170,241,191],{"class":197},[170,243,206],{"class":176},[170,245,247,249,252,254,256,258,261],{"class":172,"line":246},5,[170,248,227],{"class":183},[170,250,251],{"class":230},"message",[170,253,191],{"class":183},[170,255,194],{"class":176},[170,257,198],{"class":197},[170,259,260],{"class":201},"Type d'acte non supporté par ce workflow.",[170,262,263],{"class":197},"\"\n",[170,265,267],{"class":172,"line":266},6,[170,268,269],{"class":176},"  }\n",[170,271,273],{"class":172,"line":272},7,[170,274,275],{"class":176},"}\n",[15,277,278],{},"Les erreurs contrôlées d’entrée et d’analyse exposent un code public :",[96,280,281,291,297,303],{},[99,282,283,286,287,290],{},[19,284,285],{},"EMPTY_INPUT_FILE"," : au moins un fichier transmis avec succès contient réellement 0 octet ; vérifier le contenu local. Le message indique les noms concernés. Une erreur de transfert détectée est rejetée par le ",[19,288,289],{},"POST"," avant création du run.",[99,292,293,296],{},[19,294,295],{},"EMAIL_PARSING_INCOMPLETE"," : email illisible, format MSG non exploitable comme email ou perte de contenu détectée ; fournir un email lisible ou ses documents séparément.",[99,298,299,302],{},[19,300,301],{},"DOCUMENT_ANALYSIS_FAILED"," : document illisible ou format non analysable ; vérifier le fichier et utiliser un format pris en charge.",[99,304,305,308],{},[19,306,307],{},"ARCHIVE_PARSING_INCOMPLETE"," : ZIP illisible ou limites d’extraction dépassées (100 fichiers et 200 Mo décompressés) ; fournir une archive lisible ou envoyer les documents séparément.\nPour une erreur technique interne, Raydocs renvoie volontairement un message générique:",[161,310,312],{"className":163,"code":311,"language":165,"meta":166,"style":166},"{\n  \"status\": \"failed\",\n  \"error\": {\n    \"code\": \"WORKFLOW_RUN_FAILED\",\n    \"message\": \"Workflow run failed.\"\n  }\n}\n",[19,313,314,318,336,348,367,384,388],{"__ignoreMap":166},[170,315,316],{"class":172,"line":173},[170,317,177],{"class":176},[170,319,320,322,324,326,328,330,332,334],{"class":172,"line":180},[170,321,184],{"class":183},[170,323,188],{"class":187},[170,325,191],{"class":183},[170,327,194],{"class":176},[170,329,198],{"class":197},[170,331,51],{"class":201},[170,333,191],{"class":197},[170,335,206],{"class":176},[170,337,338,340,342,344,346],{"class":172,"line":209},[170,339,184],{"class":183},[170,341,214],{"class":187},[170,343,191],{"class":183},[170,345,194],{"class":176},[170,347,221],{"class":176},[170,349,350,352,354,356,358,360,363,365],{"class":172,"line":224},[170,351,227],{"class":183},[170,353,19],{"class":230},[170,355,191],{"class":183},[170,357,194],{"class":176},[170,359,198],{"class":197},[170,361,362],{"class":201},"WORKFLOW_RUN_FAILED",[170,364,191],{"class":197},[170,366,206],{"class":176},[170,368,369,371,373,375,377,379,382],{"class":172,"line":246},[170,370,227],{"class":183},[170,372,251],{"class":230},[170,374,191],{"class":183},[170,376,194],{"class":176},[170,378,198],{"class":197},[170,380,381],{"class":201},"Workflow run failed.",[170,383,263],{"class":197},[170,385,386],{"class":172,"line":266},[170,387,269],{"class":176},[170,389,390],{"class":172,"line":272},[170,391,275],{"class":176},[10,393,395],{"id":394},"livraison-de-la-notification","Livraison de la notification",[15,397,398,399,401,402,406,407,410],{},"Une erreur de livraison du callback ne remplace ni le JSON métier ni l’erreur initiale. Les erreurs publiques des sous-workflows remontées au parent sont notifiées par le parent ; les diagnostics techniques internes restent masqués avec ",[19,400,362],{},". Les ",[28,403,405],{"href":404},"\u002Fintegration\u002Fnotifications#recevoir-et-d%C3%A9dupliquer","règles de réception et de reprise"," décrivent l’accusé ",[19,408,409],{},"2xx",", les tentatives et la déduplication durable.",[412,413,414],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":166,"searchDepth":180,"depth":180,"links":416},[417,418,419,420,421,422],{"id":12,"depth":180,"text":13},{"id":63,"depth":180,"text":64},{"id":93,"depth":180,"text":94},{"id":124,"depth":180,"text":125},{"id":149,"depth":180,"text":150},{"id":394,"depth":180,"text":395},"Construire une intégration fiable et reprendre les traitements et téléchargements.",null,"md",{},true,"\u002Fintegration\u002Fbonnes-pratiques","Intégration au logiciel métier",{"title":5,"description":423},"integration\u002Fbonnes-pratiques","jq_HN87uSLinF91zYziCGNy8pVPyf7YDvtFwj352X6Q",1791469624856]