[{"data":1,"prerenderedAt":1080},["ShallowReactive",2],{"page-\u002Fdatasets\u002Fworkflows":3,"all-pages":751},{"id":4,"title":5,"body":6,"description":742,"extension":743,"meta":744,"navigation":227,"path":745,"robots":746,"seo":747,"sitemap":748,"stem":749,"__hash__":750},"content\u002F04.datasets\u002F3.workflows.md","Pushing and Reading Dataset Rows",{"type":7,"value":8,"toc":729},"minimark",[9,14,18,27,98,101,183,186,204,207,213,282,289,298,302,323,329,332,347,352,360,375,382,387,415,417,471,478,482,658,665,669,672,725],[10,11,13],"h1",{"id":12},"pushing-and-reading-dataset-rows-from-workflows","Pushing and reading dataset rows from workflows",[15,16,17],"p",{},"Bug bounty hunting is a long game. The subdomain you discover today might host\nthe admin panel that gets you a critical in six months. Datasets let a project\naccumulate knowledge across runs: every scan reconciles its observations into\nan evolving table of assets.",[19,20,22,23],"h2",{"id":21},"pushing-observations-stepupdate_dataset","Pushing Observations: ",[24,25,26],"code",{},"step.update_dataset",[28,29,34],"pre",{"className":30,"code":31,"language":32,"meta":33,"style":33},"language-bhw shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","step.update_dataset(\n    table = \"subdomains\",\n    source = path.file(\"subs-clean.txt\").lines(),\n    pipeline = transform.trim().lower().unique(),\n    mapping = {\n        \"host\": row.value,\n        \"source\": \"subfinder\",\n    },\n    mode = \"upsert\",\n)\n","bhw","",[24,35,36,44,50,56,62,68,74,80,86,92],{"__ignoreMap":33},[37,38,41],"span",{"class":39,"line":40},"line",1,[37,42,43],{},"step.update_dataset(\n",[37,45,47],{"class":39,"line":46},2,[37,48,49],{},"    table = \"subdomains\",\n",[37,51,53],{"class":39,"line":52},3,[37,54,55],{},"    source = path.file(\"subs-clean.txt\").lines(),\n",[37,57,59],{"class":39,"line":58},4,[37,60,61],{},"    pipeline = transform.trim().lower().unique(),\n",[37,63,65],{"class":39,"line":64},5,[37,66,67],{},"    mapping = {\n",[37,69,71],{"class":39,"line":70},6,[37,72,73],{},"        \"host\": row.value,\n",[37,75,77],{"class":39,"line":76},7,[37,78,79],{},"        \"source\": \"subfinder\",\n",[37,81,83],{"class":39,"line":82},8,[37,84,85],{},"    },\n",[37,87,89],{"class":39,"line":88},9,[37,90,91],{},"    mode = \"upsert\",\n",[37,93,95],{"class":39,"line":94},10,[37,96,97],{},")\n",[15,99,100],{},"Parameters:",[102,103,104,117],"table",{},[105,106,107],"thead",{},[108,109,110,114],"tr",{},[111,112,113],"th",{},"Parameter",[111,115,116],{},"Meaning",[118,119,120,130,140,150,167],"tbody",{},[108,121,122,127],{},[123,124,125],"td",{},[24,126,102],{},[123,128,129],{},"Name of an existing project dataset table",[108,131,132,137],{},[123,133,134],{},[24,135,136],{},"source",[123,138,139],{},"Where the data comes from — a path or typed transform expression",[108,141,142,147],{},[123,143,144],{},[24,145,146],{},"pipeline",[123,148,149],{},"Typed transform producing the records to push",[108,151,152,157],{},[123,153,154],{},[24,155,156],{},"mapping",[123,158,159,162,163,166],{},[24,160,161],{},"{column: expression}"," projection from each pipeline record (",[24,164,165],{},"row",") into dataset columns",[108,168,169,174],{},[123,170,171],{},[24,172,173],{},"mode",[123,175,176,179,180],{},[24,177,178],{},"\"upsert\""," or ",[24,181,182],{},"\"sync\"",[15,184,185],{},"The workflow only provides source, pipeline, mapping, and mode. Everything\nelse — identity, reconciliation, stale tracking, provenance, change events — is\nowned by the dataset service.",[15,187,188,189,192,193,196,197,179,200,203],{},"Dataset names must start with a letter and contain only letters, digits, and\nhyphens (",[24,190,191],{},"live-hosts",", not ",[24,194,195],{},"live_hosts","). Column names are identifiers and may\ncontain letters, digits, and underscores, but not the reserved names\n",[24,198,199],{},"__ingested_at",[24,201,202],{},"__deleted",".",[19,205,206],{"id":156},"Mapping",[15,208,209,210,212],{},"The mapping dict's keys are dataset column names; each value is an expression\nevaluated against the current record, bound as ",[24,211,165],{},". With a JSONL source,\nfields come straight off the record:",[28,214,216],{"className":30,"code":215,"language":32,"meta":33,"style":33},"step.exec(command = [\"httpx\", \"-l\", \"subs.txt\", \"-jsonl\", \"-o\", \"live.jsonl\"])\n\nstep.update_dataset(\n    table = \"live-hosts\",\n    source = path.file(\"live.jsonl\").jsonl(),\n    pipeline = transform.unique(),\n    mapping = {\n        \"url\": row.url,\n        \"status_code\": row.status_code,\n        \"title\": row.title,\n    },\n    mode = \"upsert\",\n)\n",[24,217,218,223,229,233,238,243,248,252,257,262,267,272,277],{"__ignoreMap":33},[37,219,220],{"class":39,"line":40},[37,221,222],{},"step.exec(command = [\"httpx\", \"-l\", \"subs.txt\", \"-jsonl\", \"-o\", \"live.jsonl\"])\n",[37,224,225],{"class":39,"line":46},[37,226,228],{"emptyLinePlaceholder":227},true,"\n",[37,230,231],{"class":39,"line":52},[37,232,43],{},[37,234,235],{"class":39,"line":58},[37,236,237],{},"    table = \"live-hosts\",\n",[37,239,240],{"class":39,"line":64},[37,241,242],{},"    source = path.file(\"live.jsonl\").jsonl(),\n",[37,244,245],{"class":39,"line":70},[37,246,247],{},"    pipeline = transform.unique(),\n",[37,249,250],{"class":39,"line":76},[37,251,67],{},[37,253,254],{"class":39,"line":82},[37,255,256],{},"        \"url\": row.url,\n",[37,258,259],{"class":39,"line":88},[37,260,261],{},"        \"status_code\": row.status_code,\n",[37,263,264],{"class":39,"line":94},[37,265,266],{},"        \"title\": row.title,\n",[37,268,270],{"class":39,"line":269},11,[37,271,85],{},[37,273,275],{"class":39,"line":274},12,[37,276,91],{},[37,278,280],{"class":39,"line":279},13,[37,281,97],{},[15,283,284,285,288],{},"With line-based sources, ",[24,286,287],{},"row.value"," is the raw string:",[28,290,292],{"className":30,"code":291,"language":32,"meta":33,"style":33},"mapping = {\"host\": row.value}\n",[24,293,294],{"__ignoreMap":33},[37,295,296],{"class":39,"line":40},[37,297,291],{},[19,299,301],{"id":300},"modes","Modes",[15,303,304,306,307,309,310,312,313,316,317,320,321,203],{},[24,305,173],{}," accepts the strings ",[24,308,178],{}," and ",[24,311,182],{},". The ",[24,314,315],{},"dataset.upsert()"," \u002F\n",[24,318,319],{},"dataset.sync()"," values are not accepted by ",[24,322,26],{},[324,325,327],"h3",{"id":326},"upsert",[24,328,178],{},[15,330,331],{},"Create or update records matching known identities; records absent from this\npush are left untouched. This is what you want for accumulating observations:",[28,333,335],{"className":30,"code":334,"language":32,"meta":33,"style":33},"# Every nightly run adds new subdomains; existing ones stay.\nmode = \"upsert\"\n",[24,336,337,342],{"__ignoreMap":33},[37,338,339],{"class":39,"line":40},[37,340,341],{},"# Every nightly run adds new subdomains; existing ones stay.\n",[37,343,344],{"class":39,"line":46},[37,345,346],{},"mode = \"upsert\"\n",[324,348,350],{"id":349},"sync",[24,351,182],{},[15,353,354,355,359],{},"The push represents the ",[356,357,358],"strong",{},"complete"," current state: identities that were known\nbut are absent from this push become stale. Use it when the source is\nauthoritative:",[28,361,363],{"className":30,"code":362,"language":32,"meta":33,"style":33},"# After a full rescan, hosts no longer resolving are marked stale.\nmode = \"sync\"\n",[24,364,365,370],{"__ignoreMap":33},[37,366,367],{"class":39,"line":40},[37,368,369],{},"# After a full rescan, hosts no longer resolving are marked stale.\n",[37,371,372],{"class":39,"line":46},[37,373,374],{},"mode = \"sync\"\n",[19,376,378,379],{"id":377},"reading-a-dataset-stepdownload_dataset","Reading a Dataset: ",[24,380,381],{},"step.download_dataset",[15,383,384,386],{},[24,385,381],{}," exports the current logical state of a dataset into a\nfile in the activity workspace, so a run can start from knowledge accumulated by\nprevious runs:",[28,388,390],{"className":30,"code":389,"language":32,"meta":33,"style":33},"step.download_dataset(\n    table = \"subdomains\",\n    destination = path.file(\"known-subdomains.csv\"),\n    format = \"csv\",\n)\n",[24,391,392,397,401,406,411],{"__ignoreMap":33},[37,393,394],{"class":39,"line":40},[37,395,396],{},"step.download_dataset(\n",[37,398,399],{"class":39,"line":46},[37,400,49],{},[37,402,403],{"class":39,"line":52},[37,404,405],{},"    destination = path.file(\"known-subdomains.csv\"),\n",[37,407,408],{"class":39,"line":58},[37,409,410],{},"    format = \"csv\",\n",[37,412,413],{"class":39,"line":64},[37,414,97],{},[15,416,100],{},[102,418,419,427],{},[105,420,421],{},[108,422,423,425],{},[111,424,113],{},[111,426,116],{},[118,428,429,437,451],{},[108,430,431,435],{},[123,432,433],{},[24,434,102],{},[123,436,129],{},[108,438,439,444],{},[123,440,441],{},[24,442,443],{},"destination",[123,445,446,447,450],{},"Workspace file the export is written to (",[24,448,449],{},"path.file(...)",")",[108,452,453,458],{},[123,454,455],{},[24,456,457],{},"format",[123,459,460,463,464,467,468],{},[24,461,462],{},"\"csv\""," (default), ",[24,465,466],{},"\"jsonl\"",", or ",[24,469,470],{},"\"json\"",[15,472,473,474,477],{},"Later steps read the file like any other workspace input, and the step exposes\nit as ",[24,475,476],{},"run.output",". The export covers the current logical state: latest\nobservation per identity, stale records excluded.",[19,479,481],{"id":480},"a-complete-asset-tracking-workflow","A Complete Asset-Tracking Workflow",[28,483,485],{"className":30,"code":484,"language":32,"meta":33,"style":33},"workflow(\n    name = \"asset-tracker\",\n    activities = [\n        activity(\n            name = \"discover-and-record\",\n            triggers = [trigger.cron(\"0 0 * * *\")],\n            steps = [\n                # 1. Enumerate.\n                step.exec(command = [\"subfinder\", \"-d\", config.var(\"target_domain\"), \"-silent\", \"-o\", \"subs-raw.txt\"]),\n                # 2. Normalize.\n                step.transform(\n                    source = path.file(\"subs-raw.txt\").lines(),\n                    pipeline = transform.trim().lower().unique(),\n                    destination = path.file(\"subs-clean.txt\"),\n                ),\n                # 3. Record into the project's asset inventory.\n                step.update_dataset(\n                    table = \"subdomains\",\n                    source = path.file(\"subs-clean.txt\").lines(),\n                    pipeline = transform.unique(),\n                    mapping = {\n                        \"host\": row.value,\n                        \"source\": \"subfinder\",\n                        \"program\": config.var(\"program\"),\n                    },\n                    mode = \"upsert\",\n                ),\n            ],\n        ),\n    ],\n)\n",[24,486,487,492,497,502,507,512,517,522,527,532,537,542,547,552,558,564,570,576,582,588,594,600,606,612,618,624,630,635,641,647,653],{"__ignoreMap":33},[37,488,489],{"class":39,"line":40},[37,490,491],{},"workflow(\n",[37,493,494],{"class":39,"line":46},[37,495,496],{},"    name = \"asset-tracker\",\n",[37,498,499],{"class":39,"line":52},[37,500,501],{},"    activities = [\n",[37,503,504],{"class":39,"line":58},[37,505,506],{},"        activity(\n",[37,508,509],{"class":39,"line":64},[37,510,511],{},"            name = \"discover-and-record\",\n",[37,513,514],{"class":39,"line":70},[37,515,516],{},"            triggers = [trigger.cron(\"0 0 * * *\")],\n",[37,518,519],{"class":39,"line":76},[37,520,521],{},"            steps = [\n",[37,523,524],{"class":39,"line":82},[37,525,526],{},"                # 1. Enumerate.\n",[37,528,529],{"class":39,"line":88},[37,530,531],{},"                step.exec(command = [\"subfinder\", \"-d\", config.var(\"target_domain\"), \"-silent\", \"-o\", \"subs-raw.txt\"]),\n",[37,533,534],{"class":39,"line":94},[37,535,536],{},"                # 2. Normalize.\n",[37,538,539],{"class":39,"line":269},[37,540,541],{},"                step.transform(\n",[37,543,544],{"class":39,"line":274},[37,545,546],{},"                    source = path.file(\"subs-raw.txt\").lines(),\n",[37,548,549],{"class":39,"line":279},[37,550,551],{},"                    pipeline = transform.trim().lower().unique(),\n",[37,553,555],{"class":39,"line":554},14,[37,556,557],{},"                    destination = path.file(\"subs-clean.txt\"),\n",[37,559,561],{"class":39,"line":560},15,[37,562,563],{},"                ),\n",[37,565,567],{"class":39,"line":566},16,[37,568,569],{},"                # 3. Record into the project's asset inventory.\n",[37,571,573],{"class":39,"line":572},17,[37,574,575],{},"                step.update_dataset(\n",[37,577,579],{"class":39,"line":578},18,[37,580,581],{},"                    table = \"subdomains\",\n",[37,583,585],{"class":39,"line":584},19,[37,586,587],{},"                    source = path.file(\"subs-clean.txt\").lines(),\n",[37,589,591],{"class":39,"line":590},20,[37,592,593],{},"                    pipeline = transform.unique(),\n",[37,595,597],{"class":39,"line":596},21,[37,598,599],{},"                    mapping = {\n",[37,601,603],{"class":39,"line":602},22,[37,604,605],{},"                        \"host\": row.value,\n",[37,607,609],{"class":39,"line":608},23,[37,610,611],{},"                        \"source\": \"subfinder\",\n",[37,613,615],{"class":39,"line":614},24,[37,616,617],{},"                        \"program\": config.var(\"program\"),\n",[37,619,621],{"class":39,"line":620},25,[37,622,623],{},"                    },\n",[37,625,627],{"class":39,"line":626},26,[37,628,629],{},"                    mode = \"upsert\",\n",[37,631,633],{"class":39,"line":632},27,[37,634,563],{},[37,636,638],{"class":39,"line":637},28,[37,639,640],{},"            ],\n",[37,642,644],{"class":39,"line":643},29,[37,645,646],{},"        ),\n",[37,648,650],{"class":39,"line":649},30,[37,651,652],{},"    ],\n",[37,654,656],{"class":39,"line":655},31,[37,657,97],{},[15,659,660,661,664],{},"Each night, new subdomains appear in the dataset with their source and program\nrecorded as provenance; nothing is ever lost between runs. When a later scan\nuses ",[24,662,663],{},"mode = \"sync\""," after a full validation pass, dead assets age out on\ntheir own instead of polluting your target lists forever.",[19,666,668],{"id":667},"querying-the-data-you-pushed","Querying the data you pushed",[15,670,671],{},"Pushes are only half of the feature — datasets are queried with DuckDB SQL and\ntyped filters. The Datasets section covers schema design, SQL, filters, views,\nand automation:",[673,674,675,684,691,698,705,712],"ul",{},[676,677,678,683],"li",{},[679,680,682],"a",{"href":681},"\u002Fdatasets\u002Foverview","Datasets overview",": current state vs history, identity,\nreserved columns, and limits.",[676,685,686,690],{},[679,687,689],{"href":688},"\u002Fdatasets\u002Fschema","Schemas and identity",": column kinds and identity columns.",[676,692,693,697],{},[679,694,696],{"href":695},"\u002Fdatasets\u002Fsql","SQL reference",": relations, pagination, result types, joins,\naggregates, and time ranges.",[676,699,700,704],{},[679,701,703],{"href":702},"\u002Fdatasets\u002Ffilters","Structured filters",": the filter AST used by the Hub and\nAPI.",[676,706,707,711],{},[679,708,710],{"href":709},"\u002Fdatasets\u002Fviews","Saved views",": reusable queries across datasets.",[676,713,714,718,719,309,722,203],{},[679,715,717],{"href":716},"\u002Fdatasets\u002Fapi-cli","API and CLI",": ",[24,720,721],{},"DatasetService",[24,723,724],{},"bh dataset",[726,727,728],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":33,"searchDepth":64,"depth":58,"links":730},[731,733,734,738,740,741],{"id":21,"depth":46,"text":732},"Pushing Observations: step.update_dataset",{"id":156,"depth":46,"text":206},{"id":300,"depth":46,"text":301,"children":735},[736,737],{"id":326,"depth":52,"text":178},{"id":349,"depth":52,"text":182},{"id":377,"depth":46,"text":739},"Reading a Dataset: step.download_dataset",{"id":480,"depth":46,"text":481},{"id":667,"depth":46,"text":668},"Push observations into project datasets from BHW workflows with step.update_dataset, and read them back into a run with step.download_dataset.","md",{},"\u002Fdatasets\u002Fworkflows",null,{"title":5,"description":742},{"loc":745},"04.datasets\u002F3.workflows","FtRc1pzVktpzxRngEwLJu8WZDlPomq_9fVL0lIticwI",[752,815,831,850,876,892,904,915,926,937,961,980,1000,1011,1022],{"title":753,"path":754,"stem":755,"children":756},"Workflows","\u002Fworkflows","01.workflows",[757,759,763,767,771,775,779,783,787,791,795,799,803,807,811],{"title":753,"path":754,"stem":758},"01.workflows\u002Findex",{"title":760,"path":761,"stem":762},"Workflow Quick Reference","\u002Fworkflows\u002Fquick-reference","01.workflows\u002F00.quick-reference",{"title":764,"path":765,"stem":766},"Workflows Overview","\u002Fworkflows\u002Foverview","01.workflows\u002F01.overview",{"title":768,"path":769,"stem":770},"Workflow Syntax Reference","\u002Fworkflows\u002Fsyntax-reference","01.workflows\u002F02.syntax-reference",{"title":772,"path":773,"stem":774},"Steps","\u002Fworkflows\u002Fsteps","01.workflows\u002F03.steps",{"title":776,"path":777,"stem":778},"Step Outputs","\u002Fworkflows\u002Fstep-outputs","01.workflows\u002F04.step-outputs",{"title":780,"path":781,"stem":782},"Concurrency","\u002Fworkflows\u002Fconcurrency","01.workflows\u002F05.concurrency",{"title":784,"path":785,"stem":786},"Transforms","\u002Fworkflows\u002Ftransforms","01.workflows\u002F06.transforms",{"title":788,"path":789,"stem":790},"For Each","\u002Fworkflows\u002Ffor-each","01.workflows\u002F07.for-each",{"title":792,"path":793,"stem":794},"Modules","\u002Fworkflows\u002Fmodules","01.workflows\u002F08.modules",{"title":796,"path":797,"stem":798},"Agents","\u002Fworkflows\u002Fagents","01.workflows\u002F09.agents",{"title":800,"path":801,"stem":802},"Decisions","\u002Fworkflows\u002Fdecisions","01.workflows\u002F10.decisions",{"title":804,"path":805,"stem":806},"Configuration References","\u002Fworkflows\u002Fconfig","01.workflows\u002F11.config",{"title":808,"path":809,"stem":810},"Comparison With Other Automation Systems","\u002Fworkflows\u002Fcomparison","01.workflows\u002F12.comparison",{"title":812,"path":813,"stem":814},"Generate with AI","\u002Fworkflows\u002Fai-generation","01.workflows\u002F13.ai-generation",{"title":816,"path":817,"stem":818,"children":819},"Projects","\u002Fprojects","02.projects",[820,823,827],{"title":821,"path":817,"stem":822},"Projects & Runs","02.projects\u002Findex",{"title":824,"path":825,"stem":826},"Projects Overview","\u002Fprojects\u002Foverview","02.projects\u002F1.overview",{"title":828,"path":829,"stem":830},"Runs & Artifacts","\u002Fprojects\u002Fruns-artifacts","02.projects\u002F2.runs-artifacts",{"title":832,"path":833,"stem":834,"children":835},"Runners","\u002Frunners","03.runners",[836,838,842,846],{"title":832,"path":833,"stem":837},"03.runners\u002Findex",{"title":839,"path":840,"stem":841},"Runner Overview","\u002Frunners\u002Foverview","03.runners\u002F1.overview",{"title":843,"path":844,"stem":845},"Getting Started with Runners","\u002Frunners\u002Fgetting-started","03.runners\u002F2.getting-started",{"title":847,"path":848,"stem":849},"Custom Runner Images","\u002Frunners\u002Fcustom-image","03.runners\u002F3.custom-image",{"title":851,"path":852,"stem":853,"children":854},"Datasets","\u002Fdatasets","04.datasets",[855,857,860,863,864,867,870,873],{"title":851,"path":852,"stem":856},"04.datasets\u002Findex",{"title":858,"path":681,"stem":859},"Datasets Overview","04.datasets\u002F1.overview",{"title":861,"path":688,"stem":862},"Dataset Schemas and Identity","04.datasets\u002F2.schema",{"title":5,"path":745,"stem":749},{"title":865,"path":695,"stem":866},"Dataset SQL Reference","04.datasets\u002F4.sql",{"title":868,"path":702,"stem":869},"Dataset Structured Filters","04.datasets\u002F5.filters",{"title":871,"path":709,"stem":872},"Dataset Saved Views","04.datasets\u002F6.views",{"title":874,"path":716,"stem":875},"Datasets API and CLI","04.datasets\u002F7.api-cli",{"title":877,"path":878,"stem":879,"children":880},"Agent","\u002Fagent","05.agent",[881,884,888],{"title":882,"path":878,"stem":883},"BH Agent","05.agent\u002Findex",{"title":885,"path":886,"stem":887},"BH Agent Overview","\u002Fagent\u002Foverview","05.agent\u002F1.overview",{"title":889,"path":890,"stem":891},"MCP servers","\u002Fagent\u002Fmcp-servers","05.agent\u002F2.mcp-servers",{"title":893,"path":894,"stem":895,"children":896},"Bhlast","\u002Fbhlast","06.bhlast",[897,900],{"title":898,"path":894,"stem":899},"Bhlast Servers","06.bhlast\u002Findex",{"title":901,"path":902,"stem":903},"Bhlast servers overview","\u002Fbhlast\u002Foverview","06.bhlast\u002F1.overview",{"title":905,"path":906,"stem":907,"children":908},"Notifications","\u002Fnotifications","07.notifications",[909,911],{"title":905,"path":906,"stem":910},"07.notifications\u002Findex",{"title":912,"path":913,"stem":914},"Notifications Overview","\u002Fnotifications\u002Foverview","07.notifications\u002F1.overview",{"title":916,"path":917,"stem":918,"children":919},"Blob Storage","\u002Fblob-storage","08.blob-storage",[920,922],{"title":916,"path":917,"stem":921},"08.blob-storage\u002Findex",{"title":923,"path":924,"stem":925},"Blob Storage Overview","\u002Fblob-storage\u002Foverview","08.blob-storage\u002F1.overview",{"title":927,"path":928,"stem":929,"children":930},"Payloads","\u002Fpayloads","09.payloads",[931,933],{"title":927,"path":928,"stem":932},"09.payloads\u002Findex",{"title":934,"path":935,"stem":936},"Payloads overview","\u002Fpayloads\u002Foverview","09.payloads\u002F1.overview",{"title":938,"path":939,"stem":940,"children":941},"Cve Watcher","\u002Fcve-watcher","10.cve-watcher",[942,945,949,953,957],{"title":943,"path":939,"stem":944},"CVE Watcher","10.cve-watcher\u002Findex",{"title":946,"path":947,"stem":948},"CVE Watcher Overview","\u002Fcve-watcher\u002Foverview","10.cve-watcher\u002F1.overview",{"title":950,"path":951,"stem":952},"CVE Watcher Search and Filters","\u002Fcve-watcher\u002Fsearch","10.cve-watcher\u002F2.search",{"title":954,"path":955,"stem":956},"CVE Watcher Push Notifications","\u002Fcve-watcher\u002Fnotifications","10.cve-watcher\u002F3.notifications",{"title":958,"path":959,"stem":960},"CVE Watcher API and Scopes","\u002Fcve-watcher\u002Fapi","10.cve-watcher\u002F4.api",{"title":962,"path":963,"stem":964,"children":965},"Developer","\u002Fdeveloper","11.developer",[966,968,972,976],{"title":962,"path":963,"stem":967},"11.developer\u002Findex",{"title":969,"path":970,"stem":971},"Developer Overview","\u002Fdeveloper\u002Foverview","11.developer\u002F1.overview",{"title":973,"path":974,"stem":975},"Personal Access Token Scopes","\u002Fdeveloper\u002Fscopes","11.developer\u002F2.scopes",{"title":977,"path":978,"stem":979},"Personal Access Tokens","\u002Fdeveloper\u002Fpersonal-access-tokens","11.developer\u002F3.personal-access-tokens",{"title":981,"path":982,"stem":983,"children":984},"Bh","\u002Fbh","12.bh",[985,988,992,996],{"title":986,"path":982,"stem":987},"BH CLI","12.bh\u002Findex",{"title":989,"path":990,"stem":991},"BH CLI Overview","\u002Fbh\u002Foverview","12.bh\u002F1.overview",{"title":993,"path":994,"stem":995},"BH CLI Commands","\u002Fbh\u002Fcommands","12.bh\u002F2.commands",{"title":997,"path":998,"stem":999},"BH CLI Examples","\u002Fbh\u002Fexamples","12.bh\u002F3.examples",{"title":1001,"path":1002,"stem":1003,"children":1004},"Billing","\u002Fbilling","13.billing",[1005,1007],{"title":1001,"path":1002,"stem":1006},"13.billing\u002Findex",{"title":1008,"path":1009,"stem":1010},"Billing Overview","\u002Fbilling\u002Foverview","13.billing\u002F1.overview",{"title":1012,"path":1013,"stem":1014,"children":1015},"Tools","\u002Ftools","14.tools",[1016,1018],{"title":1012,"path":1013,"stem":1017},"14.tools\u002Findex",{"title":1019,"path":1020,"stem":1021},"Cookie Lab","\u002Ftools\u002Fcookie-lab","14.tools\u002F1.cookie-lab",{"title":1023,"path":1024,"stem":1025,"children":1026},"Site Policies","\u002Fsite-policies","99.site-policies",[1027,1029,1042,1046,1050,1054,1058,1062,1066],{"title":1023,"path":1024,"stem":1028},"99.site-policies\u002Findex",{"title":1030,"path":1031,"stem":1032,"children":1033},"Privacy Policy","\u002Fsite-policies\u002Fprivacy-policy","99.site-policies\u002F1.privacy-policy",[1034,1038],{"title":1035,"path":1036,"stem":1037},"Company Processors","\u002Fsite-policies\u002Fprivacy-policy\u002Fcompany-processors","99.site-policies\u002Fprivacy-policy\u002F1.company-processors",{"title":1039,"path":1040,"stem":1041},"Data Export Instructions","\u002Fsite-policies\u002Fprivacy-policy\u002Fdata-export-instructions","99.site-policies\u002Fprivacy-policy\u002F2.data-export-instructions",{"title":1043,"path":1044,"stem":1045},"Terms of Service","\u002Fsite-policies\u002Fterms-of-service","99.site-policies\u002F2.terms-of-service",{"title":1047,"path":1048,"stem":1049},"California Resident Notice at Collection","\u002Fsite-policies\u002Fccpa","99.site-policies\u002F3.ccpa",{"title":1051,"path":1052,"stem":1053},"Cancellation Policy","\u002Fsite-policies\u002Fcancellation-policy","99.site-policies\u002F4.cancellation-policy",{"title":1055,"path":1056,"stem":1057},"Refund Policy","\u002Fsite-policies\u002Frefund-policy","99.site-policies\u002F5.refund-policy",{"title":1059,"path":1060,"stem":1061},"Taxes on Services","\u002Fsite-policies\u002Ftaxes-on-services","99.site-policies\u002F6.taxes-on-services",{"title":1063,"path":1064,"stem":1065},"Disclaimer","\u002Fsite-policies\u002Fdisclaimer","99.site-policies\u002F7.disclaimer",{"title":1067,"path":1068,"stem":1069,"children":1070},"Security","\u002Fsite-policies\u002Fsecurity","99.site-policies\u002Fsecurity\u002Findex",[1071,1072,1076],{"title":1067,"path":1068,"stem":1069},{"title":1073,"path":1074,"stem":1075},"Security Overview","\u002Fsite-policies\u002Fsecurity\u002Fsecurity-overview","99.site-policies\u002Fsecurity\u002F1.security-overview",{"title":1077,"path":1078,"stem":1079},"Security Response","\u002Fsite-policies\u002Fsecurity\u002Fsecurity-response","99.site-policies\u002Fsecurity\u002F2.security-response",1794410312376]