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