[{"data":1,"prerenderedAt":2846},["ShallowReactive",2],{"navigation":3,"page:\u002Fguides\u002Flists-and-pagination":1019,"surround:\u002Fguides\u002Flists-and-pagination":2838},[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":95,"body":1021,"breaking":2829,"date":2830,"description":2831,"extension":2832,"generated":2829,"meta":2833,"navigation":2432,"path":2834,"seo":2835,"stem":2836,"version":2830,"__hash__":2837},"docs\u002F3.guides\u002F03.lists-and-pagination.md",{"type":1022,"value":1023,"toc":2814},"minimark",[1024,1038,1043,1073,1080,1084,1097,1308,1356,1361,1382,1393,1397,1410,1544,1581,1584,1616,1620,1624,1643,1710,1720,1724,1736,1836,1851,1855,1864,2031,2035,2046,2628,2645,2663,2667,2729,2732,2810],[1025,1026,1027,1028,1031,1032,1034,1035,1037],"p",{},"Most data worth automating comes as a list: products on a category page, rows in a report,\nresults spread over twelve pages or loaded as you scroll. This guide shows how to read a list of\nobjects, collect it across pages with ",[1029,1030,576],"code",{},", and load infinite lists with ",[1029,1033,561],{}," and\n",[1029,1036,601],{},", always with a bound so a job cannot walk forever.",[1039,1040,1042],"h2",{"id":1041},"when-to-use-it","When to use it",[1044,1045,1046,1057,1063],"ul",{},[1047,1048,1049,1050,1053,1054,1056],"li",{},"One page, many items: a ",[1029,1051,1052],{},"many: true"," field with ",[1029,1055,642],{},".",[1047,1058,1059,1060,1062],{},"Items spread over numbered pages or a \"next\" link: a ",[1029,1061,576],{}," step.",[1047,1064,1065,1066,1069,1070,1072],{},"Items that load as you scroll, or behind a \"load more\" button: ",[1029,1067,1068],{},"scroll … until",", or a\n",[1029,1071,601],{}," that clicks the button.",[1025,1074,1075,1076,1056],{},"If the page fetches its items from a JSON API, reading that API is often simpler and cheaper than\nwalking the rendered list; see ",[1077,1078,98],"a",{"href":1079},"\u002Fguides\u002Fjson-and-network-locators",[1039,1081,1083],{"id":1082},"lists-of-objects","Lists of objects",[1025,1085,1086,1088,1089,1091,1092,1096],{},[1029,1087,1052],{}," turns a field into a list. With ",[1029,1090,642],{},", each match becomes an object, and every\nsubfield is located ",[1093,1094,1095],"strong",{},"inside"," its own item, so the third price always belongs to the third\nproduct:",[1098,1099,1103],"pre",{"className":1100,"code":1101,"language":680,"meta":1102,"style":1102},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","\"extract\": {\n  \"products\": {\n    \"selector\": \".product-card\",\n    \"many\": true,\n    \"min_items\": 1,\n    \"fields\": {\n      \"title\": \".title\",\n      \"price\": { \"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" },\n      \"url\": { \"selector\": \"a\", \"attr\": \"href\", \"type\": \"url\" }\n    }\n  }\n}\n","",[1029,1104,1105,1118,1132,1146,1160,1173,1183,1196,1251,1290,1296,1302],{"__ignoreMap":1102},[1106,1107,1110,1114],"span",{"class":1108,"line":1109},"line",1,[1106,1111,1113],{"class":1112},"suOy4","\"extract\"",[1106,1115,1117],{"class":1116},"sTzsn",": {\n",[1106,1119,1121,1125,1129],{"class":1108,"line":1120},2,[1106,1122,1124],{"class":1123},"sqn18","  \"products\"",[1106,1126,1128],{"class":1127},"sQm2-",":",[1106,1130,1131],{"class":1116}," {\n",[1106,1133,1135,1138,1140,1143],{"class":1108,"line":1134},3,[1106,1136,1137],{"class":1123},"    \"selector\"",[1106,1139,1128],{"class":1127},[1106,1141,1142],{"class":1112}," \".product-card\"",[1106,1144,1145],{"class":1127},",\n",[1106,1147,1149,1152,1154,1158],{"class":1108,"line":1148},4,[1106,1150,1151],{"class":1123},"    \"many\"",[1106,1153,1128],{"class":1127},[1106,1155,1157],{"class":1156},"sHJIl"," true",[1106,1159,1145],{"class":1127},[1106,1161,1163,1166,1168,1171],{"class":1108,"line":1162},5,[1106,1164,1165],{"class":1123},"    \"min_items\"",[1106,1167,1128],{"class":1127},[1106,1169,1170],{"class":1156}," 1",[1106,1172,1145],{"class":1127},[1106,1174,1176,1179,1181],{"class":1108,"line":1175},6,[1106,1177,1178],{"class":1123},"    \"fields\"",[1106,1180,1128],{"class":1127},[1106,1182,1131],{"class":1116},[1106,1184,1186,1189,1191,1194],{"class":1108,"line":1185},7,[1106,1187,1188],{"class":1123},"      \"title\"",[1106,1190,1128],{"class":1127},[1106,1192,1193],{"class":1112}," \".title\"",[1106,1195,1145],{"class":1127},[1106,1197,1199,1202,1204,1207,1210,1212,1215,1218,1221,1223,1226,1228,1231,1233,1236,1238,1241,1243,1246,1249],{"class":1108,"line":1198},8,[1106,1200,1201],{"class":1123},"      \"price\"",[1106,1203,1128],{"class":1127},[1106,1205,1206],{"class":1116}," { ",[1106,1208,1209],{"class":1123},"\"selector\"",[1106,1211,1128],{"class":1127},[1106,1213,1214],{"class":1112}," \".price\"",[1106,1216,1217],{"class":1127},",",[1106,1219,1220],{"class":1123}," \"type\"",[1106,1222,1128],{"class":1127},[1106,1224,1225],{"class":1112}," \"money\"",[1106,1227,1217],{"class":1127},[1106,1229,1230],{"class":1123}," \"locale\"",[1106,1232,1128],{"class":1127},[1106,1234,1235],{"class":1112}," \"tr\"",[1106,1237,1217],{"class":1127},[1106,1239,1240],{"class":1123}," \"currency\"",[1106,1242,1128],{"class":1127},[1106,1244,1245],{"class":1112}," \"TRY\"",[1106,1247,1248],{"class":1116}," }",[1106,1250,1145],{"class":1127},[1106,1252,1254,1257,1259,1261,1263,1265,1268,1270,1273,1275,1278,1280,1282,1284,1287],{"class":1108,"line":1253},9,[1106,1255,1256],{"class":1123},"      \"url\"",[1106,1258,1128],{"class":1127},[1106,1260,1206],{"class":1116},[1106,1262,1209],{"class":1123},[1106,1264,1128],{"class":1127},[1106,1266,1267],{"class":1112}," \"a\"",[1106,1269,1217],{"class":1127},[1106,1271,1272],{"class":1123}," \"attr\"",[1106,1274,1128],{"class":1127},[1106,1276,1277],{"class":1112}," \"href\"",[1106,1279,1217],{"class":1127},[1106,1281,1220],{"class":1123},[1106,1283,1128],{"class":1127},[1106,1285,1286],{"class":1112}," \"url\"",[1106,1288,1289],{"class":1116}," }\n",[1106,1291,1293],{"class":1108,"line":1292},10,[1106,1294,1295],{"class":1116},"    }\n",[1106,1297,1299],{"class":1108,"line":1298},11,[1106,1300,1301],{"class":1116},"  }\n",[1106,1303,1305],{"class":1108,"line":1304},12,[1106,1306,1307],{"class":1116},"}\n",[1044,1309,1310,1323,1331,1338],{},[1047,1311,1312,1313,1315,1316,1318,1319,1322],{},"Without ",[1029,1314,642],{},", ",[1029,1317,1052],{}," gives a list of scalars (",[1029,1320,1321],{},"\"tags\": { \"selector\": \".tag\", \"many\": true }",").",[1047,1324,1325,1327,1328,1330],{},[1029,1326,642],{}," without ",[1029,1329,684],{}," gives a single object, scoped to the first match.",[1047,1332,1333,1334,1337],{},"Inside an item, ",[1029,1335,1336],{},"selector: \":scope\""," is the item itself, for a field that reads the item's own\ntext or attribute.",[1047,1339,1340,1315,1342,1344,1345,1347,1348,1351,1352,1355],{},[1029,1341,696],{},[1029,1343,688],{}," and ",[1029,1346,746],{}," (",[1029,1349,1350],{},"true",", or the name of a subfield such as ",[1029,1353,1354],{},"\"sku\"",")\nconstrain the list.",[1357,1358,1360],"h3",{"id":1359},"when-the-list-is-shorter-than-expected","When the list is shorter than expected",[1025,1362,1363,1364,1366,1367,1370,1371,1374,1375,1378,1379,1381],{},"A list with fewer items than ",[1029,1365,696],{}," keeps the items it found and carries the warning\n",[1029,1368,1369],{},"list_short"," on the list's path, for example ",[1029,1372,1373],{},"{ \"code\": \"list_short\", \"field\": \"products\" }",". A\njob that would rather fail than return a short list sets ",[1029,1376,1377],{},"\"on_invalid\": \"fail\""," on that field.\n",[1029,1380,696],{}," is your best defence against a page that quietly started showing fewer results.",[1025,1383,1384,1385,1388,1389,1056],{},"Warnings about the items themselves are aggregated onto the list path with a count, so one bad\nprice in forty reads ",[1029,1386,1387],{},"{ \"code\": \"null_marker\", \"field\": \"products[].price\", \"count\": 1, \"of\": 40 }","\nrather than forty separate entries. See\n",[1077,1390,1392],{"href":1391},"\u002Fconcepts\u002Fvalidation-and-warnings","validation and warnings",[1039,1394,1396],{"id":1395},"pages-with-a-next-link","Pages with a \"next\" link",[1025,1398,1399,1400,1402,1403,1405,1406,1409],{},"A ",[1029,1401,576],{}," step pairs a navigation with an ",[1029,1404,569],{},". It runs the extract on the current page,\nfollows ",[1029,1407,1408],{},"next",", and repeats:",[1098,1411,1413],{"className":1100,"code":1412,"language":680,"meta":1102,"style":1102},"{\n  \"paginate\": {\n    \"next\": { \"css\": \"a[rel=next]\" },\n    \"max_pages\": 5,\n    \"stop_when\": { \"absent\": \"a[rel=next]\" },\n    \"delay_ms\": 0\n  },\n  \"extract\": { \"products\": { \"selector\": \".product-card\", \"many\": true, \"fields\": { … } } }\n}\n",[1029,1414,1415,1420,1429,1450,1462,1482,1492,1499,1540],{"__ignoreMap":1102},[1106,1416,1417],{"class":1108,"line":1109},[1106,1418,1419],{"class":1116},"{\n",[1106,1421,1422,1425,1427],{"class":1108,"line":1120},[1106,1423,1424],{"class":1123},"  \"paginate\"",[1106,1426,1128],{"class":1127},[1106,1428,1131],{"class":1116},[1106,1430,1431,1434,1436,1438,1441,1443,1446,1448],{"class":1108,"line":1134},[1106,1432,1433],{"class":1123},"    \"next\"",[1106,1435,1128],{"class":1127},[1106,1437,1206],{"class":1116},[1106,1439,1440],{"class":1123},"\"css\"",[1106,1442,1128],{"class":1127},[1106,1444,1445],{"class":1112}," \"a[rel=next]\"",[1106,1447,1248],{"class":1116},[1106,1449,1145],{"class":1127},[1106,1451,1452,1455,1457,1460],{"class":1108,"line":1148},[1106,1453,1454],{"class":1123},"    \"max_pages\"",[1106,1456,1128],{"class":1127},[1106,1458,1459],{"class":1156}," 5",[1106,1461,1145],{"class":1127},[1106,1463,1464,1467,1469,1471,1474,1476,1478,1480],{"class":1108,"line":1162},[1106,1465,1466],{"class":1123},"    \"stop_when\"",[1106,1468,1128],{"class":1127},[1106,1470,1206],{"class":1116},[1106,1472,1473],{"class":1123},"\"absent\"",[1106,1475,1128],{"class":1127},[1106,1477,1445],{"class":1112},[1106,1479,1248],{"class":1116},[1106,1481,1145],{"class":1127},[1106,1483,1484,1487,1489],{"class":1108,"line":1175},[1106,1485,1486],{"class":1123},"    \"delay_ms\"",[1106,1488,1128],{"class":1127},[1106,1490,1491],{"class":1156}," 0\n",[1106,1493,1494,1497],{"class":1108,"line":1185},[1106,1495,1496],{"class":1116},"  }",[1106,1498,1145],{"class":1127},[1106,1500,1501,1504,1506,1508,1511,1513,1515,1517,1519,1521,1523,1526,1528,1530,1532,1535,1537],{"class":1108,"line":1198},[1106,1502,1503],{"class":1123},"  \"extract\"",[1106,1505,1128],{"class":1127},[1106,1507,1206],{"class":1116},[1106,1509,1510],{"class":1123},"\"products\"",[1106,1512,1128],{"class":1127},[1106,1514,1206],{"class":1116},[1106,1516,1209],{"class":1123},[1106,1518,1128],{"class":1127},[1106,1520,1142],{"class":1112},[1106,1522,1217],{"class":1127},[1106,1524,1525],{"class":1123}," \"many\"",[1106,1527,1128],{"class":1127},[1106,1529,1157],{"class":1156},[1106,1531,1217],{"class":1127},[1106,1533,1534],{"class":1123}," \"fields\"",[1106,1536,1128],{"class":1127},[1106,1538,1539],{"class":1116}," { … } } }\n",[1106,1541,1542],{"class":1108,"line":1253},[1106,1543,1307],{"class":1116},[1044,1545,1546,1563,1573],{},[1047,1547,1548,1549,1552,1553,1556,1557,1559,1560,1562],{},"It stops at whichever comes first: ",[1029,1550,1551],{},"max_pages"," pages, the ",[1029,1554,1555],{},"stop_when"," condition being true on\nthe page it has read, ",[1029,1558,1408],{}," not being found, or ",[1029,1561,1408],{}," no longer moving the page.",[1047,1564,1565,1566,1568,1569,1572],{},"Top-level ",[1029,1567,1052],{}," fields are ",[1093,1570,1571],{},"concatenated"," across pages. Every other field is taken from\nthe first page.",[1047,1574,1575,1577,1578,1580],{},[1029,1576,1408],{}," is an ordinary target, so it can carry ",[1029,1579,655],{}," for a site that renders the link\ndifferently over time.",[1025,1582,1583],{},"Two lint errors keep a paginate step honest:",[1044,1585,1586,1605],{},[1047,1587,1588,1591,1592,1327,1594,1596,1597,1599,1600,1327,1602,1604],{},[1077,1589,766],{"href":1590},"\u002Freference\u002Fdsl\u002Flint\u002Fe002",": a ",[1029,1593,576],{},[1029,1595,1551],{}," (and a ",[1029,1598,1068],{}," or a\n",[1029,1601,601],{},[1029,1603,686],{},"). Every loop in a program has a bound.",[1047,1606,1607,1591,1610,1612,1613,1615],{},[1077,1608,790],{"href":1609},"\u002Freference\u002Fdsl\u002Flint\u002Fe010",[1029,1611,576],{}," whose extract has no ",[1029,1614,1052],{}," field, which\nwould read the first page's values and throw the rest away.",[1039,1617,1619],{"id":1618},"infinite-lists","Infinite lists",[1357,1621,1623],{"id":1622},"scrolling-until-a-condition-holds","Scrolling until a condition holds",[1025,1625,1626,1628,1629,1344,1632,1635,1636,1639,1640,1642],{},[1029,1627,561],{}," with ",[1029,1630,1631],{},"to",[1029,1633,1634],{},"until"," scrolls, waits ",[1029,1637,1638],{},"delay_ms",", checks the condition, and repeats up to\n",[1029,1641,686],{}," times:",[1098,1644,1646],{"className":1100,"code":1645,"language":680,"meta":1102,"style":1102},"{ \"scroll\": { \"to\": \"bottom\", \"until\": { \"exists\": \"#done\" }, \"max\": 10, \"delay_ms\": 100 } }\n",[1029,1647,1648],{"__ignoreMap":1102},[1106,1649,1650,1653,1656,1658,1660,1663,1665,1668,1670,1673,1675,1677,1680,1682,1685,1687,1689,1692,1694,1697,1699,1702,1704,1707],{"class":1108,"line":1109},[1106,1651,1652],{"class":1116},"{ ",[1106,1654,1655],{"class":1123},"\"scroll\"",[1106,1657,1128],{"class":1127},[1106,1659,1206],{"class":1116},[1106,1661,1662],{"class":1123},"\"to\"",[1106,1664,1128],{"class":1127},[1106,1666,1667],{"class":1112}," \"bottom\"",[1106,1669,1217],{"class":1127},[1106,1671,1672],{"class":1123}," \"until\"",[1106,1674,1128],{"class":1127},[1106,1676,1206],{"class":1116},[1106,1678,1679],{"class":1123},"\"exists\"",[1106,1681,1128],{"class":1127},[1106,1683,1684],{"class":1112}," \"#done\"",[1106,1686,1248],{"class":1116},[1106,1688,1217],{"class":1127},[1106,1690,1691],{"class":1123}," \"max\"",[1106,1693,1128],{"class":1127},[1106,1695,1696],{"class":1156}," 10",[1106,1698,1217],{"class":1127},[1106,1700,1701],{"class":1123}," \"delay_ms\"",[1106,1703,1128],{"class":1127},[1106,1705,1706],{"class":1156}," 100",[1106,1708,1709],{"class":1116}," } }\n",[1025,1711,1712,1714,1715,1717,1718,1322],{},[1029,1713,686],{}," is required whenever ",[1029,1716,1634],{}," is given (",[1077,1719,766],{"href":1590},[1357,1721,1723],{"id":1722},"repeating-a-block","Repeating a block",[1025,1725,1726,1728,1729,1732,1733,1735],{},[1029,1727,601],{}," runs a block of steps until a condition is true, checking the condition ",[1093,1730,1731],{},"before","\neach pass, at most ",[1029,1734,686],{}," times (1 to 100). Use it for a \"load more\" button, or to combine a scroll with\nother steps:",[1098,1737,1739],{"className":1100,"code":1738,"language":680,"meta":1102,"style":1102},"{\n  \"loop_until\": { \"exists\": \"#done\" },\n  \"max\": 10,\n  \"do\": [ { \"scroll\": { \"to\": \"bottom\", \"until\": { \"exists\": \"#done\" }, \"max\": 10, \"delay_ms\": 100 } } ]\n}\n",[1029,1740,1741,1745,1764,1775,1832],{"__ignoreMap":1102},[1106,1742,1743],{"class":1108,"line":1109},[1106,1744,1419],{"class":1116},[1106,1746,1747,1750,1752,1754,1756,1758,1760,1762],{"class":1108,"line":1120},[1106,1748,1749],{"class":1123},"  \"loop_until\"",[1106,1751,1128],{"class":1127},[1106,1753,1206],{"class":1116},[1106,1755,1679],{"class":1123},[1106,1757,1128],{"class":1127},[1106,1759,1684],{"class":1112},[1106,1761,1248],{"class":1116},[1106,1763,1145],{"class":1127},[1106,1765,1766,1769,1771,1773],{"class":1108,"line":1134},[1106,1767,1768],{"class":1123},"  \"max\"",[1106,1770,1128],{"class":1127},[1106,1772,1696],{"class":1156},[1106,1774,1145],{"class":1127},[1106,1776,1777,1780,1782,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829],{"class":1108,"line":1148},[1106,1778,1779],{"class":1123},"  \"do\"",[1106,1781,1128],{"class":1127},[1106,1783,1784],{"class":1116}," [ { ",[1106,1786,1655],{"class":1123},[1106,1788,1128],{"class":1127},[1106,1790,1206],{"class":1116},[1106,1792,1662],{"class":1123},[1106,1794,1128],{"class":1127},[1106,1796,1667],{"class":1112},[1106,1798,1217],{"class":1127},[1106,1800,1672],{"class":1123},[1106,1802,1128],{"class":1127},[1106,1804,1206],{"class":1116},[1106,1806,1679],{"class":1123},[1106,1808,1128],{"class":1127},[1106,1810,1684],{"class":1112},[1106,1812,1248],{"class":1116},[1106,1814,1217],{"class":1127},[1106,1816,1691],{"class":1123},[1106,1818,1128],{"class":1127},[1106,1820,1696],{"class":1156},[1106,1822,1217],{"class":1127},[1106,1824,1701],{"class":1123},[1106,1826,1128],{"class":1127},[1106,1828,1706],{"class":1156},[1106,1830,1831],{"class":1116}," } } ]\n",[1106,1833,1834],{"class":1108,"line":1162},[1106,1835,1307],{"class":1116},[1025,1837,1399,1838,1840,1841,1843,1844,1847,1848,1056],{},[1029,1839,601],{}," that reaches ",[1029,1842,686],{}," without its condition becoming true fails the job with\n",[1029,1845,1846],{},"loop_exhausted",", unless the step is ",[1029,1849,1850],{},"optional",[1357,1852,1854],{"id":1853},"virtualised-lists","Virtualised lists",[1025,1856,1857,1858,1860,1861,1863],{},"Some lists keep only the rows on screen in the page and recycle them as you scroll. Picture a list\nof 1 000 rows that never has more than 20 in the page. Scrolling reaches the end,\nbut an ",[1029,1859,569],{}," afterwards reads only the rows in the page at that moment. For such a list, read\nthe data from the API that feeds it (see ",[1077,1862,98],{"href":1079},"),\nor read what you need from what stays in the page, as this program does:",[1098,1865,1867],{"className":1100,"code":1866,"language":680,"meta":1102,"style":1102},"[\n  { \"scroll\": { \"to\": \"bottom\", \"until\": { \"count\": { \"target\": \"#rows .row[data-index='999']\", \"eq\": 1 } },\n    \"max\": 60, \"delay_ms\": 50 } },\n  { \"extract\": {\n      \"total\": { \"selector\": \"#total\", \"type\": \"integer\" },\n      \"last_index\": { \"selector\": \"#rows .row:last-child\", \"attr\": \"data-index\", \"type\": \"integer\" } } }\n]\n",[1029,1868,1869,1874,1928,1951,1961,1990,2026],{"__ignoreMap":1102},[1106,1870,1871],{"class":1108,"line":1109},[1106,1872,1873],{"class":1116},"[\n",[1106,1875,1876,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1902,1904,1906,1909,1911,1914,1916,1919,1921,1923,1926],{"class":1108,"line":1120},[1106,1877,1878],{"class":1116},"  { ",[1106,1880,1655],{"class":1123},[1106,1882,1128],{"class":1127},[1106,1884,1206],{"class":1116},[1106,1886,1662],{"class":1123},[1106,1888,1128],{"class":1127},[1106,1890,1667],{"class":1112},[1106,1892,1217],{"class":1127},[1106,1894,1672],{"class":1123},[1106,1896,1128],{"class":1127},[1106,1898,1206],{"class":1116},[1106,1900,1901],{"class":1123},"\"count\"",[1106,1903,1128],{"class":1127},[1106,1905,1206],{"class":1116},[1106,1907,1908],{"class":1123},"\"target\"",[1106,1910,1128],{"class":1127},[1106,1912,1913],{"class":1112}," \"#rows .row[data-index='999']\"",[1106,1915,1217],{"class":1127},[1106,1917,1918],{"class":1123}," \"eq\"",[1106,1920,1128],{"class":1127},[1106,1922,1170],{"class":1156},[1106,1924,1925],{"class":1116}," } }",[1106,1927,1145],{"class":1127},[1106,1929,1930,1933,1935,1938,1940,1942,1944,1947,1949],{"class":1108,"line":1134},[1106,1931,1932],{"class":1123},"    \"max\"",[1106,1934,1128],{"class":1127},[1106,1936,1937],{"class":1156}," 60",[1106,1939,1217],{"class":1127},[1106,1941,1701],{"class":1123},[1106,1943,1128],{"class":1127},[1106,1945,1946],{"class":1156}," 50",[1106,1948,1925],{"class":1116},[1106,1950,1145],{"class":1127},[1106,1952,1953,1955,1957,1959],{"class":1108,"line":1148},[1106,1954,1878],{"class":1116},[1106,1956,1113],{"class":1123},[1106,1958,1128],{"class":1127},[1106,1960,1131],{"class":1116},[1106,1962,1963,1966,1968,1970,1972,1974,1977,1979,1981,1983,1986,1988],{"class":1108,"line":1162},[1106,1964,1965],{"class":1123},"      \"total\"",[1106,1967,1128],{"class":1127},[1106,1969,1206],{"class":1116},[1106,1971,1209],{"class":1123},[1106,1973,1128],{"class":1127},[1106,1975,1976],{"class":1112}," \"#total\"",[1106,1978,1217],{"class":1127},[1106,1980,1220],{"class":1123},[1106,1982,1128],{"class":1127},[1106,1984,1985],{"class":1112}," \"integer\"",[1106,1987,1248],{"class":1116},[1106,1989,1145],{"class":1127},[1106,1991,1992,1995,1997,1999,2001,2003,2006,2008,2010,2012,2015,2017,2019,2021,2023],{"class":1108,"line":1175},[1106,1993,1994],{"class":1123},"      \"last_index\"",[1106,1996,1128],{"class":1127},[1106,1998,1206],{"class":1116},[1106,2000,1209],{"class":1123},[1106,2002,1128],{"class":1127},[1106,2004,2005],{"class":1112}," \"#rows .row:last-child\"",[1106,2007,1217],{"class":1127},[1106,2009,1272],{"class":1123},[1106,2011,1128],{"class":1127},[1106,2013,2014],{"class":1112}," \"data-index\"",[1106,2016,1217],{"class":1127},[1106,2018,1220],{"class":1123},[1106,2020,1128],{"class":1127},[1106,2022,1985],{"class":1112},[1106,2024,2025],{"class":1116}," } } }\n",[1106,2027,2028],{"class":1108,"line":1185},[1106,2029,2030],{"class":1116},"]\n",[1039,2032,2034],{"id":2033},"worked-example","Worked example",[1025,2036,2037,2038,2041,2042,2045],{},"Take a shop at ",[1029,2039,2040],{},"https:\u002F\u002Fshop.example.com"," whose category list ",[1029,2043,2044],{},"\u002Fc\u002Fshoes?page=n"," shows ten items a\npage over twelve pages, each with a label and an amount in Turkish lira. This program collects\nthree pages:",[2047,2048,2049],"code-group",{},[1098,2050,2055],{"className":2051,"code":2052,"filename":2053,"language":2054,"meta":1102,"style":1102},"language-ts shiki shiki-themes kaab-code kaab-code kaab-code","const definition = {\n  kaab: \"1\",\n  name,\n  options: { max_tier: \"browser\" }, \u002F\u002F following \"next\" clicks it, which takes a browser\n  steps: [\n    { goto: `${site}\u002Flist?page=1`, expect: { visible: \"#items .item\" } },\n    {\n      paginate: {\n        next: { css: \"a[rel=next]\" },\n        max_pages: 3,\n        stop_when: { absent: \"a[rel=next]\" },\n      },\n      extract: {\n        items: {\n          selector: \"#items .item\",\n          many: true,\n          fields: {\n            label: \".label\",\n            amount: { selector: \".amount\", type: \"money\", locale: \"tr\", currency: \"TRY\" },\n          },\n        },\n      },\n    },\n  ],\n};\nawait kaab.programs.create({ name, definition, publish: true });\n\nconst started = await kaab.jobs.create({ program: name });\nconst job = await kaab.jobs.wait(started.id, { timeoutMs: 120_000 });\nconst items = (job.data?.items ?? []) as { label: string }[];\nconsole.log(`${job.id}: ${items.length} items, ${items[0]?.label} … ${items.at(-1)?.label}`);\n","TypeScript","ts",[1029,2056,2057,2070,2082,2089,2112,2122,2163,2168,2177,2195,2207,2225,2232,2242,2252,2264,2276,2286,2299,2346,2354,2362,2369,2377,2385,2391,2427,2434,2463,2505,2547],{"__ignoreMap":1102},[1106,2058,2059,2062,2065,2068],{"class":1108,"line":1109},[1106,2060,2061],{"class":1123},"const",[1106,2063,2064],{"class":1156}," definition",[1106,2066,2067],{"class":1123}," =",[1106,2069,1131],{"class":1116},[1106,2071,2072,2075,2077,2080],{"class":1108,"line":1120},[1106,2073,2074],{"class":1116},"  kaab",[1106,2076,1128],{"class":1123},[1106,2078,2079],{"class":1112}," \"1\"",[1106,2081,1145],{"class":1127},[1106,2083,2084,2087],{"class":1108,"line":1134},[1106,2085,2086],{"class":1116},"  name",[1106,2088,1145],{"class":1127},[1106,2090,2091,2094,2096,2099,2101,2104,2106,2108],{"class":1108,"line":1148},[1106,2092,2093],{"class":1116},"  options",[1106,2095,1128],{"class":1123},[1106,2097,2098],{"class":1116}," { max_tier",[1106,2100,1128],{"class":1123},[1106,2102,2103],{"class":1112}," \"browser\"",[1106,2105,1248],{"class":1116},[1106,2107,1217],{"class":1127},[1106,2109,2111],{"class":2110},"sKog0"," \u002F\u002F following \"next\" clicks it, which takes a browser\n",[1106,2113,2114,2117,2119],{"class":1108,"line":1162},[1106,2115,2116],{"class":1116},"  steps",[1106,2118,1128],{"class":1123},[1106,2120,2121],{"class":1116}," [\n",[1106,2123,2124,2127,2129,2132,2135,2138,2141,2144,2146,2149,2151,2154,2156,2159,2161],{"class":1108,"line":1175},[1106,2125,2126],{"class":1116},"    { goto",[1106,2128,1128],{"class":1123},[1106,2130,2131],{"class":1112}," `",[1106,2133,2134],{"class":1123},"${",[1106,2136,2137],{"class":1116},"site",[1106,2139,2140],{"class":1123},"}",[1106,2142,2143],{"class":1112},"\u002Flist?page=1`",[1106,2145,1217],{"class":1127},[1106,2147,2148],{"class":1116}," expect",[1106,2150,1128],{"class":1123},[1106,2152,2153],{"class":1116}," { visible",[1106,2155,1128],{"class":1123},[1106,2157,2158],{"class":1112}," \"#items .item\"",[1106,2160,1925],{"class":1116},[1106,2162,1145],{"class":1127},[1106,2164,2165],{"class":1108,"line":1185},[1106,2166,2167],{"class":1116},"    {\n",[1106,2169,2170,2173,2175],{"class":1108,"line":1198},[1106,2171,2172],{"class":1116},"      paginate",[1106,2174,1128],{"class":1123},[1106,2176,1131],{"class":1116},[1106,2178,2179,2182,2184,2187,2189,2191,2193],{"class":1108,"line":1253},[1106,2180,2181],{"class":1116},"        next",[1106,2183,1128],{"class":1123},[1106,2185,2186],{"class":1116}," { css",[1106,2188,1128],{"class":1123},[1106,2190,1445],{"class":1112},[1106,2192,1248],{"class":1116},[1106,2194,1145],{"class":1127},[1106,2196,2197,2200,2202,2205],{"class":1108,"line":1292},[1106,2198,2199],{"class":1116},"        max_pages",[1106,2201,1128],{"class":1123},[1106,2203,2204],{"class":1156}," 3",[1106,2206,1145],{"class":1127},[1106,2208,2209,2212,2214,2217,2219,2221,2223],{"class":1108,"line":1298},[1106,2210,2211],{"class":1116},"        stop_when",[1106,2213,1128],{"class":1123},[1106,2215,2216],{"class":1116}," { absent",[1106,2218,1128],{"class":1123},[1106,2220,1445],{"class":1112},[1106,2222,1248],{"class":1116},[1106,2224,1145],{"class":1127},[1106,2226,2227,2230],{"class":1108,"line":1304},[1106,2228,2229],{"class":1116},"      }",[1106,2231,1145],{"class":1127},[1106,2233,2235,2238,2240],{"class":1108,"line":2234},13,[1106,2236,2237],{"class":1116},"      extract",[1106,2239,1128],{"class":1123},[1106,2241,1131],{"class":1116},[1106,2243,2245,2248,2250],{"class":1108,"line":2244},14,[1106,2246,2247],{"class":1116},"        items",[1106,2249,1128],{"class":1123},[1106,2251,1131],{"class":1116},[1106,2253,2255,2258,2260,2262],{"class":1108,"line":2254},15,[1106,2256,2257],{"class":1116},"          selector",[1106,2259,1128],{"class":1123},[1106,2261,2158],{"class":1112},[1106,2263,1145],{"class":1127},[1106,2265,2267,2270,2272,2274],{"class":1108,"line":2266},16,[1106,2268,2269],{"class":1116},"          many",[1106,2271,1128],{"class":1123},[1106,2273,1157],{"class":1156},[1106,2275,1145],{"class":1127},[1106,2277,2279,2282,2284],{"class":1108,"line":2278},17,[1106,2280,2281],{"class":1116},"          fields",[1106,2283,1128],{"class":1123},[1106,2285,1131],{"class":1116},[1106,2287,2289,2292,2294,2297],{"class":1108,"line":2288},18,[1106,2290,2291],{"class":1116},"            label",[1106,2293,1128],{"class":1123},[1106,2295,2296],{"class":1112}," \".label\"",[1106,2298,1145],{"class":1127},[1106,2300,2302,2305,2307,2310,2312,2315,2317,2320,2322,2324,2326,2329,2331,2333,2335,2338,2340,2342,2344],{"class":1108,"line":2301},19,[1106,2303,2304],{"class":1116},"            amount",[1106,2306,1128],{"class":1123},[1106,2308,2309],{"class":1116}," { selector",[1106,2311,1128],{"class":1123},[1106,2313,2314],{"class":1112}," \".amount\"",[1106,2316,1217],{"class":1127},[1106,2318,2319],{"class":1116}," type",[1106,2321,1128],{"class":1123},[1106,2323,1225],{"class":1112},[1106,2325,1217],{"class":1127},[1106,2327,2328],{"class":1116}," locale",[1106,2330,1128],{"class":1123},[1106,2332,1235],{"class":1112},[1106,2334,1217],{"class":1127},[1106,2336,2337],{"class":1116}," currency",[1106,2339,1128],{"class":1123},[1106,2341,1245],{"class":1112},[1106,2343,1248],{"class":1116},[1106,2345,1145],{"class":1127},[1106,2347,2349,2352],{"class":1108,"line":2348},20,[1106,2350,2351],{"class":1116},"          }",[1106,2353,1145],{"class":1127},[1106,2355,2357,2360],{"class":1108,"line":2356},21,[1106,2358,2359],{"class":1116},"        }",[1106,2361,1145],{"class":1127},[1106,2363,2365,2367],{"class":1108,"line":2364},22,[1106,2366,2229],{"class":1116},[1106,2368,1145],{"class":1127},[1106,2370,2372,2375],{"class":1108,"line":2371},23,[1106,2373,2374],{"class":1116},"    }",[1106,2376,1145],{"class":1127},[1106,2378,2380,2383],{"class":1108,"line":2379},24,[1106,2381,2382],{"class":1116},"  ]",[1106,2384,1145],{"class":1127},[1106,2386,2388],{"class":1108,"line":2387},25,[1106,2389,2390],{"class":1116},"};\n",[1106,2392,2394,2397,2400,2403,2405,2408,2411,2413,2415,2417,2420,2422,2424],{"class":1108,"line":2393},26,[1106,2395,2396],{"class":1123},"await",[1106,2398,2399],{"class":1156}," kaab",[1106,2401,1056],{"class":2402},"sJugJ",[1106,2404,224],{"class":1156},[1106,2406,2407],{"class":2402},".create",[1106,2409,2410],{"class":1116},"({ name",[1106,2412,1217],{"class":1127},[1106,2414,2064],{"class":1116},[1106,2416,1217],{"class":1127},[1106,2418,2419],{"class":1116}," publish",[1106,2421,1128],{"class":1123},[1106,2423,1157],{"class":1156},[1106,2425,2426],{"class":1116}," });\n",[1106,2428,2430],{"class":1108,"line":2429},27,[1106,2431,2433],{"emptyLinePlaceholder":2432},true,"\n",[1106,2435,2437,2439,2442,2444,2447,2449,2451,2453,2455,2458,2460],{"class":1108,"line":2436},28,[1106,2438,2061],{"class":1123},[1106,2440,2441],{"class":1156}," started",[1106,2443,2067],{"class":1123},[1106,2445,2446],{"class":1123}," await",[1106,2448,2399],{"class":1156},[1106,2450,1056],{"class":2402},[1106,2452,171],{"class":1156},[1106,2454,2407],{"class":2402},[1106,2456,2457],{"class":1116},"({ program",[1106,2459,1128],{"class":1123},[1106,2461,2462],{"class":1116}," name });\n",[1106,2464,2466,2468,2471,2473,2475,2477,2479,2481,2484,2487,2490,2493,2495,2498,2500,2503],{"class":1108,"line":2465},29,[1106,2467,2061],{"class":1123},[1106,2469,2470],{"class":1156}," job",[1106,2472,2067],{"class":1123},[1106,2474,2446],{"class":1123},[1106,2476,2399],{"class":1156},[1106,2478,1056],{"class":2402},[1106,2480,171],{"class":1156},[1106,2482,2483],{"class":2402},".wait",[1106,2485,2486],{"class":1116},"(",[1106,2488,2489],{"class":1156},"started",[1106,2491,2492],{"class":1116},".id",[1106,2494,1217],{"class":1127},[1106,2496,2497],{"class":1116}," { timeoutMs",[1106,2499,1128],{"class":1123},[1106,2501,2502],{"class":1156}," 120_000",[1106,2504,2426],{"class":1116},[1106,2506,2508,2510,2513,2515,2517,2519,2521,2524,2527,2530,2533,2536,2539,2541,2544],{"class":1108,"line":2507},30,[1106,2509,2061],{"class":1123},[1106,2511,2512],{"class":1156}," items",[1106,2514,2067],{"class":1123},[1106,2516,1347],{"class":1116},[1106,2518,478],{"class":1156},[1106,2520,1056],{"class":1116},[1106,2522,2523],{"class":1156},"data",[1106,2525,2526],{"class":1116},"?.items ",[1106,2528,2529],{"class":1123},"??",[1106,2531,2532],{"class":1116}," []) ",[1106,2534,2535],{"class":1123},"as",[1106,2537,2538],{"class":1116}," { label",[1106,2540,1128],{"class":1123},[1106,2542,2543],{"class":1156}," string",[1106,2545,2546],{"class":1116}," }[];\n",[1106,2548,2550,2553,2556,2558,2561,2563,2565,2567,2569,2572,2574,2577,2579,2582,2584,2587,2589,2592,2595,2598,2600,2603,2605,2607,2610,2612,2615,2618,2621,2623,2625],{"class":1108,"line":2549},31,[1106,2551,2552],{"class":1156},"console",[1106,2554,2555],{"class":2402},".log",[1106,2557,2486],{"class":1116},[1106,2559,2560],{"class":1112},"`",[1106,2562,2134],{"class":1123},[1106,2564,478],{"class":1156},[1106,2566,2492],{"class":1116},[1106,2568,2140],{"class":1123},[1106,2570,2571],{"class":1112},": ",[1106,2573,2134],{"class":1123},[1106,2575,2576],{"class":1156},"items",[1106,2578,1056],{"class":1116},[1106,2580,2581],{"class":1156},"length",[1106,2583,2140],{"class":1123},[1106,2585,2586],{"class":1112}," items, ",[1106,2588,2134],{"class":1123},[1106,2590,2591],{"class":1116},"items[",[1106,2593,2594],{"class":1156},"0",[1106,2596,2597],{"class":1116},"]?.label",[1106,2599,2140],{"class":1123},[1106,2601,2602],{"class":1112}," … ",[1106,2604,2134],{"class":1123},[1106,2606,2576],{"class":1156},[1106,2608,2609],{"class":2402},".at",[1106,2611,2486],{"class":1116},[1106,2613,2614],{"class":1123},"-",[1106,2616,2617],{"class":1156},"1",[1106,2619,2620],{"class":1116},")?.label",[1106,2622,2140],{"class":1123},[1106,2624,2560],{"class":1112},[1106,2626,2627],{"class":1116},");\n",[1025,2629,2630,2631,1315,2634,2637,2638,2640,2641,2644],{},"The job succeeds with 30 objects in ",[1029,2632,2633],{},"data.items",[1029,2635,2636],{},"{ \"label\": …, \"amount\": … }"," each, in page order.\nRaise ",[1029,2639,1551],{}," to 12 and it collects all 120; at 20 it still stops after page 12, because\n",[1029,2642,2643],{},"a[rel=next]"," is absent on the last page.",[1025,2646,2647,2648,2651,2652,1034,2654,2656,2657,1628,2659,2662],{},"Suppose the shop's search page is the infinite version: ten items at first, more from a cursor API\neach time you reach the bottom, and a ",[1029,2649,2650],{},"#done"," marker after the last batch. The ",[1029,2653,601],{},[1029,2655,561],{}," blocks above load it to the end; an ",[1029,2658,569],{},[1029,2660,2661],{},"\"min_items\": 50"," on the items then\nconfirms the whole list arrived.",[1039,2664,2666],{"id":2665},"pitfalls","Pitfalls",[1044,2668,2669,2683,2691,2711,2717],{},[1047,2670,2671,2679,2680,2682],{},[1093,2672,1399,2673,2675,2676,2678],{},[1029,2674,576],{}," field that is not ",[1029,2677,1052],{}," comes from page one only."," That is by design (a\npage title, a total), but a list you forgot to mark ",[1029,2681,684],{}," silently stops at one page's worth.",[1047,2684,2685,2690],{},[1093,2686,2687,2689],{},[1029,2688,1555],{}," is checked on the page you have read."," Choose a condition that is true on the last\npage, such as the \"next\" link being absent, not one that is true on the page after it.",[1047,2692,2693,2696,2697,2699,2700,2703,2704,2707,2708,2710],{},[1093,2694,2695],{},"Long walks hit the step's time budget."," A ",[1029,2698,576],{}," step may run for its ",[1029,2701,2702],{},"timeout_ms"," once\nper page; a step that runs past that budget fails with ",[1029,2705,2706],{},"timeout",". Keep ",[1029,2709,1551],{}," realistic and\nsplit very long walks across jobs with an input such as a start page.",[1047,2712,2713,2716],{},[1093,2714,2715],{},"Virtualised lists keep one screenful."," On a virtualised list, the DOM you extract from is the last\nscreenful, not the whole list.",[1047,2718,2719,2724,2725,2728],{},[1093,2720,2721,2723],{},[1029,2722,746],{}," catches overlapping pages."," Sites that shift items between pages while you walk them\nproduce duplicates; ",[1029,2726,2727],{},"\"unique\": \"sku\""," turns that into a visible warning.",[1039,2730,155],{"id":2731},"reference",[1044,2733,2734,2751,2779,2786,2801],{},[1047,2735,2736,1315,2741,1145,2746],{},[1077,2737,2739],{"href":2738},"\u002Freference\u002Fdsl\u002Factions\u002Fpaginate",[1029,2740,576],{},[1077,2742,2744],{"href":2743},"\u002Freference\u002Fdsl\u002Factions\u002Fscroll",[1029,2745,561],{},[1077,2747,2749],{"href":2748},"\u002Freference\u002Fdsl\u002Factions\u002Floop-until",[1029,2750,601],{},[1047,2752,2753,2754,1315,2759,1145,2764,1315,2769,1145,2774],{},"Fields: ",[1077,2755,2757],{"href":2756},"\u002Freference\u002Fdsl\u002Ffields\u002Fmany",[1029,2758,684],{},[1077,2760,2762],{"href":2761},"\u002Freference\u002Fdsl\u002Ffields\u002Ffields",[1029,2763,642],{},[1077,2765,2767],{"href":2766},"\u002Freference\u002Fdsl\u002Ffields\u002Fmin-items",[1029,2768,697],{},[1077,2770,2772],{"href":2771},"\u002Freference\u002Fdsl\u002Ffields\u002Funique",[1029,2773,746],{},[1077,2775,2777],{"href":2776},"\u002Freference\u002Fdsl\u002Ffields\u002Fon-invalid",[1029,2778,710],{},[1047,2780,2781,2782,1315,2784],{},"Lint: ",[1077,2783,766],{"href":1590},[1077,2785,790],{"href":1609},[1047,2787,2788,2791,2792,1315,2794,1034,2796],{},[1077,2789,604],{"href":2790},"\u002Freference\u002Fdsl\u002Fconditions\u002Fabsent"," such as ",[1029,2793,620],{},[1029,2795,618],{},[1077,2797,2799],{"href":2798},"\u002Freference\u002Fdsl\u002Fconditions\u002Fcount",[1029,2800,624],{},[1047,2802,2803,2807,2808],{},[1077,2804,2806],{"href":2805},"\u002Freference\u002Fcodes#warnings","Warning codes",", including ",[1029,2809,1369],{},[2811,2812,2813],"style",{},"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 .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 .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 .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 .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 .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 .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 .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)}",{"title":1102,"searchDepth":1134,"depth":1134,"links":2815},[2816,2817,2820,2821,2826,2827,2828],{"id":1041,"depth":1120,"text":1042},{"id":1082,"depth":1120,"text":1083,"children":2818},[2819],{"id":1359,"depth":1134,"text":1360},{"id":1395,"depth":1120,"text":1396},{"id":1618,"depth":1120,"text":1619,"children":2822},[2823,2824,2825],{"id":1622,"depth":1134,"text":1623},{"id":1722,"depth":1134,"text":1723},{"id":1853,"depth":1134,"text":1854},{"id":2033,"depth":1120,"text":2034},{"id":2665,"depth":1120,"text":2666},{"id":2731,"depth":1120,"text":155},false,null,"Extract lists of objects, follow \"next\" links across pages, and load infinite lists by scrolling, with bounds lint can check.","md",{},"\u002Fguides\u002Flists-and-pagination",{"title":95,"description":2831},"3.guides\u002F03.lists-and-pagination","-RnfriVw65K37LR_i78YPxDGWjwWqxlQOorZ5TWWRQs",[2839,2843],{"title":92,"path":2840,"stem":2841,"description":2842,"children":-1},"\u002Fguides\u002Fhosted-resolve","3.guides\u002F02.hosted-resolve","Let your own end users finish a parked job on a page with no account: type a one-time code, apply a fix, or take over.",{"title":98,"path":1079,"stem":2844,"description":2845,"children":-1},"3.guides\u002F04.json-and-network-locators","Read the JSON a page embeds or fetches instead of the HTML drawn from it, capture API responses, and let a discovered API move a job to the http tier.",1793593415866]