[{"data":1,"prerenderedAt":3993},["ShallowReactive",2],{"navigation":3,"page:\u002Fguides\u002Fmigrating":1019,"surround:\u002Fguides\u002Fmigrating":3985},[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":119,"body":1021,"breaking":3976,"date":3977,"description":3978,"extension":3979,"generated":3976,"meta":3980,"navigation":1653,"path":3981,"seo":3982,"stem":3983,"version":3977,"__hash__":3984},"docs\u002F3.guides\u002F11.migrating.md",{"type":1022,"value":1023,"toc":3962},"minimark",[1024,1028,1033,1036,1043,1047,1052,1401,1405,1411,1513,1524,1528,1553,1557,1564,1568,1588,1592,1609,1613,1616,2104,2107,2462,2465,2531,2534,2813,2826,3820,3824,3893,3896,3958],[1025,1026,1027],"p",{},"Most automation you already have is a script that drives a browser, a call to a scraping API, or a\npoint-and-click scraper. This guide maps each of them onto Kaabist's programs, locators, tiers and\nschedules, and converts a small Playwright script step by step.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035],{},"Use this guide when you have working automation and want Kaabist to run it: to stop maintaining\nbrowsers and proxies yourself, to get typed and validated data back, or to have a changed page\nparked and healed instead of breaking silently.",[1025,1037,1038,1039,1042],{},"Kaabist runs programs written in its own JSON language, not your scripts. If your script depends on\narbitrary code at every step (complex in-page computation, custom protocols, a desktop app), a\nprogram can still call ",[1040,1041,574],"code",{},", but that step is opaque to healing, and you may be better served\nkeeping that part where it is.",[1029,1044,1046],{"id":1045},"concept-map","Concept map",[1048,1049,1051],"h3",{"id":1050},"from-playwright-or-puppeteer","From Playwright or Puppeteer",[1053,1054,1055,1068],"table",{},[1056,1057,1058],"thead",{},[1059,1060,1061,1065],"tr",{},[1062,1063,1064],"th",{},"In your script",[1062,1066,1067],{},"In a program",[1069,1070,1071,1087,1105,1119,1133,1147,1176,1191,1213,1235,1250,1272,1287,1301,1315,1335,1350,1367,1385],"tbody",{},[1059,1072,1073,1079],{},[1074,1075,1076],"td",{},[1040,1077,1078],{},"page.goto(url)",[1074,1080,1081],{},[1082,1083,1085],"a",{"href":1084},"\u002Freference\u002Fdsl\u002Factions\u002Fgoto",[1040,1086,590],{},[1059,1088,1089,1098],{},[1074,1090,1091,1094,1095],{},[1040,1092,1093],{},"locator.fill(value)",", Puppeteer ",[1040,1096,1097],{},"page.type",[1074,1099,1100],{},[1082,1101,1103],{"href":1102},"\u002Freference\u002Fdsl\u002Factions\u002Ffill",[1040,1104,545],{},[1059,1106,1107,1112],{},[1074,1108,1109],{},[1040,1110,1111],{},"locator.click()",[1074,1113,1114],{},[1082,1115,1117],{"href":1116},"\u002Freference\u002Fdsl\u002Factions\u002Fclick",[1040,1118,547],{},[1059,1120,1121,1126],{},[1074,1122,1123],{},[1040,1124,1125],{},"keyboard.press(\"Enter\")",[1074,1127,1128],{},[1082,1129,1131],{"href":1130},"\u002Freference\u002Fdsl\u002Factions\u002Fpress",[1040,1132,549],{},[1059,1134,1135,1140],{},[1074,1136,1137],{},[1040,1138,1139],{},"locator.hover()",[1074,1141,1142],{},[1082,1143,1145],{"href":1144},"\u002Freference\u002Fdsl\u002Factions\u002Fhover",[1040,1146,551],{},[1059,1148,1149,1159],{},[1074,1150,1151,1154,1155,1154,1157],{},[1040,1152,1153],{},"selectOption",", ",[1040,1156,555],{},[1040,1158,557],{},[1074,1160,1161,1154,1166,1154,1171],{},[1082,1162,1164],{"href":1163},"\u002Freference\u002Fdsl\u002Factions\u002Fselect",[1040,1165,553],{},[1082,1167,1169],{"href":1168},"\u002Freference\u002Fdsl\u002Factions\u002Fcheck",[1040,1170,555],{},[1082,1172,1174],{"href":1173},"\u002Freference\u002Fdsl\u002Factions\u002Funcheck",[1040,1175,557],{},[1059,1177,1178,1183],{},[1074,1179,1180],{},[1040,1181,1182],{},"setInputFiles",[1074,1184,1185,1190],{},[1082,1186,1188],{"href":1187},"\u002Freference\u002Fdsl\u002Factions\u002Fupload",[1040,1189,559],{},", from files uploaded to your organisation",[1059,1192,1193,1204],{},[1074,1194,1195,1154,1198,1154,1201],{},[1040,1196,1197],{},"textContent",[1040,1199,1200],{},"getAttribute",[1040,1202,1203],{},"$$eval",[1074,1205,1206,1207,1212],{},"an ",[1082,1208,1210],{"href":1209},"\u002Freference\u002Fdsl\u002Factions\u002Fextract",[1040,1211,569],{}," schema: fields, types, lists",[1059,1214,1215,1223],{},[1074,1216,1217,1154,1220],{},[1040,1218,1219],{},"waitForSelector",[1040,1221,1222],{},"expect(locator).toBeVisible()",[1074,1224,1225,1226,1229,1230],{},"a step's ",[1040,1227,1228],{},"expect",", or ",[1082,1231,1233],{"href":1232},"\u002Freference\u002Fdsl\u002Factions\u002Fwait-for",[1040,1234,563],{},[1059,1236,1237,1242],{},[1074,1238,1239],{},[1040,1240,1241],{},"waitForTimeout(ms)",[1074,1243,1244,1249],{},[1082,1245,1247],{"href":1246},"\u002Freference\u002Fdsl\u002Factions\u002Fsleep",[1040,1248,586],{},", which lint warns about: wait for a condition instead",[1059,1251,1252,1261],{},[1074,1253,1254,1257,1258],{},[1040,1255,1256],{},"waitForResponse"," + ",[1040,1259,1260],{},"response.json()",[1074,1262,1263,1268,1269,1271],{},[1082,1264,1266],{"href":1265},"\u002Freference\u002Fdsl\u002Factions\u002Fcapture-response",[1040,1267,571],{},", or a ",[1040,1270,626],{}," field",[1059,1273,1274,1279],{},[1074,1275,1276],{},[1040,1277,1278],{},"page.evaluate(fn)",[1074,1280,1281,1286],{},[1082,1282,1284],{"href":1283},"\u002Freference\u002Fdsl\u002Factions\u002Fevaluate",[1040,1285,574],{}," (paid plans; the step cannot be healed)",[1059,1288,1289,1294],{},[1074,1290,1291],{},[1040,1292,1293],{},"waitForEvent(\"download\")",[1074,1295,1296],{},[1082,1297,1299],{"href":1298},"\u002Freference\u002Fdsl\u002Factions\u002Fdownload",[1040,1300,578],{},[1059,1302,1303,1308],{},[1074,1304,1305],{},[1040,1306,1307],{},"page.screenshot()",[1074,1309,1310],{},[1082,1311,1313],{"href":1312},"\u002Freference\u002Fdsl\u002Factions\u002Fscreenshot",[1040,1314,597],{},[1059,1316,1317,1322],{},[1074,1318,1319],{},[1040,1320,1321],{},"context.storageState()",[1074,1323,1324,1325,1328,1329,1331,1332],{},"a ",[1082,1326,504],{"href":1327},"\u002Fconcepts\u002Fsessions",", saved by a ",[1040,1330,595],{}," with ",[1040,1333,1334],{},"save_session",[1059,1336,1337,1343],{},[1074,1338,1324,1339,1342],{},[1040,1340,1341],{},"for"," loop over \"next page\"",[1074,1344,1345],{},[1082,1346,1348],{"href":1347},"\u002Freference\u002Fdsl\u002Factions\u002Fpaginate",[1040,1349,576],{},[1059,1351,1352,1357],{},[1074,1353,1354],{},[1040,1355,1356],{},"while (…)",[1074,1358,1359,1364,1365],{},[1082,1360,1362],{"href":1361},"\u002Freference\u002Fdsl\u002Factions\u002Floop-until",[1040,1363,601],{},", with a required ",[1040,1366,686],{},[1059,1368,1369,1374],{},[1074,1370,1371],{},[1040,1372,1373],{},"if (…)",[1074,1375,1376,1381,1382],{},[1082,1377,1379],{"href":1378},"\u002Freference\u002Fdsl\u002Factions\u002Fwhen",[1040,1380,599],{},", or a step's ",[1040,1383,1384],{},"if",[1059,1386,1387,1393],{},[1074,1388,1389,1392],{},[1040,1390,1391],{},"prompt()"," for a one-time code",[1074,1394,1395,1400],{},[1082,1396,1398],{"href":1397},"\u002Freference\u002Fdsl\u002Factions\u002Fawait-input",[1040,1399,592],{},": the job parks until you answer",[1048,1402,1404],{"id":1403},"selectors-become-locators","Selectors become locators",[1025,1406,1407,1408,1410],{},"A Playwright locator names one way to find an element. A Kaabist target can name several, as\n",[1040,1409,655],{},", tried in order until one matches exactly one element:",[1053,1412,1413,1423],{},[1056,1414,1415],{},[1059,1416,1417,1420],{},[1062,1418,1419],{},"Playwright",[1062,1421,1422],{},"Target",[1069,1424,1425,1437,1449,1461,1477,1489,1501],{},[1059,1426,1427,1432],{},[1074,1428,1429],{},[1040,1430,1431],{},"page.getByTestId(\"price\")",[1074,1433,1434],{},[1040,1435,1436],{},"{ \"testid\": \"price\" }",[1059,1438,1439,1444],{},[1074,1440,1441],{},[1040,1442,1443],{},"page.getByRole(\"button\", { name: \"Next\" })",[1074,1445,1446],{},[1040,1447,1448],{},"{ \"role\": \"button\", \"name\": \"Next\" }",[1059,1450,1451,1456],{},[1074,1452,1453],{},[1040,1454,1455],{},"page.getByText(\"Sign in\", { exact: true })",[1074,1457,1458],{},[1040,1459,1460],{},"{ \"text\": \"Sign in\", \"exact\": true }",[1059,1462,1463,1468],{},[1074,1464,1465],{},[1040,1466,1467],{},"page.locator(\".price\")",[1074,1469,1470,1473,1474],{},[1040,1471,1472],{},"\".price\""," or ",[1040,1475,1476],{},"{ \"css\": \".price\" }",[1059,1478,1479,1484],{},[1074,1480,1481],{},[1040,1482,1483],{},"page.locator(\"xpath=…\")",[1074,1485,1486],{},[1040,1487,1488],{},"{ \"xpath\": \"…\" }",[1059,1490,1491,1496],{},[1074,1492,1493],{},[1040,1494,1495],{},".nth(2)",[1074,1497,1498],{},[1040,1499,1500],{},"\"nth\": 2",[1059,1502,1503,1508],{},[1074,1504,1505],{},[1040,1506,1507],{},"page.frameLocator(\"#pay\")",[1074,1509,1510],{},[1040,1511,1512],{},"\"frame\": [\"#pay\"]",[1025,1514,1515,1516,1519,1520,1523],{},"A match on more than one element is a failure (",[1040,1517,1518],{},"target_ambiguous","), not \"the first one\". Give the\nmost stable locator first: a test id, then a role and name, then text, then CSS. See\n",[1082,1521,63],{"href":1522},"\u002Fconcepts\u002Flocators",".",[1048,1525,1527],{"id":1526},"retries-become-tiers-and-healing","Retries become tiers and healing",[1025,1529,1530,1531,1535,1536,1539,1540,1543,1544,1547,1548,1552],{},"Your script probably wraps steps in retries and sleeps. Kaabist decides why a step failed and\nreacts to the cause: a page that needs JavaScript moves the job to a browser\n(",[1082,1532,1534],{"href":1533},"\u002Fconcepts\u002Ftiers-and-escalation","tiers","), a moved element is relocated from its ground truth\n(",[1082,1537,48],{"href":1538},"\u002Fconcepts\u002Fself-healing","), a cookie banner is dismissed\n(",[1082,1541,51],{"href":1542},"\u002Fconcepts\u002Fobstacles","), and network errors are retried with backoff. A step-level\n",[1040,1545,1546],{},"retry"," exists for the rest, except on steps that change something\n(",[1082,1549,1551],{"href":1550},"\u002Fguides\u002Fside-effect-safety","side-effect safety",").",[1048,1554,1556],{"id":1555},"cron-becomes-schedules","Cron becomes schedules",[1025,1558,1559,1560,1563],{},"A cron job that runs your script becomes a ",[1082,1561,501],{"href":1562},"\u002Fguides\u002Fschedules-and-change-detection"," on a\nprogram, with a time zone, an overlap policy and optional change detection that tells you only\nwhen the result differs.",[1048,1565,1567],{"id":1566},"from-a-scraping-api","From a scraping API",[1025,1569,1570,1571,1257,1573,1575,1576,1579,1580,1583,1584,1587],{},"A call that sends a URL and selectors maps onto the ",[1040,1572,610],{},[1040,1574,569],{}," shorthand of\n",[1040,1577,1578],{},"POST \u002Fv1\u002Fjobs",": one request, one job, typed ",[1040,1581,1582],{},"data"," back. Kaabist starts on the cheapest tier\nand escalates on its own, so you do not choose \"render JavaScript\" per call; cap the cost with\n",[1040,1585,1586],{},"max_tier",". When you call the same page shape repeatedly, save it as a program instead and run it\nby name.",[1048,1589,1591],{"id":1590},"from-a-no-code-scraper","From a no-code scraper",[1025,1593,1594,1595,1599,1600,1603,1604,1608],{},"Point-and-click selection is the panel's picker: open the page in the\n",[1082,1596,1598],{"href":1597},"\u002Fpanel\u002Fbuilder","program builder",", click a value, press ",[1040,1601,1602],{},"s"," to turn one item into a list, and\nconfirm. See ",[1082,1605,1607],{"href":1606},"\u002Fpanel\u002Fpicking-and-recording","picking and recording",". The result is an ordinary\nprogram you can export as JSON and run from the API.",[1029,1610,1612],{"id":1611},"worked-example","Worked example",[1025,1614,1615],{},"This Playwright script reads the product cards of a shop's category list, page after page:",[1617,1618,1623],"pre",{"className":1619,"code":1620,"language":1621,"meta":1622,"style":1622},"language-ts shiki shiki-themes kaab-code kaab-code kaab-code","import { chromium } from \"playwright\";\n\nconst browser = await chromium.launch();\nconst page = await browser.newPage();\nawait page.goto(\"https:\u002F\u002Fshop.example.com\u002Fc\u002Fshoes?page=1\");\n\nconst products = [];\nfor (let n = 0; n \u003C 5; n++) {\n  for (const card of await page.locator(\".product-card\").all()) {\n    const price = await card.locator(\".price\").innerText(); \u002F\u002F \"1.337,40 TL\"\n    products.push({\n      title: await card.locator(\".title\").innerText(),\n      price: Number(price.replace(\" TL\", \"\").replaceAll(\".\", \"\").replace(\",\", \".\")),\n      sku: (await card.locator(\".sku\").innerText()).replace(\"SKU: \", \"\"),\n    });\n  }\n  const next = page.locator(\"a[rel=next]\");\n  if ((await next.count()) === 0) break;\n  await next.click();\n  await page.waitForLoadState();\n}\nawait browser.close();\n","ts","",[1040,1624,1625,1648,1655,1681,1700,1720,1725,1738,1776,1813,1846,1858,1889,1952,1995,2001,2007,2029,2061,2074,2086,2092],{"__ignoreMap":1622},[1626,1627,1630,1634,1638,1641,1645],"span",{"class":1628,"line":1629},"line",1,[1626,1631,1633],{"class":1632},"sqn18","import",[1626,1635,1637],{"class":1636},"sTzsn"," { chromium } ",[1626,1639,1640],{"class":1632},"from",[1626,1642,1644],{"class":1643},"suOy4"," \"playwright\"",[1626,1646,1647],{"class":1636},";\n",[1626,1649,1651],{"class":1628,"line":1650},2,[1626,1652,1654],{"emptyLinePlaceholder":1653},true,"\n",[1626,1656,1658,1661,1665,1668,1671,1674,1678],{"class":1628,"line":1657},3,[1626,1659,1660],{"class":1632},"const",[1626,1662,1664],{"class":1663},"sHJIl"," browser",[1626,1666,1667],{"class":1632}," =",[1626,1669,1670],{"class":1632}," await",[1626,1672,1673],{"class":1663}," chromium",[1626,1675,1677],{"class":1676},"sJugJ",".launch",[1626,1679,1680],{"class":1636},"();\n",[1626,1682,1684,1686,1689,1691,1693,1695,1698],{"class":1628,"line":1683},4,[1626,1685,1660],{"class":1632},[1626,1687,1688],{"class":1663}," page",[1626,1690,1667],{"class":1632},[1626,1692,1670],{"class":1632},[1626,1694,1664],{"class":1663},[1626,1696,1697],{"class":1676},".newPage",[1626,1699,1680],{"class":1636},[1626,1701,1703,1706,1708,1711,1714,1717],{"class":1628,"line":1702},5,[1626,1704,1705],{"class":1632},"await",[1626,1707,1688],{"class":1663},[1626,1709,1710],{"class":1676},".goto",[1626,1712,1713],{"class":1636},"(",[1626,1715,1716],{"class":1643},"\"https:\u002F\u002Fshop.example.com\u002Fc\u002Fshoes?page=1\"",[1626,1718,1719],{"class":1636},");\n",[1626,1721,1723],{"class":1628,"line":1722},6,[1626,1724,1654],{"emptyLinePlaceholder":1653},[1626,1726,1728,1730,1733,1735],{"class":1628,"line":1727},7,[1626,1729,1660],{"class":1632},[1626,1731,1732],{"class":1663}," products",[1626,1734,1667],{"class":1632},[1626,1736,1737],{"class":1636}," [];\n",[1626,1739,1741,1743,1746,1749,1752,1755,1758,1761,1764,1767,1770,1773],{"class":1628,"line":1740},8,[1626,1742,1341],{"class":1632},[1626,1744,1745],{"class":1636}," (",[1626,1747,1748],{"class":1632},"let",[1626,1750,1751],{"class":1636}," n ",[1626,1753,1754],{"class":1632},"=",[1626,1756,1757],{"class":1663}," 0",[1626,1759,1760],{"class":1636},"; n ",[1626,1762,1763],{"class":1632},"\u003C",[1626,1765,1766],{"class":1663}," 5",[1626,1768,1769],{"class":1636},"; n",[1626,1771,1772],{"class":1632},"++",[1626,1774,1775],{"class":1636},") {\n",[1626,1777,1779,1782,1784,1786,1789,1792,1794,1796,1799,1801,1804,1807,1810],{"class":1628,"line":1778},9,[1626,1780,1781],{"class":1632},"  for",[1626,1783,1745],{"class":1636},[1626,1785,1660],{"class":1632},[1626,1787,1788],{"class":1663}," card",[1626,1790,1791],{"class":1632}," of",[1626,1793,1670],{"class":1632},[1626,1795,1688],{"class":1663},[1626,1797,1798],{"class":1676},".locator",[1626,1800,1713],{"class":1636},[1626,1802,1803],{"class":1643},"\".product-card\"",[1626,1805,1806],{"class":1636},")",[1626,1808,1809],{"class":1676},".all",[1626,1811,1812],{"class":1636},"()) {\n",[1626,1814,1816,1819,1822,1824,1826,1828,1830,1832,1834,1836,1839,1842],{"class":1628,"line":1815},10,[1626,1817,1818],{"class":1632},"    const",[1626,1820,1821],{"class":1663}," price",[1626,1823,1667],{"class":1632},[1626,1825,1670],{"class":1632},[1626,1827,1788],{"class":1663},[1626,1829,1798],{"class":1676},[1626,1831,1713],{"class":1636},[1626,1833,1472],{"class":1643},[1626,1835,1806],{"class":1636},[1626,1837,1838],{"class":1676},".innerText",[1626,1840,1841],{"class":1636},"(); ",[1626,1843,1845],{"class":1844},"sKog0","\u002F\u002F \"1.337,40 TL\"\n",[1626,1847,1849,1852,1855],{"class":1628,"line":1848},11,[1626,1850,1851],{"class":1663},"    products",[1626,1853,1854],{"class":1676},".push",[1626,1856,1857],{"class":1636},"({\n",[1626,1859,1861,1864,1867,1869,1871,1873,1875,1878,1880,1882,1885],{"class":1628,"line":1860},12,[1626,1862,1863],{"class":1636},"      title",[1626,1865,1866],{"class":1632},":",[1626,1868,1670],{"class":1632},[1626,1870,1788],{"class":1663},[1626,1872,1798],{"class":1676},[1626,1874,1713],{"class":1636},[1626,1876,1877],{"class":1643},"\".title\"",[1626,1879,1806],{"class":1636},[1626,1881,1838],{"class":1676},[1626,1883,1884],{"class":1636},"()",[1626,1886,1888],{"class":1887},"sQm2-",",\n",[1626,1890,1892,1895,1897,1900,1902,1905,1908,1910,1913,1916,1919,1921,1924,1926,1929,1931,1933,1935,1937,1939,1942,1944,1947,1950],{"class":1628,"line":1891},13,[1626,1893,1894],{"class":1636},"      price",[1626,1896,1866],{"class":1632},[1626,1898,1899],{"class":1676}," Number",[1626,1901,1713],{"class":1636},[1626,1903,1904],{"class":1663},"price",[1626,1906,1907],{"class":1676},".replace",[1626,1909,1713],{"class":1636},[1626,1911,1912],{"class":1643},"\" TL\"",[1626,1914,1915],{"class":1887},",",[1626,1917,1918],{"class":1643}," \"\"",[1626,1920,1806],{"class":1636},[1626,1922,1923],{"class":1676},".replaceAll",[1626,1925,1713],{"class":1636},[1626,1927,1928],{"class":1643},"\".\"",[1626,1930,1915],{"class":1887},[1626,1932,1918],{"class":1643},[1626,1934,1806],{"class":1636},[1626,1936,1907],{"class":1676},[1626,1938,1713],{"class":1636},[1626,1940,1941],{"class":1643},"\",\"",[1626,1943,1915],{"class":1887},[1626,1945,1946],{"class":1643}," \".\"",[1626,1948,1949],{"class":1636},"))",[1626,1951,1888],{"class":1887},[1626,1953,1955,1958,1960,1962,1964,1966,1968,1970,1973,1975,1977,1980,1982,1984,1987,1989,1991,1993],{"class":1628,"line":1954},14,[1626,1956,1957],{"class":1636},"      sku",[1626,1959,1866],{"class":1632},[1626,1961,1745],{"class":1636},[1626,1963,1705],{"class":1632},[1626,1965,1788],{"class":1663},[1626,1967,1798],{"class":1676},[1626,1969,1713],{"class":1636},[1626,1971,1972],{"class":1643},"\".sku\"",[1626,1974,1806],{"class":1636},[1626,1976,1838],{"class":1676},[1626,1978,1979],{"class":1636},"())",[1626,1981,1907],{"class":1676},[1626,1983,1713],{"class":1636},[1626,1985,1986],{"class":1643},"\"SKU: \"",[1626,1988,1915],{"class":1887},[1626,1990,1918],{"class":1643},[1626,1992,1806],{"class":1636},[1626,1994,1888],{"class":1887},[1626,1996,1998],{"class":1628,"line":1997},15,[1626,1999,2000],{"class":1636},"    });\n",[1626,2002,2004],{"class":1628,"line":2003},16,[1626,2005,2006],{"class":1636},"  }\n",[1626,2008,2010,2013,2016,2018,2020,2022,2024,2027],{"class":1628,"line":2009},17,[1626,2011,2012],{"class":1632},"  const",[1626,2014,2015],{"class":1663}," next",[1626,2017,1667],{"class":1632},[1626,2019,1688],{"class":1663},[1626,2021,1798],{"class":1676},[1626,2023,1713],{"class":1636},[1626,2025,2026],{"class":1643},"\"a[rel=next]\"",[1626,2028,1719],{"class":1636},[1626,2030,2032,2035,2038,2040,2042,2045,2048,2051,2053,2056,2059],{"class":1628,"line":2031},18,[1626,2033,2034],{"class":1632},"  if",[1626,2036,2037],{"class":1636}," ((",[1626,2039,1705],{"class":1632},[1626,2041,2015],{"class":1663},[1626,2043,2044],{"class":1676},".count",[1626,2046,2047],{"class":1636},"()) ",[1626,2049,2050],{"class":1632},"===",[1626,2052,1757],{"class":1663},[1626,2054,2055],{"class":1636},") ",[1626,2057,2058],{"class":1632},"break",[1626,2060,1647],{"class":1636},[1626,2062,2064,2067,2069,2072],{"class":1628,"line":2063},19,[1626,2065,2066],{"class":1632},"  await",[1626,2068,2015],{"class":1663},[1626,2070,2071],{"class":1676},".click",[1626,2073,1680],{"class":1636},[1626,2075,2077,2079,2081,2084],{"class":1628,"line":2076},20,[1626,2078,2066],{"class":1632},[1626,2080,1688],{"class":1663},[1626,2082,2083],{"class":1676},".waitForLoadState",[1626,2085,1680],{"class":1636},[1626,2087,2089],{"class":1628,"line":2088},21,[1626,2090,2091],{"class":1636},"}\n",[1626,2093,2095,2097,2099,2102],{"class":1628,"line":2094},22,[1626,2096,1705],{"class":1632},[1626,2098,1664],{"class":1663},[1626,2100,2101],{"class":1676},".close",[1626,2103,1680],{"class":1636},[1025,2105,2106],{},"The same work as a program:",[1617,2108,2111],{"className":2109,"code":2110,"language":680,"meta":1622,"style":1622},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{\n  \"kaab\": \"1\",\n  \"name\": \"shoe-catalogue\",\n  \"options\": { \"max_tier\": \"http\" },\n  \"steps\": [\n    {\n      \"goto\": \"https:\u002F\u002Fshop.example.com\u002Fc\u002Fshoes?page=1\",\n      \"expect\": { \"count\": { \"target\": \".product-card\", \"min\": 1 } }\n    },\n    {\n      \"paginate\": { \"next\": \"a[rel=next]\", \"max_pages\": 5, \"stop_when\": { \"absent\": \"a[rel=next]\" } },\n      \"extract\": {\n        \"products\": {\n          \"selector\": \".product-card\",\n          \"many\": true,\n          \"fields\": {\n            \"title\": \".title\",\n            \"price\": { \"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" },\n            \"sku\": { \"selector\": \".sku\", \"regex\": \"SKU:\\\\s*([A-Z0-9-]+)\" }\n          }\n        }\n      }\n    }\n  ]\n}\n",[1040,2112,2113,2118,2130,2142,2165,2175,2180,2192,2229,2236,2240,2287,2297,2306,2317,2329,2338,2350,2401,2430,2435,2440,2445,2451,2457],{"__ignoreMap":1622},[1626,2114,2115],{"class":1628,"line":1629},[1626,2116,2117],{"class":1636},"{\n",[1626,2119,2120,2123,2125,2128],{"class":1628,"line":1650},[1626,2121,2122],{"class":1632},"  \"kaab\"",[1626,2124,1866],{"class":1887},[1626,2126,2127],{"class":1643}," \"1\"",[1626,2129,1888],{"class":1887},[1626,2131,2132,2135,2137,2140],{"class":1628,"line":1657},[1626,2133,2134],{"class":1632},"  \"name\"",[1626,2136,1866],{"class":1887},[1626,2138,2139],{"class":1643}," \"shoe-catalogue\"",[1626,2141,1888],{"class":1887},[1626,2143,2144,2147,2149,2152,2155,2157,2160,2163],{"class":1628,"line":1683},[1626,2145,2146],{"class":1632},"  \"options\"",[1626,2148,1866],{"class":1887},[1626,2150,2151],{"class":1636}," { ",[1626,2153,2154],{"class":1632},"\"max_tier\"",[1626,2156,1866],{"class":1887},[1626,2158,2159],{"class":1643}," \"http\"",[1626,2161,2162],{"class":1636}," }",[1626,2164,1888],{"class":1887},[1626,2166,2167,2170,2172],{"class":1628,"line":1702},[1626,2168,2169],{"class":1632},"  \"steps\"",[1626,2171,1866],{"class":1887},[1626,2173,2174],{"class":1636}," [\n",[1626,2176,2177],{"class":1628,"line":1722},[1626,2178,2179],{"class":1636},"    {\n",[1626,2181,2182,2185,2187,2190],{"class":1628,"line":1727},[1626,2183,2184],{"class":1632},"      \"goto\"",[1626,2186,1866],{"class":1887},[1626,2188,2189],{"class":1643}," \"https:\u002F\u002Fshop.example.com\u002Fc\u002Fshoes?page=1\"",[1626,2191,1888],{"class":1887},[1626,2193,2194,2197,2199,2201,2204,2206,2208,2211,2213,2216,2218,2221,2223,2226],{"class":1628,"line":1740},[1626,2195,2196],{"class":1632},"      \"expect\"",[1626,2198,1866],{"class":1887},[1626,2200,2151],{"class":1636},[1626,2202,2203],{"class":1632},"\"count\"",[1626,2205,1866],{"class":1887},[1626,2207,2151],{"class":1636},[1626,2209,2210],{"class":1632},"\"target\"",[1626,2212,1866],{"class":1887},[1626,2214,2215],{"class":1643}," \".product-card\"",[1626,2217,1915],{"class":1887},[1626,2219,2220],{"class":1632}," \"min\"",[1626,2222,1866],{"class":1887},[1626,2224,2225],{"class":1663}," 1",[1626,2227,2228],{"class":1636}," } }\n",[1626,2230,2231,2234],{"class":1628,"line":1778},[1626,2232,2233],{"class":1636},"    }",[1626,2235,1888],{"class":1887},[1626,2237,2238],{"class":1628,"line":1815},[1626,2239,2179],{"class":1636},[1626,2241,2242,2245,2247,2249,2252,2254,2257,2259,2262,2264,2266,2268,2271,2273,2275,2278,2280,2282,2285],{"class":1628,"line":1848},[1626,2243,2244],{"class":1632},"      \"paginate\"",[1626,2246,1866],{"class":1887},[1626,2248,2151],{"class":1636},[1626,2250,2251],{"class":1632},"\"next\"",[1626,2253,1866],{"class":1887},[1626,2255,2256],{"class":1643}," \"a[rel=next]\"",[1626,2258,1915],{"class":1887},[1626,2260,2261],{"class":1632}," \"max_pages\"",[1626,2263,1866],{"class":1887},[1626,2265,1766],{"class":1663},[1626,2267,1915],{"class":1887},[1626,2269,2270],{"class":1632}," \"stop_when\"",[1626,2272,1866],{"class":1887},[1626,2274,2151],{"class":1636},[1626,2276,2277],{"class":1632},"\"absent\"",[1626,2279,1866],{"class":1887},[1626,2281,2256],{"class":1643},[1626,2283,2284],{"class":1636}," } }",[1626,2286,1888],{"class":1887},[1626,2288,2289,2292,2294],{"class":1628,"line":1860},[1626,2290,2291],{"class":1632},"      \"extract\"",[1626,2293,1866],{"class":1887},[1626,2295,2296],{"class":1636}," {\n",[1626,2298,2299,2302,2304],{"class":1628,"line":1891},[1626,2300,2301],{"class":1632},"        \"products\"",[1626,2303,1866],{"class":1887},[1626,2305,2296],{"class":1636},[1626,2307,2308,2311,2313,2315],{"class":1628,"line":1954},[1626,2309,2310],{"class":1632},"          \"selector\"",[1626,2312,1866],{"class":1887},[1626,2314,2215],{"class":1643},[1626,2316,1888],{"class":1887},[1626,2318,2319,2322,2324,2327],{"class":1628,"line":1997},[1626,2320,2321],{"class":1632},"          \"many\"",[1626,2323,1866],{"class":1887},[1626,2325,2326],{"class":1663}," true",[1626,2328,1888],{"class":1887},[1626,2330,2331,2334,2336],{"class":1628,"line":2003},[1626,2332,2333],{"class":1632},"          \"fields\"",[1626,2335,1866],{"class":1887},[1626,2337,2296],{"class":1636},[1626,2339,2340,2343,2345,2348],{"class":1628,"line":2009},[1626,2341,2342],{"class":1632},"            \"title\"",[1626,2344,1866],{"class":1887},[1626,2346,2347],{"class":1643}," \".title\"",[1626,2349,1888],{"class":1887},[1626,2351,2352,2355,2357,2359,2362,2364,2367,2369,2372,2374,2377,2379,2382,2384,2387,2389,2392,2394,2397,2399],{"class":1628,"line":2031},[1626,2353,2354],{"class":1632},"            \"price\"",[1626,2356,1866],{"class":1887},[1626,2358,2151],{"class":1636},[1626,2360,2361],{"class":1632},"\"selector\"",[1626,2363,1866],{"class":1887},[1626,2365,2366],{"class":1643}," \".price\"",[1626,2368,1915],{"class":1887},[1626,2370,2371],{"class":1632}," \"type\"",[1626,2373,1866],{"class":1887},[1626,2375,2376],{"class":1643}," \"money\"",[1626,2378,1915],{"class":1887},[1626,2380,2381],{"class":1632}," \"locale\"",[1626,2383,1866],{"class":1887},[1626,2385,2386],{"class":1643}," \"tr\"",[1626,2388,1915],{"class":1887},[1626,2390,2391],{"class":1632}," \"currency\"",[1626,2393,1866],{"class":1887},[1626,2395,2396],{"class":1643}," \"TRY\"",[1626,2398,2162],{"class":1636},[1626,2400,1888],{"class":1887},[1626,2402,2403,2406,2408,2410,2412,2414,2417,2419,2422,2424,2427],{"class":1628,"line":2063},[1626,2404,2405],{"class":1632},"            \"sku\"",[1626,2407,1866],{"class":1887},[1626,2409,2151],{"class":1636},[1626,2411,2361],{"class":1632},[1626,2413,1866],{"class":1887},[1626,2415,2416],{"class":1643}," \".sku\"",[1626,2418,1915],{"class":1887},[1626,2420,2421],{"class":1632}," \"regex\"",[1626,2423,1866],{"class":1887},[1626,2425,2426],{"class":1643}," \"SKU:\\\\s*([A-Z0-9-]+)\"",[1626,2428,2429],{"class":1636}," }\n",[1626,2431,2432],{"class":1628,"line":2076},[1626,2433,2434],{"class":1636},"          }\n",[1626,2436,2437],{"class":1628,"line":2088},[1626,2438,2439],{"class":1636},"        }\n",[1626,2441,2442],{"class":1628,"line":2094},[1626,2443,2444],{"class":1636},"      }\n",[1626,2446,2448],{"class":1628,"line":2447},23,[1626,2449,2450],{"class":1636},"    }\n",[1626,2452,2454],{"class":1628,"line":2453},24,[1626,2455,2456],{"class":1636},"  ]\n",[1626,2458,2460],{"class":1628,"line":2459},25,[1626,2461,2091],{"class":1636},[1025,2463,2464],{},"What changed:",[2466,2467,2468,2486,2510,2519],"ul",{},[2469,2470,2471,2477,2478,2481,2482,2485],"li",{},[2472,2473,2474,2475,1523],"strong",{},"The loop is ",[1040,2476,576],{}," It follows ",[1040,2479,2480],{},"a[rel=next]"," for at most five pages, extracts on each,\nand concatenates the ",[1040,2483,2484],{},"products"," lists.",[2469,2487,2488,2491,2492,1331,2495,2498,2499,2502,2503,2506,2507,2509],{},[2472,2489,2490],{},"Parsing is declared."," ",[1040,2493,2494],{},"type: \"money\"",[1040,2496,2497],{},"locale: \"tr\""," reads ",[1040,2500,2501],{},"1.337,40 TL"," as\n",[1040,2504,2505],{},"{ \"amount\": 1337.4, \"currency\": \"TRY\" }","; a value that does not parse becomes a warning, not a\ncrash. The ",[1040,2508,717],{}," keeps only the SKU code.",[2469,2511,2512,2491,2515,2518],{},[2472,2513,2514],{},"No browser is launched for this page.",[1040,2516,2517],{},"max_tier: \"http\""," keeps it on plain HTTP requests,\nwhich this shop allows.",[2469,2520,2521,2530],{},[2472,2522,2523,2524,2526,2527,1523],{},"The ",[1040,2525,1228],{}," replaces ",[1040,2528,2529],{},"waitForLoadState"," The step succeeds only when product cards are\npresent.",[1025,2532,2533],{},"Save it as a program and publish it:",[2535,2536,2537],"code-group",{},[1617,2538,2541],{"className":1619,"code":2539,"filename":2540,"language":1621,"meta":1622,"style":1622},"\u002F\u002F Version 1, published: alias `latest` points at it.\nconst program = await kaab.programs.create({ name, definition, publish: true });\n\n\u002F\u002F Version 2 adds a field; publishing it moves `latest` to 2.\nconst v2 = await kaab.programs.versions.create(program.id, {\n  definition: {\n    ...definition,\n    steps: [\n      definition.steps[0],\n      { extract: { ...definition.steps[1]?.extract, sku: { selector: \".sku\" } } },\n    ],\n  },\n  notes: \"read the SKU too\",\n  publish: true,\n});\nconsole.log(`${program.name}: v${v2.version} is ${v2.status}`);\n","TypeScript",[1040,2542,2543,2548,2589,2593,2598,2633,2642,2652,2661,2677,2718,2725,2732,2744,2755,2760],{"__ignoreMap":1622},[1626,2544,2545],{"class":1628,"line":1629},[1626,2546,2547],{"class":1844},"\u002F\u002F Version 1, published: alias `latest` points at it.\n",[1626,2549,2550,2552,2555,2557,2559,2562,2564,2566,2569,2572,2574,2577,2579,2582,2584,2586],{"class":1628,"line":1650},[1626,2551,1660],{"class":1632},[1626,2553,2554],{"class":1663}," program",[1626,2556,1667],{"class":1632},[1626,2558,1670],{"class":1632},[1626,2560,2561],{"class":1663}," kaab",[1626,2563,1523],{"class":1676},[1626,2565,224],{"class":1663},[1626,2567,2568],{"class":1676},".create",[1626,2570,2571],{"class":1636},"({ name",[1626,2573,1915],{"class":1887},[1626,2575,2576],{"class":1636}," definition",[1626,2578,1915],{"class":1887},[1626,2580,2581],{"class":1636}," publish",[1626,2583,1866],{"class":1632},[1626,2585,2326],{"class":1663},[1626,2587,2588],{"class":1636}," });\n",[1626,2590,2591],{"class":1628,"line":1657},[1626,2592,1654],{"emptyLinePlaceholder":1653},[1626,2594,2595],{"class":1628,"line":1683},[1626,2596,2597],{"class":1844},"\u002F\u002F Version 2 adds a field; publishing it moves `latest` to 2.\n",[1626,2599,2600,2602,2605,2607,2609,2611,2613,2615,2617,2620,2622,2624,2626,2629,2631],{"class":1628,"line":1702},[1626,2601,1660],{"class":1632},[1626,2603,2604],{"class":1663}," v2",[1626,2606,1667],{"class":1632},[1626,2608,1670],{"class":1632},[1626,2610,2561],{"class":1663},[1626,2612,1523],{"class":1676},[1626,2614,224],{"class":1663},[1626,2616,1523],{"class":1676},[1626,2618,2619],{"class":1663},"versions",[1626,2621,2568],{"class":1676},[1626,2623,1713],{"class":1636},[1626,2625,489],{"class":1663},[1626,2627,2628],{"class":1636},".id",[1626,2630,1915],{"class":1887},[1626,2632,2296],{"class":1636},[1626,2634,2635,2638,2640],{"class":1628,"line":1722},[1626,2636,2637],{"class":1636},"  definition",[1626,2639,1866],{"class":1632},[1626,2641,2296],{"class":1636},[1626,2643,2644,2647,2650],{"class":1628,"line":1727},[1626,2645,2646],{"class":1632},"    ...",[1626,2648,2649],{"class":1636},"definition",[1626,2651,1888],{"class":1887},[1626,2653,2654,2657,2659],{"class":1628,"line":1740},[1626,2655,2656],{"class":1636},"    steps",[1626,2658,1866],{"class":1632},[1626,2660,2174],{"class":1636},[1626,2662,2663,2666,2669,2672,2675],{"class":1628,"line":1778},[1626,2664,2665],{"class":1663},"      definition",[1626,2667,2668],{"class":1636},".steps[",[1626,2670,2671],{"class":1663},"0",[1626,2673,2674],{"class":1636},"]",[1626,2676,1888],{"class":1887},[1626,2678,2679,2682,2684,2686,2689,2691,2693,2696,2699,2701,2704,2706,2709,2711,2713,2716],{"class":1628,"line":1815},[1626,2680,2681],{"class":1636},"      { extract",[1626,2683,1866],{"class":1632},[1626,2685,2151],{"class":1636},[1626,2687,2688],{"class":1632},"...",[1626,2690,2649],{"class":1663},[1626,2692,2668],{"class":1636},[1626,2694,2695],{"class":1663},"1",[1626,2697,2698],{"class":1636},"]?.extract",[1626,2700,1915],{"class":1887},[1626,2702,2703],{"class":1636}," sku",[1626,2705,1866],{"class":1632},[1626,2707,2708],{"class":1636}," { selector",[1626,2710,1866],{"class":1632},[1626,2712,2416],{"class":1643},[1626,2714,2715],{"class":1636}," } } }",[1626,2717,1888],{"class":1887},[1626,2719,2720,2723],{"class":1628,"line":1848},[1626,2721,2722],{"class":1636},"    ]",[1626,2724,1888],{"class":1887},[1626,2726,2727,2730],{"class":1628,"line":1860},[1626,2728,2729],{"class":1636},"  }",[1626,2731,1888],{"class":1887},[1626,2733,2734,2737,2739,2742],{"class":1628,"line":1891},[1626,2735,2736],{"class":1636},"  notes",[1626,2738,1866],{"class":1632},[1626,2740,2741],{"class":1643}," \"read the SKU too\"",[1626,2743,1888],{"class":1887},[1626,2745,2746,2749,2751,2753],{"class":1628,"line":1954},[1626,2747,2748],{"class":1636},"  publish",[1626,2750,1866],{"class":1632},[1626,2752,2326],{"class":1663},[1626,2754,1888],{"class":1887},[1626,2756,2757],{"class":1628,"line":1997},[1626,2758,2759],{"class":1636},"});\n",[1626,2761,2762,2765,2768,2770,2773,2776,2778,2781,2784,2787,2789,2792,2795,2797,2800,2802,2804,2807,2809,2811],{"class":1628,"line":2003},[1626,2763,2764],{"class":1663},"console",[1626,2766,2767],{"class":1676},".log",[1626,2769,1713],{"class":1636},[1626,2771,2772],{"class":1643},"`",[1626,2774,2775],{"class":1632},"${",[1626,2777,489],{"class":1663},[1626,2779,2780],{"class":1636},".name",[1626,2782,2783],{"class":1632},"}",[1626,2785,2786],{"class":1643},": v",[1626,2788,2775],{"class":1632},[1626,2790,2791],{"class":1663},"v2",[1626,2793,2794],{"class":1636},".version",[1626,2796,2783],{"class":1632},[1626,2798,2799],{"class":1643}," is ",[1626,2801,2775],{"class":1632},[1626,2803,2791],{"class":1663},[1626,2805,2806],{"class":1636},".status",[1626,2808,2783],{"class":1632},[1626,2810,2772],{"class":1643},[1626,2812,1719],{"class":1636},[1025,2814,2815,2816,2799,2818,2821,2822,2825],{},"Then run it. The first item of ",[1040,2817,2484],{},[1040,2819,2820],{},"Kulaklık Klasik 101",", priced 1337.4 TRY, SKU\n",[1040,2823,2824],{},"HP-1037",". A one-off page that you have not saved yet runs with the shorthand:",[2535,2827,2828,2964,3201,3439,3752],{},[1617,2829,2834],{"className":2830,"code":2831,"filename":2832,"language":2833,"meta":1622,"style":1622},"language-bash shiki shiki-themes kaab-code kaab-code kaab-code","response=$(curl -sS --fail-with-body \"${KAAB_BASE_URL:-https:\u002F\u002Fapi.kaab.ist\u002Fv1}\u002Fjobs\" \\\n  -H \"Authorization: Bearer $KAAB_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Prefer: wait=30\" \\\n  -d '{\n    \"url\": \"'\"${SITE_URL:-https:\u002F\u002Fshop.example.com}\"'\u002Fp\u002F1\",\n    \"extract\": {\n      \"title\": \"h1\",\n      \"price\": { \"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" }\n    }\n  }')\necho \"$response\"\n","curl","bash",[1040,2835,2836,2879,2889,2898,2907,2915,2929,2934,2939,2944,2948,2956],{"__ignoreMap":1622},[1626,2837,2838,2841,2843,2846,2848,2852,2855,2858,2861,2864,2867,2870,2873,2876],{"class":1628,"line":1629},[1626,2839,2840],{"class":1636},"response",[1626,2842,1754],{"class":1632},[1626,2844,2845],{"class":1636},"$(",[1626,2847,2832],{"class":1676},[1626,2849,2851],{"class":2850},"sx8Bj"," -sS",[1626,2853,2854],{"class":2850}," --fail-with-body",[1626,2856,2857],{"class":1643}," \"${KAAB_BASE_URL",[1626,2859,2860],{"class":1632},":-",[1626,2862,2863],{"class":1643},"https",[1626,2865,2866],{"class":1632},":\u002F\u002F",[1626,2868,2869],{"class":1643},"api.kaab.ist",[1626,2871,2872],{"class":1632},"\u002F",[1626,2874,2875],{"class":1643},"v1}\u002Fjobs\"",[1626,2877,2878],{"class":1636}," \\\n",[1626,2880,2881,2884,2887],{"class":1628,"line":1650},[1626,2882,2883],{"class":2850},"  -H",[1626,2885,2886],{"class":1643}," \"Authorization: Bearer $KAAB_API_KEY\"",[1626,2888,2878],{"class":1636},[1626,2890,2891,2893,2896],{"class":1628,"line":1657},[1626,2892,2883],{"class":2850},[1626,2894,2895],{"class":1643}," \"Content-Type: application\u002Fjson\"",[1626,2897,2878],{"class":1636},[1626,2899,2900,2902,2905],{"class":1628,"line":1683},[1626,2901,2883],{"class":2850},[1626,2903,2904],{"class":1643}," \"Prefer: wait=30\"",[1626,2906,2878],{"class":1636},[1626,2908,2909,2912],{"class":1628,"line":1702},[1626,2910,2911],{"class":2850},"  -d",[1626,2913,2914],{"class":1643}," '{\n",[1626,2916,2917,2920,2922,2924,2926],{"class":1628,"line":1722},[1626,2918,2919],{"class":1643},"    \"url\": \"'\"${SITE_URL",[1626,2921,2860],{"class":1632},[1626,2923,2863],{"class":1643},[1626,2925,2866],{"class":1632},[1626,2927,2928],{"class":1643},"shop.example.com}\"'\u002Fp\u002F1\",\n",[1626,2930,2931],{"class":1628,"line":1727},[1626,2932,2933],{"class":1643},"    \"extract\": {\n",[1626,2935,2936],{"class":1628,"line":1740},[1626,2937,2938],{"class":1643},"      \"title\": \"h1\",\n",[1626,2940,2941],{"class":1628,"line":1778},[1626,2942,2943],{"class":1643},"      \"price\": { \"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" }\n",[1626,2945,2946],{"class":1628,"line":1815},[1626,2947,2450],{"class":1643},[1626,2949,2950,2953],{"class":1628,"line":1848},[1626,2951,2952],{"class":1643},"  }'",[1626,2954,2955],{"class":1636},")\n",[1626,2957,2958,2961],{"class":1628,"line":1860},[1626,2959,2960],{"class":1676},"echo",[1626,2962,2963],{"class":1643}," \"$response\"\n",[1617,2965,2967],{"className":1619,"code":2966,"filename":2540,"language":1621,"meta":1622,"style":1622},"\u002F\u002F One call: create the job and hold the request up to 30 s for its result (`Prefer: wait`).\nconst job = await kaab.jobs.create({\n  url: `${site}\u002Fp\u002F1`,\n  extract: {\n    title: \"h1\",\n    price: { selector: \".price\", type: \"money\", locale: \"tr\", currency: \"TRY\" },\n  },\n  wait: 30,\n});\nif (job.status !== \"succeeded\") throw new Error(`job ${job.id} is ${job.status}`);\nconsole.log(`${job.id}: ${JSON.stringify(job.data)}`);\n",[1040,2968,2969,2974,2995,3017,3026,3038,3082,3088,3100,3104,3159],{"__ignoreMap":1622},[1626,2970,2971],{"class":1628,"line":1629},[1626,2972,2973],{"class":1844},"\u002F\u002F One call: create the job and hold the request up to 30 s for its result (`Prefer: wait`).\n",[1626,2975,2976,2978,2981,2983,2985,2987,2989,2991,2993],{"class":1628,"line":1650},[1626,2977,1660],{"class":1632},[1626,2979,2980],{"class":1663}," job",[1626,2982,1667],{"class":1632},[1626,2984,1670],{"class":1632},[1626,2986,2561],{"class":1663},[1626,2988,1523],{"class":1676},[1626,2990,171],{"class":1663},[1626,2992,2568],{"class":1676},[1626,2994,1857],{"class":1636},[1626,2996,2997,3000,3002,3005,3007,3010,3012,3015],{"class":1628,"line":1657},[1626,2998,2999],{"class":1636},"  url",[1626,3001,1866],{"class":1632},[1626,3003,3004],{"class":1643}," `",[1626,3006,2775],{"class":1632},[1626,3008,3009],{"class":1636},"site",[1626,3011,2783],{"class":1632},[1626,3013,3014],{"class":1643},"\u002Fp\u002F1`",[1626,3016,1888],{"class":1887},[1626,3018,3019,3022,3024],{"class":1628,"line":1683},[1626,3020,3021],{"class":1636},"  extract",[1626,3023,1866],{"class":1632},[1626,3025,2296],{"class":1636},[1626,3027,3028,3031,3033,3036],{"class":1628,"line":1702},[1626,3029,3030],{"class":1636},"    title",[1626,3032,1866],{"class":1632},[1626,3034,3035],{"class":1643}," \"h1\"",[1626,3037,1888],{"class":1887},[1626,3039,3040,3043,3045,3047,3049,3051,3053,3056,3058,3060,3062,3065,3067,3069,3071,3074,3076,3078,3080],{"class":1628,"line":1722},[1626,3041,3042],{"class":1636},"    price",[1626,3044,1866],{"class":1632},[1626,3046,2708],{"class":1636},[1626,3048,1866],{"class":1632},[1626,3050,2366],{"class":1643},[1626,3052,1915],{"class":1887},[1626,3054,3055],{"class":1636}," type",[1626,3057,1866],{"class":1632},[1626,3059,2376],{"class":1643},[1626,3061,1915],{"class":1887},[1626,3063,3064],{"class":1636}," locale",[1626,3066,1866],{"class":1632},[1626,3068,2386],{"class":1643},[1626,3070,1915],{"class":1887},[1626,3072,3073],{"class":1636}," currency",[1626,3075,1866],{"class":1632},[1626,3077,2396],{"class":1643},[1626,3079,2162],{"class":1636},[1626,3081,1888],{"class":1887},[1626,3083,3084,3086],{"class":1628,"line":1727},[1626,3085,2729],{"class":1636},[1626,3087,1888],{"class":1887},[1626,3089,3090,3093,3095,3098],{"class":1628,"line":1740},[1626,3091,3092],{"class":1636},"  wait",[1626,3094,1866],{"class":1632},[1626,3096,3097],{"class":1663}," 30",[1626,3099,1888],{"class":1887},[1626,3101,3102],{"class":1628,"line":1778},[1626,3103,2759],{"class":1636},[1626,3105,3106,3108,3110,3112,3115,3118,3121,3123,3126,3129,3132,3134,3137,3139,3141,3143,3145,3147,3149,3151,3153,3155,3157],{"class":1628,"line":1815},[1626,3107,1384],{"class":1632},[1626,3109,1745],{"class":1636},[1626,3111,478],{"class":1663},[1626,3113,3114],{"class":1636},".status ",[1626,3116,3117],{"class":1632},"!==",[1626,3119,3120],{"class":1643}," \"succeeded\"",[1626,3122,2055],{"class":1636},[1626,3124,3125],{"class":1632},"throw",[1626,3127,3128],{"class":1632}," new",[1626,3130,3131],{"class":1676}," Error",[1626,3133,1713],{"class":1636},[1626,3135,3136],{"class":1643},"`job ",[1626,3138,2775],{"class":1632},[1626,3140,478],{"class":1663},[1626,3142,2628],{"class":1636},[1626,3144,2783],{"class":1632},[1626,3146,2799],{"class":1643},[1626,3148,2775],{"class":1632},[1626,3150,478],{"class":1663},[1626,3152,2806],{"class":1636},[1626,3154,2783],{"class":1632},[1626,3156,2772],{"class":1643},[1626,3158,1719],{"class":1636},[1626,3160,3161,3163,3165,3167,3169,3171,3173,3175,3177,3180,3182,3185,3188,3190,3192,3195,3197,3199],{"class":1628,"line":1848},[1626,3162,2764],{"class":1663},[1626,3164,2767],{"class":1676},[1626,3166,1713],{"class":1636},[1626,3168,2772],{"class":1643},[1626,3170,2775],{"class":1632},[1626,3172,478],{"class":1663},[1626,3174,2628],{"class":1636},[1626,3176,2783],{"class":1632},[1626,3178,3179],{"class":1643},": ",[1626,3181,2775],{"class":1632},[1626,3183,3184],{"class":1663},"JSON",[1626,3186,3187],{"class":1676},".stringify",[1626,3189,1713],{"class":1636},[1626,3191,478],{"class":1663},[1626,3193,3194],{"class":1636},".data)",[1626,3196,2783],{"class":1632},[1626,3198,2772],{"class":1643},[1626,3200,1719],{"class":1636},[1617,3202,3207],{"className":3203,"code":3204,"filename":3205,"language":3206,"meta":1622,"style":1622},"language-python shiki shiki-themes kaab-code kaab-code kaab-code","# One call: create the job and hold the request up to 30 s for its result (Prefer: wait).\njob = kaab.jobs.create(\n    url=f\"{site}\u002Fp\u002F1\",\n    extract={\"title\": \"h1\", \"price\": {\"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\"}},\n    wait=30,\n)\nif job.status != \"succeeded\":\n    raise SystemExit(f\"job {job.id} is {job.status}\")\nprint(f\"{job.id}: {job.data.to_dict() if job.data else None}\")\n","Python","python",[1040,3208,3209,3214,3235,3260,3324,3336,3340,3359,3394],{"__ignoreMap":1622},[1626,3210,3211],{"class":1628,"line":1629},[1626,3212,3213],{"class":1844},"# One call: create the job and hold the request up to 30 s for its result (Prefer: wait).\n",[1626,3215,3216,3219,3221,3223,3225,3227,3229,3232],{"class":1628,"line":1650},[1626,3217,3218],{"class":1636},"job ",[1626,3220,1754],{"class":1632},[1626,3222,2561],{"class":1636},[1626,3224,1523],{"class":1887},[1626,3226,171],{"class":1636},[1626,3228,1523],{"class":1887},[1626,3230,3231],{"class":1676},"create",[1626,3233,3234],{"class":1887},"(\n",[1626,3236,3237,3240,3242,3245,3248,3251,3253,3255,3258],{"class":1628,"line":1657},[1626,3238,3239],{"class":1887},"    url",[1626,3241,1754],{"class":1632},[1626,3243,3244],{"class":1632},"f",[1626,3246,3247],{"class":1643},"\"",[1626,3249,3250],{"class":1663},"{",[1626,3252,3009],{"class":1887},[1626,3254,2783],{"class":1663},[1626,3256,3257],{"class":1643},"\u002Fp\u002F1\"",[1626,3259,1888],{"class":1887},[1626,3261,3262,3265,3267,3269,3272,3274,3277,3279,3282,3285,3287,3289,3291,3293,3296,3298,3301,3303,3306,3308,3311,3313,3316,3318,3321],{"class":1628,"line":1683},[1626,3263,3264],{"class":1887},"    extract",[1626,3266,1754],{"class":1632},[1626,3268,3250],{"class":1887},[1626,3270,3271],{"class":1643},"\"title\"",[1626,3273,3179],{"class":1887},[1626,3275,3276],{"class":1643},"\"h1\"",[1626,3278,1154],{"class":1887},[1626,3280,3281],{"class":1643},"\"price\"",[1626,3283,3284],{"class":1887},": {",[1626,3286,2361],{"class":1643},[1626,3288,3179],{"class":1887},[1626,3290,1472],{"class":1643},[1626,3292,1154],{"class":1887},[1626,3294,3295],{"class":1643},"\"type\"",[1626,3297,3179],{"class":1887},[1626,3299,3300],{"class":1643},"\"money\"",[1626,3302,1154],{"class":1887},[1626,3304,3305],{"class":1643},"\"locale\"",[1626,3307,3179],{"class":1887},[1626,3309,3310],{"class":1643},"\"tr\"",[1626,3312,1154],{"class":1887},[1626,3314,3315],{"class":1643},"\"currency\"",[1626,3317,3179],{"class":1887},[1626,3319,3320],{"class":1643},"\"TRY\"",[1626,3322,3323],{"class":1887},"}},\n",[1626,3325,3326,3329,3331,3334],{"class":1628,"line":1702},[1626,3327,3328],{"class":1887},"    wait",[1626,3330,1754],{"class":1632},[1626,3332,3333],{"class":1663},"30",[1626,3335,1888],{"class":1887},[1626,3337,3338],{"class":1628,"line":1722},[1626,3339,2955],{"class":1887},[1626,3341,3342,3344,3346,3348,3351,3354,3356],{"class":1628,"line":1727},[1626,3343,1384],{"class":1632},[1626,3345,2980],{"class":1636},[1626,3347,1523],{"class":1887},[1626,3349,3350],{"class":1636},"status ",[1626,3352,3353],{"class":1632},"!=",[1626,3355,3120],{"class":1643},[1626,3357,3358],{"class":1887},":\n",[1626,3360,3361,3364,3367,3369,3371,3374,3376,3379,3381,3383,3385,3388,3390,3392],{"class":1628,"line":1740},[1626,3362,3363],{"class":1632},"    raise",[1626,3365,3366],{"class":1663}," SystemExit",[1626,3368,1713],{"class":1887},[1626,3370,3244],{"class":1632},[1626,3372,3373],{"class":1643},"\"job ",[1626,3375,3250],{"class":1663},[1626,3377,3378],{"class":1887},"job.id",[1626,3380,2783],{"class":1663},[1626,3382,2799],{"class":1643},[1626,3384,3250],{"class":1663},[1626,3386,3387],{"class":1887},"job.status",[1626,3389,2783],{"class":1663},[1626,3391,3247],{"class":1643},[1626,3393,2955],{"class":1887},[1626,3395,3396,3399,3401,3403,3405,3407,3409,3411,3413,3415,3418,3421,3424,3426,3429,3432,3435,3437],{"class":1628,"line":1778},[1626,3397,3398],{"class":1676},"print",[1626,3400,1713],{"class":1887},[1626,3402,3244],{"class":1632},[1626,3404,3247],{"class":1643},[1626,3406,3250],{"class":1663},[1626,3408,3378],{"class":1887},[1626,3410,2783],{"class":1663},[1626,3412,3179],{"class":1643},[1626,3414,3250],{"class":1663},[1626,3416,3417],{"class":1887},"job.data.",[1626,3419,3420],{"class":1676},"to_dict",[1626,3422,3423],{"class":1887},"() ",[1626,3425,1384],{"class":1632},[1626,3427,3428],{"class":1887}," job.data ",[1626,3430,3431],{"class":1632},"else",[1626,3433,3434],{"class":1663}," None}",[1626,3436,3247],{"class":1643},[1626,3438,2955],{"class":1887},[1617,3440,3445],{"className":3441,"code":3442,"filename":3443,"language":3444,"meta":1622,"style":1622},"language-go shiki shiki-themes kaab-code kaab-code kaab-code","\u002F\u002F One call: create the job and hold the request up to 30 s for its result (Prefer: wait).\nbody, err := kaab.Body[client.CreateJobJSONBody](map[string]any{\n    \"url\": site + \"\u002Fp\u002F1\",\n    \"extract\": map[string]any{\n        \"title\": \"h1\",\n        \"price\": map[string]any{\"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\"},\n    },\n})\nif err != nil {\n    log.Fatal(err)\n}\njob, err := c.Jobs.Create(ctx, body, kaab.WithWait(30))\nif err != nil {\n    log.Fatal(err)\n}\nif job.Status != \"succeeded\" {\n    log.Fatalf(\"job %s is %s\", job.ID, job.Status)\n}\nfmt.Printf(\"%s: %v\\n\", job.ID, *job.Data)\n","Go","go",[1040,3446,3447,3452,3494,3510,3529,3540,3592,3597,3602,3616,3627,3631,3657,3669,3677,3681,3694,3717,3721],{"__ignoreMap":1622},[1626,3448,3449],{"class":1628,"line":1629},[1626,3450,3451],{"class":1844},"\u002F\u002F One call: create the job and hold the request up to 30 s for its result (Prefer: wait).\n",[1626,3453,3454,3457,3460,3463,3466,3469,3472,3474,3477,3480,3483,3485,3488,3490,3492],{"class":1628,"line":1650},[1626,3455,3456],{"class":1636},"body, err ",[1626,3458,3459],{"class":1632},":=",[1626,3461,3462],{"class":1636}," kaab.",[1626,3464,3465],{"class":1676},"Body",[1626,3467,3468],{"class":1636},"[",[1626,3470,3471],{"class":1676},"client",[1626,3473,1523],{"class":1636},[1626,3475,3476],{"class":1676},"CreateJobJSONBody",[1626,3478,3479],{"class":1636},"](",[1626,3481,3482],{"class":1632},"map",[1626,3484,3468],{"class":1636},[1626,3486,3487],{"class":1632},"string",[1626,3489,2674],{"class":1636},[1626,3491,634],{"class":1676},[1626,3493,2117],{"class":1636},[1626,3495,3496,3499,3502,3505,3508],{"class":1628,"line":1657},[1626,3497,3498],{"class":1643},"    \"url\"",[1626,3500,3501],{"class":1636},": site ",[1626,3503,3504],{"class":1632},"+",[1626,3506,3507],{"class":1643}," \"\u002Fp\u002F1\"",[1626,3509,1888],{"class":1636},[1626,3511,3512,3515,3517,3519,3521,3523,3525,3527],{"class":1628,"line":1683},[1626,3513,3514],{"class":1643},"    \"extract\"",[1626,3516,3179],{"class":1636},[1626,3518,3482],{"class":1632},[1626,3520,3468],{"class":1636},[1626,3522,3487],{"class":1632},[1626,3524,2674],{"class":1636},[1626,3526,634],{"class":1676},[1626,3528,2117],{"class":1636},[1626,3530,3531,3534,3536,3538],{"class":1628,"line":1702},[1626,3532,3533],{"class":1643},"        \"title\"",[1626,3535,3179],{"class":1636},[1626,3537,3276],{"class":1643},[1626,3539,1888],{"class":1636},[1626,3541,3542,3545,3547,3549,3551,3553,3555,3557,3559,3561,3563,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589],{"class":1628,"line":1722},[1626,3543,3544],{"class":1643},"        \"price\"",[1626,3546,3179],{"class":1636},[1626,3548,3482],{"class":1632},[1626,3550,3468],{"class":1636},[1626,3552,3487],{"class":1632},[1626,3554,2674],{"class":1636},[1626,3556,634],{"class":1676},[1626,3558,3250],{"class":1636},[1626,3560,2361],{"class":1643},[1626,3562,3179],{"class":1636},[1626,3564,1472],{"class":1643},[1626,3566,1154],{"class":1636},[1626,3568,3295],{"class":1643},[1626,3570,3179],{"class":1636},[1626,3572,3300],{"class":1643},[1626,3574,1154],{"class":1636},[1626,3576,3305],{"class":1643},[1626,3578,3179],{"class":1636},[1626,3580,3310],{"class":1643},[1626,3582,1154],{"class":1636},[1626,3584,3315],{"class":1643},[1626,3586,3179],{"class":1636},[1626,3588,3320],{"class":1643},[1626,3590,3591],{"class":1636},"},\n",[1626,3593,3594],{"class":1628,"line":1727},[1626,3595,3596],{"class":1636},"    },\n",[1626,3598,3599],{"class":1628,"line":1740},[1626,3600,3601],{"class":1636},"})\n",[1626,3603,3604,3606,3609,3611,3614],{"class":1628,"line":1778},[1626,3605,1384],{"class":1632},[1626,3607,3608],{"class":1636}," err ",[1626,3610,3353],{"class":1632},[1626,3612,3613],{"class":1663}," nil",[1626,3615,2296],{"class":1636},[1626,3617,3618,3621,3624],{"class":1628,"line":1815},[1626,3619,3620],{"class":1636},"    log.",[1626,3622,3623],{"class":1676},"Fatal",[1626,3625,3626],{"class":1636},"(err)\n",[1626,3628,3629],{"class":1628,"line":1848},[1626,3630,2091],{"class":1636},[1626,3632,3633,3636,3638,3641,3644,3647,3650,3652,3654],{"class":1628,"line":1860},[1626,3634,3635],{"class":1636},"job, err ",[1626,3637,3459],{"class":1632},[1626,3639,3640],{"class":1636}," c.Jobs.",[1626,3642,3643],{"class":1676},"Create",[1626,3645,3646],{"class":1636},"(ctx, body, kaab.",[1626,3648,3649],{"class":1676},"WithWait",[1626,3651,1713],{"class":1636},[1626,3653,3333],{"class":1663},[1626,3655,3656],{"class":1636},"))\n",[1626,3658,3659,3661,3663,3665,3667],{"class":1628,"line":1891},[1626,3660,1384],{"class":1632},[1626,3662,3608],{"class":1636},[1626,3664,3353],{"class":1632},[1626,3666,3613],{"class":1663},[1626,3668,2296],{"class":1636},[1626,3670,3671,3673,3675],{"class":1628,"line":1954},[1626,3672,3620],{"class":1636},[1626,3674,3623],{"class":1676},[1626,3676,3626],{"class":1636},[1626,3678,3679],{"class":1628,"line":1997},[1626,3680,2091],{"class":1636},[1626,3682,3683,3685,3688,3690,3692],{"class":1628,"line":2003},[1626,3684,1384],{"class":1632},[1626,3686,3687],{"class":1636}," job.Status ",[1626,3689,3353],{"class":1632},[1626,3691,3120],{"class":1643},[1626,3693,2296],{"class":1636},[1626,3695,3696,3698,3701,3703,3705,3708,3710,3712,3714],{"class":1628,"line":2009},[1626,3697,3620],{"class":1636},[1626,3699,3700],{"class":1676},"Fatalf",[1626,3702,1713],{"class":1636},[1626,3704,3373],{"class":1643},[1626,3706,3707],{"class":1663},"%s",[1626,3709,2799],{"class":1643},[1626,3711,3707],{"class":1663},[1626,3713,3247],{"class":1643},[1626,3715,3716],{"class":1636},", job.ID, job.Status)\n",[1626,3718,3719],{"class":1628,"line":2031},[1626,3720,2091],{"class":1636},[1626,3722,3723,3726,3729,3731,3733,3735,3737,3740,3743,3746,3749],{"class":1628,"line":2063},[1626,3724,3725],{"class":1636},"fmt.",[1626,3727,3728],{"class":1676},"Printf",[1626,3730,1713],{"class":1636},[1626,3732,3247],{"class":1643},[1626,3734,3707],{"class":1663},[1626,3736,3179],{"class":1643},[1626,3738,3739],{"class":1663},"%v",[1626,3741,3742],{"class":1643},"\\n\"",[1626,3744,3745],{"class":1636},", job.ID, ",[1626,3747,3748],{"class":1632},"*",[1626,3750,3751],{"class":1636},"job.Data)\n",[1617,3753,3755],{"className":2830,"code":3754,"filename":841,"language":2833,"meta":1622,"style":1622},"data=$(kaab jobs run \\\n  --url \"${SITE_URL:-https:\u002F\u002Fshop.example.com}\u002Fp\u002F1\" \\\n  --extract '{\"title\": \"h1\", \"price\": {\"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\"}}' \\\n  --wait 30)\necho \"$data\"\n",[1040,3756,3757,3775,3794,3804,3813],{"__ignoreMap":1622},[1626,3758,3759,3761,3763,3765,3767,3770,3773],{"class":1628,"line":1629},[1626,3760,1582],{"class":1636},[1626,3762,1754],{"class":1632},[1626,3764,2845],{"class":1636},[1626,3766,846],{"class":1676},[1626,3768,3769],{"class":2850}," jobs",[1626,3771,3772],{"class":2850}," run",[1626,3774,2878],{"class":1636},[1626,3776,3777,3780,3783,3785,3787,3789,3792],{"class":1628,"line":1650},[1626,3778,3779],{"class":2850},"  --url",[1626,3781,3782],{"class":1643}," \"${SITE_URL",[1626,3784,2860],{"class":1632},[1626,3786,2863],{"class":1643},[1626,3788,2866],{"class":1632},[1626,3790,3791],{"class":1643},"shop.example.com}\u002Fp\u002F1\"",[1626,3793,2878],{"class":1636},[1626,3795,3796,3799,3802],{"class":1628,"line":1657},[1626,3797,3798],{"class":2850},"  --extract",[1626,3800,3801],{"class":1643}," '{\"title\": \"h1\", \"price\": {\"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\"}}'",[1626,3803,2878],{"class":1636},[1626,3805,3806,3809,3811],{"class":1628,"line":1683},[1626,3807,3808],{"class":2850},"  --wait",[1626,3810,3097],{"class":1663},[1626,3812,2955],{"class":1636},[1626,3814,3815,3817],{"class":1628,"line":1702},[1626,3816,2960],{"class":1676},[1626,3818,3819],{"class":1643}," \"$data\"\n",[1029,3821,3823],{"id":3822},"pitfalls","Pitfalls",[2466,3825,3826,3839,3848,3865,3873,3887],{},[2469,3827,3828,2491,3831,3833,3834,1473,3836,3838],{},[2472,3829,3830],{},"Porting the sleeps.",[1040,3832,586],{}," is capped at 10 seconds and lint warns about it. Replace each with\nan ",[1040,3835,1228],{},[1040,3837,563],{}," on what you were waiting for.",[2469,3840,3841,2491,3844,3847],{},[2472,3842,3843],{},"Positional selectors.",[1040,3845,3846],{},"nth-child"," chains and structural XPaths are the first thing to break,\nand lint warns when a target has nothing better. Prefer test ids, roles and text, and add\ncandidates.",[2469,3849,3850,3853,3854,1473,3857,3860,3861,3864],{},[2472,3851,3852],{},"\"First match\" habits."," Playwright's strict mode is close, but code that used ",[1040,3855,3856],{},"$",[1040,3858,3859],{},".first()","\nsilently picked one element. In a program, an ambiguous target fails; add ",[1040,3862,3863],{},"nth"," only when the\nposition is the meaning.",[2469,3866,3867,3872],{},[2472,3868,3869,3870,1523],{},"Moving logic into ",[1040,3871,574],{}," It works, but healing cannot see inside it and it needs a paid\nplan. Use extract types, transforms and conditions first.",[2469,3874,3875,3878,3879,3882,3883,1552],{},[2472,3876,3877],{},"Passwords as plain strings."," Declare them as ",[1040,3880,3881],{},"secret"," inputs (see\n",[1082,3884,3886],{"href":3885},"\u002Fguides\u002Fsecurity-and-data","security and data handling",[2469,3888,3889,3892],{},[2472,3890,3891],{},"Assuming a browser."," Kaabist starts on HTTP and escalates when the page needs it. If your\nscript relied on browser-only behaviour (clicks, typing), the program runs in a browser\nautomatically; a read-only program may not.",[1029,3894,155],{"id":3895},"reference",[2466,3897,3898,3909,3920,3948],{},[2469,3899,3900,1154,3903,1154,3906],{},[1082,3901,3902],{"href":525},"DSL reference",[1082,3904,537],{"href":3905},"\u002Freference\u002Fdsl\u002Fsteps",[1082,3907,639],{"href":3908},"\u002Freference\u002Fdsl\u002Ftargets",[2469,3910,3911,3915,3916],{},[1082,3912,3913],{"href":1347},[1040,3914,576],{}," and ",[1082,3917,3918],{"href":1209},[1040,3919,569],{},[2469,3921,3922,3923,1154,3928,1888,3933,1154,3938,1888,3943],{},"Field options: ",[1082,3924,3926],{"href":3925},"\u002Freference\u002Fdsl\u002Ffields\u002Fmany",[1040,3927,684],{},[1082,3929,3931],{"href":3930},"\u002Freference\u002Fdsl\u002Ffields\u002Ffields",[1040,3932,642],{},[1082,3934,3936],{"href":3935},"\u002Freference\u002Fdsl\u002Ffields\u002Ftype",[1040,3937,744],{},[1082,3939,3941],{"href":3940},"\u002Freference\u002Fdsl\u002Ffields\u002Fregex",[1040,3942,717],{},[1082,3944,3946],{"href":3945},"\u002Freference\u002Fdsl\u002Ffields\u002Flocale",[1040,3947,682],{},[2469,3949,3950,1154,3954],{},[1082,3951,3953],{"href":3952},"\u002Freference\u002Fapi\u002Fprograms\u002Fcreate-program","Create a program",[1082,3955,3957],{"href":3956},"\u002Freference\u002Fapi\u002Fjobs\u002Fcreate-job","create a job",[3959,3960,3961],"style",{},"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 .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 .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 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 .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 .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 .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);}html pre.shiki code .sx8Bj, html code.shiki .sx8Bj{--shiki-light:var(--kaab-code-token-string);--shiki-default:var(--kaab-code-token-string);--shiki-dark:var(--kaab-code-token-string)}",{"title":1622,"searchDepth":1657,"depth":1657,"links":3963},[3964,3965,3973,3974,3975],{"id":1031,"depth":1650,"text":1032},{"id":1045,"depth":1650,"text":1046,"children":3966},[3967,3968,3969,3970,3971,3972],{"id":1050,"depth":1657,"text":1051},{"id":1403,"depth":1657,"text":1404},{"id":1526,"depth":1657,"text":1527},{"id":1555,"depth":1657,"text":1556},{"id":1566,"depth":1657,"text":1567},{"id":1590,"depth":1657,"text":1591},{"id":1611,"depth":1650,"text":1612},{"id":3822,"depth":1650,"text":3823},{"id":3895,"depth":1650,"text":155},false,null,"Move Playwright or Puppeteer scripts, scraping-API calls and no-code scrapers to Kaabist programs, with a concept map and a worked conversion.","md",{},"\u002Fguides\u002Fmigrating",{"title":119,"description":3978},"3.guides\u002F11.migrating","b7Ag73OjoNIzFpJ4MeSsnlmph-J1SvzTPhc9SBRxF-I",[3986,3989],{"title":116,"path":3885,"stem":3987,"description":3988,"children":-1},"3.guides\u002F10.security-and-data","What Kaabist stores about your jobs, how secrets and sessions are protected, how long data is kept, and how to delete it.",{"title":122,"path":3990,"stem":3991,"description":3992,"children":-1},"\u002Fguides\u002Fdrift-and-canaries","3.guides\u002F12.drift-and-canaries","How Kaabist notices that a program has quietly started returning worse data, and how it finds out before your next job does.",1793593417676]