[{"data":1,"prerenderedAt":1679},["ShallowReactive",2],{"navigation":3,"page:\u002Fpanel\u002Fbuilder":1019,"surround:\u002Fpanel\u002Fbuilder":1672},[4,21,82,133,154,1010],[5,6,7,8],"Getting started","\u002Fgetting-started","i-lucide-rocket",[9,12,15,18],[10,6,11,11],"What Kaabist is",0,[13,14,11,11],"API keys and modes","keys-and-modes",[16,17,11,11],"Your first job","first-job",[19,20,11,11],"Understanding the envelope","envelope",[22,23,24,25],"Concepts","\u002Fconcepts","i-lucide-book-open",[26,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79],[27,23,11,11],"Overview",[29,30,11,11],"Programs and versions","programs-and-versions",[32,33,11,11],"Tiers and escalation","tiers-and-escalation",[35,36,11,11],"The http tier","http-tier",[38,39,11,11],"The browser tier","browser-tier",[41,42,11,11],"Sessions","sessions",[44,45,11,11],"Human in the loop","human-in-the-loop",[47,48,11,11],"How healing works","self-healing",[50,51,11,11],"Obstacles and captchas","obstacles",[53,54,11,11],"Validation and warnings","validation-and-warnings",[56,57,11,11],"Credits and billing","credits-and-billing",[59,60,11,11],"Limits","limits",[62,63,11,11],"Locators","locators",[65,66,11,11],"Snapshots","snapshots",[68,69,11,11],"Egress and proxies","egress-and-proxies",[71,72,11,11],"Queueing and fairness","queueing",[74,75,11,11],"Accounts, organisations and roles","accounts-and-roles",[77,78,11,11],"Data retention","data-retention",[80,81,11,11],"Documents and PDFs","documents-and-pdfs",[83,84,85,86],"Guides","\u002Fguides","i-lucide-map",[87,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130],[27,84,11,11],[89,90,11,11],"Authenticated flows","authenticated-flows",[92,93,11,11],"Hosted resolve pages","hosted-resolve",[95,96,11,11],"Lists and pagination","lists-and-pagination",[98,99,11,11],"JSON and network locators","json-and-network-locators",[101,102,11,11],"Schedules and change detection","schedules-and-change-detection",[104,105,11,11],"Webhooks","webhooks",[107,108,11,11],"Bring your own providers","byo-providers",[110,111,11,11],"Testing: replay, dry-run and test mode","testing",[113,114,11,11],"Side-effect safety","side-effect-safety",[116,117,11,11],"Security & data handling","security-and-data",[119,120,11,11],"Migrating from other tools","migrating",[122,123,11,11],"Drift detection and canaries","drift-and-canaries",[125,126,11,11],"SDKs","sdks",[128,129,11,11],"The kaab CLI","cli",[131,132,11,11],"Coding agents (MCP)","mcp",[134,135,136,137],"Panel","\u002Fpanel","i-lucide-layout-dashboard",[138,139,142,145,148,151],[27,135,11,11],[140,141,11,11],"The program builder","builder",[143,144,11,11],"Picking and recording","picking-and-recording",[146,147,11,11],"Taking over a job","takeover",[149,150,11,11],"Getting help","support",[152,153,11,11],"Referrals","referrals",[155,156,157,158],"Reference","\u002Freference","i-lucide-library",[159,160,520,834,837,840,1006,1007],[27,156,11,11],[161,162,11,163],"API","api",[164,166,169,212,222,274,297,316,347,376,389,396,403,410,426,447,454],[27,165,11,11],"\u002Freference\u002Fapi",[167,168,11,11],"Interactive reference","explorer",[170,171,11,172],"Jobs","jobs",[173,176,179,182,185,188,191,194,197,200,203,206,209],[174,175,11,11],"Create job","create-job",[177,178,11,11],"List jobs","list-jobs",[180,181,11,11],"Create job batch","create-job-batch",[183,184,11,11],"Estimate job","estimate-job",[186,187,11,11],"Get job","get-job",[189,190,11,11],"List job steps","list-job-steps",[192,193,11,11],"Get job snapshot","get-job-snapshot",[195,196,11,11],"Get job screenshot","get-job-screenshot",[198,199,11,11],"Get job artifact","get-job-artifact",[201,202,11,11],"Submit job input","submit-job-input",[204,205,11,11],"Resume job","resume-job",[207,208,11,11],"Takeover job","takeover-job",[210,211,11,11],"Cancel job","cancel-job",[213,214,11,215],"Batches","batches",[216,219],[217,218,11,11],"Get batch","get-batch",[220,221,11,11],"List batch jobs","list-batch-jobs",[223,224,11,225],"Programs","programs",[226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271],[227,228,11,11],"Create program","create-program",[230,231,11,11],"List programs","list-programs",[233,234,11,11],"Lint program","lint-program",[236,237,11,11],"Get program","get-program",[239,240,11,11],"Update program","update-program",[242,243,11,11],"Delete program","delete-program",[245,246,11,11],"List program versions","list-program-versions",[248,249,11,11],"Create program version","create-program-version",[251,252,11,11],"Update program version","update-program-version",[254,255,11,11],"Delete program version","delete-program-version",[257,258,11,11],"Get program version","get-program-version",[260,261,11,11],"Publish program version","publish-program-version",[263,264,11,11],"Diff program version","diff-program-version",[266,267,11,11],"Replay program version","replay-program-version",[269,270,11,11],"Set program alias","set-program-alias",[272,273,11,11],"Delete program alias","delete-program-alias",[41,42,11,275],[276,279,282,285,288,291,294],[277,278,11,11],"Create session","create-session",[280,281,11,11],"List sessions","list-sessions",[283,284,11,11],"Get session","get-session",[286,287,11,11],"Update session","update-session",[289,290,11,11],"Delete session","delete-session",[292,293,11,11],"Verify session","verify-session",[295,296,11,11],"Refresh session","refresh-session",[298,299,11,300],"Proposals","proposals",[301,304,307,310,313],[302,303,11,11],"List proposals","list-proposals",[305,306,11,11],"Get proposal","get-proposal",[308,309,11,11],"Approve proposal","approve-proposal",[311,312,11,11],"Reject proposal","reject-proposal",[314,315,11,11],"Edit proposal","edit-proposal",[317,318,11,319],"Schedules","schedules",[320,323,326,329,332,335,338,341,344],[321,322,11,11],"Create schedule","create-schedule",[324,325,11,11],"List schedules","list-schedules",[327,328,11,11],"Get schedule","get-schedule",[330,331,11,11],"Update schedule","update-schedule",[333,334,11,11],"Delete schedule","delete-schedule",[336,337,11,11],"Pause schedule","pause-schedule",[339,340,11,11],"Resume schedule","resume-schedule",[342,343,11,11],"List schedule runs","list-schedule-runs",[345,346,11,11],"Get schedule run diff","get-schedule-run-diff",[104,105,11,348],[349,352,355,358,361,364,367,370,373],[350,351,11,11],"Create webhook","create-webhook",[353,354,11,11],"List webhooks","list-webhooks",[356,357,11,11],"Get webhook","get-webhook",[359,360,11,11],"Update webhook","update-webhook",[362,363,11,11],"Delete webhook","delete-webhook",[365,366,11,11],"Rotate webhook secret","rotate-webhook-secret",[368,369,11,11],"List webhook deliveries","list-webhook-deliveries",[371,372,11,11],"Resend webhook delivery","resend-webhook-delivery",[374,375,11,11],"Test webhook","test-webhook",[377,378,11,379],"Organisation","org",[380,383,386],[381,382,11,11],"Rotate org webhook secret","rotate-org-webhook-secret",[384,385,11,11],"Get org","get-org",[387,388,11,11],"Request data deletion","request-data-deletion",[390,391,11,392],"Credits","credits",[393],[394,395,11,11],"Get credits","get-credits",[397,398,11,399],"Ledger","ledger",[400],[401,402,11,11],"List ledger entries","list-ledger-entries",[404,405,11,406],"Usage","usage",[407],[408,409,11,11],"Get usage","get-usage",[411,412,11,413],"API keys","api-keys",[414,417,420,423],[415,416,11,11],"List API keys","list-api-keys",[418,419,11,11],"Create API key","create-api-key",[421,422,11,11],"Rotate API key","rotate-api-key",[424,425,11,11],"Revoke API key","revoke-api-key",[427,108,11,428],"BYO providers",[429,432,435,438,441,444],[430,431,11,11],"List BYO providers","list-byo-providers",[433,434,11,11],"Create BYO provider","create-byo-provider",[436,437,11,11],"Get BYO provider","get-byo-provider",[439,440,11,11],"Update BYO provider","update-byo-provider",[442,443,11,11],"Delete BYO provider","delete-byo-provider",[445,446,11,11],"Test BYO provider","test-byo-provider",[448,449,11,450],"Sites","sites",[451],[452,453,11,11],"Get site profile","get-site-profile",[455,456,11,457],"Objects","schemas",[458,460,463,466,469,470,473,476,479,482,485,487,490,493,496,499,502,505,508,511,514,517],[27,459,11,11],"\u002Freference\u002Fapi\u002Fschemas",[461,462,11,11],"ApiKey","api-key",[464,465,11,11],"Batch","batch",[467,468,11,11],"ByoProvider","byo-provider",[390,391,11,11],[471,472,11,11],"ErrorResponse","error-response",[474,475,11,11],"ExtractSchema","extract-schema",[477,478,11,11],"Job","job",[480,481,11,11],"LedgerEntry","ledger-entry",[483,484,11,11],"LintResult","lint-result",[486,378,11,11],"Org",[488,489,11,11],"Program","program",[491,492,11,11],"ProgramDefinition","program-definition",[494,495,11,11],"ProgramVersion","program-version",[497,498,11,11],"Proposal","proposal",[500,501,11,11],"Schedule","schedule",[503,504,11,11],"Session","session",[506,507,11,11],"SiteProfile","site-profile",[509,510,11,11],"StepRecord","step-record",[512,513,11,11],"Webhook","webhook",[515,516,11,11],"WebhookDelivery","webhook-delivery",[518,519,11,11],"WebhookEvent","webhook-event",[521,522,11,523],"DSL","dsl",[524,526,529,532,535,538,603,637,640,751,754,756],[27,525,11,11],"\u002Freference\u002Fdsl",[527,528,11,11],"Inputs","inputs",[530,531,11,11],"Options","options",[533,534,11,11],"Policies","policies",[536,537,11,11],"Steps","steps",[539,540,11,541],"Actions","actions",[542,544,546,548,550,552,554,556,558,560,562,565,568,570,573,575,577,579,582,585,587,589,591,594,596,598,600],[27,543,11,11],"\u002Freference\u002Fdsl\u002Factions",[545,545,11,11],"fill",[547,547,11,11],"click",[549,549,11,11],"press",[551,551,11,11],"hover",[553,553,11,11],"select",[555,555,11,11],"check",[557,557,11,11],"uncheck",[559,559,11,11],"upload",[561,561,11,11],"scroll",[563,564,11,11],"wait_for","wait-for",[566,567,11,11],"set_session","set-session",[569,569,11,11],"extract",[571,572,11,11],"capture_response","capture-response",[574,574,11,11],"evaluate",[576,576,11,11],"paginate",[578,578,11,11],"download",[580,581,11,11],"read_pdf","read-pdf",[583,584,11,11],"set_vars","set-vars",[586,586,11,11],"sleep",[588,588,11,11],"reload",[590,590,11,11],"goto",[592,593,11,11],"await_input","await-input",[595,595,11,11],"checkpoint",[597,597,11,11],"screenshot",[599,599,11,11],"when",[601,602,11,11],"loop_until","loop-until",[604,605,11,606],"Conditions","conditions",[607,609,611,613,615,617,619,621,623,625,627,629,631,633,635],[27,608,11,11],"\u002Freference\u002Fdsl\u002Fconditions",[610,610,11,11],"url",[612,612,11,11],"title",[614,614,11,11],"visible",[616,616,11,11],"hidden",[618,618,11,11],"exists",[620,620,11,11],"absent",[622,622,11,11],"text",[624,624,11,11],"count",[626,626,11,11],"network",[628,628,11,11],"var",[630,630,11,11],"landmark",[632,632,11,11],"all",[634,634,11,11],"any",[636,636,11,11],"not",[638,639,11,11],"Targets","targets",[641,642,11,643],"Fields","fields",[644,646,649,651,654,656,659,661,663,666,668,671,672,674,677,679,681,683,685,687,690,693,695,698,701,703,704,707,709,712,714,716,718,720,722,724,726,728,731,733,734,736,738,740,743,745,747,749],[27,645,11,11],"\u002Freference\u002Fdsl\u002Ffields",[647,648,11,11],"allow_suffix","allow-suffix",[650,650,11,11],"attr",[652,653,11,11],"base_url","base-url",[655,655,11,11],"candidates",[657,658,11,11],"case_insensitive","case-insensitive",[660,660,11,11],"country",[662,662,11,11],"currency",[664,665,11,11],"date_format","date-format",[667,667,11,11],"decimal",[669,670,11,11],"false_values","false-values",[642,642,11,11],[673,673,11,11],"flags",[675,676,11,11],"follow_redirects","follow-redirects",[678,678,11,11],"frame",[680,680,11,11],"json",[682,682,11,11],"locale",[684,684,11,11],"many",[686,686,11,11],"max",[688,689,11,11],"max_items","max-items",[691,692,11,11],"max_length","max-length",[694,694,11,11],"min",[696,697,11,11],"min_items","min-items",[699,700,11,11],"min_length","min-length",[702,702,11,11],"name",[626,626,11,11],[705,706,11,11],"null_markers","null-markers",[708,708,11,11],"nullable",[710,711,11,11],"on_invalid","on-invalid",[713,713,11,11],"pattern",[715,715,11,11],"presence",[717,717,11,11],"regex",[719,719,11,11],"required",[721,721,11,11],"role",[723,723,11,11],"sample",[725,725,11,11],"selector",[727,727,11,11],"source",[729,730,11,11],"strip_fragment","strip-fragment",[732,732,11,11],"testid",[622,622,11,11],[735,735,11,11],"thousands",[737,737,11,11],"timezone",[739,739,11,11],"transforms",[741,742,11,11],"true_values","true-values",[744,744,11,11],"type",[746,746,11,11],"unique",[748,748,11,11],"values",[750,750,11,11],"xpath",[752,753,11,11],"Assertions","assertions",[755,739,11,11],"Transforms",[757,758,11,759],"Lint codes","lint",[760,762,765,768,771,774,777,780,783,786,789,792,795,798,801,804,807,810,813,816,819,822,825,828,831],[27,761,11,11],"\u002Freference\u002Fdsl\u002Flint",[763,764,11,11],"E001","e001",[766,767,11,11],"E002","e002",[769,770,11,11],"E003","e003",[772,773,11,11],"E004","e004",[775,776,11,11],"E005","e005",[778,779,11,11],"E006","e006",[781,782,11,11],"E007","e007",[784,785,11,11],"E008","e008",[787,788,11,11],"E009","e009",[790,791,11,11],"E010","e010",[793,794,11,11],"E011","e011",[796,797,11,11],"E012","e012",[799,800,11,11],"E013","e013",[802,803,11,11],"E014","e014",[805,806,11,11],"W001","w001",[808,809,11,11],"W002","w002",[811,812,11,11],"W003","w003",[814,815,11,11],"W004","w004",[817,818,11,11],"W005","w005",[820,821,11,11],"W006","w006",[823,824,11,11],"W007","w007",[826,827,11,11],"W008","w008",[829,830,11,11],"W009","w009",[832,833,11,11],"W010","w010",[835,836,11,11],"Codes","codes",[838,839,11,11],"Events","events",[841,129,11,842],"CLI",[843,845,847,850,853,856,859,862,865,868,871,874,877,880,883,886,889,892,895,898,901,904,907,910,913,916,919,922,925,928,931,934,937,940,943,946,949,952,955,958,961,964,967,970,973,976,979,982,985,988,991,994,997,1000,1003],[27,844,11,11],"\u002Freference\u002Fcli",[846,846,11,11],"kaab",[848,849,11,11],"kaab auth","kaab-auth",[851,852,11,11],"kaab auth login","kaab-auth-login",[854,855,11,11],"kaab auth logout","kaab-auth-logout",[857,858,11,11],"kaab auth status","kaab-auth-status",[860,861,11,11],"kaab completion","kaab-completion",[863,864,11,11],"kaab completion bash","kaab-completion-bash",[866,867,11,11],"kaab completion fish","kaab-completion-fish",[869,870,11,11],"kaab completion powershell","kaab-completion-powershell",[872,873,11,11],"kaab completion zsh","kaab-completion-zsh",[875,876,11,11],"kaab credits","kaab-credits",[878,879,11,11],"kaab jobs","kaab-jobs",[881,882,11,11],"kaab jobs cancel","kaab-jobs-cancel",[884,885,11,11],"kaab jobs get","kaab-jobs-get",[887,888,11,11],"kaab jobs input","kaab-jobs-input",[890,891,11,11],"kaab jobs list","kaab-jobs-list",[893,894,11,11],"kaab jobs resume","kaab-jobs-resume",[896,897,11,11],"kaab jobs run","kaab-jobs-run",[899,900,11,11],"kaab jobs snapshot","kaab-jobs-snapshot",[902,903,11,11],"kaab jobs steps","kaab-jobs-steps",[905,906,11,11],"kaab jobs takeover","kaab-jobs-takeover",[908,909,11,11],"kaab open","kaab-open",[911,912,11,11],"kaab open job","kaab-open-job",[914,915,11,11],"kaab programs","kaab-programs",[917,918,11,11],"kaab programs alias","kaab-programs-alias",[920,921,11,11],"kaab programs alias set","kaab-programs-alias-set",[923,924,11,11],"kaab programs diff","kaab-programs-diff",[926,927,11,11],"kaab programs lint","kaab-programs-lint",[929,930,11,11],"kaab programs list","kaab-programs-list",[932,933,11,11],"kaab programs pull","kaab-programs-pull",[935,936,11,11],"kaab programs push","kaab-programs-push",[938,939,11,11],"kaab proposals","kaab-proposals",[941,942,11,11],"kaab proposals approve","kaab-proposals-approve",[944,945,11,11],"kaab proposals list","kaab-proposals-list",[947,948,11,11],"kaab proposals reject","kaab-proposals-reject",[950,951,11,11],"kaab proposals show","kaab-proposals-show",[953,954,11,11],"kaab schedules","kaab-schedules",[956,957,11,11],"kaab schedules create","kaab-schedules-create",[959,960,11,11],"kaab schedules list","kaab-schedules-list",[962,963,11,11],"kaab schedules pause","kaab-schedules-pause",[965,966,11,11],"kaab schedules resume","kaab-schedules-resume",[968,969,11,11],"kaab schedules runs","kaab-schedules-runs",[971,972,11,11],"kaab sessions","kaab-sessions",[974,975,11,11],"kaab sessions create","kaab-sessions-create",[977,978,11,11],"kaab sessions delete","kaab-sessions-delete",[980,981,11,11],"kaab sessions list","kaab-sessions-list",[983,984,11,11],"kaab sessions verify","kaab-sessions-verify",[986,987,11,11],"kaab usage","kaab-usage",[989,990,11,11],"kaab version","kaab-version",[992,993,11,11],"kaab webhooks","kaab-webhooks",[995,996,11,11],"kaab webhooks create","kaab-webhooks-create",[998,999,11,11],"kaab webhooks deliveries","kaab-webhooks-deliveries",[1001,1002,11,11],"kaab webhooks list","kaab-webhooks-list",[1004,1005,11,11],"kaab webhooks test","kaab-webhooks-test",[125,126,11,11],[1008,1009,11,11],"Plans and pricing","plans",[1011,1012,1013,1014],"Changelog","\u002Fchangelog","i-lucide-history",[1015,1016],[27,1012,11,11],[1017,1018,11,11],"Deprecations","deprecations",{"id":1020,"title":140,"body":1021,"breaking":1662,"date":1663,"description":1664,"extension":1665,"generated":1662,"meta":1666,"navigation":1667,"path":1668,"seo":1669,"stem":1670,"version":1663,"__hash__":1671},"docs\u002F4.panel\u002F02.builder.md",{"type":1022,"value":1023,"toc":1650},"minimark",[1024,1034,1039,1055,1059,1066,1093,1099,1153,1177,1181,1200,1203,1216,1220,1244,1249,1252,1272,1290,1294,1316,1320,1329,1332,1457,1461,1464,1561,1582,1586,1618,1621,1646],[1025,1026,1027,1028,1033],"p",{},"The program builder edits one program as two views of the same document: a step list and the\nprogram's JSON, side by side. It records what you do in a real browser, picks fields on live and\nstored pages, test-runs the draft and publishes it, without a builder-only format: what it saves\nis the same ",[1029,1030,1032],"a",{"href":1031},"\u002Fconcepts\u002Fprograms-and-versions","program JSON"," the API stores.",[1035,1036,1038],"h2",{"id":1037},"when-to-use-it","When to use it",[1025,1040,1041,1042,1045,1046,1050,1051,1054],{},"Use the builder to create a program from a site you can see, to try a change against a real page\nbefore publishing it, and to fix a program a proposal could not. If you keep programs as files in\na repository, edit them there and push them with the ",[1029,1043,841],{"href":1044},"\u002Fguides\u002Fcli","; the builder's ",[1047,1048,1049],"strong",{},"Export","\nand ",[1047,1052,1053],{},"Import"," move a definition between the two.",[1035,1056,1058],{"id":1057},"the-screen","The screen",[1025,1060,1061,1062,1065],{},"Open it from a program's page with ",[1047,1063,1064],{},"Open builder",".",[1025,1067,1068,1071,1072,1076,1077,1080,1081,1083,1084,1083,1086,1050,1089,1092],{},[1047,1069,1070],{},"The header"," shows the program's name, a badge for the version you are editing (",[1073,1074,1075],"em",{},"draft vN",", or\n",[1073,1078,1079],{},"new draft",") and the save state: \"Saved\", \"Unsaved changes\", \"Saving…\", or \"Saved locally: fix\nlint errors to save the draft\". On the right: undo, redo, ",[1047,1082,1049],{},", ",[1047,1085,1053],{},[1047,1087,1088],{},"Save draft",[1047,1090,1091],{},"Publish",", which stays disabled until the draft lints clean. If someone publishes a version\nwhile you edit, a warning says so.",[1025,1094,1095,1098],{},[1047,1096,1097],{},"The left column"," has four tabs:",[1100,1101,1102,1138,1143,1148],"ul",{},[1103,1104,1105,1107,1108,1083,1111,1113,1114,1118,1119,1122,1123,1126,1127,1083,1130,1133,1134,1137],"li",{},[1047,1106,536],{},": the program as cards, one per step, each with a drag handle, a summary and badges\n(",[1073,1109,1110],{},"side effect",[1073,1112,595],{},", the ",[1115,1116,1117],"code",{},"expect",", the number of lint findings). A ",[1047,1120,1121],{},"+"," between two\ncards adds a step from a menu grouped into Navigate, Interact, Wait, Data, Session & input,\nControl and Other. An open card shows the action's form and, under ",[1047,1124,1125],{},"Step settings",", the step's\nid, name, timeout, what to do on error, and the ",[1073,1128,1129],{},"Side effect",[1073,1131,1132],{},"Optional"," and ",[1073,1135,1136],{},"Retry"," settings.",[1103,1139,1140,1142],{},[1047,1141,527],{},": each input with its type, whether it is required or may be stored, its default,\ndescription and limits.",[1103,1144,1145,1147],{},[1047,1146,530],{},": the starting and highest tier (the highest your plan allows is shown), credit, step\nand duration limits, region, locale, time zone, viewport, asset blocking, cache, session and\nproxy.",[1103,1149,1150,1152],{},[1047,1151,533],{},": strict mode, raw values, what to do on an expired session or a captcha, and when\nto keep screenshots.",[1025,1154,1155,1158,1159,1162,1163,1166,1167,1083,1170,1133,1173,1176],{},[1047,1156,1157],{},"The right column"," has five tabs: ",[1047,1160,1161],{},"JSON"," (an editor of the whole program), ",[1047,1164,1165],{},"Lint"," with the\nnumber of findings, ",[1047,1168,1169],{},"Browser",[1047,1171,1172],{},"Stored page",[1047,1174,1175],{},"Test",". It widens for the browser tabs and\ncan take the full width.",[1035,1178,1180],{"id":1179},"steps-inputs-options-and-policies","Steps, inputs, options and policies",[1025,1182,1183,1184,1083,1186,1083,1188,1190,1191,1193,1194,1196,1197,1199],{},"Every action of the program language has a form: targets with their ranked candidates and a\nuniqueness check against the page you have open, conditions built from parts (",[1115,1185,632],{},[1115,1187,634],{},[1115,1189,636],{},",\nlandmarks), extract fields with types, parse settings, constraints and transforms. ",[1115,1192,599],{}," and\n",[1115,1195,601],{}," show their blocks as lanes; ",[1115,1198,576],{}," shows the fields it extracts on every page.",[1025,1201,1202],{},"Whatever you change in one view shows in the other at once. JSON that does not parse is pointed out\nby line, and the step list keeps showing the last valid version until it parses again.",[1025,1204,1205,1206,1208,1209,1083,1212,1215],{},"Lint runs as you type. ",[1047,1207,1165],{}," lists each finding with its code, message and path, and clicking one\nopens that step; \"The program lints clean.\" when there is nothing. Errors block publishing;\nwarnings say what they mean. Undo and redo cover both views (",[1115,1210,1211],{},"Ctrl+Z",[1115,1213,1214],{},"Ctrl+Shift+Z","). Your work is\nkept in the browser as you go, and saved to the server as the program's draft version after 30\nseconds without an edit, whenever it lints.",[1035,1217,1219],{"id":1218},"recording-and-picking","Recording and picking",[1025,1221,1222,1224,1225,1228,1229,1231,1232,1235,1236,1239,1240,1065],{},[1047,1223,1169],{}," opens the page in a real browser in the cloud, going out through the same network as a\nrun of the program. In ",[1073,1226,1227],{},"Navigate"," mode what you do is recorded as steps: the recorder proposes\nchecks (",[1115,1230,1117],{},") to add, asks you to declare secret inputs for passwords (which are never\nrecorded) and offers to ask for one-time codes when the program runs. In ",[1073,1233,1234],{},"Pick"," mode, a click fills\nin the target or the field you asked to pick; ",[1047,1237,1238],{},"select similar"," turns one item of a list into a\nlist field. See ",[1029,1241,1243],{"href":1242},"\u002Fpanel\u002Fpicking-and-recording","picking and recording",[1025,1245,1246,1248],{},[1047,1247,1172],{}," does the same on a page a test run kept, with nothing on it running: extraction can\nbe tried there instantly in your browser, and on the server for the authoritative answer.",[1035,1250,1251],{"id":111},"Testing",[1025,1253,1254,1256,1257,1083,1260,1263,1264,1267,1268,1271],{},[1047,1255,1175],{}," runs the draft as it is now, for free, against your daily test quota: ",[1047,1258,1259],{},"Run all",[1047,1261,1262],{},"Run to\nhere"," (stop after the selected step) and ",[1047,1265,1266],{},"Run step"," (from the last checkpoint before it). The\n",[1047,1269,1270],{},"Dry run"," switch stops before the first step marked as a side effect. The tab also holds a\ntest value for each of the program's inputs.",[1025,1273,1274,1275,1083,1278,1281,1282,1285,1286,1289],{},"The timeline shows each step's status, duration and badges (",[1073,1276,1277],{},"healed",[1073,1279,1280],{},"obstacle","); open a step to see\nits screenshot and ",[1047,1283,1284],{},"Use this page in the picker",". When the run asks for a value, the timeline says\nwhat it is waiting for and offers ",[1047,1287,1288],{},"Send","; when it needs a person, it offers a takeover; when it\nsucceeds, the data appears below.",[1035,1291,1293],{"id":1292},"staying-signed-in","Staying signed in",[1025,1295,1296,1297,1299,1300,1303,1304,1307,1308,1311,1312,1315],{},"A program that signs in can keep the session: end the sign-in with a ",[1047,1298,595],{}," that saves a\nsession (",[1115,1301,1302],{},"save_session","), and set ",[1047,1305,1306],{},"Options → Session"," to that name with ",[1047,1309,1310],{},"Resume from the stored\nsession"," on. Later runs start after the checkpoint while the session works. If the site has ended\nit, the first page lands on its login form; the run notices and signs in again from the first step,\nwhich saves the session anew. Declare the program's ",[1115,1313,1314],{},"login_page"," landmark (a condition that holds\non the login form) so this works on sites whose login page has no telling URL.",[1035,1317,1319],{"id":1318},"publishing","Publishing",[1025,1321,1322,1324,1325,1328],{},[1047,1323,1091],{}," opens \"Publish a new version\": the lint result, what changed since the current version,\nwhat a run costs and the tier it starts at, which fields still lack ground truth, a notes field,\nand checkboxes to move other aliases (say, ",[1115,1326,1327],{},"production",") to the new version too. Each program page\nlists its versions, their diffs and its aliases.",[1025,1330,1331],{},"The same alias move from code:",[1333,1334,1335],"code-group",{},[1336,1337,1343],"pre",{"className":1338,"code":1339,"filename":1340,"language":1341,"meta":1342,"style":1342},"language-ts shiki shiki-themes kaab-code kaab-code kaab-code","\u002F\u002F `production` moves only when you say so: here it stays on version 1.\nconst aliased = await kaab.programs.aliases.set(program.id, \"production\", { version: 1 });\nconsole.log(`aliases: ${JSON.stringify(aliased.aliases)}`);\n","TypeScript","ts","",[1115,1344,1345,1354,1418],{"__ignoreMap":1342},[1346,1347,1350],"span",{"class":1348,"line":1349},"line",1,[1346,1351,1353],{"class":1352},"sKog0","\u002F\u002F `production` moves only when you say so: here it stays on version 1.\n",[1346,1355,1357,1361,1365,1368,1371,1374,1377,1379,1381,1384,1387,1391,1393,1396,1400,1404,1406,1409,1412,1415],{"class":1348,"line":1356},2,[1346,1358,1360],{"class":1359},"sqn18","const",[1346,1362,1364],{"class":1363},"sHJIl"," aliased",[1346,1366,1367],{"class":1359}," =",[1346,1369,1370],{"class":1359}," await",[1346,1372,1373],{"class":1363}," kaab",[1346,1375,1065],{"class":1376},"sJugJ",[1346,1378,224],{"class":1363},[1346,1380,1065],{"class":1376},[1346,1382,1383],{"class":1363},"aliases",[1346,1385,1386],{"class":1376},".set",[1346,1388,1390],{"class":1389},"sTzsn","(",[1346,1392,489],{"class":1363},[1346,1394,1395],{"class":1389},".id",[1346,1397,1399],{"class":1398},"sQm2-",",",[1346,1401,1403],{"class":1402},"suOy4"," \"production\"",[1346,1405,1399],{"class":1398},[1346,1407,1408],{"class":1389}," { version",[1346,1410,1411],{"class":1359},":",[1346,1413,1414],{"class":1363}," 1",[1346,1416,1417],{"class":1389}," });\n",[1346,1419,1421,1424,1427,1429,1432,1435,1437,1440,1442,1445,1448,1451,1454],{"class":1348,"line":1420},3,[1346,1422,1423],{"class":1363},"console",[1346,1425,1426],{"class":1376},".log",[1346,1428,1390],{"class":1389},[1346,1430,1431],{"class":1402},"`aliases: ",[1346,1433,1434],{"class":1359},"${",[1346,1436,1161],{"class":1363},[1346,1438,1439],{"class":1376},".stringify",[1346,1441,1390],{"class":1389},[1346,1443,1444],{"class":1363},"aliased",[1346,1446,1447],{"class":1389},".aliases)",[1346,1449,1450],{"class":1359},"}",[1346,1452,1453],{"class":1402},"`",[1346,1455,1456],{"class":1389},");\n",[1035,1458,1460],{"id":1459},"worked-example","Worked example",[1025,1462,1463],{},"Build a product program for a shop's product page:",[1465,1466,1467,1481,1496,1513,1537,1553],"ol",{},[1103,1468,1469,1472,1473,1476,1477,1480],{},[1047,1470,1471],{},"Programs → New program",", name it ",[1115,1474,1475],{},"shop-product",", choose ",[1047,1478,1479],{},"Blank",", and open the builder.",[1103,1482,1483,1484,1487,1488,1491,1492,1495],{},"Add a ",[1047,1485,1486],{},"Go to URL"," step with ",[1115,1489,1490],{},"https:\u002F\u002Fshop.example.com\u002Fp\u002F1",", then an ",[1047,1493,1494],{},"Extract"," step.",[1103,1497,1498,1499,1501,1502,1504,1505,1507,1508,1510,1511,1065],{},"In ",[1047,1500,1175],{},", press ",[1047,1503,1259],{},". When it succeeds, open the ",[1115,1506,590],{}," step in the timeline and\nchoose ",[1047,1509,1284],{},": the stored page opens in ",[1047,1512,1172],{},[1103,1514,1515,1516,1518,1519,1521,1522,1525,1526,1529,1530,1533,1534,1065],{},"In the extract step, add a field ",[1115,1517,612],{}," and press ",[1047,1520,1234],{},", then click the heading on the\nstored page. Add ",[1115,1523,1524],{},"price",", pick the price, and set its type to money with locale ",[1115,1527,1528],{},"tr"," and\ncurrency ",[1115,1531,1532],{},"TRY",". The field's sample shows ",[1115,1535,1536],{},"1.337,40 TL",[1103,1538,1539,1542,1543,1545,1546,1548,1549,1552],{},[1047,1540,1541],{},"Run here"," extracts in your browser: ",[1115,1544,612],{}," is \"Kulaklık Klasik 101\" and ",[1115,1547,1524],{}," is\n1337.4 TRY. ",[1047,1550,1551],{},"Test on the server"," gives the same answer.",[1103,1554,1555,1557,1558,1065],{},[1047,1556,1091],{},": lint is clean, every field has ground truth, and version 1 becomes ",[1115,1559,1560],{},"latest",[1025,1562,1563,1564,1566,1567,1476,1570,1573,1574,1577,1578,1581],{},"To record a sign-in instead, open ",[1047,1565,1169],{}," on a login page such as\n",[1115,1568,1569],{},"https:\u002F\u002Fportal.example.com\u002Flogin",[1047,1571,1572],{},"Record",", and sign in: the recorder suggests a secret ",[1115,1575,1576],{},"password"," input and an \"ask for it when the program runs\"\nstep for the one-time code. ",[1047,1579,1580],{},"Run to here"," on the step after the login stops there and shows the\ndashboard's screenshot.",[1035,1583,1585],{"id":1584},"pitfalls","Pitfalls",[1100,1587,1588,1594,1606,1612],{},[1103,1589,1590,1593],{},[1047,1591,1592],{},"Publishing without ground truth."," A field you never confirmed on a page has nothing for the\nhealer to compare with when the site changes. The publish dialog lists them.",[1103,1595,1596,1599,1600,1602,1603,1605],{},[1047,1597,1598],{},"Testing a side effect for real."," ",[1047,1601,1259],{}," performs side-effect steps; switch on ",[1047,1604,1270],{},"\nuntil you mean it.",[1103,1607,1608,1611],{},[1047,1609,1610],{},"Lint errors stop the server save."," Your work stays in the browser (\"Saved locally\") until the\ndraft lints; another device does not see it.",[1103,1613,1614,1617],{},[1047,1615,1616],{},"Editing while someone publishes."," Heed the warning and reload before you publish over their\nversion.",[1035,1619,155],{"id":1620},"reference",[1100,1622,1623,1631],{},[1103,1624,1625,1133,1628],{},[1029,1626,1627],{"href":525},"DSL reference",[1029,1629,1630],{"href":761},"lint codes",[1103,1632,1633,1637,1638,1637,1642],{},[1029,1634,1636],{"href":1635},"\u002Freference\u002Fapi\u002Fprograms\u002Fcreate-program-version","Create a program version",",\n",[1029,1639,1641],{"href":1640},"\u002Freference\u002Fapi\u002Fprograms\u002Fpublish-program-version","publish a version",[1029,1643,1645],{"href":1644},"\u002Freference\u002Fapi\u002Fprograms\u002Fset-program-alias","set an alias",[1647,1648,1649],"style",{},"html pre.shiki code .sKog0, html code.shiki .sKog0{--shiki-light:var(--kaab-code-token-comment);--shiki-default:var(--kaab-code-token-comment);--shiki-dark:var(--kaab-code-token-comment)}html pre.shiki code .sqn18, html code.shiki .sqn18{--shiki-light:var(--kaab-code-token-keyword);--shiki-default:var(--kaab-code-token-keyword);--shiki-dark:var(--kaab-code-token-keyword)}html pre.shiki code .sHJIl, html code.shiki .sHJIl{--shiki-light:var(--kaab-code-token-constant);--shiki-default:var(--kaab-code-token-constant);--shiki-dark:var(--kaab-code-token-constant)}html pre.shiki code .sJugJ, html code.shiki .sJugJ{--shiki-light:var(--kaab-code-token-function);--shiki-default:var(--kaab-code-token-function);--shiki-dark:var(--kaab-code-token-function)}html pre.shiki code .sTzsn, html code.shiki .sTzsn{--shiki-light:var(--kaab-code-foreground);--shiki-default:var(--kaab-code-foreground);--shiki-dark:var(--kaab-code-foreground)}html pre.shiki code .sQm2-, html code.shiki .sQm2-{--shiki-light:var(--kaab-code-token-punctuation);--shiki-default:var(--kaab-code-token-punctuation);--shiki-dark:var(--kaab-code-token-punctuation)}html pre.shiki code .suOy4, html code.shiki .suOy4{--shiki-light:var(--kaab-code-token-string-expression);--shiki-default:var(--kaab-code-token-string-expression);--shiki-dark:var(--kaab-code-token-string-expression)}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":1342,"searchDepth":1420,"depth":1420,"links":1651},[1652,1653,1654,1655,1656,1657,1658,1659,1660,1661],{"id":1037,"depth":1356,"text":1038},{"id":1057,"depth":1356,"text":1058},{"id":1179,"depth":1356,"text":1180},{"id":1218,"depth":1356,"text":1219},{"id":111,"depth":1356,"text":1251},{"id":1292,"depth":1356,"text":1293},{"id":1318,"depth":1356,"text":1319},{"id":1459,"depth":1356,"text":1460},{"id":1584,"depth":1356,"text":1585},{"id":1620,"depth":1356,"text":155},false,null,"Build, test and publish programs in the panel: visually or in JSON, by recording, by picking on live pages and stored snapshots.","md",{},true,"\u002Fpanel\u002Fbuilder",{"title":140,"description":1664},"4.panel\u002F02.builder","SRHxPlPIcRkez1gBqHPvFV6nTpoOMM8_t1KnRiiOGsU",[1673,1676],{"title":27,"path":135,"stem":1674,"description":1675,"children":-1},"4.panel\u002F01.index","Signing in, organisations, members, API keys, programs, jobs, sessions, schedules, webhooks, BYO providers, usage, billing and the audit log at app.kaab.ist.",{"title":143,"path":1242,"stem":1677,"description":1678,"children":-1},"4.panel\u002F03.picking-and-recording","Point at elements in a live page to get locators and list fields, and record what you do as program steps.",1793593418245]