[{"data":1,"prerenderedAt":1260},["ShallowReactive",2],{"\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi-v2-decouverte":3,"section:\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi-v2-decouverte":1259},{"id":4,"title":5,"body":6,"description":1241,"extension":1242,"meta":1243,"navigation":593,"path":1255,"seo":1256,"stem":1257,"__hash__":1258},"docs\u002F1.v5\u002F3.dodock\u002F10.developpeurs\u002Fapi-v2-decouverte.md","API de découverte des méthodes (API v2)",{"type":7,"value":8,"toc":1226},"minimark",[9,13,22,25,30,37,53,65,69,75,154,160,165,186,190,203,207,220,254,261,265,270,380,387,413,416,421,514,531,535,538,622,628,1089,1103,1106,1109,1127,1131,1144,1161,1175,1178,1182,1200,1204,1222],[10,11,5],"h1",{"id":12},"api-de-découverte-des-méthodes-api-v2",[14,15,16,17,21],"p",{},"L'API v2 expose une API de découverte sous ",[18,19,20],"code",{},"\u002Fapi\u002Fv2\u002Fdiscovery",". Un client authentifié l'utilise pour lister les méthodes qu'il peut appeler et pour lire la signature d'une méthode avant de l'appeler.",[14,23,24],{},"L'API de découverte est disponible à partir de Dodock v5.50.",[26,27,29],"h2",{"id":28},"autorisations","Autorisations",[14,31,32,33,36],{},"Chaque route appelle ",[18,34,35],{},"frappe.only_for(\"Desk User\")",".",[38,39,40,44,50],"ul",{},[41,42,43],"li",{},"Un utilisateur qui a accès au bureau (rôle « Utilisateur du bureau ») peut interroger l'API.",[41,45,46,47,36],{},"Un utilisateur du site web, sans accès au bureau, reçoit une erreur ",[18,48,49],{},"403",[41,51,52],{},"Une méthode de Server Script (type API) apparaît uniquement si l'utilisateur peut lire ce Server Script. Les autorisations utilisateur sur le type de document Server Script s'appliquent aussi.",[14,54,55,56,59,60,36],{},"L'authentification est la même que pour le reste de l'API : session, jeton (",[18,57,58],{},"Authorization: token \u003Cclé>:\u003Csecret>",") ou OAuth. Voir ",[61,62,64],"a",{"href":63},"\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Frest_api","API REST v1",[26,66,68],{"id":67},"routes","Routes",[14,70,71,72,36],{},"Toutes les routes acceptent uniquement ",[18,73,74],{},"GET",[76,77,78,91],"table",{},[79,80,81],"thead",{},[82,83,84,88],"tr",{},[85,86,87],"th",{},"Route",[85,89,90],{},"Réponse",[92,93,94,104,114,124,134,144],"tbody",{},[82,95,96,101],{},[97,98,99],"td",{},[18,100,20],{},[97,102,103],{},"Index racine : nombre de méthodes et liens vers les autres routes",[82,105,106,111],{},[97,107,108],{},[18,109,110],{},"\u002Fapi\u002Fv2\u002Fdiscovery\u002Fsearch?q=\u003Ctexte>",[97,112,113],{},"Recherche dans l'index des méthodes (50 résultats au maximum)",[82,115,116,121],{},[97,117,118],{},[18,119,120],{},"\u002Fapi\u002Fv2\u002Fdiscovery\u002Fmethod",[97,122,123],{},"Index complet des méthodes",[82,125,126,131],{},[97,127,128],{},[18,129,130],{},"\u002Fapi\u002Fv2\u002Fdiscovery\u002Fmethod\u002F\u003Cméthode>",[97,132,133],{},"Détail d'une méthode whitelistée ou d'un Server Script",[82,135,136,141],{},[97,137,138],{},[18,139,140],{},"\u002Fapi\u002Fv2\u002Fdiscovery\u002Fdoctype\u002F\u003Cdoctype>",[97,142,143],{},"Méthodes whitelistées du contrôleur d'un type de document",[82,145,146,151],{},[97,147,148],{},[18,149,150],{},"\u002Fapi\u002Fv2\u002Fdiscovery\u002Fdoctype\u002F\u003Cdoctype>\u002Fmethod\u002F\u003Cméthode>",[97,152,153],{},"Détail d'une méthode de contrôleur",[14,155,156,157,36],{},"Comme les autres routes v2, la réponse est placée dans la clé ",[18,158,159],{},"data",[161,162,164],"h3",{"id":163},"index-racine","Index racine",[14,166,167,169,170,173,174,177,178,181,182,185],{},[18,168,20],{}," renvoie le type ",[18,171,172],{},"discovery",", le nombre de méthodes (",[18,175,176],{},"resources.methods",", ",[18,179,180],{},"resources.doctype_methods",") et la liste des routes (",[18,183,184],{},"links",").",[161,187,189],{"id":188},"recherche","Recherche",[14,191,192,195,196,199,200,202],{},[18,193,194],{},"\u002Fapi\u002Fv2\u002Fdiscovery\u002Fsearch"," découpe le paramètre ",[18,197,198],{},"q"," en mots. Un résultat correspond quand tous les mots sont dans son chemin, son type de document, son nom, sa description ou sa docstring. La casse n'a pas d'importance. Sans ",[18,201,198],{},", la route renvoie les 50 premières entrées de l'index.",[161,204,206],{"id":205},"index-des-méthodes","Index des méthodes",[14,208,209,211,212,215,216,219],{},[18,210,120],{}," renvoie un objet ",[18,213,214],{},"{\"type\": \"method_index\", \"methods\": [...]}",". Chaque entrée a une clé ",[18,217,218],{},"kind"," :",[38,221,222,240],{},[41,223,224,227,228,231,232,235,236,239],{},[18,225,226],{},"rpc"," : une fonction Python décorée par ",[18,229,230],{},"@frappe.whitelist()"," au niveau d'un module, ou un Server Script de type API. L'entrée contient ",[18,233,234],{},"path"," et, si la fonction a une docstring, ",[18,237,238],{},"description"," (sa première ligne).",[41,241,242,245,246,177,248,251,252,36],{},[18,243,244],{},"doctype"," : une méthode whitelistée d'un contrôleur de document. L'entrée contient ",[18,247,244],{},[18,249,250],{},"method"," et ",[18,253,238],{},[14,255,256,257,260],{},"L'index des méthodes de contrôleur exclut les méthodes standard de la classe ",[18,258,259],{},"Document"," et les types de documents enfants (tables).",[161,262,264],{"id":263},"détail-dune-méthode","Détail d'une méthode",[14,266,267,269],{},[18,268,130],{}," renvoie, pour une fonction whitelistée :",[76,271,272,282],{},[79,273,274],{},[82,275,276,279],{},[85,277,278],{},"Clé",[85,280,281],{},"Contenu",[92,283,284,293,303,313,326,347,360,370],{},[82,285,286,290],{},[97,287,288],{},[18,289,234],{},[97,291,292],{},"Chemin complet de la méthode",[82,294,295,300],{},[97,296,297],{},[18,298,299],{},"name",[97,301,302],{},"Nom de la fonction",[82,304,305,310],{},[97,306,307],{},[18,308,309],{},"http_methods",[97,311,312],{},"Méthodes HTTP acceptées",[82,314,315,320],{},[97,316,317],{},[18,318,319],{},"allow_guest",[97,321,322,325],{},[18,323,324],{},"true"," si un visiteur non connecté peut l'appeler",[82,327,328,333],{},[97,329,330],{},[18,331,332],{},"params",[97,334,335,336,177,338,177,341,177,344],{},"Paramètres : ",[18,337,299],{},[18,339,340],{},"required",[18,342,343],{},"default",[18,345,346],{},"type",[82,348,349,354],{},[97,350,351],{},[18,352,353],{},"endpoint",[97,355,356,357],{},"Route à appeler : ",[18,358,359],{},"\u002Fapi\u002Fv2\u002Fmethod\u002F\u003Cméthode>",[82,361,362,367],{},[97,363,364],{},[18,365,366],{},"docstring",[97,368,369],{},"Docstring complète, si elle existe",[82,371,372,377],{},[97,373,374],{},[18,375,376],{},"source",[97,378,379],{},"Code source, si l'application l'autorise (voir plus bas)",[14,381,382,383,386],{},"La route applique les surcharges déclarées dans le hook ",[18,384,385],{},"override_whitelisted_methods",". Une méthode inconnue ou non whitelistée renvoie une erreur « n'existe pas ».",[14,388,389,390,392,393,395,396,177,398,177,401,177,404,407,408,410,411,36],{},"Pour un Server Script de type API, la réponse contient ",[18,391,299],{}," (le nom du Server Script), ",[18,394,309],{}," (",[18,397,74],{},[18,399,400],{},"POST",[18,402,403],{},"PUT",[18,405,406],{},"DELETE","), une liste ",[18,409,332],{}," vide et l'",[18,412,353],{},[161,414,153],{"id":415},"détail-dune-méthode-de-contrôleur",[14,417,418,420],{},[18,419,150],{}," renvoie :",[76,422,423,431],{},[79,424,425],{},[82,426,427,429],{},[85,428,278],{},[85,430,281],{},[92,432,433,444,454,465,478,499],{},[82,434,435,441],{},[97,436,437,177,439],{},[18,438,244],{},[18,440,250],{},[97,442,443],{},"Type de document et nom de la méthode",[82,445,446,451],{},[97,447,448],{},[18,449,450],{},"defined_in",[97,452,453],{},"Classe Python qui définit la méthode",[82,455,456,460],{},[97,457,458],{},[18,459,353],{},[97,461,462],{},[18,463,464],{},"\u002Fapi\u002Fv2\u002Fdocument\u002F\u003Cdoctype>\u002F{name}\u002Fmethod\u002F\u003Cméthode>",[82,466,467,471],{},[97,468,469],{},[18,470,309],{},[97,472,473,475,476],{},[18,474,74],{}," et\u002Fou ",[18,477,400],{},[82,479,480,485],{},[97,481,482],{},[18,483,484],{},"permission",[97,486,487,488,491,492,177,494,491,497],{},"Autorisation demandée sur le document : ",[18,489,490],{},"read"," pour ",[18,493,74],{},[18,495,496],{},"write",[18,498,400],{},[82,500,501,509],{},[97,502,503,177,505,177,507],{},[18,504,332],{},[18,506,366],{},[18,508,376],{},[97,510,511,512],{},"Comme pour une méthode ",[18,513,226],{},[14,515,516,517,177,520,251,523,526,527,530],{},"Les méthodes ",[18,518,519],{},"submit",[18,521,522],{},"cancel",[18,524,525],{},"discard"," n'apparaissent que si le type de document est validable. La méthode ",[18,528,529],{},"rename"," n'apparaît que si le type de document autorise le renommage. Un type de document enfant renvoie une erreur « n'existe pas ».",[26,532,534],{"id":533},"exemple","Exemple",[14,536,537],{},"Cet exemple cherche la méthode qui compte des documents, puis lit sa signature. Remplacez l'URL du site et le jeton par les vôtres.",[539,540,545],"pre",{"className":541,"code":542,"language":543,"meta":544,"style":544},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -s \"https:\u002F\u002Fvotre-site.dokos.cloud\u002Fapi\u002Fv2\u002Fdiscovery\u002Fsearch?q=get_count\" \\\n     -H \"Authorization: token VOTRE_CLE_API:VOTRE_SECRET_API\"\n\ncurl -s \"https:\u002F\u002Fvotre-site.dokos.cloud\u002Fapi\u002Fv2\u002Fdiscovery\u002Fmethod\u002Ffrappe.client.get_count\" \\\n     -H \"Authorization: token VOTRE_CLE_API:VOTRE_SECRET_API\"\n","bash","",[18,546,547,574,588,595,611],{"__ignoreMap":544},[548,549,552,556,560,564,567,570],"span",{"class":550,"line":551},"line",1,[548,553,555],{"class":554},"sBMFI","curl",[548,557,559],{"class":558},"sfazB"," -s",[548,561,563],{"class":562},"sMK4o"," \"",[548,565,566],{"class":558},"https:\u002F\u002Fvotre-site.dokos.cloud\u002Fapi\u002Fv2\u002Fdiscovery\u002Fsearch?q=get_count",[548,568,569],{"class":562},"\"",[548,571,573],{"class":572},"sTEyZ"," \\\n",[548,575,577,580,582,585],{"class":550,"line":576},2,[548,578,579],{"class":558},"     -H",[548,581,563],{"class":562},[548,583,584],{"class":558},"Authorization: token VOTRE_CLE_API:VOTRE_SECRET_API",[548,586,587],{"class":562},"\"\n",[548,589,591],{"class":550,"line":590},3,[548,592,594],{"emptyLinePlaceholder":593},true,"\n",[548,596,598,600,602,604,607,609],{"class":550,"line":597},4,[548,599,555],{"class":554},[548,601,559],{"class":558},[548,603,563],{"class":562},[548,605,606],{"class":558},"https:\u002F\u002Fvotre-site.dokos.cloud\u002Fapi\u002Fv2\u002Fdiscovery\u002Fmethod\u002Ffrappe.client.get_count",[548,608,569],{"class":562},[548,610,573],{"class":572},[548,612,614,616,618,620],{"class":550,"line":613},5,[548,615,579],{"class":558},[548,617,563],{"class":562},[548,619,584],{"class":558},[548,621,587],{"class":562},[14,623,624,625,627],{},"La deuxième requête renvoie une réponse de cette forme (le champ ",[18,626,376],{}," est tronqué) :",[539,629,633],{"className":630,"code":631,"language":632,"meta":544,"style":544},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"data\": {\n    \"type\": \"method\",\n    \"kind\": \"rpc\",\n    \"path\": \"frappe.client.get_count\",\n    \"name\": \"get_count\",\n    \"http_methods\": [\"GET\", \"POST\", \"PUT\", \"DELETE\"],\n    \"allow_guest\": false,\n    \"params\": [\n      {\"name\": \"doctype\", \"required\": true, \"type\": \"str\"},\n      {\"name\": \"filters\", \"required\": false, \"type\": \"str | list | dict[str, typing.Any] | None\"},\n      {\"name\": \"debug\", \"required\": false, \"default\": false, \"type\": \"int | bool\"},\n      {\"name\": \"cache\", \"required\": false, \"default\": false, \"type\": \"int | bool\"}\n    ],\n    \"endpoint\": \"\u002Fapi\u002Fv2\u002Fmethod\u002Ffrappe.client.get_count\",\n    \"source\": \"@frappe.whitelist()\\ndef get_count(...\"\n  }\n}\n","json",[18,634,635,640,656,676,694,713,733,781,795,809,861,911,970,1029,1035,1055,1078,1084],{"__ignoreMap":544},[548,636,637],{"class":550,"line":551},[548,638,639],{"class":562},"{\n",[548,641,642,645,648,650,653],{"class":550,"line":576},[548,643,644],{"class":562},"  \"",[548,646,159],{"class":647},"spNyl",[548,649,569],{"class":562},[548,651,652],{"class":562},":",[548,654,655],{"class":562}," {\n",[548,657,658,661,663,665,667,669,671,673],{"class":550,"line":590},[548,659,660],{"class":562},"    \"",[548,662,346],{"class":554},[548,664,569],{"class":562},[548,666,652],{"class":562},[548,668,563],{"class":562},[548,670,250],{"class":558},[548,672,569],{"class":562},[548,674,675],{"class":562},",\n",[548,677,678,680,682,684,686,688,690,692],{"class":550,"line":597},[548,679,660],{"class":562},[548,681,218],{"class":554},[548,683,569],{"class":562},[548,685,652],{"class":562},[548,687,563],{"class":562},[548,689,226],{"class":558},[548,691,569],{"class":562},[548,693,675],{"class":562},[548,695,696,698,700,702,704,706,709,711],{"class":550,"line":613},[548,697,660],{"class":562},[548,699,234],{"class":554},[548,701,569],{"class":562},[548,703,652],{"class":562},[548,705,563],{"class":562},[548,707,708],{"class":558},"frappe.client.get_count",[548,710,569],{"class":562},[548,712,675],{"class":562},[548,714,716,718,720,722,724,726,729,731],{"class":550,"line":715},6,[548,717,660],{"class":562},[548,719,299],{"class":554},[548,721,569],{"class":562},[548,723,652],{"class":562},[548,725,563],{"class":562},[548,727,728],{"class":558},"get_count",[548,730,569],{"class":562},[548,732,675],{"class":562},[548,734,736,738,740,742,744,747,749,751,753,756,758,760,762,764,766,768,770,772,774,776,778],{"class":550,"line":735},7,[548,737,660],{"class":562},[548,739,309],{"class":554},[548,741,569],{"class":562},[548,743,652],{"class":562},[548,745,746],{"class":562}," [",[548,748,569],{"class":562},[548,750,74],{"class":558},[548,752,569],{"class":562},[548,754,755],{"class":562},",",[548,757,563],{"class":562},[548,759,400],{"class":558},[548,761,569],{"class":562},[548,763,755],{"class":562},[548,765,563],{"class":562},[548,767,403],{"class":558},[548,769,569],{"class":562},[548,771,755],{"class":562},[548,773,563],{"class":562},[548,775,406],{"class":558},[548,777,569],{"class":562},[548,779,780],{"class":562},"],\n",[548,782,784,786,788,790,792],{"class":550,"line":783},8,[548,785,660],{"class":562},[548,787,319],{"class":554},[548,789,569],{"class":562},[548,791,652],{"class":562},[548,793,794],{"class":562}," false,\n",[548,796,798,800,802,804,806],{"class":550,"line":797},9,[548,799,660],{"class":562},[548,801,332],{"class":554},[548,803,569],{"class":562},[548,805,652],{"class":562},[548,807,808],{"class":562}," [\n",[548,810,812,815,817,820,822,824,826,828,830,832,834,836,838,840,843,845,847,849,851,853,856,858],{"class":550,"line":811},10,[548,813,814],{"class":562},"      {",[548,816,569],{"class":562},[548,818,299],{"class":819},"sbssI",[548,821,569],{"class":562},[548,823,652],{"class":562},[548,825,563],{"class":562},[548,827,244],{"class":558},[548,829,569],{"class":562},[548,831,755],{"class":562},[548,833,563],{"class":562},[548,835,340],{"class":819},[548,837,569],{"class":562},[548,839,652],{"class":562},[548,841,842],{"class":562}," true,",[548,844,563],{"class":562},[548,846,346],{"class":819},[548,848,569],{"class":562},[548,850,652],{"class":562},[548,852,563],{"class":562},[548,854,855],{"class":558},"str",[548,857,569],{"class":562},[548,859,860],{"class":562},"},\n",[548,862,864,866,868,870,872,874,876,879,881,883,885,887,889,891,894,896,898,900,902,904,907,909],{"class":550,"line":863},11,[548,865,814],{"class":562},[548,867,569],{"class":562},[548,869,299],{"class":819},[548,871,569],{"class":562},[548,873,652],{"class":562},[548,875,563],{"class":562},[548,877,878],{"class":558},"filters",[548,880,569],{"class":562},[548,882,755],{"class":562},[548,884,563],{"class":562},[548,886,340],{"class":819},[548,888,569],{"class":562},[548,890,652],{"class":562},[548,892,893],{"class":562}," false,",[548,895,563],{"class":562},[548,897,346],{"class":819},[548,899,569],{"class":562},[548,901,652],{"class":562},[548,903,563],{"class":562},[548,905,906],{"class":558},"str | list | dict[str, typing.Any] | None",[548,908,569],{"class":562},[548,910,860],{"class":562},[548,912,914,916,918,920,922,924,926,929,931,933,935,937,939,941,943,945,947,949,951,953,955,957,959,961,963,966,968],{"class":550,"line":913},12,[548,915,814],{"class":562},[548,917,569],{"class":562},[548,919,299],{"class":819},[548,921,569],{"class":562},[548,923,652],{"class":562},[548,925,563],{"class":562},[548,927,928],{"class":558},"debug",[548,930,569],{"class":562},[548,932,755],{"class":562},[548,934,563],{"class":562},[548,936,340],{"class":819},[548,938,569],{"class":562},[548,940,652],{"class":562},[548,942,893],{"class":562},[548,944,563],{"class":562},[548,946,343],{"class":819},[548,948,569],{"class":562},[548,950,652],{"class":562},[548,952,893],{"class":562},[548,954,563],{"class":562},[548,956,346],{"class":819},[548,958,569],{"class":562},[548,960,652],{"class":562},[548,962,563],{"class":562},[548,964,965],{"class":558},"int | bool",[548,967,569],{"class":562},[548,969,860],{"class":562},[548,971,973,975,977,979,981,983,985,988,990,992,994,996,998,1000,1002,1004,1006,1008,1010,1012,1014,1016,1018,1020,1022,1024,1026],{"class":550,"line":972},13,[548,974,814],{"class":562},[548,976,569],{"class":562},[548,978,299],{"class":819},[548,980,569],{"class":562},[548,982,652],{"class":562},[548,984,563],{"class":562},[548,986,987],{"class":558},"cache",[548,989,569],{"class":562},[548,991,755],{"class":562},[548,993,563],{"class":562},[548,995,340],{"class":819},[548,997,569],{"class":562},[548,999,652],{"class":562},[548,1001,893],{"class":562},[548,1003,563],{"class":562},[548,1005,343],{"class":819},[548,1007,569],{"class":562},[548,1009,652],{"class":562},[548,1011,893],{"class":562},[548,1013,563],{"class":562},[548,1015,346],{"class":819},[548,1017,569],{"class":562},[548,1019,652],{"class":562},[548,1021,563],{"class":562},[548,1023,965],{"class":558},[548,1025,569],{"class":562},[548,1027,1028],{"class":562},"}\n",[548,1030,1032],{"class":550,"line":1031},14,[548,1033,1034],{"class":562},"    ],\n",[548,1036,1038,1040,1042,1044,1046,1048,1051,1053],{"class":550,"line":1037},15,[548,1039,660],{"class":562},[548,1041,353],{"class":554},[548,1043,569],{"class":562},[548,1045,652],{"class":562},[548,1047,563],{"class":562},[548,1049,1050],{"class":558},"\u002Fapi\u002Fv2\u002Fmethod\u002Ffrappe.client.get_count",[548,1052,569],{"class":562},[548,1054,675],{"class":562},[548,1056,1058,1060,1062,1064,1066,1068,1070,1073,1076],{"class":550,"line":1057},16,[548,1059,660],{"class":562},[548,1061,376],{"class":554},[548,1063,569],{"class":562},[548,1065,652],{"class":562},[548,1067,563],{"class":562},[548,1069,230],{"class":558},[548,1071,1072],{"class":572},"\\n",[548,1074,1075],{"class":558},"def get_count(...",[548,1077,587],{"class":562},[548,1079,1081],{"class":550,"line":1080},17,[548,1082,1083],{"class":562},"  }\n",[548,1085,1087],{"class":550,"line":1086},18,[548,1088,1028],{"class":562},[14,1090,1091,1092,1094,1095,1098,1099,36],{},"Le client appelle ensuite l'",[18,1093,353],{}," indiqué, par exemple ",[18,1096,1097],{},"GET \u002Fapi\u002Fv2\u002Fmethod\u002Ffrappe.client.get_count?doctype=Customer",". Voir ",[61,1100,1102],{"href":1101},"\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Frest-api-v2","API REST v2",[26,1104,1105],{"id":987},"Cache",[14,1107,1108],{},"L'index des méthodes est construit à partir du code des applications installées, puis gardé en cache.",[38,1110,1111,1117,1120],{},[41,1112,1113,1114,36],{},"Le cache est construit à la première requête, en tâche de fond, dans la file ",[18,1115,1116],{},"long",[41,1118,1119],{},"Il expire après une heure. La requête suivante lance une nouvelle construction.",[41,1121,1122,1123,1126],{},"Si le cache est vide, l'API lance sa construction et renvoie une erreur ",[18,1124,1125],{},"503"," : « API discovery cache is being generated. Please try again in 10 seconds. ». Refaites la requête quelques secondes plus tard.",[26,1128,1130],{"id":1129},"exposer-le-code-source-des-méthodes","Exposer le code source des méthodes",[14,1132,1133,1134,1136,1137,1140,1141,219],{},"La clé ",[18,1135,376],{}," contient le code Python de la méthode uniquement si l'application qui la définit l'autorise. Elle déclare pour cela le hook ",[18,1138,1139],{},"expose_discovery_source"," dans son ",[18,1142,1143],{},"hooks.py",[539,1145,1149],{"className":1146,"code":1147,"language":1148,"meta":544,"style":544},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# hooks.py de votre application\nexpose_discovery_source = True\n","python",[18,1150,1151,1156],{"__ignoreMap":544},[548,1152,1153],{"class":550,"line":551},[548,1154,1155],{},"# hooks.py de votre application\n",[548,1157,1158],{"class":550,"line":576},[548,1159,1160],{},"expose_discovery_source = True\n",[14,1162,1163,1164,1167,1168,1171,1172,1174],{},"En v5, seul Dodock (",[18,1165,1166],{},"frappe",") déclare ce hook. Pour les autres applications, Dokos (",[18,1169,1170],{},"erpnext",") compris, la clé ",[18,1173,376],{}," est absente de la réponse, sauf si elles déclarent le hook. N'activez pas ce hook dans une application dont le code ne doit pas être diffusé.",[14,1176,1177],{},"Le hook ajoute uniquement des métadonnées à la réponse. Il ne change ni l'exécution des méthodes, ni les autorisations.",[26,1179,1181],{"id":1180},"limites","Limites",[38,1183,1184,1191,1197],{},[41,1185,1186,1187,36],{},"L'API ne produit pas de spécification OpenAPI. Pour les types de documents de Dokos, voir la ",[61,1188,1190],{"href":1189},"\u002Fv5\u002Fdokos\u002Fapi","Référence OpenAPI de Dokos",[41,1192,1193,1194,1196],{},"Une fonction apparaît dans l'index uniquement si elle est décorée par ",[18,1195,230],{}," au niveau du module. Une fonction whitelistée autrement (par exemple, attribuée dynamiquement) n'apparaît pas.",[41,1198,1199],{},"Les webhooks ne font pas partie de l'index.",[26,1201,1203],{"id":1202},"voir-aussi","Voir aussi",[38,1205,1206,1210,1216],{},[41,1207,1208],{},[61,1209,1102],{"href":1101},[41,1211,1212],{},[61,1213,1215],{"href":1214},"\u002Fv5\u002Fintegrations\u002Fia\u002Fserveur-mcp-dodock","Serveur MCP",[41,1217,1218],{},[61,1219,1221],{"href":1220},"\u002Fv5\u002Fdodock\u002Fdeveloppeurs","Référence développeur",[1223,1224,1225],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":544,"searchDepth":551,"depth":576,"links":1227},[1228,1229,1236,1237,1238,1239,1240],{"id":28,"depth":576,"text":29},{"id":67,"depth":576,"text":68,"children":1230},[1231,1232,1233,1234,1235],{"id":163,"depth":590,"text":164},{"id":188,"depth":590,"text":189},{"id":205,"depth":590,"text":206},{"id":263,"depth":590,"text":264},{"id":415,"depth":590,"text":153},{"id":533,"depth":576,"text":534},{"id":987,"depth":576,"text":1105},{"id":1129,"depth":576,"text":1130},{"id":1180,"depth":576,"text":1181},{"id":1202,"depth":576,"text":1203},"Référence des points d'accès \u002Fapi\u002Fv2\u002Fdiscovery : autorisations, routes, format des réponses, cache et exposition du code source des méthodes.","md",{"icon":1244,"reviewed":593,"last_verified":1245,"source_mrs":1246,"sources":1248},"i-mdi-api","2026-11-04",[1247],"https:\u002F\u002Fgitlab.com\u002Fdokos\u002Fdodock\u002F-\u002Fmerge_requests\u002F12099",[1249,1250,1251,1252,1253,1254],"dodock@v5-dev:frappe\u002Fapi\u002Fdiscovery.py","dodock@v5-dev:frappe\u002Fapi\u002Fv2.py","dodock@v5-dev:frappe\u002Fhooks.py","dodock@v5-dev:frappe\u002Fpermissions.py","dodock@v5-dev:frappe\u002F__init__.py","dokos@v5-dev:erpnext\u002Fhooks.py","\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi-v2-decouverte",{"title":5,"description":1241},"1.v5\u002F3.dodock\u002F10.developpeurs\u002Fapi-v2-decouverte","u3rbkdKSwvJxXNDgftnpYJR6e-QXmyY9uiYI9oKlHQA",{},1793871956794]