[{"data":1,"prerenderedAt":1782},["ShallowReactive",2],{"navigation":3,"page:\u002Fconcepts\u002Fhttp-tier":1019,"surround:\u002Fconcepts\u002Fhttp-tier":1774},[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":35,"body":1021,"breaking":1764,"date":1765,"description":1766,"extension":1767,"generated":1764,"meta":1768,"navigation":1769,"path":1770,"seo":1771,"stem":1772,"version":1765,"__hash__":1773},"docs\u002F2.concepts\u002F03.http-tier.md",{"type":1022,"value":1023,"toc":1753},"minimark",[1024,1028,1033,1052,1056,1059,1071,1075,1101,1105,1108,1147,1154,1232,1247,1251,1271,1299,1308,1312,1323,1381,1395,1399,1408,1548,1582,1603,1628,1632,1690,1693,1749],[1025,1026,1027],"p",{},"The http tier reads a page with one request and no browser: no JavaScript runs and nothing is laid out, and Kaabist extracts from the document that came back. It is the default for any program that only navigates and extracts, and it costs one compute credit per request where a browser costs five.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1040,1041,1043,1044,1046,1047,1043,1049,1051],{},"Most pages are documents: they arrive complete and say what they say in their markup, embedded JSON or ",[1037,1038,1039],"code",{},"ld+json",". Any ",[1037,1042,590],{}," + ",[1037,1045,569],{}," program, including every ",[1037,1048,610],{},[1037,1050,569],{}," job, starts here. You do not need to ask for it; you need to avoid steps that force a browser when a document would do, and to know what changes about conditions at this tier.",[1029,1053,1055],{"id":1054},"what-it-fetches-with","What it fetches with",[1025,1057,1058],{},"Not a plain HTTP client. A request from this tier carries a real browser's TLS and HTTP\u002F2 fingerprint and a real browser's headers in a real browser's order, and goes out through the same proxy pool a browser job would use. A site that serves documents to browsers and blocks scrapers usually cannot tell the difference, and when it can, the job moves up a tier by itself.",[1025,1060,1061,1062,1066,1067,1070],{},"Cookies persist across navigations inside one job, so a program that follows a redirect, collects a consent cookie and asks for the page again behaves like one browsing session. A bound ",[1063,1064,504],"a",{"href":1065},"\u002Fconcepts\u002Fsessions"," seeds those cookies. ",[1037,1068,1069],{},"options.headers"," adds request headers to every request this tier makes.",[1029,1072,1074],{"id":1073},"what-it-can-read","What it can read",[1025,1076,1077,1078,1080,1081,1083,1084,1087,1088,1087,1091,1094,1095,1097,1098,1100],{},"Everything in the document: CSS, XPath, text and role locators, ",[1037,1079,717],{}," over text or HTML, and ",[1037,1082,680],{}," locators over the JSON the page embeds (",[1037,1085,1086],{},"\u003Cscript id=\"__NEXT_DATA__\">",", ",[1037,1089,1090],{},"window.__INITIAL_STATE__",[1037,1092,1093],{},"application\u002Fld+json","). A ",[1037,1096,626],{}," locator works here too: the endpoints a program's ",[1037,1099,626],{}," locators name are fetched alongside the document, so a program that reads a site's JSON API directly can run without a browser.",[1029,1102,1104],{"id":1103},"what-needs-a-browser","What needs a browser",[1025,1106,1107],{},"The http tier has a document, not a page. There is nothing to click, nothing has been laid out and no script has run, so a program containing any of these steps starts at the browser tier instead:",[1025,1109,1110,1112,1113,1112,1115,1112,1117,1112,1119,1112,1121,1112,1123,1112,1125,1112,1127,1112,1129,1112,1131,1112,1133,1112,1135,1112,1137,1112,1139,1112,1141,1112,1143,1112,1145],{},[1037,1111,547],{}," · ",[1037,1114,545],{},[1037,1116,549],{},[1037,1118,551],{},[1037,1120,553],{},[1037,1122,555],{},[1037,1124,557],{},[1037,1126,559],{},[1037,1128,561],{},[1037,1130,563],{},[1037,1132,574],{},[1037,1134,597],{},[1037,1136,578],{},[1037,1138,576],{},[1037,1140,592],{},[1037,1142,566],{},[1037,1144,571],{},[1037,1146,601],{},[1025,1148,1149,1150,1153],{},"A target inside an ",[1037,1151,1152],{},"iframe"," also needs a browser: the http tier fetched one document and no frame in it. If a job reaches such a step at this tier, it moves up and records why:",[1155,1156,1160],"pre",{"className":1157,"code":1158,"language":680,"meta":1159,"style":1159},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{ \"meta\": { \"tier\": \"browser\", \"escalations\": [{ \"from\": \"http\", \"to\": \"browser\", \"reason\": \"tier_insufficient:frame\" }] } }\n","",[1037,1161,1162],{"__ignoreMap":1159},[1163,1164,1167,1171,1175,1179,1182,1185,1187,1191,1194,1197,1199,1202,1205,1207,1210,1212,1215,1217,1219,1221,1224,1226,1229],"span",{"class":1165,"line":1166},"line",1,[1163,1168,1170],{"class":1169},"sTzsn","{ ",[1163,1172,1174],{"class":1173},"sqn18","\"meta\"",[1163,1176,1178],{"class":1177},"sQm2-",":",[1163,1180,1181],{"class":1169}," { ",[1163,1183,1184],{"class":1173},"\"tier\"",[1163,1186,1178],{"class":1177},[1163,1188,1190],{"class":1189},"suOy4"," \"browser\"",[1163,1192,1193],{"class":1177},",",[1163,1195,1196],{"class":1173}," \"escalations\"",[1163,1198,1178],{"class":1177},[1163,1200,1201],{"class":1169}," [{ ",[1163,1203,1204],{"class":1173},"\"from\"",[1163,1206,1178],{"class":1177},[1163,1208,1209],{"class":1189}," \"http\"",[1163,1211,1193],{"class":1177},[1163,1213,1214],{"class":1173}," \"to\"",[1163,1216,1178],{"class":1177},[1163,1218,1190],{"class":1189},[1163,1220,1193],{"class":1177},[1163,1222,1223],{"class":1173}," \"reason\"",[1163,1225,1178],{"class":1177},[1163,1227,1228],{"class":1189}," \"tier_insufficient:frame\"",[1163,1230,1231],{"class":1169}," }] } }\n",[1025,1233,1234,1235,1238,1239,1242,1243,1246],{},"A page that looks like a document but is an empty shell, a ",[1037,1236,1237],{},"\u003Cdiv id=\"root\">"," and a script, moves up for a different reason: the expected content is missing, and the page is classified ",[1037,1240,1241],{},"empty_shell",". See ",[1063,1244,32],{"href":1245},"\u002Fconcepts\u002Ftiers-and-escalation",".",[1029,1248,1250],{"id":1249},"conditions-at-this-tier","Conditions at this tier",[1025,1252,1253,1087,1255,1087,1257,1087,1259,1087,1261,1087,1263,1087,1265,1267,1268,1270],{},[1037,1254,618],{},[1037,1256,620],{},[1037,1258,624],{},[1037,1260,622],{},[1037,1262,610],{},[1037,1264,612],{},[1037,1266,628],{}," and ",[1037,1269,630],{}," behave exactly as they do at the browser tier. Two do not:",[1272,1273,1274,1291],"ul",{},[1275,1276,1277,1290],"li",{},[1278,1279,1280,1282,1283,1285,1286,1282,1288,1246],"strong",{},[1037,1281,614],{}," means ",[1037,1284,618],{}," here, and ",[1037,1287,616],{},[1037,1289,620],{}," Nothing was painted, and \"cannot tell\" is not \"no\": a price behind a tab is still the price.",[1275,1292,1293,1298],{},[1278,1294,1295,1297],{},[1037,1296,626],{}," is always false."," One request was made, by Kaabist, and nothing ran to make another. A program that waits for an API call belongs at the browser tier.",[1025,1300,1301,1267,1304,1307],{},[1037,1302,1303],{},"options.block_urls",[1037,1305,1306],{},"options.assets"," are ignored, because this tier loads no subresources.",[1029,1309,1311],{"id":1310},"the-shared-cache","The shared cache",[1025,1313,1314,1315,1043,1317,1319,1320,1178],{},"A plain ",[1037,1316,590],{},[1037,1318,569],{}," job with no session and no inputs can be served from the shared cache when you set ",[1037,1321,1322],{},"cache.max_age",[1155,1324,1326],{"className":1157,"code":1325,"language":680,"meta":1159,"style":1159},"{ \"url\": \"https:\u002F\u002Fshop.example.com\u002Fp\u002F1\", \"extract\": { \"title\": \"h1\" }, \"cache\": { \"max_age\": 300 } }\n",[1037,1327,1328],{"__ignoreMap":1159},[1163,1329,1330,1332,1335,1337,1340,1342,1345,1347,1349,1352,1354,1357,1360,1362,1365,1367,1369,1372,1374,1378],{"class":1165,"line":1166},[1163,1331,1170],{"class":1169},[1163,1333,1334],{"class":1173},"\"url\"",[1163,1336,1178],{"class":1177},[1163,1338,1339],{"class":1189}," \"https:\u002F\u002Fshop.example.com\u002Fp\u002F1\"",[1163,1341,1193],{"class":1177},[1163,1343,1344],{"class":1173}," \"extract\"",[1163,1346,1178],{"class":1177},[1163,1348,1181],{"class":1169},[1163,1350,1351],{"class":1173},"\"title\"",[1163,1353,1178],{"class":1177},[1163,1355,1356],{"class":1189}," \"h1\"",[1163,1358,1359],{"class":1169}," }",[1163,1361,1193],{"class":1177},[1163,1363,1364],{"class":1173}," \"cache\"",[1163,1366,1178],{"class":1177},[1163,1368,1181],{"class":1169},[1163,1370,1371],{"class":1173},"\"max_age\"",[1163,1373,1178],{"class":1177},[1163,1375,1377],{"class":1376},"sHJIl"," 300",[1163,1379,1380],{"class":1169}," } }\n",[1025,1382,1383,1384,1387,1388,1391,1392,1246],{},"A hit pays its compute credit and no proxy traffic, and says so with ",[1037,1385,1386],{},"meta.cache: \"hit\""," and a ",[1037,1389,1390],{},"cache_hit"," warning. The eligibility rules are on ",[1063,1393,32],{"href":1394},"\u002Fconcepts\u002Ftiers-and-escalation#the-shared-cache",[1029,1396,1398],{"id":1397},"worked-example","Worked example",[1025,1400,1401,1402,1404,1405,1178],{},"Run a shop's product page, server-rendered with an ",[1037,1403,1039],{}," block and ",[1037,1406,1407],{},"__NEXT_DATA__",[1155,1409,1411],{"className":1157,"code":1410,"language":680,"meta":1159,"style":1159},"{\n  \"url\": \"https:\u002F\u002Fshop.example.com\u002Fp\u002F1\",\n  \"extract\": {\n    \"title\": \"h1\",\n    \"price\": { \"selector\": \".price\", \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" },\n    \"stock\": { \"json\": \"$.props.pageProps.product.stock\", \"type\": \"integer\" }\n  }\n}\n",[1037,1412,1413,1418,1431,1442,1454,1506,1536,1542],{"__ignoreMap":1159},[1163,1414,1415],{"class":1165,"line":1166},[1163,1416,1417],{"class":1169},"{\n",[1163,1419,1421,1424,1426,1428],{"class":1165,"line":1420},2,[1163,1422,1423],{"class":1173},"  \"url\"",[1163,1425,1178],{"class":1177},[1163,1427,1339],{"class":1189},[1163,1429,1430],{"class":1177},",\n",[1163,1432,1434,1437,1439],{"class":1165,"line":1433},3,[1163,1435,1436],{"class":1173},"  \"extract\"",[1163,1438,1178],{"class":1177},[1163,1440,1441],{"class":1169}," {\n",[1163,1443,1445,1448,1450,1452],{"class":1165,"line":1444},4,[1163,1446,1447],{"class":1173},"    \"title\"",[1163,1449,1178],{"class":1177},[1163,1451,1356],{"class":1189},[1163,1453,1430],{"class":1177},[1163,1455,1457,1460,1462,1464,1467,1469,1472,1474,1477,1479,1482,1484,1487,1489,1492,1494,1497,1499,1502,1504],{"class":1165,"line":1456},5,[1163,1458,1459],{"class":1173},"    \"price\"",[1163,1461,1178],{"class":1177},[1163,1463,1181],{"class":1169},[1163,1465,1466],{"class":1173},"\"selector\"",[1163,1468,1178],{"class":1177},[1163,1470,1471],{"class":1189}," \".price\"",[1163,1473,1193],{"class":1177},[1163,1475,1476],{"class":1173}," \"type\"",[1163,1478,1178],{"class":1177},[1163,1480,1481],{"class":1189}," \"money\"",[1163,1483,1193],{"class":1177},[1163,1485,1486],{"class":1173}," \"locale\"",[1163,1488,1178],{"class":1177},[1163,1490,1491],{"class":1189}," \"tr\"",[1163,1493,1193],{"class":1177},[1163,1495,1496],{"class":1173}," \"currency\"",[1163,1498,1178],{"class":1177},[1163,1500,1501],{"class":1189}," \"TRY\"",[1163,1503,1359],{"class":1169},[1163,1505,1430],{"class":1177},[1163,1507,1509,1512,1514,1516,1519,1521,1524,1526,1528,1530,1533],{"class":1165,"line":1508},6,[1163,1510,1511],{"class":1173},"    \"stock\"",[1163,1513,1178],{"class":1177},[1163,1515,1181],{"class":1169},[1163,1517,1518],{"class":1173},"\"json\"",[1163,1520,1178],{"class":1177},[1163,1522,1523],{"class":1189}," \"$.props.pageProps.product.stock\"",[1163,1525,1193],{"class":1177},[1163,1527,1476],{"class":1173},[1163,1529,1178],{"class":1177},[1163,1531,1532],{"class":1189}," \"integer\"",[1163,1534,1535],{"class":1169}," }\n",[1163,1537,1539],{"class":1165,"line":1538},7,[1163,1540,1541],{"class":1169},"  }\n",[1163,1543,1545],{"class":1165,"line":1544},8,[1163,1546,1547],{"class":1169},"}\n",[1025,1549,1550,1553,1554,1557,1558,1561,1562,1565,1566,1087,1569,1572,1573,1576,1577,1579,1580,1246],{},[1278,1551,1552],{},"The request."," One ",[1037,1555,1556],{},"GET"," to ",[1037,1559,1560],{},"\u002Fp\u002F1"," with a browser's fingerprint, through a datacenter proxy. ",[1037,1563,1564],{},"meta.tier"," is ",[1037,1567,1568],{},"http",[1037,1570,1571],{},"meta.escalations"," is empty, and ",[1037,1574,1575],{},"meta.steps"," lists the ",[1037,1578,590],{}," and the ",[1037,1581,569],{},[1025,1583,1584,1587,1588,1591,1592,1595,1596,1599,1600,1602],{},[1278,1585,1586],{},"The snapshot."," ",[1037,1589,1590],{},"GET \u002Fv1\u002Fjobs\u002F{id}\u002Fsnapshot"," redirects to the stored snapshot: the URL and final URL, the status and headers, ",[1037,1593,1594],{},"tier: \"http\"",", timings, and a reference to the stored HTML. Its network log is empty, because nothing else was fetched. ",[1037,1597,1598],{},"stock"," came from the ",[1037,1601,1407],{}," JSON inside that HTML, without a browser.",[1025,1604,1605,1587,1608,1611,1612,1615,1616,1619,1620,1623,1624,1627],{},[1278,1606,1607],{},"The cost.",[1037,1609,1610],{},"meta.credits.breakdown"," shows ",[1037,1613,1614],{},"compute: 1"," and the proxy traffic of one document. The same job forced to the browser tier with ",[1037,1617,1618],{},"options.prefer_tier: \"browser\""," returns the same ",[1037,1621,1622],{},"data"," and costs ",[1037,1625,1626],{},"compute: 5",", plus the traffic of the scripts and stylesheets a browser loads (images, fonts and trackers are blocked).",[1029,1629,1631],{"id":1630},"pitfalls","Pitfalls",[1272,1633,1634,1649,1669,1681],{},[1275,1635,1636,1641,1642,1645,1646,1648],{},[1278,1637,1638,1639,1246],{},"A precautionary ",[1037,1640,563],{}," It forces the browser tier for the whole job. Use an ",[1037,1643,1644],{},"expect"," on the ",[1037,1647,590],{}," instead, which works at this tier.",[1275,1650,1651,1654,1655,1087,1658,1661,1662,1665,1666,1668],{},[1278,1652,1653],{},"Reading prices that JavaScript fills in."," A server-rendered skeleton (",[1037,1656,1657],{},"-",[1037,1659,1660],{},"Loading",") is classified ",[1037,1663,1664],{},"placeholder_content"," and the job moves to the browser once; give such a field ",[1037,1667,705],{}," so a genuinely missing value is read as empty.",[1275,1670,1671,1674,1675,1677,1678,1680],{},[1278,1672,1673],{},"Waiting for a network response."," A ",[1037,1676,626],{}," condition never holds here. Read the endpoint with a ",[1037,1679,626],{}," locator, or let the job run at the browser tier.",[1275,1682,1683,1689],{},[1278,1684,1685,1686,1688],{},"Expecting ",[1037,1687,614],{}," to filter hidden elements."," It cannot at this tier; select the element you want with a more specific locator.",[1029,1691,155],{"id":1692},"reference",[1272,1694,1695,1715,1725,1738,1744],{},[1275,1696,1697,1701,1702,1087,1705,1087,1708,1087,1711,1714],{},[1063,1698,1700],{"href":1699},"\u002Freference\u002Fdsl\u002Foptions","Program options"," (",[1037,1703,1704],{},"prefer_tier",[1037,1706,1707],{},"max_tier",[1037,1709,1710],{},"headers",[1037,1712,1713],{},"cache",")",[1275,1716,1717,1087,1720],{},[1063,1718,604],{"href":1719},"\u002Freference\u002Fdsl\u002Fconditions\u002Fvisible",[1063,1721,1723],{"href":1722},"\u002Freference\u002Fdsl\u002Fconditions\u002Fnetwork",[1037,1724,626],{},[1275,1726,1727,1267,1733],{},[1063,1728,1730,1731],{"href":1729},"\u002Freference\u002Fdsl\u002Ffields\u002Fjson","Field locators: ",[1037,1732,680],{},[1063,1734,1736],{"href":1735},"\u002Freference\u002Fdsl\u002Ffields\u002Fnetwork",[1037,1737,626],{},[1275,1739,1740],{},[1063,1741,1743],{"href":1742},"\u002Freference\u002Fapi\u002Fjobs\u002Fget-job-snapshot","Get a job's snapshot",[1275,1745,1746],{},[1063,1747,65],{"href":1748},"\u002Fconcepts\u002Fsnapshots",[1750,1751,1752],"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":1159,"searchDepth":1433,"depth":1433,"links":1754},[1755,1756,1757,1758,1759,1760,1761,1762,1763],{"id":1031,"depth":1420,"text":1032},{"id":1054,"depth":1420,"text":1055},{"id":1073,"depth":1420,"text":1074},{"id":1103,"depth":1420,"text":1104},{"id":1249,"depth":1420,"text":1250},{"id":1310,"depth":1420,"text":1311},{"id":1397,"depth":1420,"text":1398},{"id":1630,"depth":1420,"text":1631},{"id":1692,"depth":1420,"text":155},false,null,"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.","md",{},true,"\u002Fconcepts\u002Fhttp-tier",{"title":35,"description":1766},"2.concepts\u002F03.http-tier","Cbiv8jBansOjzUSjKKfkJssac0FJUKIMUoR8AV7mxCI",[1775,1778],{"title":32,"path":1245,"stem":1776,"description":1777,"children":-1},"2.concepts\u002F02.tiers-and-escalation","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.",{"title":38,"path":1779,"stem":1780,"description":1781,"children":-1},"\u002Fconcepts\u002Fbrowser-tier","2.concepts\u002F04.browser-tier","What Kaabist does with a real browser: isolation, asset blocking, real clicks, waiting for a one-time code, what a page can see, and the limits.",1793593409303]