[{"data":1,"prerenderedAt":1743},["ShallowReactive",2],{"navigation":3,"page:\u002Fconcepts\u002Fegress-and-proxies":1019,"surround:\u002Fconcepts\u002Fegress-and-proxies":1734},[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":68,"body":1021,"breaking":1724,"date":1725,"description":1726,"extension":1727,"generated":1724,"meta":1728,"navigation":1729,"path":1730,"seo":1731,"stem":1732,"version":1725,"__hash__":1733},"docs\u002F2.concepts\u002F14.egress-and-proxies.md",{"type":1022,"value":1023,"toc":1709},"minimark",[1024,1028,1033,1049,1053,1059,1127,1201,1204,1214,1219,1225,1229,1232,1235,1239,1245,1326,1329,1333,1336,1477,1480,1484,1491,1495,1521,1539,1548,1597,1611,1615,1658,1661,1705],[1025,1026,1027],"p",{},"Every request a job makes, from the http tier and from a real browser alike, leaves through one gateway that picks the exit, paces each site and refuses destinations that must not be reached. That is what lets Kaabist visit a site politely however many customers want it at once, bill proxy traffic exactly, and guarantee that a program cannot be tricked into reaching something internal.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1040,1041,1044,1045,1048],{},"The defaults suit public pages: a datacenter exit in the job's region, moved to residential when a site answers with a challenge. Set the ",[1037,1038,1039],"code",{},"proxy"," option when a site shows different content per country, when it blocks datacenter addresses, or when your contract requires traffic to leave through a proxy you operate. Read the refusal table when a job fails with ",[1037,1042,1043],{},"ssrf_blocked",", ",[1037,1046,1047],{},"byo_proxy_unreachable"," or a navigation that never reached the site.",[1029,1050,1052],{"id":1051},"choosing-an-exit","Choosing an exit",[1025,1054,1055,1056,1058],{},"The ",[1037,1057,1039],{}," option on a program or a job decides where a request comes from:",[1060,1061,1065],"pre",{"className":1062,"code":1063,"language":680,"meta":1064,"style":1064},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{ \"options\": { \"proxy\": { \"mode\": \"platform\", \"pool\": \"datacenter\", \"country\": \"DE\" } } }\n","",[1037,1066,1067],{"__ignoreMap":1064},[1068,1069,1072,1076,1080,1084,1087,1090,1092,1094,1097,1099,1103,1106,1109,1111,1114,1116,1119,1121,1124],"span",{"class":1070,"line":1071},"line",1,[1068,1073,1075],{"class":1074},"sTzsn","{ ",[1068,1077,1079],{"class":1078},"sqn18","\"options\"",[1068,1081,1083],{"class":1082},"sQm2-",":",[1068,1085,1086],{"class":1074}," { ",[1068,1088,1089],{"class":1078},"\"proxy\"",[1068,1091,1083],{"class":1082},[1068,1093,1086],{"class":1074},[1068,1095,1096],{"class":1078},"\"mode\"",[1068,1098,1083],{"class":1082},[1068,1100,1102],{"class":1101},"suOy4"," \"platform\"",[1068,1104,1105],{"class":1082},",",[1068,1107,1108],{"class":1078}," \"pool\"",[1068,1110,1083],{"class":1082},[1068,1112,1113],{"class":1101}," \"datacenter\"",[1068,1115,1105],{"class":1082},[1068,1117,1118],{"class":1078}," \"country\"",[1068,1120,1083],{"class":1082},[1068,1122,1123],{"class":1101}," \"DE\"",[1068,1125,1126],{"class":1074}," } } }\n",[1128,1129,1130,1152,1159],"ul",{},[1131,1132,1133,1139,1140,1143,1144,1147,1148,1151],"li",{},[1134,1135,1136],"strong",{},[1037,1137,1138],{},"pool"," is ",[1037,1141,1142],{},"datacenter"," (the default, and the fastest and cheapest), ",[1037,1145,1146],{},"residential",", or ",[1037,1149,1150],{},"mobile",". Kaabist moves up to residential on its own when a site answers with a challenge page, or when the site's profile says it needs one, and the stealth tier always uses residential.",[1131,1153,1154,1158],{},[1134,1155,1156],{},[1037,1157,660],{}," is an ISO-3166-1 alpha-2 code. If no provider in the chosen pool serves it, the nearest configured country is used rather than failing the job.",[1131,1160,1161,1166,1167,1170,1171,1174,1175,1178,1179,1182,1183,1186,1187,1189,1190,1192,1193,1195,1196,1200],{},[1134,1162,1163],{},[1037,1164,1165],{},"mode: \"byo\""," with a ",[1037,1168,1169],{},"byo_id"," sends the job through your own proxy instead. ",[1037,1172,1173],{},"fallback"," then decides what happens when yours is unreachable: ",[1037,1176,1177],{},"\"platform\""," keeps the job running on Kaabist's exits, adds a ",[1037,1180,1181],{},"byo_fallback_used"," warning to the result and bills that traffic, and ",[1037,1184,1185],{},"\"none\""," (the default) fails the job with ",[1037,1188,1047],{}," rather than sending your traffic through an exit you did not choose. ",[1037,1191,1165],{}," without a ",[1037,1194,1169],{}," uses your organisation's default proxy. See ",[1197,1198,107],"a",{"href":1199},"\u002Fguides\u002Fbyo-providers"," for vendors, presets and health checks.",[1025,1202,1203],{},"One job keeps one exit for its whole run. A checkout flow that changed address halfway would sign itself out, so the choice is made once and stays; a retry after a failed connection may land on a different exit.",[1025,1205,1206,1209,1210,1213],{},[1037,1207,1208],{},"meta.proxy"," on the job reports what was used: ",[1037,1211,1212],{},"{ \"mode\": \"platform\", \"pool\": \"datacenter\", \"country\": \"DE\" }",".",[1215,1216,1218],"h3",{"id":1217},"what-the-pools-cost","What the pools cost",[1025,1220,1221,1222,1213],{},"Proxy traffic is billed per megabyte the gateway moved for the job: 0.05 credits for datacenter, 0.5 for residential, 2 for mobile. Traffic through your own proxy is not billed. See ",[1197,1223,56],{"href":1224},"\u002Fconcepts\u002Fcredits-and-billing",[1029,1226,1228],{"id":1227},"pacing","Pacing",[1025,1230,1231],{},"Kaabist limits how fast any one site is visited, across every customer. By default that is two requests per second to a hostname, with a burst of five; a site known to tolerate more, or less, gets its own limit. A request that arrives when the allowance is spent waits its turn, up to twenty seconds, and is then refused as rate limited rather than queued forever. A site also has a cap on connections open to it at once, across all customers.",[1025,1233,1234],{},"This is why a job against a large catalogue takes the time it takes. It is also why Kaabist is blocked less often than a scraper that does not pace itself.",[1029,1236,1238],{"id":1237},"what-kaabist-has-learned-about-a-site","What Kaabist has learned about a site",[1025,1240,1241,1244],{},[1037,1242,1243],{},"GET \u002Fv1\u002Fsites\u002F{hostname}"," shows what the platform has learned about a site you use:",[1060,1246,1248],{"className":1062,"code":1247,"language":680,"meta":1064,"style":1064},"{ \"hostname\": \"shop.example.com\", \"object\": \"site_profile\", \"tier_required\": \"browser\", \"tier_confidence\": 0.9, \"known_obstacles_count\": 2, \"api_endpoints_count\": 1, \"last_blocked_at\": \"2026-09-30T08:12:00Z\" }\n",[1037,1249,1250],{"__ignoreMap":1064},[1068,1251,1252,1254,1257,1259,1262,1264,1267,1269,1272,1274,1277,1279,1282,1284,1287,1289,1293,1295,1298,1300,1303,1305,1308,1310,1313,1315,1318,1320,1323],{"class":1070,"line":1071},[1068,1253,1075],{"class":1074},[1068,1255,1256],{"class":1078},"\"hostname\"",[1068,1258,1083],{"class":1082},[1068,1260,1261],{"class":1101}," \"shop.example.com\"",[1068,1263,1105],{"class":1082},[1068,1265,1266],{"class":1078}," \"object\"",[1068,1268,1083],{"class":1082},[1068,1270,1271],{"class":1101}," \"site_profile\"",[1068,1273,1105],{"class":1082},[1068,1275,1276],{"class":1078}," \"tier_required\"",[1068,1278,1083],{"class":1082},[1068,1280,1281],{"class":1101}," \"browser\"",[1068,1283,1105],{"class":1082},[1068,1285,1286],{"class":1078}," \"tier_confidence\"",[1068,1288,1083],{"class":1082},[1068,1290,1292],{"class":1291},"sHJIl"," 0.9",[1068,1294,1105],{"class":1082},[1068,1296,1297],{"class":1078}," \"known_obstacles_count\"",[1068,1299,1083],{"class":1082},[1068,1301,1302],{"class":1291}," 2",[1068,1304,1105],{"class":1082},[1068,1306,1307],{"class":1078}," \"api_endpoints_count\"",[1068,1309,1083],{"class":1082},[1068,1311,1312],{"class":1291}," 1",[1068,1314,1105],{"class":1082},[1068,1316,1317],{"class":1078}," \"last_blocked_at\"",[1068,1319,1083],{"class":1082},[1068,1321,1322],{"class":1101}," \"2026-09-30T08:12:00Z\"",[1068,1324,1325],{"class":1074}," }\n",[1025,1327,1328],{},"The tier it needs and how confident Kaabist is, how many obstacles it has learned to dismiss there, how many JSON endpoints were found behind it, and when it last blocked a request. It is the answer to \"why is this site slower and more expensive than that one\". A hostname nothing is known about returns an empty profile, not an error. What your own proxy or model taught Kaabist stays in your organisation's profile and never reaches the shared one.",[1029,1330,1332],{"id":1331},"when-a-request-never-leaves","When a request never leaves",[1025,1334,1335],{},"Some requests are refused before a connection is opened:",[1337,1338,1339,1355],"table",{},[1340,1341,1342],"thead",{},[1343,1344,1345,1349,1352],"tr",{},[1346,1347,1348],"th",{},"Reason",[1346,1350,1351],{},"What happened",[1346,1353,1354],{},"What the job sees",[1356,1357,1358,1381,1394,1406,1418,1430,1442,1454],"tbody",{},[1343,1359,1360,1365,1376],{},[1361,1362,1363],"td",{},[1037,1364,1043],{},[1361,1366,1367,1368,1371,1372,1375],{},"The address the hostname resolves to is private, loopback, link-local or a cloud metadata endpoint, or the name ends in ",[1037,1369,1370],{},".internal"," or ",[1037,1373,1374],{},".local",". This is not configurable: a program that could reach those could read Kaabist's own infrastructure.",[1361,1377,1378,1379],{},"fails with ",[1037,1380,1043],{},[1343,1382,1383,1388,1391],{},[1361,1384,1385],{},[1037,1386,1387],{},"blocked_list",[1361,1389,1390],{},"The target is on Kaabist's blocklist, or on a blocklist your organisation configured.",[1361,1392,1393],{},"the navigation fails",[1343,1395,1396,1401,1404],{},[1361,1397,1398],{},[1037,1399,1400],{},"rate_limited",[1361,1402,1403],{},"The site's allowance stayed spent for the whole twenty-second wait.",[1361,1405,1393],{},[1343,1407,1408,1413,1416],{},[1361,1409,1410],{},[1037,1411,1412],{},"org_concurrency",[1361,1414,1415],{},"Your organisation already has as many connections open as it may.",[1361,1417,1393],{},[1343,1419,1420,1425,1428],{},[1361,1421,1422],{},[1037,1423,1424],{},"host_concurrency",[1361,1426,1427],{},"The site already has as many connections open as Kaabist allows it, across all customers.",[1361,1429,1393],{},[1343,1431,1432,1437,1440],{},[1361,1433,1434],{},[1037,1435,1436],{},"no_provider",[1361,1438,1439],{},"The requested pool has no provider configured at all.",[1361,1441,1393],{},[1343,1443,1444,1449,1452],{},[1361,1445,1446],{},[1037,1447,1448],{},"upstream_error",[1361,1450,1451],{},"Two different proxy providers failed to open the connection.",[1361,1453,1393],{},[1343,1455,1456,1460,1468],{},[1361,1457,1458],{},[1037,1459,1047],{},[1361,1461,1462,1463,1139,1465,1213],{},"Your own proxy could not be reached and ",[1037,1464,1173],{},[1037,1466,1467],{},"none",[1361,1469,1378,1470,1472,1473,1476],{},[1037,1471,1047],{},", not retryable; ",[1037,1474,1475],{},"error.details.byo_id"," names the proxy",[1025,1478,1479],{},"A redirect is re-checked at every hop, and the address a hostname resolves to is checked and then connected to directly, so a page that redirects to an internal address, or a name that resolves to a public address once and a private one the next time, is refused rather than followed.",[1029,1481,1483],{"id":1482},"what-kaabist-records","What Kaabist records",[1025,1485,1486,1487,1490],{},"For each connection: the hostname, the bytes in each direction, how long it lasted, and which pool it used. Not the URL path, not the headers, and not the content: a secure connection is opaque to the gateway by design. Bytes are what proxy usage is billed on. See ",[1197,1488,77],{"href":1489},"\u002Fconcepts\u002Fdata-retention"," for how long the rest of a job's data is kept.",[1029,1492,1494],{"id":1493},"worked-example","Worked example",[1025,1496,1497,1500,1501,1504,1505,1508,1509,1512,1513,1516,1517,1520],{},[1134,1498,1499],{},"A redirect to an internal address."," A shop's link ",[1037,1502,1503],{},"https:\u002F\u002Fshop.example.com\u002Fgo\u002Fpartner"," answers with a ",[1037,1506,1507],{},"302"," to ",[1037,1510,1511],{},"http:\u002F\u002F169.254.169.254\u002Flatest\u002Fmeta-data\u002F",", the cloud metadata address. A job that opens it reaches the shop, receives the redirect, and the gateway refuses the second hop: the job fails with ",[1037,1514,1515],{},"error.code: \"ssrf_blocked\"",". The same happens with a redirect to ",[1037,1518,1519],{},"127.0.0.1",". No setting changes this.",[1025,1522,1523,1526,1527,1530,1531,1534,1535,1538],{},[1134,1524,1525],{},"A site that blocks datacenter addresses."," Some sites let only residential exits through. A job with the default proxy reaches it from a datacenter address and receives a challenge page; Kaabist recognises the challenge, moves to a residential exit and a stronger tier as your ",[1037,1528,1529],{},"max_tier"," allows, and the job's ",[1037,1532,1533],{},"meta.proxy.pool"," and ",[1037,1536,1537],{},"meta.escalations"," show what it took. The residential traffic is billed at 0.5 credits a megabyte instead of 0.05.",[1025,1540,1541,1544,1545,1083],{},[1134,1542,1543],{},"Your own proxy, with a fallback."," With a proxy registered as ",[1037,1546,1547],{},"byo_01J…",[1060,1549,1551],{"className":1062,"code":1550,"language":680,"meta":1064,"style":1064},"{ \"options\": { \"proxy\": { \"mode\": \"byo\", \"byo_id\": \"byo_01J…\", \"fallback\": \"platform\" } } }\n",[1037,1552,1553],{"__ignoreMap":1064},[1068,1554,1555,1557,1559,1561,1563,1565,1567,1569,1571,1573,1576,1578,1581,1583,1586,1588,1591,1593,1595],{"class":1070,"line":1071},[1068,1556,1075],{"class":1074},[1068,1558,1079],{"class":1078},[1068,1560,1083],{"class":1082},[1068,1562,1086],{"class":1074},[1068,1564,1089],{"class":1078},[1068,1566,1083],{"class":1082},[1068,1568,1086],{"class":1074},[1068,1570,1096],{"class":1078},[1068,1572,1083],{"class":1082},[1068,1574,1575],{"class":1101}," \"byo\"",[1068,1577,1105],{"class":1082},[1068,1579,1580],{"class":1078}," \"byo_id\"",[1068,1582,1083],{"class":1082},[1068,1584,1585],{"class":1101}," \"byo_01J…\"",[1068,1587,1105],{"class":1082},[1068,1589,1590],{"class":1078}," \"fallback\"",[1068,1592,1083],{"class":1082},[1068,1594,1102],{"class":1101},[1068,1596,1126],{"class":1074},[1025,1598,1599,1600,1603,1604,1607,1608,1610],{},"If your proxy is down when the job runs, the job continues through Kaabist's exits, its result carries ",[1037,1601,1602],{},"{ \"code\": \"byo_fallback_used\" }",", and that traffic is billed. With ",[1037,1605,1606],{},"\"fallback\": \"none\""," the same job fails with ",[1037,1609,1047],{}," and nothing leaves through an exit you did not choose.",[1029,1612,1614],{"id":1613},"pitfalls","Pitfalls",[1128,1616,1617,1623,1633,1642,1648],{},[1131,1618,1619,1622],{},[1134,1620,1621],{},"A country nobody serves is replaced, not refused."," When the content depends on the country, test the job from that country before relying on it in a schedule.",[1131,1624,1625,1628,1629,1632],{},[1134,1626,1627],{},"Residential costs ten times datacenter."," Pin ",[1037,1630,1631],{},"pool: \"datacenter\""," only when you are sure the site accepts it; otherwise let Kaabist move up when it must.",[1131,1634,1635,1641],{},[1134,1636,1637,1640],{},[1037,1638,1639],{},"fallback: \"platform\""," is billed."," The fallback traffic goes through Kaabist's pools and is charged like any other.",[1131,1643,1644,1647],{},[1134,1645,1646],{},"Pacing is per site, not per job."," Splitting a crawl into more jobs does not make one site answer faster.",[1131,1649,1650,1653,1654,1657],{},[1134,1651,1652],{},"Development addresses are refused in production."," A program that works against ",[1037,1655,1656],{},"localhost"," on your machine is refused the same address on Kaabist.",[1029,1659,155],{"id":1660},"reference",[1128,1662,1663,1671,1677,1687,1697],{},[1131,1664,1665,1668,1669],{},[1197,1666,530],{"href":1667},"\u002Freference\u002Fdsl\u002Foptions",", including ",[1037,1670,1039],{},[1131,1672,1673],{},[1197,1674,1676],{"href":1675},"\u002Freference\u002Fapi\u002Fsites\u002Fget-site-profile","Get a site profile",[1131,1678,1679,1534,1683],{},[1197,1680,1682],{"href":1681},"\u002Freference\u002Fapi\u002Fschemas\u002Fbyo-provider","Bring-your-own provider schema",[1197,1684,1686],{"href":1685},"\u002Freference\u002Fapi\u002Fbyo-providers\u002Ftest-byo-provider","test a provider",[1131,1688,1689,1534,1693],{},[1197,1690,1692],{"href":1691},"\u002Freference\u002Fcodes#errors","Error codes",[1197,1694,1696],{"href":1695},"\u002Freference\u002Fcodes#warnings","warning codes",[1131,1698,1699,1534,1701],{},[1197,1700,107],{"href":1199},[1197,1702,1704],{"href":1703},"\u002Fguides\u002Fsecurity-and-data","Security and data",[1706,1707,1708],"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":1064,"searchDepth":1710,"depth":1710,"links":1711},3,[1712,1714,1717,1718,1719,1720,1721,1722,1723],{"id":1031,"depth":1713,"text":1032},2,{"id":1051,"depth":1713,"text":1052,"children":1715},[1716],{"id":1217,"depth":1710,"text":1218},{"id":1227,"depth":1713,"text":1228},{"id":1237,"depth":1713,"text":1238},{"id":1331,"depth":1713,"text":1332},{"id":1482,"depth":1713,"text":1483},{"id":1493,"depth":1713,"text":1494},{"id":1613,"depth":1713,"text":1614},{"id":1660,"depth":1713,"text":155},false,null,"How a job's traffic reaches a site: proxy pools, countries, your own proxy, pacing per site, what is refused before it leaves, and what is recorded.","md",{},true,"\u002Fconcepts\u002Fegress-and-proxies",{"title":68,"description":1726},"2.concepts\u002F14.egress-and-proxies","rH2dmwGRuU5fBXqRefi6wWsdtuQae-w7oMz2bOMm0E4",[1735,1739],{"title":65,"path":1736,"stem":1737,"description":1738,"children":-1},"\u002Fconcepts\u002Fsnapshots","2.concepts\u002F13.snapshots","What Kaabist stores for each step of a job, what it deliberately leaves out, how to fetch a step's snapshot, and how to replay a program against one.",{"title":71,"path":1740,"stem":1741,"description":1742,"children":-1},"\u002Fconcepts\u002Fqueueing","2.concepts\u002F15.queueing","Why your job starts when it does: priorities, plan weights, concurrency, credits, session locks, and what happens to a job when its worker dies.",1793593413315]