[{"data":1,"prerenderedAt":648},["ShallowReactive",2],{"page-\u002Fprojects\u002Foverview":3,"all-pages":327},{"id":4,"title":5,"body":6,"description":317,"extension":318,"meta":319,"navigation":320,"path":321,"robots":322,"seo":323,"sitemap":324,"stem":325,"__hash__":326},"content\u002F02.projects\u002F1.overview.md","Projects Overview",{"type":7,"value":8,"toc":310},"minimark",[9,14,25,81,155,197,201,281,285,306],[10,11,13],"h2",{"id":12},"the-object-model","The Object Model",[15,16,22],"pre",{"className":17,"code":19,"language":20,"meta":21},[18],"language-text","Project\n└── Workflow (e.g. \"recon\")\n    ├── Revision (every save creates one; scans pin a revision)\n    └── Scan (a dispatch of a workflow revision)\n        └── Run (one execution of a scan on a runner)\n            └── Artifacts (files handed between activities)\n","text","",[23,24,19],"code",{"__ignoreMap":21},[26,27,28,44,63],"ul",{},[29,30,31,35,36,39,40,43],"li",{},[32,33,34],"strong",{},"Project"," (",[23,37,38],{},"\u002Fu\u002F\u003Cyou>\u002Fprojects\u002F\u003Cproject>",") — owns everything: workflows,\ndatasets, vars\u002Fsecrets\u002FMCP config, and agent setup. Create one per target\nor program at ",[23,41,42],{},"\u002Fprojects\u002Fnew",".",[29,45,46,35,49,52,53,58,59,62],{},[32,47,48],{},"Workflow",[23,50,51],{},"...\u002Fworkflows\u002F\u003Cworkflow>",") — a saved\n",[54,55,57],"a",{"href":56},"\u002Fworkflows\u002Foverview","BHW definition",". Editing creates a new ",[32,60,61],{},"revision",";\ndispatches always run against a pinned revision, so a scan is reproducible.",[29,64,65,68,69,72,73,76,77,80],{},[32,66,67],{},"Scan"," — a dispatch of a workflow revision: manual\n(",[23,70,71],{},"trigger.dispatch","), scheduled (",[23,74,75],{},"trigger.cron","), or event-driven\n(",[23,78,79],{},"trigger.on(...)","). Dispatch manually from the workflow page or the CLI:",[15,82,86],{"className":83,"code":84,"language":85,"meta":21,"style":21},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bh scan dispatch --workflow-id \"\u003CWORKFLOW_ID>\" --scan-name \"nightly\" \\\n  --input-string \"domain=acme-example.com\" --input-bool \"aggressive=false\"\n","bash",[23,87,88,131],{"__ignoreMap":21},[89,90,93,97,101,104,107,111,114,117,120,122,125,127],"span",{"class":91,"line":92},"line",1,[89,94,96],{"class":95},"sBMFI","bh",[89,98,100],{"class":99},"sfazB"," scan",[89,102,103],{"class":99}," dispatch",[89,105,106],{"class":99}," --workflow-id",[89,108,110],{"class":109},"sMK4o"," \"",[89,112,113],{"class":99},"\u003CWORKFLOW_ID>",[89,115,116],{"class":109},"\"",[89,118,119],{"class":99}," --scan-name",[89,121,110],{"class":109},[89,123,124],{"class":99},"nightly",[89,126,116],{"class":109},[89,128,130],{"class":129},"sTEyZ"," \\\n",[89,132,134,137,139,142,144,147,149,152],{"class":91,"line":133},2,[89,135,136],{"class":99},"  --input-string",[89,138,110],{"class":109},[89,140,141],{"class":99},"domain=acme-example.com",[89,143,116],{"class":109},[89,145,146],{"class":99}," --input-bool",[89,148,110],{"class":109},[89,150,151],{"class":99},"aggressive=false",[89,153,154],{"class":109},"\"\n",[26,156,157,175],{},[29,158,159,35,162,165,166,169,170,174],{},[32,160,161],{},"Run",[23,163,164],{},"...\u002Fscans\u002F\u003Cscan>\u002Fruns\u002F\u003Cid>",", list at ",[23,167,168],{},"...\u002Fworkflows\u002F\u003Cworkflow>\u002Fruns",")\n— one execution of a scan on a ",[54,171,173],{"href":172},"\u002Frunners\u002Foverview","runner",". The run tree\nshows every activity and step with status, logs, and produced files.",[29,176,177,180,181,184,185,188,189,193,194,43],{},[32,178,179],{},"Artifacts"," — files handed between activities via\n",[23,182,183],{},"step.upload_artifact"," \u002F ",[23,186,187],{},"step.download_artifact"," (see\n",[54,190,192],{"href":191},"\u002Fworkflows\u002Fsteps#artifacts","Steps","). They belong to the run; control\nretention with ",[23,195,196],{},"expires_in = duration.days(7)",[10,198,200],{"id":199},"project-tabs","Project Tabs",[202,203,204,220],"table",{},[205,206,207],"thead",{},[208,209,210,214,217],"tr",{},[211,212,213],"th",{},"Tab",[211,215,216],{},"Purpose",[211,218,219],{},"Docs",[221,222,223,236,250,267],"tbody",{},[208,224,225,229,232],{},[226,227,228],"td",{},"Workflows",[226,230,231],{},"Definitions, revisions, scans, runs",[226,233,234],{},[54,235,228],{"href":56},[208,237,238,241,244],{},[226,239,240],{},"Datasets",[226,242,243],{},"Asset inventory accumulated across runs",[226,245,246],{},[54,247,249],{"href":248},"\u002Fdatasets\u002Foverview","Datasets guide",[208,251,252,255,261],{},[226,253,254],{},"Vars \u002F Secrets \u002F MCP",[226,256,257,258],{},"External configuration referenced via ",[23,259,260],{},"config.*",[226,262,263],{},[54,264,266],{"href":265},"\u002Fworkflows\u002Fconfig","Configuration",[208,268,269,272,275],{},[226,270,271],{},"Agent",[226,273,274],{},"Chat, providers, skills for this project",[226,276,277],{},[54,278,280],{"href":279},"\u002Fagent\u002Foverview","BH Agent",[10,282,284],{"id":283},"next-steps","Next Steps",[26,286,287,294,300],{},[29,288,289,293],{},[54,290,292],{"href":291},"\u002Fprojects\u002Fruns-artifacts","Runs & Artifacts",": Read results and pull files\nwith the CLI.",[29,295,296,299],{},[54,297,298],{"href":56},"Workflows Overview",": Write the automation itself.",[29,301,302,305],{},[54,303,304],{"href":172},"Runners",": Provide the compute runs execute on.",[307,308,309],"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);}",{"title":21,"searchDepth":311,"depth":312,"links":313},5,4,[314,315,316],{"id":12,"depth":133,"text":13},{"id":199,"depth":133,"text":200},{"id":283,"depth":133,"text":284},"Projects, workflows, scans, runs, and artifacts — the core BountyHub object model and how they fit together.","md",{},true,"\u002Fprojects\u002Foverview",null,{"title":5,"description":317},{"loc":321},"02.projects\u002F1.overview","ESL9xgn7sL90Pkfl33i8bZtAcJZoYbYewZ_s9K3kFzg",[328,386,397,414,447,460,472,483,494,505,529,548,568,579,590],{"title":228,"path":329,"stem":330,"children":331},"\u002Fworkflows","01.workflows",[332,334,338,340,344,347,351,355,359,363,367,371,375,378,382],{"title":228,"path":329,"stem":333},"01.workflows\u002Findex",{"title":335,"path":336,"stem":337},"Workflow Quick Reference","\u002Fworkflows\u002Fquick-reference","01.workflows\u002F00.quick-reference",{"title":298,"path":56,"stem":339},"01.workflows\u002F01.overview",{"title":341,"path":342,"stem":343},"Workflow Syntax Reference","\u002Fworkflows\u002Fsyntax-reference","01.workflows\u002F02.syntax-reference",{"title":192,"path":345,"stem":346},"\u002Fworkflows\u002Fsteps","01.workflows\u002F03.steps",{"title":348,"path":349,"stem":350},"Step Outputs","\u002Fworkflows\u002Fstep-outputs","01.workflows\u002F04.step-outputs",{"title":352,"path":353,"stem":354},"Concurrency","\u002Fworkflows\u002Fconcurrency","01.workflows\u002F05.concurrency",{"title":356,"path":357,"stem":358},"Transforms","\u002Fworkflows\u002Ftransforms","01.workflows\u002F06.transforms",{"title":360,"path":361,"stem":362},"For Each","\u002Fworkflows\u002Ffor-each","01.workflows\u002F07.for-each",{"title":364,"path":365,"stem":366},"Modules","\u002Fworkflows\u002Fmodules","01.workflows\u002F08.modules",{"title":368,"path":369,"stem":370},"Agents","\u002Fworkflows\u002Fagents","01.workflows\u002F09.agents",{"title":372,"path":373,"stem":374},"Decisions","\u002Fworkflows\u002Fdecisions","01.workflows\u002F10.decisions",{"title":376,"path":265,"stem":377},"Configuration References","01.workflows\u002F11.config",{"title":379,"path":380,"stem":381},"Comparison With Other Automation Systems","\u002Fworkflows\u002Fcomparison","01.workflows\u002F12.comparison",{"title":383,"path":384,"stem":385},"Generate with AI","\u002Fworkflows\u002Fai-generation","01.workflows\u002F13.ai-generation",{"title":387,"path":388,"stem":389,"children":390},"Projects","\u002Fprojects","02.projects",[391,394,395],{"title":392,"path":388,"stem":393},"Projects & Runs","02.projects\u002Findex",{"title":5,"path":321,"stem":325},{"title":292,"path":291,"stem":396},"02.projects\u002F2.runs-artifacts",{"title":304,"path":398,"stem":399,"children":400},"\u002Frunners","03.runners",[401,403,406,410],{"title":304,"path":398,"stem":402},"03.runners\u002Findex",{"title":404,"path":172,"stem":405},"Runner Overview","03.runners\u002F1.overview",{"title":407,"path":408,"stem":409},"Getting Started with Runners","\u002Frunners\u002Fgetting-started","03.runners\u002F2.getting-started",{"title":411,"path":412,"stem":413},"Custom Runner Images","\u002Frunners\u002Fcustom-image","03.runners\u002F3.custom-image",{"title":240,"path":415,"stem":416,"children":417},"\u002Fdatasets","04.datasets",[418,420,423,427,431,435,439,443],{"title":240,"path":415,"stem":419},"04.datasets\u002Findex",{"title":421,"path":248,"stem":422},"Datasets Overview","04.datasets\u002F1.overview",{"title":424,"path":425,"stem":426},"Dataset Schemas and Identity","\u002Fdatasets\u002Fschema","04.datasets\u002F2.schema",{"title":428,"path":429,"stem":430},"Pushing and Reading Dataset Rows","\u002Fdatasets\u002Fworkflows","04.datasets\u002F3.workflows",{"title":432,"path":433,"stem":434},"Dataset SQL Reference","\u002Fdatasets\u002Fsql","04.datasets\u002F4.sql",{"title":436,"path":437,"stem":438},"Dataset Structured Filters","\u002Fdatasets\u002Ffilters","04.datasets\u002F5.filters",{"title":440,"path":441,"stem":442},"Dataset Saved Views","\u002Fdatasets\u002Fviews","04.datasets\u002F6.views",{"title":444,"path":445,"stem":446},"Datasets API and CLI","\u002Fdatasets\u002Fapi-cli","04.datasets\u002F7.api-cli",{"title":271,"path":448,"stem":449,"children":450},"\u002Fagent","05.agent",[451,453,456],{"title":280,"path":448,"stem":452},"05.agent\u002Findex",{"title":454,"path":279,"stem":455},"BH Agent Overview","05.agent\u002F1.overview",{"title":457,"path":458,"stem":459},"MCP servers","\u002Fagent\u002Fmcp-servers","05.agent\u002F2.mcp-servers",{"title":461,"path":462,"stem":463,"children":464},"Bhlast","\u002Fbhlast","06.bhlast",[465,468],{"title":466,"path":462,"stem":467},"Bhlast Servers","06.bhlast\u002Findex",{"title":469,"path":470,"stem":471},"Bhlast servers overview","\u002Fbhlast\u002Foverview","06.bhlast\u002F1.overview",{"title":473,"path":474,"stem":475,"children":476},"Notifications","\u002Fnotifications","07.notifications",[477,479],{"title":473,"path":474,"stem":478},"07.notifications\u002Findex",{"title":480,"path":481,"stem":482},"Notifications Overview","\u002Fnotifications\u002Foverview","07.notifications\u002F1.overview",{"title":484,"path":485,"stem":486,"children":487},"Blob Storage","\u002Fblob-storage","08.blob-storage",[488,490],{"title":484,"path":485,"stem":489},"08.blob-storage\u002Findex",{"title":491,"path":492,"stem":493},"Blob Storage Overview","\u002Fblob-storage\u002Foverview","08.blob-storage\u002F1.overview",{"title":495,"path":496,"stem":497,"children":498},"Payloads","\u002Fpayloads","09.payloads",[499,501],{"title":495,"path":496,"stem":500},"09.payloads\u002Findex",{"title":502,"path":503,"stem":504},"Payloads overview","\u002Fpayloads\u002Foverview","09.payloads\u002F1.overview",{"title":506,"path":507,"stem":508,"children":509},"Cve Watcher","\u002Fcve-watcher","10.cve-watcher",[510,513,517,521,525],{"title":511,"path":507,"stem":512},"CVE Watcher","10.cve-watcher\u002Findex",{"title":514,"path":515,"stem":516},"CVE Watcher Overview","\u002Fcve-watcher\u002Foverview","10.cve-watcher\u002F1.overview",{"title":518,"path":519,"stem":520},"CVE Watcher Search and Filters","\u002Fcve-watcher\u002Fsearch","10.cve-watcher\u002F2.search",{"title":522,"path":523,"stem":524},"CVE Watcher Push Notifications","\u002Fcve-watcher\u002Fnotifications","10.cve-watcher\u002F3.notifications",{"title":526,"path":527,"stem":528},"CVE Watcher API and Scopes","\u002Fcve-watcher\u002Fapi","10.cve-watcher\u002F4.api",{"title":530,"path":531,"stem":532,"children":533},"Developer","\u002Fdeveloper","11.developer",[534,536,540,544],{"title":530,"path":531,"stem":535},"11.developer\u002Findex",{"title":537,"path":538,"stem":539},"Developer Overview","\u002Fdeveloper\u002Foverview","11.developer\u002F1.overview",{"title":541,"path":542,"stem":543},"Personal Access Token Scopes","\u002Fdeveloper\u002Fscopes","11.developer\u002F2.scopes",{"title":545,"path":546,"stem":547},"Personal Access Tokens","\u002Fdeveloper\u002Fpersonal-access-tokens","11.developer\u002F3.personal-access-tokens",{"title":549,"path":550,"stem":551,"children":552},"Bh","\u002Fbh","12.bh",[553,556,560,564],{"title":554,"path":550,"stem":555},"BH CLI","12.bh\u002Findex",{"title":557,"path":558,"stem":559},"BH CLI Overview","\u002Fbh\u002Foverview","12.bh\u002F1.overview",{"title":561,"path":562,"stem":563},"BH CLI Commands","\u002Fbh\u002Fcommands","12.bh\u002F2.commands",{"title":565,"path":566,"stem":567},"BH CLI Examples","\u002Fbh\u002Fexamples","12.bh\u002F3.examples",{"title":569,"path":570,"stem":571,"children":572},"Billing","\u002Fbilling","13.billing",[573,575],{"title":569,"path":570,"stem":574},"13.billing\u002Findex",{"title":576,"path":577,"stem":578},"Billing Overview","\u002Fbilling\u002Foverview","13.billing\u002F1.overview",{"title":580,"path":581,"stem":582,"children":583},"Tools","\u002Ftools","14.tools",[584,586],{"title":580,"path":581,"stem":585},"14.tools\u002Findex",{"title":587,"path":588,"stem":589},"Cookie Lab","\u002Ftools\u002Fcookie-lab","14.tools\u002F1.cookie-lab",{"title":591,"path":592,"stem":593,"children":594},"Site Policies","\u002Fsite-policies","99.site-policies",[595,597,610,614,618,622,626,630,634],{"title":591,"path":592,"stem":596},"99.site-policies\u002Findex",{"title":598,"path":599,"stem":600,"children":601},"Privacy Policy","\u002Fsite-policies\u002Fprivacy-policy","99.site-policies\u002F1.privacy-policy",[602,606],{"title":603,"path":604,"stem":605},"Company Processors","\u002Fsite-policies\u002Fprivacy-policy\u002Fcompany-processors","99.site-policies\u002Fprivacy-policy\u002F1.company-processors",{"title":607,"path":608,"stem":609},"Data Export Instructions","\u002Fsite-policies\u002Fprivacy-policy\u002Fdata-export-instructions","99.site-policies\u002Fprivacy-policy\u002F2.data-export-instructions",{"title":611,"path":612,"stem":613},"Terms of Service","\u002Fsite-policies\u002Fterms-of-service","99.site-policies\u002F2.terms-of-service",{"title":615,"path":616,"stem":617},"California Resident Notice at Collection","\u002Fsite-policies\u002Fccpa","99.site-policies\u002F3.ccpa",{"title":619,"path":620,"stem":621},"Cancellation Policy","\u002Fsite-policies\u002Fcancellation-policy","99.site-policies\u002F4.cancellation-policy",{"title":623,"path":624,"stem":625},"Refund Policy","\u002Fsite-policies\u002Frefund-policy","99.site-policies\u002F5.refund-policy",{"title":627,"path":628,"stem":629},"Taxes on Services","\u002Fsite-policies\u002Ftaxes-on-services","99.site-policies\u002F6.taxes-on-services",{"title":631,"path":632,"stem":633},"Disclaimer","\u002Fsite-policies\u002Fdisclaimer","99.site-policies\u002F7.disclaimer",{"title":635,"path":636,"stem":637,"children":638},"Security","\u002Fsite-policies\u002Fsecurity","99.site-policies\u002Fsecurity\u002Findex",[639,640,644],{"title":635,"path":636,"stem":637},{"title":641,"path":642,"stem":643},"Security Overview","\u002Fsite-policies\u002Fsecurity\u002Fsecurity-overview","99.site-policies\u002Fsecurity\u002F1.security-overview",{"title":645,"path":646,"stem":647},"Security Response","\u002Fsite-policies\u002Fsecurity\u002Fsecurity-response","99.site-policies\u002Fsecurity\u002F2.security-response",1794410312376]