8f0b9b181e4b7be813445c43693a3f666e8b7619
lrnassar
  Fri Oct 10 18:57:15 2025 -0700
Adding API key documentation and updating the CAPTCHA message so people can find it, refs #36428

diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index 0688267610c..ee4b5fe1bf9 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -1497,31 +1497,32 @@
     printf("function showWidget() { \n"
        "turnstile.render('#myWidget', {\n"
          "sitekey: '%s',\n"
          "theme: 'light',\n"
          "callback: function (token) {\n"
          "     const parser = new URL(window.location);\n"
          "     parser.searchParams.set('token', token);\n"
          "     window.location = parser.href;\n"
          "   },\n"
        "});\n"
        "}\n", cfSiteKey);
     puts("</script>");
     puts("</head><body>");
     puts("<style>body, h1, h2, h3, h4, h5, h6  { font-family: Helvetica, Arial, sans-serif; }</style>\n");
     puts("<h4>The Genome Browser is protecting itself from bots. This will just take a few seconds.</h4>");
-    puts("<small>If you are a bot and were made for a research project, please contact us by email.</small>");
+    puts("<small>If you wish to make programmatic queries, see our FAQ: https://genome.ucsc.edu/FAQ/FAQdownloads.html#CAPTCHA.</small>");
+    puts("");
     puts("<script src='https://challenges.cloudflare.com/turnstile/v0/api.js?onload=showWidget' async defer></script>");
     puts("<div id='myWidget'></div>");
     puts("</body></html>");
     sqlCleanupAll(); // we are wondering about hanging connections, so just in case, close them.
     exit(0);
 }
 
 static boolean isUserAgentException() 
 /* return true if HTTP user-agent is in list of exceptions in hg.conf */
 {
 char *agent = cgiUserAgent();
 if (!agent)
     return FALSE;
 
 struct slName *excStrs = cfgValsWithPrefix("noCaptchaAgent.");