[{"data":1,"prerenderedAt":2234},["ShallowReactive",2],{"navigation":3,"page:\u002Fconcepts\u002Ftiers-and-escalation":1019,"surround:\u002Fconcepts\u002Ftiers-and-escalation":2226},[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":32,"body":1021,"breaking":2216,"date":2217,"description":2218,"extension":2219,"generated":2216,"meta":2220,"navigation":2221,"path":2222,"seo":2223,"stem":2224,"version":2217,"__hash__":2225},"docs\u002F2.concepts\u002F02.tiers-and-escalation.md",{"type":1022,"value":1023,"toc":2204},"minimark",[1024,1028,1033,1049,1053,1115,1131,1135,1138,1223,1233,1237,1240,1345,1348,1501,1515,1537,1541,1548,1635,1642,1660,1664,1667,1680,1684,1713,1716,1745,1770,1774,1785,2024,2060,2078,2097,2101,2145,2148,2200],[1025,1026,1027],"p",{},"Kaabist fetches pages in three ways that differ widely in cost, and it picks the cheapest one that can read your page. A job starts as low as its program allows, moves up when the page turns out to need more, and Kaabist remembers what each site needed, so later jobs against the same site start at the right tier.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1040,1041,1044,1045,1048],{},"You do not choose a tier for each job; read this page to understand what a job cost and why. Set ",[1037,1038,1039],"code",{},"options.max_tier"," to cap spending, ",[1037,1042,1043],{},"options.prefer_tier"," when you already know a site needs a browser, and ",[1037,1046,1047],{},"options.cache"," when many jobs read the same public page.",[1029,1050,1052],{"id":1051},"the-three-tiers","The three tiers",[1054,1055,1056,1072],"table",{},[1057,1058,1059],"thead",{},[1060,1061,1062,1066,1069],"tr",{},[1063,1064,1065],"th",{},"Tier",[1063,1067,1068],{},"What it is",[1063,1070,1071],{},"Compute credits",[1073,1074,1075,1089,1102],"tbody",{},[1060,1076,1077,1083,1086],{},[1078,1079,1080],"td",{},[1037,1081,1082],{},"http",[1078,1084,1085],{},"one request with a real browser's TLS fingerprint, one parsed document, no JavaScript",[1078,1087,1088],{},"1 per request",[1060,1090,1091,1096,1099],{},[1078,1092,1093],{},[1037,1094,1095],{},"browser",[1078,1097,1098],{},"a real Chromium, with JavaScript, clicks and typing",[1078,1100,1101],{},"5, plus 1 per started 10 s beyond the first 30 s",[1060,1103,1104,1109,1112],{},[1078,1105,1106],{},[1037,1107,1108],{},"stealth",[1078,1110,1111],{},"a hardened browser on a residential address",[1078,1113,1114],{},"20, plus 1 per started 10 s beyond the first 30 s",[1025,1116,1117,1118,1122,1123,1126,1127,1130],{},"Proxy traffic is billed on top, per megabyte by pool: datacenter is the default, residential costs ten times as much. See ",[1119,1120,35],"a",{"href":1121},"\u002Fconcepts\u002Fhttp-tier",", ",[1119,1124,38],{"href":1125},"\u002Fconcepts\u002Fbrowser-tier"," and ",[1119,1128,56],{"href":1129},"\u002Fconcepts\u002Fcredits-and-billing",".",[1029,1132,1134],{"id":1133},"where-a-job-starts","Where a job starts",[1025,1136,1137],{},"In order:",[1139,1140,1141,1192,1202,1208],"ol",{},[1142,1143,1144,1148,1149,1122,1151,1122,1153,1122,1155,1122,1157,1122,1159,1122,1161,1122,1163,1122,1165,1122,1167,1122,1169,1122,1171,1122,1173,1122,1175,1122,1177,1122,1179,1122,1181,1183,1184,1186,1187,1189,1190,1130],"li",{},[1145,1146,1147],"strong",{},"What your program does."," A program with a ",[1037,1150,547],{},[1037,1152,545],{},[1037,1154,549],{},[1037,1156,551],{},[1037,1158,553],{},[1037,1160,555],{},[1037,1162,557],{},[1037,1164,559],{},[1037,1166,561],{},[1037,1168,563],{},[1037,1170,574],{},[1037,1172,597],{},[1037,1174,578],{},[1037,1176,576],{},[1037,1178,592],{},[1037,1180,566],{},[1037,1182,571],{}," or ",[1037,1185,601],{}," cannot run without a browser, so it starts at ",[1037,1188,1095],{},". A program that only navigates and extracts starts at ",[1037,1191,1082],{},[1142,1193,1194,1198,1199,1201],{},[1145,1195,1196,1130],{},[1037,1197,1043],{}," A floor, not a ceiling: ask for ",[1037,1200,1095],{}," and the job does not start lower.",[1142,1203,1204,1207],{},[1145,1205,1206],{},"What Kaabist has learned about the hostname."," When the site profile is confident that a document is not enough, the job starts at the tier the site needs and does not pay for an attempt that would fail.",[1142,1209,1210,1214,1215,1218,1219,1222],{},[1145,1211,1212],{},[1037,1213,1039],{}," caps all of the above, and your plan caps ",[1037,1216,1217],{},"max_tier",". A job that needs a tier above its cap fails with ",[1037,1220,1221],{},"max_tier_exceeded"," rather than spending what you did not agree to.",[1025,1224,1225,1226,1229,1230,1130],{},"The envelope records the start in ",[1037,1227,1228],{},"meta.tier_requested"," and the tier the job finished at in ",[1037,1231,1232],{},"meta.tier",[1029,1234,1236],{"id":1235},"why-a-job-moves-up","Why a job moves up",[1025,1238,1239],{},"When a step fails, Kaabist classifies the page before reacting, and only some classes mean \"this tier cannot read this page\":",[1054,1241,1242,1255],{},[1057,1243,1244],{},[1060,1245,1246,1249,1252],{},[1063,1247,1248],{},"Class",[1063,1250,1251],{},"What it means",[1063,1253,1254],{},"What happens",[1073,1256,1257,1272,1299,1319],{},[1060,1258,1259,1264,1267],{},[1078,1260,1261],{},[1037,1262,1263],{},"empty_shell",[1078,1265,1266],{},"the document is a mount point and a script bundle; the content does not exist yet",[1078,1268,1269,1270],{},"moves to ",[1037,1271,1095],{},[1060,1273,1274,1279,1290],{},[1078,1275,1276],{},[1037,1277,1278],{},"placeholder_content",[1078,1280,1281,1282,1285,1286,1289],{},"the elements are there but print ",[1037,1283,1284],{},"-",", an em dash (U+2014), ",[1037,1287,1288],{},"Loading"," or a skeleton",[1078,1291,1292,1293,1295,1296,1298],{},"at ",[1037,1294,1082],{},", moves to ",[1037,1297,1095],{}," once; if the browser reads the same, the value is treated as empty",[1060,1300,1301,1306,1309],{},[1078,1302,1303],{},[1037,1304,1305],{},"challenge_page",[1078,1307,1308],{},"an anti-bot interstitial (Cloudflare, DataDome, PerimeterX, Akamai, Imperva)",[1078,1310,1311,1312,1315,1316,1318],{},"handled by ",[1037,1313,1314],{},"policies.captcha",", like a puzzle, and recorded on the site profile, so later jobs start at the tier and on the proxy pool the site needs (residential addresses at ",[1037,1317,1108],{},")",[1060,1320,1321,1326,1329],{},[1078,1322,1323],{},[1037,1324,1325],{},"captcha",[1078,1327,1328],{},"a puzzle: reCAPTCHA, hCaptcha, Turnstile, GeeTest, Arkose",[1078,1330,1331,1332,1334,1335,1338,1339,1183,1342],{},"does not move up, because a better address does not solve a puzzle; follows ",[1037,1333,1314],{},": ",[1037,1336,1337],{},"park"," (the default), ",[1037,1340,1341],{},"solve",[1037,1343,1344],{},"fail",[1025,1346,1347],{},"Moving up is not a failure. Kaabist takes a checkpoint, requeues the job at the next tier and carries on from there; the job keeps its id, inputs and envelope. Each hop is recorded:",[1349,1350,1354],"pre",{"className":1351,"code":1352,"language":680,"meta":1353,"style":1353},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{\n  \"meta\": {\n    \"tier\": \"browser\",\n    \"tier_requested\": \"http\",\n    \"escalations\": [{ \"from\": \"http\", \"to\": \"browser\", \"reason\": \"empty_shell\" }]\n  },\n  \"warnings\": [{ \"code\": \"escalated\", \"step\": \"steps[0]\", \"message\": \"empty_shell\" }]\n}\n","",[1037,1355,1356,1365,1379,1394,1407,1448,1456,1495],{"__ignoreMap":1353},[1357,1358,1361],"span",{"class":1359,"line":1360},"line",1,[1357,1362,1364],{"class":1363},"sTzsn","{\n",[1357,1366,1368,1372,1376],{"class":1359,"line":1367},2,[1357,1369,1371],{"class":1370},"sqn18","  \"meta\"",[1357,1373,1375],{"class":1374},"sQm2-",":",[1357,1377,1378],{"class":1363}," {\n",[1357,1380,1382,1385,1387,1391],{"class":1359,"line":1381},3,[1357,1383,1384],{"class":1370},"    \"tier\"",[1357,1386,1375],{"class":1374},[1357,1388,1390],{"class":1389},"suOy4"," \"browser\"",[1357,1392,1393],{"class":1374},",\n",[1357,1395,1397,1400,1402,1405],{"class":1359,"line":1396},4,[1357,1398,1399],{"class":1370},"    \"tier_requested\"",[1357,1401,1375],{"class":1374},[1357,1403,1404],{"class":1389}," \"http\"",[1357,1406,1393],{"class":1374},[1357,1408,1410,1413,1415,1418,1421,1423,1425,1428,1431,1433,1435,1437,1440,1442,1445],{"class":1359,"line":1409},5,[1357,1411,1412],{"class":1370},"    \"escalations\"",[1357,1414,1375],{"class":1374},[1357,1416,1417],{"class":1363}," [{ ",[1357,1419,1420],{"class":1370},"\"from\"",[1357,1422,1375],{"class":1374},[1357,1424,1404],{"class":1389},[1357,1426,1427],{"class":1374},",",[1357,1429,1430],{"class":1370}," \"to\"",[1357,1432,1375],{"class":1374},[1357,1434,1390],{"class":1389},[1357,1436,1427],{"class":1374},[1357,1438,1439],{"class":1370}," \"reason\"",[1357,1441,1375],{"class":1374},[1357,1443,1444],{"class":1389}," \"empty_shell\"",[1357,1446,1447],{"class":1363}," }]\n",[1357,1449,1451,1454],{"class":1359,"line":1450},6,[1357,1452,1453],{"class":1363},"  }",[1357,1455,1393],{"class":1374},[1357,1457,1459,1462,1464,1466,1469,1471,1474,1476,1479,1481,1484,1486,1489,1491,1493],{"class":1359,"line":1458},7,[1357,1460,1461],{"class":1370},"  \"warnings\"",[1357,1463,1375],{"class":1374},[1357,1465,1417],{"class":1363},[1357,1467,1468],{"class":1370},"\"code\"",[1357,1470,1375],{"class":1374},[1357,1472,1473],{"class":1389}," \"escalated\"",[1357,1475,1427],{"class":1374},[1357,1477,1478],{"class":1370}," \"step\"",[1357,1480,1375],{"class":1374},[1357,1482,1483],{"class":1389}," \"steps[0]\"",[1357,1485,1427],{"class":1374},[1357,1487,1488],{"class":1370}," \"message\"",[1357,1490,1375],{"class":1374},[1357,1492,1444],{"class":1389},[1357,1494,1447],{"class":1363},[1357,1496,1498],{"class":1359,"line":1497},8,[1357,1499,1500],{"class":1363},"}\n",[1025,1502,1503,1506,1507,1510,1511,1514],{},[1037,1504,1505],{},"reason"," is the class, sometimes followed by the signature that identified it (",[1037,1508,1509],{},"challenge_page:\u003Csignature>","), or ",[1037,1512,1513],{},"tier_insufficient:\u003Caction>"," when a tier was asked to do something it cannot.",[1025,1516,1517,1518,1522,1523,1527,1528,1532,1533,1536],{},"Everything else is about your program, not the tier: a moved element goes to the ",[1119,1519,1521],{"href":1520},"\u002Fconcepts\u002Fself-healing","healer",", an expired session to its ",[1119,1524,1526],{"href":1525},"\u002Fconcepts\u002Fsessions","refresh program",", a dialog to the ",[1119,1529,1531],{"href":1530},"\u002Fconcepts\u002Fobstacles","obstacle layer",", and a page nobody recognises parks the job for a person (",[1119,1534,44],{"href":1535},"\u002Fconcepts\u002Fhuman-in-the-loop",").",[1029,1538,1540],{"id":1539},"what-kaabist-remembers-about-a-site","What Kaabist remembers about a site",[1025,1542,1543,1544,1547],{},"Per hostname, Kaabist keeps the tier that works and how confident it is, the proxy pool the site needs, the endpoints it has been seen to serve, the obstacles it shows, and when it last refused a job. ",[1037,1545,1546],{},"GET \u002Fv1\u002Fsites\u002F{hostname}"," shows the part that is yours to see:",[1349,1549,1551],{"className":1351,"code":1550,"language":680,"meta":1353,"style":1353},"{ \"hostname\": \"shop.example\", \"object\": \"site_profile\",\n  \"tier_required\": \"browser\", \"tier_confidence\": 0.9,\n  \"known_obstacles_count\": 2, \"api_endpoints_count\": 1,\n  \"last_blocked_at\": \"2026-09-13T08:41:00Z\" }\n",[1037,1552,1553,1578,1600,1622],{"__ignoreMap":1353},[1357,1554,1555,1558,1561,1563,1566,1568,1571,1573,1576],{"class":1359,"line":1360},[1357,1556,1557],{"class":1363},"{ ",[1357,1559,1560],{"class":1370},"\"hostname\"",[1357,1562,1375],{"class":1374},[1357,1564,1565],{"class":1389}," \"shop.example\"",[1357,1567,1427],{"class":1374},[1357,1569,1570],{"class":1370}," \"object\"",[1357,1572,1375],{"class":1374},[1357,1574,1575],{"class":1389}," \"site_profile\"",[1357,1577,1393],{"class":1374},[1357,1579,1580,1583,1585,1587,1589,1592,1594,1598],{"class":1359,"line":1367},[1357,1581,1582],{"class":1370},"  \"tier_required\"",[1357,1584,1375],{"class":1374},[1357,1586,1390],{"class":1389},[1357,1588,1427],{"class":1374},[1357,1590,1591],{"class":1370}," \"tier_confidence\"",[1357,1593,1375],{"class":1374},[1357,1595,1597],{"class":1596},"sHJIl"," 0.9",[1357,1599,1393],{"class":1374},[1357,1601,1602,1605,1607,1610,1612,1615,1617,1620],{"class":1359,"line":1381},[1357,1603,1604],{"class":1370},"  \"known_obstacles_count\"",[1357,1606,1375],{"class":1374},[1357,1608,1609],{"class":1596}," 2",[1357,1611,1427],{"class":1374},[1357,1613,1614],{"class":1370}," \"api_endpoints_count\"",[1357,1616,1375],{"class":1374},[1357,1618,1619],{"class":1596}," 1",[1357,1621,1393],{"class":1374},[1357,1623,1624,1627,1629,1632],{"class":1359,"line":1396},[1357,1625,1626],{"class":1370},"  \"last_blocked_at\"",[1357,1628,1375],{"class":1374},[1357,1630,1631],{"class":1389}," \"2026-09-13T08:41:00Z\"",[1357,1633,1634],{"class":1363}," }\n",[1025,1636,1637,1638,1641],{},"A hostname nothing is known about returns an empty profile, not a ",[1037,1639,1640],{},"404",". Two rules shape what is learned:",[1643,1644,1645,1651],"ul",{},[1142,1646,1647,1650],{},[1145,1648,1649],{},"A profile is re-tested."," Confidence rises slowly with successes and jumps on a refusal. A profile that has not been re-tested for a week is stale, and one job in ten deliberately starts a rung lower to find out whether the site got easier. A site that fixed its rendering stops costing you a browser.",[1142,1652,1653,1656,1657,1659],{},[1145,1654,1655],{},"What a job teaches depends on what the job was."," A public page teaches the platform's profile, which every customer benefits from. A job carrying your session, your own proxy or an ",[1037,1658,574],{}," step teaches only your organisation's profile: what a site does behind your login is not a fact about the site.",[1029,1661,1663],{"id":1662},"when-a-discovered-api-makes-a-job-cheaper","When a discovered API makes a job cheaper",[1025,1665,1666],{},"A page that renders from JSON got that JSON from somewhere. After a successful browser-tier run, Kaabist compares the values it extracted with the JSON responses the page fetched, and when one explains the page it writes the locators that would read it directly. It then checks them by running the extraction against that endpoint alone and comparing the result with what the browser produced; anything that does not match exactly is discarded.",[1025,1668,1669,1670,1672,1673,1676,1677,1679],{},"What survives becomes a ",[1145,1671,498],{}," on your program, of kind ",[1037,1674,1675],{},"api_discovery",", in the review queue. Nothing changes until you approve it. Once approved, the program reads the endpoint instead of the rendered page and can run at the ",[1037,1678,1082],{}," tier: the same data, without a browser.",[1029,1681,1683],{"id":1682},"the-shared-cache","The shared cache",[1025,1685,1686,1687,1690,1691,1694,1695,1183,1698,1701,1702,1705,1706,1709,1710,1536],{},"Two jobs that read the same public page inside the same window can share one fetch. Set ",[1037,1688,1689],{},"cache.max_age"," (1 to 86400 seconds) on the job, and Kaabist serves a stored copy when it has one. ",[1037,1692,1693],{},"meta.cache"," is ",[1037,1696,1697],{},"hit",[1037,1699,1700],{},"miss"," on every job, and a hit adds the warning ",[1037,1703,1704],{},"cache_hit",". ",[1037,1707,1708],{},"POST \u002Fv1\u002Fjobs\u002Festimate"," tells you in advance whether a job could be served from the cache (",[1037,1711,1712],{},"cache: \"possible\"",[1025,1714,1715],{},"A job is eligible only when it is a plain public fetch:",[1643,1717,1718,1739,1742],{},[1142,1719,1720,1721,1723,1724,1726,1727,1730,1731,1734,1735,1738],{},"the program is exactly one ",[1037,1722,590],{}," and one ",[1037,1725,569],{}," into ",[1037,1728,1729],{},"data",", with no ",[1037,1732,1733],{},"expect",", no ",[1037,1736,1737],{},"if"," and no side effect;",[1142,1740,1741],{},"the URL carries no template;",[1142,1743,1744],{},"the job has no session and no inputs.",[1025,1746,1747,1750,1751,1122,1754,1122,1757,1122,1760,1122,1763,1122,1766,1769],{},[1037,1748,1749],{},"cache"," on a job that is not eligible is ignored, not refused. The key is the normalized URL, the tier, the hash of your extract schema and the job's mode, so test and live jobs never share entries. Normalizing drops the fragment, the default port, the case of the scheme and host, the order of query parameters and campaign parameters (",[1037,1752,1753],{},"utm_*",[1037,1755,1756],{},"fbclid",[1037,1758,1759],{},"gclid",[1037,1761,1762],{},"_ga",[1037,1764,1765],{},"mc_cid",[1037,1767,1768],{},"mc_eid","); it keeps everything else, including a trailing slash. Pages that answered with an error, and pages Kaabist had to diagnose, are never stored. A hit pays its compute credit and no proxy traffic.",[1029,1771,1773],{"id":1772},"worked-example","Worked example",[1025,1775,1776,1777,1780,1781,1784],{},"The single-page app at ",[1037,1778,1779],{},"https:\u002F\u002Fapp.example.com"," serves an empty ",[1037,1782,1783],{},"#root"," shell: its script fetches the product list as JSON half a second after load and draws the cards. Store a program that waits for the cards and reads them:",[1349,1786,1788],{"className":1351,"code":1787,"language":680,"meta":1353,"style":1353},"{\n  \"kaab\": \"1\",\n  \"name\": \"app-products\",\n  \"options\": { \"max_tier\": \"browser\" },\n  \"steps\": [\n    { \"goto\": \"https:\u002F\u002Fapp.example.com\u002F\", \"expect\": { \"count\": { \"target\": \"#products .product-card\", \"min\": 1 } } },\n    { \"extract\": { \"products\": { \"selector\": \"#products .product-card\", \"many\": true, \"min_items\": 1,\n        \"fields\": { \"title\": \".title\", \"price\": { \"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" } } } } }\n  ]\n}\n",[1037,1789,1790,1794,1806,1818,1840,1850,1901,1947,2013,2019],{"__ignoreMap":1353},[1357,1791,1792],{"class":1359,"line":1360},[1357,1793,1364],{"class":1363},[1357,1795,1796,1799,1801,1804],{"class":1359,"line":1367},[1357,1797,1798],{"class":1370},"  \"kaab\"",[1357,1800,1375],{"class":1374},[1357,1802,1803],{"class":1389}," \"1\"",[1357,1805,1393],{"class":1374},[1357,1807,1808,1811,1813,1816],{"class":1359,"line":1381},[1357,1809,1810],{"class":1370},"  \"name\"",[1357,1812,1375],{"class":1374},[1357,1814,1815],{"class":1389}," \"app-products\"",[1357,1817,1393],{"class":1374},[1357,1819,1820,1823,1825,1828,1831,1833,1835,1838],{"class":1359,"line":1396},[1357,1821,1822],{"class":1370},"  \"options\"",[1357,1824,1375],{"class":1374},[1357,1826,1827],{"class":1363}," { ",[1357,1829,1830],{"class":1370},"\"max_tier\"",[1357,1832,1375],{"class":1374},[1357,1834,1390],{"class":1389},[1357,1836,1837],{"class":1363}," }",[1357,1839,1393],{"class":1374},[1357,1841,1842,1845,1847],{"class":1359,"line":1409},[1357,1843,1844],{"class":1370},"  \"steps\"",[1357,1846,1375],{"class":1374},[1357,1848,1849],{"class":1363}," [\n",[1357,1851,1852,1855,1858,1860,1863,1865,1868,1870,1872,1875,1877,1879,1882,1884,1887,1889,1892,1894,1896,1899],{"class":1359,"line":1450},[1357,1853,1854],{"class":1363},"    { ",[1357,1856,1857],{"class":1370},"\"goto\"",[1357,1859,1375],{"class":1374},[1357,1861,1862],{"class":1389}," \"https:\u002F\u002Fapp.example.com\u002F\"",[1357,1864,1427],{"class":1374},[1357,1866,1867],{"class":1370}," \"expect\"",[1357,1869,1375],{"class":1374},[1357,1871,1827],{"class":1363},[1357,1873,1874],{"class":1370},"\"count\"",[1357,1876,1375],{"class":1374},[1357,1878,1827],{"class":1363},[1357,1880,1881],{"class":1370},"\"target\"",[1357,1883,1375],{"class":1374},[1357,1885,1886],{"class":1389}," \"#products .product-card\"",[1357,1888,1427],{"class":1374},[1357,1890,1891],{"class":1370}," \"min\"",[1357,1893,1375],{"class":1374},[1357,1895,1619],{"class":1596},[1357,1897,1898],{"class":1363}," } } }",[1357,1900,1393],{"class":1374},[1357,1902,1903,1905,1908,1910,1912,1915,1917,1919,1922,1924,1926,1928,1931,1933,1936,1938,1941,1943,1945],{"class":1359,"line":1458},[1357,1904,1854],{"class":1363},[1357,1906,1907],{"class":1370},"\"extract\"",[1357,1909,1375],{"class":1374},[1357,1911,1827],{"class":1363},[1357,1913,1914],{"class":1370},"\"products\"",[1357,1916,1375],{"class":1374},[1357,1918,1827],{"class":1363},[1357,1920,1921],{"class":1370},"\"selector\"",[1357,1923,1375],{"class":1374},[1357,1925,1886],{"class":1389},[1357,1927,1427],{"class":1374},[1357,1929,1930],{"class":1370}," \"many\"",[1357,1932,1375],{"class":1374},[1357,1934,1935],{"class":1596}," true",[1357,1937,1427],{"class":1374},[1357,1939,1940],{"class":1370}," \"min_items\"",[1357,1942,1375],{"class":1374},[1357,1944,1619],{"class":1596},[1357,1946,1393],{"class":1374},[1357,1948,1949,1952,1954,1956,1959,1961,1964,1966,1969,1971,1973,1975,1977,1980,1982,1985,1987,1990,1992,1995,1997,2000,2002,2005,2007,2010],{"class":1359,"line":1497},[1357,1950,1951],{"class":1370},"        \"fields\"",[1357,1953,1375],{"class":1374},[1357,1955,1827],{"class":1363},[1357,1957,1958],{"class":1370},"\"title\"",[1357,1960,1375],{"class":1374},[1357,1962,1963],{"class":1389}," \".title\"",[1357,1965,1427],{"class":1374},[1357,1967,1968],{"class":1370}," \"price\"",[1357,1970,1375],{"class":1374},[1357,1972,1827],{"class":1363},[1357,1974,1921],{"class":1370},[1357,1976,1375],{"class":1374},[1357,1978,1979],{"class":1389}," \".price\"",[1357,1981,1427],{"class":1374},[1357,1983,1984],{"class":1370}," \"type\"",[1357,1986,1375],{"class":1374},[1357,1988,1989],{"class":1389}," \"money\"",[1357,1991,1427],{"class":1374},[1357,1993,1994],{"class":1370}," \"locale\"",[1357,1996,1375],{"class":1374},[1357,1998,1999],{"class":1389}," \"tr\"",[1357,2001,1427],{"class":1374},[1357,2003,2004],{"class":1370}," \"currency\"",[1357,2006,1375],{"class":1374},[1357,2008,2009],{"class":1389}," \"TRY\"",[1357,2011,2012],{"class":1363}," } } } } }\n",[1357,2014,2016],{"class":1359,"line":2015},9,[1357,2017,2018],{"class":1363},"  ]\n",[1357,2020,2022],{"class":1359,"line":2021},10,[1357,2023,1500],{"class":1363},[1025,2025,2026,2029,2030,2032,2033,2035,2036,2038,2039,2041,2042,1122,2045,2048,2049,2052,2053,2055,2056,2059],{},[1145,2027,2028],{},"First run."," Nothing in the program needs a browser, so the job starts at ",[1037,2031,1082],{},". The document has no cards, the ",[1037,2034,1733],{}," fails, and the page is classified ",[1037,2037,1263],{},". The job moves to ",[1037,2040,1095],{},", where the script runs and the cards appear, and it succeeds. The envelope shows ",[1037,2043,2044],{},"tier_requested: \"http\"",[1037,2046,2047],{},"tier: \"browser\"",", one entry in ",[1037,2050,2051],{},"meta.escalations"," with reason ",[1037,2054,1263],{},", and an ",[1037,2057,2058],{},"escalated"," warning. It paid for one http request and one browser run.",[1025,2061,2062,2065,2066,2068,2069,1694,2072,1122,2074,2077],{},[1145,2063,2064],{},"Later runs."," The failed ",[1037,2067,1082],{}," attempt is recorded on the site's profile. Once the profile is confident that the site needs a browser, jobs start there: ",[1037,2070,2071],{},"tier_requested",[1037,2073,1095],{},[1037,2075,2076],{},"escalations"," is empty, and no http request is wasted.",[1025,2079,2080,2083,2084,2086,2087,2089,2090,2093,2094,2096],{},[1145,2081,2082],{},"After discovery."," The browser run saw the page fetch its product list as JSON, and the values in it match what was extracted. An ",[1037,2085,1675],{}," proposal appears in your review queue, replacing the CSS locators with ",[1037,2088,626],{}," locators on that endpoint. Approve it with ",[1037,2091,2092],{},"promote: true"," and a new version is published that reads the JSON directly; once nothing in the program needs the rendered page, it runs at the ",[1037,2095,1082],{}," tier, one compute credit instead of five.",[1029,2098,2100],{"id":2099},"pitfalls","Pitfalls",[1643,2102,2103,2120,2126,2139],{},[1142,2104,2105,2111,2112,2114,2115,2117,2118,1130],{},[1145,2106,2107,2108,2110],{},"A ",[1037,2109,1217],{}," that is too low."," A program capped at ",[1037,2113,1082],{}," against a JavaScript site fails ",[1037,2116,1221],{}," on its first run. The free plan is capped at ",[1037,2119,1082],{},[1142,2121,2122,2125],{},[1145,2123,2124],{},"Assuming the first run's cost is the steady state."," The first job against a new site may pay for a failed lower tier; later jobs do not.",[1142,2127,2128,2131,2132,2134,2135,2138],{},[1145,2129,2130],{},"Expecting a captcha or a challenge to escalate."," Both follow ",[1037,2133,1314],{},", which parks by default. Set ",[1037,2136,2137],{},"policies.captcha: \"solve\""," to use a solver, which is billed per solve.",[1142,2140,2141,2144],{},[1145,2142,2143],{},"Expecting the cache to share personal pages."," Any session or input makes a job ineligible, by design.",[1029,2146,155],{"id":2147},"reference",[1643,2149,2150,2164,2174,2180,2194],{},[1142,2151,2152,2156,2157,1122,2159,1122,2162,1318],{},[1119,2153,2155],{"href":2154},"\u002Freference\u002Fdsl\u002Foptions","Program options"," (",[1037,2158,1217],{},[1037,2160,2161],{},"prefer_tier",[1037,2163,1749],{},[1142,2165,2166,1126,2170],{},[1119,2167,2169],{"href":2168},"\u002Freference\u002Fapi\u002Fsites\u002Fget-site-profile","Get a site profile",[1119,2171,2173],{"href":2172},"\u002Freference\u002Fapi\u002Fschemas\u002Fsite-profile","the site profile object",[1142,2175,2176],{},[1119,2177,2179],{"href":2178},"\u002Freference\u002Fapi\u002Fjobs\u002Festimate-job","Estimate a job",[1142,2181,2182,1122,2186,1122,2190],{},[1119,2183,2185],{"href":2184},"\u002Freference\u002Fcodes#tiers","Tiers",[1119,2187,2189],{"href":2188},"\u002Freference\u002Fcodes#diagnose-classes","diagnose classes",[1119,2191,2193],{"href":2192},"\u002Freference\u002Fcodes#warnings","warnings",[1142,2195,2196],{},[1119,2197,2199],{"href":2198},"\u002Freference\u002Fapi\u002Fproposals\u002Fapprove-proposal","Approve a proposal",[2201,2202,2203],"style",{},"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 .suOy4, html code.shiki .suOy4{--shiki-light:var(--kaab-code-token-string-expression);--shiki-default:var(--kaab-code-token-string-expression);--shiki-dark:var(--kaab-code-token-string-expression)}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}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)}",{"title":1353,"searchDepth":1381,"depth":1381,"links":2205},[2206,2207,2208,2209,2210,2211,2212,2213,2214,2215],{"id":1031,"depth":1367,"text":1032},{"id":1051,"depth":1367,"text":1052},{"id":1133,"depth":1367,"text":1134},{"id":1235,"depth":1367,"text":1236},{"id":1539,"depth":1367,"text":1540},{"id":1662,"depth":1367,"text":1663},{"id":1682,"depth":1367,"text":1683},{"id":1772,"depth":1367,"text":1773},{"id":2099,"depth":1367,"text":2100},{"id":2147,"depth":1367,"text":155},false,null,"Which tier a job starts at and why it moves up, what Kaabist learns about each site, when a discovered API makes a job cheaper, and the shared cache.","md",{},true,"\u002Fconcepts\u002Ftiers-and-escalation",{"title":32,"description":2218},"2.concepts\u002F02.tiers-and-escalation","lFVBm87FW-JJUxZ7NOHyMFcMAp_qI2Veh_rw7PuhzvI",[2227,2231],{"title":29,"path":2228,"stem":2229,"description":2230,"children":-1},"\u002Fconcepts\u002Fprograms-and-versions","2.concepts\u002F01.programs-and-versions","Programs are versioned JSON: immutable versions, the latest and production aliases, the one-step shorthand, lint, publishing, diffs and replay.",{"title":35,"path":1121,"stem":2232,"description":2233,"children":-1},"2.concepts\u002F03.http-tier","The cheapest way to read a page: what Kaabist can do without a browser, what makes a job need one, and how conditions behave on a document.",1793593409302]