[{"data":1,"prerenderedAt":2299},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fexamples":3,"docs-nav":2269},{"id":4,"title":5,"body":6,"description":2262,"extension":2263,"meta":2264,"navigation":187,"path":2265,"seo":2266,"stem":2267,"__hash__":2268},"docs\u002Fdocs\u002F8.examples.md","Code Examples",{"type":7,"value":8,"toc":2247},"minimark",[9,14,19,341,345,597,601,768,779,783,786,1234,1238,1241,1525,1529,1539,1857,1861,1903,2084,2088,2114,2187,2193,2197,2202,2215,2219,2229,2233,2240,2243],[10,11,13],"h1",{"id":12},"code-examples","Code examples",[15,16,18],"h2",{"id":17},"javascript-nodejs-18-or-browser-backend","JavaScript (Node.js 18+ or browser backend)",[20,21,26],"pre",{"className":22,"code":23,"language":24,"meta":25,"style":25},"language-js shiki shiki-themes signupsieve","const res = await fetch(\"https:\u002F\u002Fsignupsieve.p.rapidapi.com\u002Fv1\u002Fcheck\", {\n  method: \"POST\",\n  headers: {\n    \"Content-Type\": \"application\u002Fjson\",\n    \"X-RapidAPI-Key\": process.env.RAPIDAPI_KEY,\n    \"X-RapidAPI-Host\": \"signupsieve.p.rapidapi.com\",\n  },\n  body: JSON.stringify({ email, ip: req.ip }),\n});\nconst result = await res.json();\n\nif (result.did_you_mean) {\n  return showHint(`Did you mean ${result.did_you_mean}?`);\n}\nif (result.verdict === \"block\") {\n  return reject(\"Please use a valid, personal email address.\");\n}\nconst user = await createUser({\n  email,\n  canonical: result.canonical, \u002F\u002F unique index on this stops duplicate accounts\n  needsVerification: result.verdict === \"review\",\n});\n","js","",[27,28,29,62,75,84,98,109,122,128,155,161,182,189,204,232,238,256,271,276,294,300,319,336],"code",{"__ignoreMap":25},[30,31,34,38,42,45,48,52,55,59],"span",{"class":32,"line":33},"line",1,[30,35,37],{"class":36},"svzfb","const",[30,39,41],{"class":40},"sp0VP"," res ",[30,43,44],{"class":36},"=",[30,46,47],{"class":36}," await",[30,49,51],{"class":50},"sLaUg"," fetch",[30,53,54],{"class":40},"(",[30,56,58],{"class":57},"sG-eq","\"https:\u002F\u002Fsignupsieve.p.rapidapi.com\u002Fv1\u002Fcheck\"",[30,60,61],{"class":40},", {\n",[30,63,65,69,72],{"class":32,"line":64},2,[30,66,68],{"class":67},"sZvsG","  method:",[30,70,71],{"class":57}," \"POST\"",[30,73,74],{"class":40},",\n",[30,76,78,81],{"class":32,"line":77},3,[30,79,80],{"class":67},"  headers:",[30,82,83],{"class":40}," {\n",[30,85,87,90,93,96],{"class":32,"line":86},4,[30,88,89],{"class":57},"    \"Content-Type\"",[30,91,92],{"class":67},":",[30,94,95],{"class":57}," \"application\u002Fjson\"",[30,97,74],{"class":40},[30,99,101,104,106],{"class":32,"line":100},5,[30,102,103],{"class":57},"    \"X-RapidAPI-Key\"",[30,105,92],{"class":67},[30,107,108],{"class":40}," process.env.RAPIDAPI_KEY,\n",[30,110,112,115,117,120],{"class":32,"line":111},6,[30,113,114],{"class":57},"    \"X-RapidAPI-Host\"",[30,116,92],{"class":67},[30,118,119],{"class":57}," \"signupsieve.p.rapidapi.com\"",[30,121,74],{"class":40},[30,123,125],{"class":32,"line":124},7,[30,126,127],{"class":40},"  },\n",[30,129,131,134,137,140,143,146,149,152],{"class":32,"line":130},8,[30,132,133],{"class":67},"  body:",[30,135,136],{"class":40}," JSON",[30,138,139],{"class":50},".stringify",[30,141,142],{"class":40},"({ email, ",[30,144,145],{"class":67},"ip:",[30,147,148],{"class":40}," req.",[30,150,151],{"class":67},"ip",[30,153,154],{"class":40}," }),\n",[30,156,158],{"class":32,"line":157},9,[30,159,160],{"class":40},"});\n",[30,162,164,166,169,171,173,176,179],{"class":32,"line":163},10,[30,165,37],{"class":36},[30,167,168],{"class":40}," result ",[30,170,44],{"class":36},[30,172,47],{"class":36},[30,174,175],{"class":40}," res",[30,177,178],{"class":50},".json",[30,180,181],{"class":40},"();\n",[30,183,185],{"class":32,"line":184},11,[30,186,188],{"emptyLinePlaceholder":187},true,"\n",[30,190,192,195,198,201],{"class":32,"line":191},12,[30,193,194],{"class":36},"if",[30,196,197],{"class":40}," (result.",[30,199,200],{"class":67},"did_you_mean",[30,202,203],{"class":40},") {\n",[30,205,207,210,213,215,218,221,224,226,229],{"class":32,"line":206},13,[30,208,209],{"class":36},"  return",[30,211,212],{"class":50}," showHint",[30,214,54],{"class":40},[30,216,217],{"class":57},"`Did you mean ${",[30,219,220],{"class":40},"result",[30,222,223],{"class":57},".",[30,225,200],{"class":67},[30,227,228],{"class":57},"}?`",[30,230,231],{"class":40},");\n",[30,233,235],{"class":32,"line":234},14,[30,236,237],{"class":40},"}\n",[30,239,241,243,245,248,251,254],{"class":32,"line":240},15,[30,242,194],{"class":36},[30,244,197],{"class":40},[30,246,247],{"class":67},"verdict",[30,249,250],{"class":36}," ===",[30,252,253],{"class":57}," \"block\"",[30,255,203],{"class":40},[30,257,259,261,264,266,269],{"class":32,"line":258},16,[30,260,209],{"class":36},[30,262,263],{"class":50}," reject",[30,265,54],{"class":40},[30,267,268],{"class":57},"\"Please use a valid, personal email address.\"",[30,270,231],{"class":40},[30,272,274],{"class":32,"line":273},17,[30,275,237],{"class":40},[30,277,279,281,284,286,288,291],{"class":32,"line":278},18,[30,280,37],{"class":36},[30,282,283],{"class":40}," user ",[30,285,44],{"class":36},[30,287,47],{"class":36},[30,289,290],{"class":50}," createUser",[30,292,293],{"class":40},"({\n",[30,295,297],{"class":32,"line":296},19,[30,298,299],{"class":40},"  email,\n",[30,301,303,306,309,312,315],{"class":32,"line":302},20,[30,304,305],{"class":67},"  canonical:",[30,307,308],{"class":40}," result.",[30,310,311],{"class":67},"canonical",[30,313,314],{"class":40},", ",[30,316,318],{"class":317},"sr6gc","\u002F\u002F unique index on this stops duplicate accounts\n",[30,320,322,325,327,329,331,334],{"class":32,"line":321},21,[30,323,324],{"class":67},"  needsVerification:",[30,326,308],{"class":40},[30,328,247],{"class":67},[30,330,250],{"class":36},[30,332,333],{"class":57}," \"review\"",[30,335,74],{"class":40},[30,337,339],{"class":32,"line":338},22,[30,340,160],{"class":40},[15,342,344],{"id":343},"python","Python",[20,346,349],{"className":347,"code":348,"language":343,"meta":25,"style":25},"language-python shiki shiki-themes signupsieve","import os, requests\n\nHEADERS = {\n    \"X-RapidAPI-Key\": os.environ[\"RAPIDAPI_KEY\"],\n    \"X-RapidAPI-Host\": \"signupsieve.p.rapidapi.com\",\n}\nURL = \"https:\u002F\u002Fsignupsieve.p.rapidapi.com\"\n\nresult = requests.post(f\"{URL}\u002Fv1\u002Fcheck\", headers=HEADERS,\n                       json={\"email\": email, \"ip\": ip}, timeout=10).json()\n\nif result[\"verdict\"] == \"block\":\n    raise ValueError(\"Please use a valid email address.\")\n\n# Later, once the user verifies their email:\nrequests.post(f\"{URL}\u002Fv1\u002Ffeedback\", headers=HEADERS,\n              json={\"email\": email, \"outcome\": \"confirmed\"}, timeout=10)\n",[27,350,351,359,363,374,387,399,403,413,417,453,491,495,516,530,534,539,565],{"__ignoreMap":25},[30,352,353,356],{"class":32,"line":33},[30,354,355],{"class":36},"import",[30,357,358],{"class":40}," os, requests\n",[30,360,361],{"class":32,"line":64},[30,362,188],{"emptyLinePlaceholder":187},[30,364,365,369,372],{"class":32,"line":77},[30,366,368],{"class":367},"shnHK","HEADERS",[30,370,371],{"class":36}," =",[30,373,83],{"class":40},[30,375,376,378,381,384],{"class":32,"line":86},[30,377,103],{"class":57},[30,379,380],{"class":40},": os.environ[",[30,382,383],{"class":57},"\"RAPIDAPI_KEY\"",[30,385,386],{"class":40},"],\n",[30,388,389,391,394,397],{"class":32,"line":100},[30,390,114],{"class":57},[30,392,393],{"class":40},": ",[30,395,396],{"class":57},"\"signupsieve.p.rapidapi.com\"",[30,398,74],{"class":40},[30,400,401],{"class":32,"line":111},[30,402,237],{"class":40},[30,404,405,408,410],{"class":32,"line":124},[30,406,407],{"class":367},"URL",[30,409,371],{"class":36},[30,411,412],{"class":57}," \"https:\u002F\u002Fsignupsieve.p.rapidapi.com\"\n",[30,414,415],{"class":32,"line":130},[30,416,188],{"emptyLinePlaceholder":187},[30,418,419,422,424,427,430,433,436,439,442,444,447,449,451],{"class":32,"line":157},[30,420,421],{"class":40},"result ",[30,423,44],{"class":36},[30,425,426],{"class":40}," requests.",[30,428,429],{"class":50},"post(",[30,431,432],{"class":36},"f",[30,434,435],{"class":57},"\"",[30,437,438],{"class":367},"{URL}",[30,440,441],{"class":57},"\u002Fv1\u002Fcheck\"",[30,443,314],{"class":50},[30,445,446],{"class":40},"headers",[30,448,44],{"class":36},[30,450,368],{"class":367},[30,452,74],{"class":50},[30,454,455,458,460,463,466,469,472,475,478,480,483,486,488],{"class":32,"line":163},[30,456,457],{"class":40},"                       json",[30,459,44],{"class":36},[30,461,462],{"class":50},"{",[30,464,465],{"class":57},"\"email\"",[30,467,468],{"class":50},": email, ",[30,470,471],{"class":57},"\"ip\"",[30,473,474],{"class":50},": ip}, ",[30,476,477],{"class":40},"timeout",[30,479,44],{"class":36},[30,481,482],{"class":367},"10",[30,484,485],{"class":50},")",[30,487,223],{"class":40},[30,489,490],{"class":50},"json()\n",[30,492,493],{"class":32,"line":184},[30,494,188],{"emptyLinePlaceholder":187},[30,496,497,499,502,505,508,511,513],{"class":32,"line":191},[30,498,194],{"class":36},[30,500,501],{"class":40}," result[",[30,503,504],{"class":57},"\"verdict\"",[30,506,507],{"class":40},"] ",[30,509,510],{"class":36},"==",[30,512,253],{"class":57},[30,514,515],{"class":40},":\n",[30,517,518,521,524,527],{"class":32,"line":206},[30,519,520],{"class":36},"    raise",[30,522,523],{"class":50}," ValueError(",[30,525,526],{"class":57},"\"Please use a valid email address.\"",[30,528,529],{"class":50},")\n",[30,531,532],{"class":32,"line":234},[30,533,188],{"emptyLinePlaceholder":187},[30,535,536],{"class":32,"line":240},[30,537,538],{"class":317},"# Later, once the user verifies their email:\n",[30,540,541,544,546,548,550,552,555,557,559,561,563],{"class":32,"line":258},[30,542,543],{"class":40},"requests.",[30,545,429],{"class":50},[30,547,432],{"class":36},[30,549,435],{"class":57},[30,551,438],{"class":367},[30,553,554],{"class":57},"\u002Fv1\u002Ffeedback\"",[30,556,314],{"class":50},[30,558,446],{"class":40},[30,560,44],{"class":36},[30,562,368],{"class":367},[30,564,74],{"class":50},[30,566,567,570,572,574,576,578,581,583,586,589,591,593,595],{"class":32,"line":273},[30,568,569],{"class":40},"              json",[30,571,44],{"class":36},[30,573,462],{"class":50},[30,575,465],{"class":57},[30,577,468],{"class":50},[30,579,580],{"class":57},"\"outcome\"",[30,582,393],{"class":50},[30,584,585],{"class":57},"\"confirmed\"",[30,587,588],{"class":50},"}, ",[30,590,477],{"class":40},[30,592,44],{"class":36},[30,594,482],{"class":367},[30,596,529],{"class":50},[15,598,600],{"id":599},"php","PHP",[20,602,605],{"className":603,"code":604,"language":599,"meta":25,"style":25},"language-php shiki shiki-themes signupsieve","$ch = curl_init(\"https:\u002F\u002Fsignupsieve.p.rapidapi.com\u002Fv1\u002Fcheck\");\ncurl_setopt_array($ch, [\n    CURLOPT_POST => true,\n    CURLOPT_RETURNTRANSFER => true,\n    CURLOPT_HTTPHEADER => [\n        \"Content-Type: application\u002Fjson\",\n        \"X-RapidAPI-Key: \" . getenv(\"RAPIDAPI_KEY\"),\n        \"X-RapidAPI-Host: signupsieve.p.rapidapi.com\",\n    ],\n    CURLOPT_POSTFIELDS => json_encode([\"email\" => $email, \"ip\" => $_SERVER[\"REMOTE_ADDR\"]]),\n]);\n$result = json_decode(curl_exec($ch), true);\n",[27,606,607,624,635,648,659,669,676,692,699,704,739,746],{"__ignoreMap":25},[30,608,609,612,614,617,619,621],{"class":32,"line":33},[30,610,611],{"class":40},"$ch ",[30,613,44],{"class":36},[30,615,616],{"class":50}," curl_init(",[30,618,58],{"class":57},[30,620,485],{"class":50},[30,622,623],{"class":40},";\n",[30,625,626,629,632],{"class":32,"line":64},[30,627,628],{"class":50},"curl_setopt_array(",[30,630,631],{"class":40},"$ch",[30,633,634],{"class":50},", [\n",[30,636,637,640,643,646],{"class":32,"line":77},[30,638,639],{"class":367},"    CURLOPT_POST",[30,641,642],{"class":36}," =>",[30,644,645],{"class":367}," true",[30,647,74],{"class":50},[30,649,650,653,655,657],{"class":32,"line":86},[30,651,652],{"class":367},"    CURLOPT_RETURNTRANSFER",[30,654,642],{"class":36},[30,656,645],{"class":367},[30,658,74],{"class":50},[30,660,661,664,666],{"class":32,"line":100},[30,662,663],{"class":367},"    CURLOPT_HTTPHEADER",[30,665,642],{"class":36},[30,667,668],{"class":50}," [\n",[30,670,671,674],{"class":32,"line":111},[30,672,673],{"class":57},"        \"Content-Type: application\u002Fjson\"",[30,675,74],{"class":50},[30,677,678,681,684,687,689],{"class":32,"line":124},[30,679,680],{"class":57},"        \"X-RapidAPI-Key: \"",[30,682,683],{"class":36}," .",[30,685,686],{"class":50}," getenv(",[30,688,383],{"class":57},[30,690,691],{"class":50},"),\n",[30,693,694,697],{"class":32,"line":130},[30,695,696],{"class":57},"        \"X-RapidAPI-Host: signupsieve.p.rapidapi.com\"",[30,698,74],{"class":50},[30,700,701],{"class":32,"line":157},[30,702,703],{"class":50},"    ],\n",[30,705,706,709,711,714,716,718,721,723,725,727,730,733,736],{"class":32,"line":163},[30,707,708],{"class":367},"    CURLOPT_POSTFIELDS",[30,710,642],{"class":36},[30,712,713],{"class":50}," json_encode([",[30,715,465],{"class":57},[30,717,642],{"class":36},[30,719,720],{"class":40}," $email",[30,722,314],{"class":50},[30,724,471],{"class":57},[30,726,642],{"class":36},[30,728,729],{"class":40}," $_SERVER",[30,731,732],{"class":50},"[",[30,734,735],{"class":57},"\"REMOTE_ADDR\"",[30,737,738],{"class":50},"]]),\n",[30,740,741,744],{"class":32,"line":184},[30,742,743],{"class":50},"])",[30,745,623],{"class":40},[30,747,748,751,753,756,758,761,764,766],{"class":32,"line":191},[30,749,750],{"class":40},"$result ",[30,752,44],{"class":36},[30,754,755],{"class":50}," json_decode(curl_exec(",[30,757,631],{"class":40},[30,759,760],{"class":50},"), ",[30,762,763],{"class":367},"true",[30,765,485],{"class":50},[30,767,623],{"class":40},[769,770,771],"blockquote",{},[772,773,774,778],"p",{},[775,776,777],"strong",{},"Keep your RapidAPI key on your server."," Never put it in browser or mobile app code.",[15,780,782],{"id":781},"nextjs-app-router","Next.js (App Router)",[772,784,785],{},"A route handler for your signup form. It fails open: if the check times out, the signup goes through.",[20,787,791],{"className":788,"code":789,"language":790,"meta":25,"style":25},"language-ts shiki shiki-themes signupsieve","\u002F\u002F app\u002Fapi\u002Fsignup\u002Froute.ts\nexport async function POST(req: Request) {\n  const { email } = await req.json();\n  const ip = req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim();\n\n  let result: { verdict?: string; canonical?: string; did_you_mean?: string } = {};\n  try {\n    const res = await fetch(\"https:\u002F\u002Fsignupsieve.p.rapidapi.com\u002Fv1\u002Fcheck\", {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application\u002Fjson\",\n        \"X-RapidAPI-Key\": process.env.RAPIDAPI_KEY!,\n        \"X-RapidAPI-Host\": \"signupsieve.p.rapidapi.com\",\n      },\n      body: JSON.stringify({ email, ip }),\n      signal: AbortSignal.timeout(3000),\n    });\n    if (res.ok) result = await res.json();\n  } catch {\n    \u002F\u002F Network problem: let the signup through and check it later.\n  }\n\n  if (result.did_you_mean) {\n    return Response.json({ error: `Did you mean ${result.did_you_mean}?` }, { status: 422 });\n  }\n  if (result.verdict === \"block\") {\n    return Response.json({ error: \"Please use a valid, personal email address.\" }, { status: 422 });\n  }\n  \u002F\u002F Save result.canonical with a unique index to stop duplicate accounts.\n  return Response.json({ ok: true, needsVerification: result.verdict === \"review\" });\n}\n","ts",[27,792,793,798,820,839,886,890,924,931,950,959,966,977,992,1003,1008,1020,1038,1043,1067,1077,1082,1087,1091,1103,1143,1148,1163,1187,1192,1198,1229],{"__ignoreMap":25},[30,794,795],{"class":32,"line":33},[30,796,797],{"class":317},"\u002F\u002F app\u002Fapi\u002Fsignup\u002Froute.ts\n",[30,799,800,803,806,809,812,815,817],{"class":32,"line":64},[30,801,802],{"class":36},"export",[30,804,805],{"class":36}," async",[30,807,808],{"class":36}," function",[30,810,811],{"class":50}," POST",[30,813,814],{"class":40},"(req",[30,816,92],{"class":36},[30,818,819],{"class":40}," Request) {\n",[30,821,822,825,828,830,832,835,837],{"class":32,"line":77},[30,823,824],{"class":36},"  const",[30,826,827],{"class":40}," { email } ",[30,829,44],{"class":36},[30,831,47],{"class":36},[30,833,834],{"class":40}," req",[30,836,178],{"class":50},[30,838,181],{"class":40},[30,840,841,843,846,848,850,852,854,857,859,862,864,867,869,872,875,878,881,884],{"class":32,"line":86},[30,842,824],{"class":36},[30,844,845],{"class":40}," ip ",[30,847,44],{"class":36},[30,849,834],{"class":40},[30,851,223],{"class":50},[30,853,446],{"class":40},[30,855,856],{"class":50},".get",[30,858,54],{"class":40},[30,860,861],{"class":57},"\"x-forwarded-for\"",[30,863,485],{"class":40},[30,865,866],{"class":50},"?.split",[30,868,54],{"class":40},[30,870,871],{"class":57},"\",\"",[30,873,874],{"class":40},")[",[30,876,877],{"class":367},"0",[30,879,880],{"class":40},"]",[30,882,883],{"class":50},"?.trim",[30,885,181],{"class":40},[30,887,888],{"class":32,"line":100},[30,889,188],{"emptyLinePlaceholder":187},[30,891,892,895,898,900,903,906,909,911,914,916,919,921],{"class":32,"line":111},[30,893,894],{"class":36},"  let",[30,896,897],{"class":40}," result",[30,899,92],{"class":36},[30,901,902],{"class":40}," { verdict",[30,904,905],{"class":36},"?:",[30,907,908],{"class":40}," string; canonical",[30,910,905],{"class":36},[30,912,913],{"class":40}," string; did_you_mean",[30,915,905],{"class":36},[30,917,918],{"class":40}," string } ",[30,920,44],{"class":36},[30,922,923],{"class":40}," {};\n",[30,925,926,929],{"class":32,"line":124},[30,927,928],{"class":36},"  try",[30,930,83],{"class":40},[30,932,933,936,938,940,942,944,946,948],{"class":32,"line":130},[30,934,935],{"class":36},"    const",[30,937,41],{"class":40},[30,939,44],{"class":36},[30,941,47],{"class":36},[30,943,51],{"class":50},[30,945,54],{"class":40},[30,947,58],{"class":57},[30,949,61],{"class":40},[30,951,952,955,957],{"class":32,"line":157},[30,953,954],{"class":67},"      method:",[30,956,71],{"class":57},[30,958,74],{"class":40},[30,960,961,964],{"class":32,"line":163},[30,962,963],{"class":67},"      headers:",[30,965,83],{"class":40},[30,967,968,971,973,975],{"class":32,"line":184},[30,969,970],{"class":57},"        \"Content-Type\"",[30,972,92],{"class":67},[30,974,95],{"class":57},[30,976,74],{"class":40},[30,978,979,982,984,987,990],{"class":32,"line":191},[30,980,981],{"class":57},"        \"X-RapidAPI-Key\"",[30,983,92],{"class":67},[30,985,986],{"class":40}," process.env.RAPIDAPI_KEY",[30,988,989],{"class":36},"!",[30,991,74],{"class":40},[30,993,994,997,999,1001],{"class":32,"line":206},[30,995,996],{"class":57},"        \"X-RapidAPI-Host\"",[30,998,92],{"class":67},[30,1000,119],{"class":57},[30,1002,74],{"class":40},[30,1004,1005],{"class":32,"line":234},[30,1006,1007],{"class":40},"      },\n",[30,1009,1010,1013,1015,1017],{"class":32,"line":240},[30,1011,1012],{"class":67},"      body:",[30,1014,136],{"class":40},[30,1016,139],{"class":50},[30,1018,1019],{"class":40},"({ email, ip }),\n",[30,1021,1022,1025,1028,1031,1033,1036],{"class":32,"line":258},[30,1023,1024],{"class":67},"      signal:",[30,1026,1027],{"class":40}," AbortSignal",[30,1029,1030],{"class":50},".timeout",[30,1032,54],{"class":40},[30,1034,1035],{"class":367},"3000",[30,1037,691],{"class":40},[30,1039,1040],{"class":32,"line":273},[30,1041,1042],{"class":40},"    });\n",[30,1044,1045,1048,1051,1054,1057,1059,1061,1063,1065],{"class":32,"line":278},[30,1046,1047],{"class":36},"    if",[30,1049,1050],{"class":40}," (res.",[30,1052,1053],{"class":67},"ok",[30,1055,1056],{"class":40},") result ",[30,1058,44],{"class":36},[30,1060,47],{"class":36},[30,1062,175],{"class":40},[30,1064,178],{"class":50},[30,1066,181],{"class":40},[30,1068,1069,1072,1075],{"class":32,"line":296},[30,1070,1071],{"class":40},"  } ",[30,1073,1074],{"class":36},"catch",[30,1076,83],{"class":40},[30,1078,1079],{"class":32,"line":302},[30,1080,1081],{"class":317},"    \u002F\u002F Network problem: let the signup through and check it later.\n",[30,1083,1084],{"class":32,"line":321},[30,1085,1086],{"class":40},"  }\n",[30,1088,1089],{"class":32,"line":338},[30,1090,188],{"emptyLinePlaceholder":187},[30,1092,1094,1097,1099,1101],{"class":32,"line":1093},23,[30,1095,1096],{"class":36},"  if",[30,1098,197],{"class":40},[30,1100,200],{"class":67},[30,1102,203],{"class":40},[30,1104,1106,1109,1112,1114,1117,1120,1123,1125,1127,1129,1131,1134,1137,1140],{"class":32,"line":1105},24,[30,1107,1108],{"class":36},"    return",[30,1110,1111],{"class":40}," Response",[30,1113,178],{"class":50},[30,1115,1116],{"class":40},"({ ",[30,1118,1119],{"class":67},"error:",[30,1121,1122],{"class":57}," `Did you mean ${",[30,1124,220],{"class":40},[30,1126,223],{"class":57},[30,1128,200],{"class":67},[30,1130,228],{"class":57},[30,1132,1133],{"class":40}," }, { ",[30,1135,1136],{"class":67},"status:",[30,1138,1139],{"class":367}," 422",[30,1141,1142],{"class":40}," });\n",[30,1144,1146],{"class":32,"line":1145},25,[30,1147,1086],{"class":40},[30,1149,1151,1153,1155,1157,1159,1161],{"class":32,"line":1150},26,[30,1152,1096],{"class":36},[30,1154,197],{"class":40},[30,1156,247],{"class":67},[30,1158,250],{"class":36},[30,1160,253],{"class":57},[30,1162,203],{"class":40},[30,1164,1166,1168,1170,1172,1174,1176,1179,1181,1183,1185],{"class":32,"line":1165},27,[30,1167,1108],{"class":36},[30,1169,1111],{"class":40},[30,1171,178],{"class":50},[30,1173,1116],{"class":40},[30,1175,1119],{"class":67},[30,1177,1178],{"class":57}," \"Please use a valid, personal email address.\"",[30,1180,1133],{"class":40},[30,1182,1136],{"class":67},[30,1184,1139],{"class":367},[30,1186,1142],{"class":40},[30,1188,1190],{"class":32,"line":1189},28,[30,1191,1086],{"class":40},[30,1193,1195],{"class":32,"line":1194},29,[30,1196,1197],{"class":317},"  \u002F\u002F Save result.canonical with a unique index to stop duplicate accounts.\n",[30,1199,1201,1203,1205,1207,1209,1212,1214,1216,1219,1221,1223,1225,1227],{"class":32,"line":1200},30,[30,1202,209],{"class":36},[30,1204,1111],{"class":40},[30,1206,178],{"class":50},[30,1208,1116],{"class":40},[30,1210,1211],{"class":67},"ok:",[30,1213,645],{"class":367},[30,1215,314],{"class":40},[30,1217,1218],{"class":67},"needsVerification:",[30,1220,308],{"class":40},[30,1222,247],{"class":67},[30,1224,250],{"class":36},[30,1226,333],{"class":57},[30,1228,1142],{"class":40},[30,1230,1232],{"class":32,"line":1231},31,[30,1233,237],{"class":40},[15,1235,1237],{"id":1236},"express","Express",[772,1239,1240],{},"A middleware you can put in front of any signup route.",[20,1242,1244],{"className":22,"code":1243,"language":24,"meta":25,"style":25},"\u002F\u002F Behind a load balancer, set app.set(\"trust proxy\", 1) so req.ip is the user's IP.\nasync function signupSieve(req, res, next) {\n  try {\n    const r = await fetch(\"https:\u002F\u002Fsignupsieve.p.rapidapi.com\u002Fv1\u002Fcheck\", {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application\u002Fjson\",\n        \"X-RapidAPI-Key\": process.env.RAPIDAPI_KEY,\n        \"X-RapidAPI-Host\": \"signupsieve.p.rapidapi.com\",\n      },\n      body: JSON.stringify({ email: req.body.email, ip: req.ip }),\n      signal: AbortSignal.timeout(3000),\n    });\n    if (r.ok) req.signupCheck = await r.json();\n  } catch {\n    \u002F\u002F Fail open on network problems.\n  }\n  if (req.signupCheck?.verdict === \"block\") {\n    return res.status(422).json({\n      error: \"Please use a valid, personal email address.\",\n      did_you_mean: req.signupCheck.did_you_mean,\n    });\n  }\n  next();\n}\n\napp.post(\"\u002Fsignup\", express.json(), signupSieve, createUser);\n",[27,1245,1246,1251,1264,1270,1289,1297,1303,1313,1321,1331,1335,1364,1378,1382,1408,1416,1421,1425,1440,1460,1469,1481,1485,1489,1496,1500,1504],{"__ignoreMap":25},[30,1247,1248],{"class":32,"line":33},[30,1249,1250],{"class":317},"\u002F\u002F Behind a load balancer, set app.set(\"trust proxy\", 1) so req.ip is the user's IP.\n",[30,1252,1253,1256,1258,1261],{"class":32,"line":64},[30,1254,1255],{"class":36},"async",[30,1257,808],{"class":36},[30,1259,1260],{"class":50}," signupSieve",[30,1262,1263],{"class":40},"(req, res, next) {\n",[30,1265,1266,1268],{"class":32,"line":77},[30,1267,928],{"class":36},[30,1269,83],{"class":40},[30,1271,1272,1274,1277,1279,1281,1283,1285,1287],{"class":32,"line":86},[30,1273,935],{"class":36},[30,1275,1276],{"class":40}," r ",[30,1278,44],{"class":36},[30,1280,47],{"class":36},[30,1282,51],{"class":50},[30,1284,54],{"class":40},[30,1286,58],{"class":57},[30,1288,61],{"class":40},[30,1290,1291,1293,1295],{"class":32,"line":100},[30,1292,954],{"class":67},[30,1294,71],{"class":57},[30,1296,74],{"class":40},[30,1298,1299,1301],{"class":32,"line":111},[30,1300,963],{"class":67},[30,1302,83],{"class":40},[30,1304,1305,1307,1309,1311],{"class":32,"line":124},[30,1306,970],{"class":57},[30,1308,92],{"class":67},[30,1310,95],{"class":57},[30,1312,74],{"class":40},[30,1314,1315,1317,1319],{"class":32,"line":130},[30,1316,981],{"class":57},[30,1318,92],{"class":67},[30,1320,108],{"class":40},[30,1322,1323,1325,1327,1329],{"class":32,"line":157},[30,1324,996],{"class":57},[30,1326,92],{"class":67},[30,1328,119],{"class":57},[30,1330,74],{"class":40},[30,1332,1333],{"class":32,"line":163},[30,1334,1007],{"class":40},[30,1336,1337,1339,1341,1343,1345,1348,1351,1354,1356,1358,1360,1362],{"class":32,"line":184},[30,1338,1012],{"class":67},[30,1340,136],{"class":40},[30,1342,139],{"class":50},[30,1344,1116],{"class":40},[30,1346,1347],{"class":67},"email:",[30,1349,1350],{"class":40}," req.body.",[30,1352,1353],{"class":67},"email",[30,1355,314],{"class":40},[30,1357,145],{"class":67},[30,1359,148],{"class":40},[30,1361,151],{"class":67},[30,1363,154],{"class":40},[30,1365,1366,1368,1370,1372,1374,1376],{"class":32,"line":191},[30,1367,1024],{"class":67},[30,1369,1027],{"class":40},[30,1371,1030],{"class":50},[30,1373,54],{"class":40},[30,1375,1035],{"class":367},[30,1377,691],{"class":40},[30,1379,1380],{"class":32,"line":206},[30,1381,1042],{"class":40},[30,1383,1384,1386,1389,1391,1394,1397,1399,1401,1404,1406],{"class":32,"line":234},[30,1385,1047],{"class":36},[30,1387,1388],{"class":40}," (r.",[30,1390,1053],{"class":67},[30,1392,1393],{"class":40},") req.",[30,1395,1396],{"class":67},"signupCheck",[30,1398,371],{"class":36},[30,1400,47],{"class":36},[30,1402,1403],{"class":40}," r",[30,1405,178],{"class":50},[30,1407,181],{"class":40},[30,1409,1410,1412,1414],{"class":32,"line":240},[30,1411,1071],{"class":40},[30,1413,1074],{"class":36},[30,1415,83],{"class":40},[30,1417,1418],{"class":32,"line":258},[30,1419,1420],{"class":317},"    \u002F\u002F Fail open on network problems.\n",[30,1422,1423],{"class":32,"line":273},[30,1424,1086],{"class":40},[30,1426,1427,1429,1432,1434,1436,1438],{"class":32,"line":278},[30,1428,1096],{"class":36},[30,1430,1431],{"class":40}," (req.signupCheck?.",[30,1433,247],{"class":67},[30,1435,250],{"class":36},[30,1437,253],{"class":57},[30,1439,203],{"class":40},[30,1441,1442,1444,1446,1449,1451,1454,1456,1458],{"class":32,"line":296},[30,1443,1108],{"class":36},[30,1445,175],{"class":40},[30,1447,1448],{"class":50},".status",[30,1450,54],{"class":40},[30,1452,1453],{"class":367},"422",[30,1455,485],{"class":40},[30,1457,178],{"class":50},[30,1459,293],{"class":40},[30,1461,1462,1465,1467],{"class":32,"line":302},[30,1463,1464],{"class":67},"      error:",[30,1466,1178],{"class":57},[30,1468,74],{"class":40},[30,1470,1471,1474,1477,1479],{"class":32,"line":321},[30,1472,1473],{"class":67},"      did_you_mean:",[30,1475,1476],{"class":40}," req.signupCheck.",[30,1478,200],{"class":67},[30,1480,74],{"class":40},[30,1482,1483],{"class":32,"line":338},[30,1484,1042],{"class":40},[30,1486,1487],{"class":32,"line":1093},[30,1488,1086],{"class":40},[30,1490,1491,1494],{"class":32,"line":1105},[30,1492,1493],{"class":50},"  next",[30,1495,181],{"class":40},[30,1497,1498],{"class":32,"line":1145},[30,1499,237],{"class":40},[30,1501,1502],{"class":32,"line":1150},[30,1503,188],{"emptyLinePlaceholder":187},[30,1505,1506,1509,1512,1514,1517,1520,1522],{"class":32,"line":1165},[30,1507,1508],{"class":40},"app",[30,1510,1511],{"class":50},".post",[30,1513,54],{"class":40},[30,1515,1516],{"class":57},"\"\u002Fsignup\"",[30,1518,1519],{"class":40},", express",[30,1521,178],{"class":50},[30,1523,1524],{"class":40},"(), signupSieve, createUser);\n",[15,1526,1528],{"id":1527},"laravel","Laravel",[772,1530,1531,1532,1535,1536,223],{},"A validation rule. Put your key in ",[27,1533,1534],{},"config\u002Fservices.php"," as ",[27,1537,1538],{},"signupsieve.key",[20,1540,1542],{"className":603,"code":1541,"language":599,"meta":25,"style":25},"use Closure;\nuse Illuminate\\Support\\Facades\\Http;\n\n$request->validate([\n    'email' => ['required', 'email', function (string $attribute, mixed $value, Closure $fail) use ($request) {\n        \u002F\u002F rescue() returns null on network errors, so the signup goes through.\n        $result = rescue(fn () => Http::withHeaders([\n            'X-RapidAPI-Key' => config('services.signupsieve.key'),\n            'X-RapidAPI-Host' => 'signupsieve.p.rapidapi.com',\n        ])->timeout(3)->post('https:\u002F\u002Fsignupsieve.p.rapidapi.com\u002Fv1\u002Fcheck', [\n            'email' => $value,\n            'ip' => $request->ip(),\n        ])->throw()->json(), null, false);\n\n        if (isset($result['did_you_mean'])) {\n            $fail(\"Did you mean {$result['did_you_mean']}?\");\n        } elseif (($result['verdict'] ?? null) === 'block') {\n            $fail('Please use a valid, personal email address.');\n        }\n    }],\n]);\n",[27,1543,1544,1552,1559,1563,1577,1620,1625,1647,1662,1674,1698,1710,1725,1751,1755,1777,1796,1829,1842,1847,1852],{"__ignoreMap":25},[30,1545,1546,1549],{"class":32,"line":33},[30,1547,1548],{"class":36},"use",[30,1550,1551],{"class":40}," Closure;\n",[30,1553,1554,1556],{"class":32,"line":64},[30,1555,1548],{"class":36},[30,1557,1558],{"class":40}," Illuminate\\Support\\Facades\\Http;\n",[30,1560,1561],{"class":32,"line":77},[30,1562,188],{"emptyLinePlaceholder":187},[30,1564,1565,1568,1571,1574],{"class":32,"line":86},[30,1566,1567],{"class":40},"$request",[30,1569,1570],{"class":36},"->",[30,1572,1573],{"class":50},"validate",[30,1575,1576],{"class":40},"([\n",[30,1578,1579,1582,1584,1587,1590,1592,1595,1597,1600,1603,1606,1609,1612,1615,1617],{"class":32,"line":100},[30,1580,1581],{"class":57},"    'email'",[30,1583,642],{"class":36},[30,1585,1586],{"class":40}," [",[30,1588,1589],{"class":57},"'required'",[30,1591,314],{"class":40},[30,1593,1594],{"class":57},"'email'",[30,1596,314],{"class":40},[30,1598,1599],{"class":36},"function",[30,1601,1602],{"class":40}," (",[30,1604,1605],{"class":36},"string",[30,1607,1608],{"class":40}," $attribute, ",[30,1610,1611],{"class":36},"mixed",[30,1613,1614],{"class":40}," $value, Closure $fail) ",[30,1616,1548],{"class":36},[30,1618,1619],{"class":40}," ($request) {\n",[30,1621,1622],{"class":32,"line":111},[30,1623,1624],{"class":317},"        \u002F\u002F rescue() returns null on network errors, so the signup goes through.\n",[30,1626,1627,1630,1632,1635,1638,1641,1644],{"class":32,"line":124},[30,1628,1629],{"class":40},"        $result ",[30,1631,44],{"class":36},[30,1633,1634],{"class":50}," rescue(",[30,1636,1637],{"class":36},"fn",[30,1639,1640],{"class":50}," () => Http",[30,1642,1643],{"class":36},"::",[30,1645,1646],{"class":50},"withHeaders([\n",[30,1648,1649,1652,1654,1657,1660],{"class":32,"line":130},[30,1650,1651],{"class":57},"            'X-RapidAPI-Key'",[30,1653,642],{"class":36},[30,1655,1656],{"class":50}," config(",[30,1658,1659],{"class":57},"'services.signupsieve.key'",[30,1661,691],{"class":50},[30,1663,1664,1667,1669,1672],{"class":32,"line":157},[30,1665,1666],{"class":57},"            'X-RapidAPI-Host'",[30,1668,642],{"class":36},[30,1670,1671],{"class":57}," 'signupsieve.p.rapidapi.com'",[30,1673,74],{"class":50},[30,1675,1676,1679,1681,1684,1687,1689,1691,1693,1696],{"class":32,"line":163},[30,1677,1678],{"class":50},"        ])",[30,1680,1570],{"class":36},[30,1682,1683],{"class":50},"timeout(",[30,1685,1686],{"class":367},"3",[30,1688,485],{"class":50},[30,1690,1570],{"class":36},[30,1692,429],{"class":50},[30,1694,1695],{"class":57},"'https:\u002F\u002Fsignupsieve.p.rapidapi.com\u002Fv1\u002Fcheck'",[30,1697,634],{"class":50},[30,1699,1700,1703,1705,1708],{"class":32,"line":184},[30,1701,1702],{"class":57},"            'email'",[30,1704,642],{"class":36},[30,1706,1707],{"class":40}," $value",[30,1709,74],{"class":50},[30,1711,1712,1715,1717,1720,1722],{"class":32,"line":191},[30,1713,1714],{"class":57},"            'ip'",[30,1716,642],{"class":36},[30,1718,1719],{"class":40}," $request",[30,1721,1570],{"class":36},[30,1723,1724],{"class":50},"ip(),\n",[30,1726,1727,1729,1731,1734,1736,1739,1742,1744,1747,1749],{"class":32,"line":206},[30,1728,1678],{"class":50},[30,1730,1570],{"class":36},[30,1732,1733],{"class":50},"throw()",[30,1735,1570],{"class":36},[30,1737,1738],{"class":50},"json(), ",[30,1740,1741],{"class":367},"null",[30,1743,314],{"class":50},[30,1745,1746],{"class":367},"false",[30,1748,485],{"class":50},[30,1750,623],{"class":40},[30,1752,1753],{"class":32,"line":234},[30,1754,188],{"emptyLinePlaceholder":187},[30,1756,1757,1760,1762,1765,1768,1770,1773,1775],{"class":32,"line":240},[30,1758,1759],{"class":36},"        if",[30,1761,1602],{"class":40},[30,1763,1764],{"class":50},"isset(",[30,1766,1767],{"class":40},"$result",[30,1769,732],{"class":50},[30,1771,1772],{"class":57},"'did_you_mean'",[30,1774,743],{"class":50},[30,1776,203],{"class":40},[30,1778,1779,1782,1784,1787,1789,1792,1794],{"class":32,"line":258},[30,1780,1781],{"class":40},"            $fail",[30,1783,54],{"class":50},[30,1785,1786],{"class":57},"\"Did you mean {",[30,1788,1767],{"class":40},[30,1790,1791],{"class":57},"['did_you_mean']}?\"",[30,1793,485],{"class":50},[30,1795,623],{"class":40},[30,1797,1798,1801,1804,1807,1810,1812,1815,1818,1821,1824,1827],{"class":32,"line":273},[30,1799,1800],{"class":40},"        } ",[30,1802,1803],{"class":36},"elseif",[30,1805,1806],{"class":40}," (($result[",[30,1808,1809],{"class":57},"'verdict'",[30,1811,507],{"class":40},[30,1813,1814],{"class":36},"??",[30,1816,1817],{"class":367}," null",[30,1819,1820],{"class":40},") ",[30,1822,1823],{"class":36},"===",[30,1825,1826],{"class":57}," 'block'",[30,1828,203],{"class":40},[30,1830,1831,1833,1835,1838,1840],{"class":32,"line":278},[30,1832,1781],{"class":40},[30,1834,54],{"class":50},[30,1836,1837],{"class":57},"'Please use a valid, personal email address.'",[30,1839,485],{"class":50},[30,1841,623],{"class":40},[30,1843,1844],{"class":32,"line":296},[30,1845,1846],{"class":40},"        }\n",[30,1848,1849],{"class":32,"line":302},[30,1850,1851],{"class":40},"    }],\n",[30,1853,1854],{"class":32,"line":321},[30,1855,1856],{"class":40},"]);\n",[15,1858,1860],{"id":1859},"example-catching-a-fake-signup","Example: catching a fake signup",[20,1862,1866],{"className":1863,"code":1864,"language":1865,"meta":25,"style":25},"language-json shiki shiki-themes signupsieve","POST \u002Fv1\u002Fcheck\n{ \"email\": \"qwerty1234@yahoo.com\", \"ip\": \"3.5.140.10\" }\n","json",[27,1867,1868,1879],{"__ignoreMap":25},[30,1869,1870,1873,1876],{"class":32,"line":33},[30,1871,1872],{"class":40},"POST \u002Fv",[30,1874,1875],{"class":367},"1",[30,1877,1878],{"class":40},"\u002Fcheck\n",[30,1880,1881,1884,1886,1888,1891,1893,1895,1897,1900],{"class":32,"line":64},[30,1882,1883],{"class":40},"{ ",[30,1885,465],{"class":67},[30,1887,393],{"class":40},[30,1889,1890],{"class":57},"\"qwerty1234@yahoo.com\"",[30,1892,314],{"class":40},[30,1894,471],{"class":67},[30,1896,393],{"class":40},[30,1898,1899],{"class":57},"\"3.5.140.10\"",[30,1901,1902],{"class":40}," }\n",[20,1904,1906],{"className":1863,"code":1905,"language":1865,"meta":25,"style":25},"{\n  \"email\": \"qwerty1234@yahoo.com\",\n  \"canonical\": \"qwerty1234@yahoo.com\",\n  \"account_type\": \"free\",\n  \"deliverable_domain\": true,\n  \"mail_provider\": \"yahoo\",\n  \"human_score\": 3,\n  \"verdict\": \"block\",\n  \"reasons\": [\"keyboard_pattern\", \"datacenter_ip\", \"unnatural_name\", \"long_digit_run\"],\n  \"ip\": { \"datacenter\": \"aws\", \"tor\": false, \"signups_from_ip\": 1 },\n  \"check_id\": \"chk_AbQY_Yyt0JRL1mpGtCtC...\",\n  \"model\": \"baseline\"\n}\n",[27,1907,1908,1913,1924,1935,1947,1958,1970,1981,1993,2021,2058,2070,2080],{"__ignoreMap":25},[30,1909,1910],{"class":32,"line":33},[30,1911,1912],{"class":40},"{\n",[30,1914,1915,1918,1920,1922],{"class":32,"line":64},[30,1916,1917],{"class":67},"  \"email\"",[30,1919,393],{"class":40},[30,1921,1890],{"class":57},[30,1923,74],{"class":40},[30,1925,1926,1929,1931,1933],{"class":32,"line":77},[30,1927,1928],{"class":67},"  \"canonical\"",[30,1930,393],{"class":40},[30,1932,1890],{"class":57},[30,1934,74],{"class":40},[30,1936,1937,1940,1942,1945],{"class":32,"line":86},[30,1938,1939],{"class":67},"  \"account_type\"",[30,1941,393],{"class":40},[30,1943,1944],{"class":57},"\"free\"",[30,1946,74],{"class":40},[30,1948,1949,1952,1954,1956],{"class":32,"line":100},[30,1950,1951],{"class":67},"  \"deliverable_domain\"",[30,1953,393],{"class":40},[30,1955,763],{"class":367},[30,1957,74],{"class":40},[30,1959,1960,1963,1965,1968],{"class":32,"line":111},[30,1961,1962],{"class":67},"  \"mail_provider\"",[30,1964,393],{"class":40},[30,1966,1967],{"class":57},"\"yahoo\"",[30,1969,74],{"class":40},[30,1971,1972,1975,1977,1979],{"class":32,"line":124},[30,1973,1974],{"class":67},"  \"human_score\"",[30,1976,393],{"class":40},[30,1978,1686],{"class":367},[30,1980,74],{"class":40},[30,1982,1983,1986,1988,1991],{"class":32,"line":130},[30,1984,1985],{"class":67},"  \"verdict\"",[30,1987,393],{"class":40},[30,1989,1990],{"class":57},"\"block\"",[30,1992,74],{"class":40},[30,1994,1995,1998,2001,2004,2006,2009,2011,2014,2016,2019],{"class":32,"line":157},[30,1996,1997],{"class":67},"  \"reasons\"",[30,1999,2000],{"class":40},": [",[30,2002,2003],{"class":57},"\"keyboard_pattern\"",[30,2005,314],{"class":40},[30,2007,2008],{"class":57},"\"datacenter_ip\"",[30,2010,314],{"class":40},[30,2012,2013],{"class":57},"\"unnatural_name\"",[30,2015,314],{"class":40},[30,2017,2018],{"class":57},"\"long_digit_run\"",[30,2020,386],{"class":40},[30,2022,2023,2026,2029,2032,2034,2037,2039,2042,2044,2046,2048,2051,2053,2055],{"class":32,"line":163},[30,2024,2025],{"class":67},"  \"ip\"",[30,2027,2028],{"class":40},": { ",[30,2030,2031],{"class":67},"\"datacenter\"",[30,2033,393],{"class":40},[30,2035,2036],{"class":57},"\"aws\"",[30,2038,314],{"class":40},[30,2040,2041],{"class":67},"\"tor\"",[30,2043,393],{"class":40},[30,2045,1746],{"class":367},[30,2047,314],{"class":40},[30,2049,2050],{"class":67},"\"signups_from_ip\"",[30,2052,393],{"class":40},[30,2054,1875],{"class":367},[30,2056,2057],{"class":40}," },\n",[30,2059,2060,2063,2065,2068],{"class":32,"line":184},[30,2061,2062],{"class":67},"  \"check_id\"",[30,2064,393],{"class":40},[30,2066,2067],{"class":57},"\"chk_AbQY_Yyt0JRL1mpGtCtC...\"",[30,2069,74],{"class":40},[30,2071,2072,2075,2077],{"class":32,"line":191},[30,2073,2074],{"class":67},"  \"model\"",[30,2076,393],{"class":40},[30,2078,2079],{"class":57},"\"baseline\"\n",[30,2081,2082],{"class":32,"line":206},[30,2083,237],{"class":40},[15,2085,2087],{"id":2086},"example-catching-a-typo","Example: catching a typo",[20,2089,2091],{"className":1863,"code":2090,"language":1865,"meta":25,"style":25},"POST \u002Fv1\u002Fcheck\n{ \"email\": \"j.o.hn+promo7@gmial.com\" }\n",[27,2092,2093,2101],{"__ignoreMap":25},[30,2094,2095,2097,2099],{"class":32,"line":33},[30,2096,1872],{"class":40},[30,2098,1875],{"class":367},[30,2100,1878],{"class":40},[30,2102,2103,2105,2107,2109,2112],{"class":32,"line":64},[30,2104,1883],{"class":40},[30,2106,465],{"class":67},[30,2108,393],{"class":40},[30,2110,2111],{"class":57},"\"j.o.hn+promo7@gmial.com\"",[30,2113,1902],{"class":40},[20,2115,2117],{"className":1863,"code":2116,"language":1865,"meta":25,"style":25},"{\n  \"canonical\": \"j.o.hn@gmial.com\",\n  \"did_you_mean\": \"j.o.hn+promo7@gmail.com\",\n  \"human_score\": 9,\n  \"verdict\": \"block\",\n  \"reasons\": [\"domain_typo\", \"unnatural_name\"]\n}\n",[27,2118,2119,2123,2134,2146,2157,2167,2183],{"__ignoreMap":25},[30,2120,2121],{"class":32,"line":33},[30,2122,1912],{"class":40},[30,2124,2125,2127,2129,2132],{"class":32,"line":64},[30,2126,1928],{"class":67},[30,2128,393],{"class":40},[30,2130,2131],{"class":57},"\"j.o.hn@gmial.com\"",[30,2133,74],{"class":40},[30,2135,2136,2139,2141,2144],{"class":32,"line":77},[30,2137,2138],{"class":67},"  \"did_you_mean\"",[30,2140,393],{"class":40},[30,2142,2143],{"class":57},"\"j.o.hn+promo7@gmail.com\"",[30,2145,74],{"class":40},[30,2147,2148,2150,2152,2155],{"class":32,"line":86},[30,2149,1974],{"class":67},[30,2151,393],{"class":40},[30,2153,2154],{"class":367},"9",[30,2156,74],{"class":40},[30,2158,2159,2161,2163,2165],{"class":32,"line":100},[30,2160,1985],{"class":67},[30,2162,393],{"class":40},[30,2164,1990],{"class":57},[30,2166,74],{"class":40},[30,2168,2169,2171,2173,2176,2178,2180],{"class":32,"line":111},[30,2170,1997],{"class":67},[30,2172,2000],{"class":40},[30,2174,2175],{"class":57},"\"domain_typo\"",[30,2177,314],{"class":40},[30,2179,2013],{"class":57},[30,2181,2182],{"class":40},"]\n",[30,2184,2185],{"class":32,"line":124},[30,2186,237],{"class":40},[772,2188,2189,2190,2192],{},"Show ",[27,2191,200],{}," to the user instead of rejecting them outright.",[15,2194,2196],{"id":2195},"block-disposable-emails-by-framework","Block disposable emails by framework",[2198,2199,2201],"h3",{"id":2200},"block-disposable-emails-in-nextjs","Block disposable emails in Next.js",[772,2203,2204,2205,2208,2209,2214],{},"Call the API from a route handler before you create the user, and reject a ",[27,2206,2207],{},"block"," verdict. See the ",[2210,2211,2213],"a",{"href":2212},"#nextjs-app-router","Next.js example"," above.",[2198,2216,2218],{"id":2217},"block-disposable-emails-in-express","Block disposable emails in Express",[772,2220,2221,2222,2224,2225,2214],{},"Add a small middleware in front of your signup route that rejects ",[27,2223,2207],{}," and passes everything else through. See the ",[2210,2226,2228],{"href":2227},"#express","Express example",[2198,2230,2232],{"id":2231},"block-disposable-emails-in-laravel","Block disposable emails in Laravel",[772,2234,2235,2236,2214],{},"Use a validation rule on the email field, so a throwaway address fails like any other invalid input. See the ",[2210,2237,2239],{"href":2238},"#laravel","Laravel example",[772,2241,2242],{},"All three fail open: if the API is slow or unreachable, the signup still goes through.",[2244,2245,2246],"style",{},"html pre.shiki code .sp0VP, html code.shiki .sp0VP{--shiki-default:#E2E8F0}html pre.shiki code .shnHK, html code.shiki .shnHK{--shiki-default:#FDE68A}html pre.shiki code .sZvsG, html code.shiki .sZvsG{--shiki-default:#BAE6FD}html pre.shiki code .sG-eq, html code.shiki .sG-eq{--shiki-default:#2EE59D}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 pre.shiki code .svzfb, html code.shiki .svzfb{--shiki-default:#7DD3FC}html pre.shiki code .sLaUg, html code.shiki .sLaUg{--shiki-default:#FFFFFF}html pre.shiki code .sr6gc, html code.shiki .sr6gc{--shiki-default:#94A3B8;--shiki-default-font-style:italic}",{"title":25,"searchDepth":64,"depth":64,"links":2248},[2249,2250,2251,2252,2253,2254,2255,2256,2257],{"id":17,"depth":64,"text":18},{"id":343,"depth":64,"text":344},{"id":599,"depth":64,"text":600},{"id":781,"depth":64,"text":782},{"id":1236,"depth":64,"text":1237},{"id":1527,"depth":64,"text":1528},{"id":1859,"depth":64,"text":1860},{"id":2086,"depth":64,"text":2087},{"id":2195,"depth":64,"text":2196,"children":2258},[2259,2260,2261],{"id":2200,"depth":77,"text":2201},{"id":2217,"depth":77,"text":2218},{"id":2231,"depth":77,"text":2232},"Copy-paste SignupSieve integrations for Node.js, Python, PHP, Next.js, Express and Laravel.","md",{},"\u002Fdocs\u002Fexamples",{"title":5,"description":2262},"docs\u002F8.examples","HNd_ymRisWy0PuUdegvHrfCZJEOgTggxkSCFVqrfClo",[2270,2274,2278,2282,2286,2290,2294,2298],{"path":2271,"title":2272,"stem":2273},"\u002Fdocs","Quick Start","docs\u002F1.index",{"path":2275,"title":2276,"stem":2277},"\u002Fdocs\u002Fverdicts","Verdicts","docs\u002F2.verdicts",{"path":2279,"title":2280,"stem":2281},"\u002Fdocs\u002Fendpoints","Endpoints","docs\u002F3.endpoints",{"path":2283,"title":2284,"stem":2285},"\u002Fdocs\u002Fresponse-fields","Response Fields","docs\u002F4.response-fields",{"path":2287,"title":2288,"stem":2289},"\u002Fdocs\u002Freason-codes","Reason Codes","docs\u002F5.reason-codes",{"path":2291,"title":2292,"stem":2293},"\u002Fdocs\u002Ffeedback","Feedback","docs\u002F6.feedback",{"path":2295,"title":2296,"stem":2297},"\u002Fdocs\u002Ferrors","Errors and Billing","docs\u002F7.errors",{"path":2265,"title":5,"stem":2267},1792516807768]