[{"data":1,"prerenderedAt":2173},["ShallowReactive",2],{"navigation":3,"page:\u002Fconcepts\u002Fsnapshots":1019,"surround:\u002Fconcepts\u002Fsnapshots":2164},[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":65,"body":1021,"breaking":2155,"date":2156,"description":2157,"extension":2158,"generated":2155,"meta":2159,"navigation":1516,"path":2160,"seo":2161,"stem":2162,"version":2156,"__hash__":2163},"docs\u002F2.concepts\u002F13.snapshots.md",{"type":1022,"value":1023,"toc":2143},"minimark",[1024,1028,1033,1036,1040,1105,1109,1137,1141,1147,1365,1395,1399,1405,1426,1437,1913,1917,1931,1942,1946,1958,1962,1974,2057,2061,2096,2099,2139],[1025,1026,1027],"p",{},"Every step of a job leaves a snapshot: the page as Kaabist saw it, plus the network, console and timing that explain how it got there. Snapshots are what you look at when a run did something you did not expect, what the builder renders when you pick a field, what healing compares against when a site changes, and what you can re-run a new program version against without fetching anything.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035],{},"Open a step's snapshot when a job failed, parked, or returned a value you did not expect, to see the page the step actually had in front of it. Replay a draft version against a stored snapshot when you change an extract schema, so you can check the result before you publish or spend credits. Read the \"never contains\" section before you automate a site with sensitive data.",[1029,1037,1039],{"id":1038},"what-a-snapshot-contains","What a snapshot contains",[1041,1042,1043,1051,1062,1073,1079,1093,1099],"ul",{},[1044,1045,1046,1050],"li",{},[1047,1048,1049],"strong",{},"The page."," The HTML after the page settled, not the HTML the server sent. Stylesheets are inlined and every link, image and form action is rewritten to an absolute address, so the stored copy renders faithfully weeks later with no access to the site. Content behind an open shadow root is included; content behind a closed one cannot be read by anything, including Kaabist, and is only counted.",[1044,1052,1053,1056,1057,1061],{},[1047,1054,1055],{},"Same-origin frames."," Each is stored separately, with the path to the ",[1058,1059,1060],"code",{},"\u003Ciframe>"," that holds it. A cross-origin frame is recorded as present but its content is not stored.",[1044,1063,1064,1067,1068,1072],{},[1047,1065,1066],{},"Network activity."," Every request the page made, with its method, status, type, size and timing. Response ",[1069,1070,1071],"em",{},"bodies"," are kept only for JSON and plain text, and only up to 512 KB each; that is what makes reading the API the page already calls possible.",[1044,1074,1075,1078],{},[1047,1076,1077],{},"Console output",", truncated to 2 KB per message.",[1044,1080,1081,1084,1085,1088,1089,1092],{},[1047,1082,1083],{},"Embedded data."," An index of the machine-readable payloads found in the page (",[1058,1086,1087],{},"__NEXT_DATA__",", a Nuxt or Redux store, ",[1058,1090,1091],{},"ld+json","), so extraction can read structured data instead of scraping it.",[1044,1094,1095,1098],{},[1047,1096,1097],{},"Page facts",": the URL asked for and the final URL after redirects, the HTTP status, a few response headers, the tier, timings, and counts of nodes, frames, forms, scripts and shadow roots.",[1044,1100,1101,1104],{},[1047,1102,1103],{},"A screenshot",", when the step failed, the job needs your attention, or you asked for one.",[1029,1106,1108],{"id":1107},"what-a-snapshot-never-contains","What a snapshot never contains",[1025,1110,1111,1112,1115,1116,1115,1119,1115,1121,1124,1125,1128,1129,1132,1133,1136],{},"Cookies, storage state, passwords and one-time codes are never written. Password fields and inputs whose name looks like a secret (",[1058,1113,1114],{},"token",", ",[1058,1117,1118],{},"otp",[1058,1120,1058],{},[1058,1122,1123],{},"cvv"," and similar) are emptied before the page is serialised, and marked so you can see that a value was there. ",[1058,1126,1127],{},"Set-Cookie"," is removed from the stored headers, and request and response headers in the network log are limited to ",[1058,1130,1131],{},"content-type"," and ",[1058,1134,1135],{},"accept",". This is structural, not a filter applied afterwards: the stored format has no place to put them.",[1029,1138,1140],{"id":1139},"fetching-a-steps-snapshot","Fetching a step's snapshot",[1025,1142,1143,1146],{},[1058,1144,1145],{},"GET \u002Fv1\u002Fjobs\u002F{id}\u002Fsteps"," lists every step a job ran, each attempt separately, with its status, timings, warnings, any healing or obstacle record, and links to its snapshot and screenshot:",[1148,1149,1153],"pre",{"className":1150,"code":1151,"language":680,"meta":1152,"style":1152},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{\n  \"data\": [\n    {\n      \"step_path\": \"steps[1]\", \"attempt\": 0, \"action\": \"extract\", \"status\": \"ok\", \"tier\": \"http\",\n      \"started_at\": \"…\", \"finished_at\": \"…\", \"duration_ms\": 41,\n      \"snapshot\": \"\u002Fv1\u002Fjobs\u002Fjob_01J…\u002Fsnapshot?step=steps[1]\",\n      \"screenshot\": null, \"error\": null, \"warnings\": [], \"healed\": null, \"obstacle\": null,\n      \"result_preview\": null\n    }\n  ]\n}\n","",[1058,1154,1155,1164,1178,1184,1241,1273,1286,1336,1347,1353,1359],{"__ignoreMap":1152},[1156,1157,1160],"span",{"class":1158,"line":1159},"line",1,[1156,1161,1163],{"class":1162},"sTzsn","{\n",[1156,1165,1167,1171,1175],{"class":1158,"line":1166},2,[1156,1168,1170],{"class":1169},"sqn18","  \"data\"",[1156,1172,1174],{"class":1173},"sQm2-",":",[1156,1176,1177],{"class":1162}," [\n",[1156,1179,1181],{"class":1158,"line":1180},3,[1156,1182,1183],{"class":1162},"    {\n",[1156,1185,1187,1190,1192,1196,1199,1202,1204,1208,1210,1213,1215,1218,1220,1223,1225,1228,1230,1233,1235,1238],{"class":1158,"line":1186},4,[1156,1188,1189],{"class":1169},"      \"step_path\"",[1156,1191,1174],{"class":1173},[1156,1193,1195],{"class":1194},"suOy4"," \"steps[1]\"",[1156,1197,1198],{"class":1173},",",[1156,1200,1201],{"class":1169}," \"attempt\"",[1156,1203,1174],{"class":1173},[1156,1205,1207],{"class":1206},"sHJIl"," 0",[1156,1209,1198],{"class":1173},[1156,1211,1212],{"class":1169}," \"action\"",[1156,1214,1174],{"class":1173},[1156,1216,1217],{"class":1194}," \"extract\"",[1156,1219,1198],{"class":1173},[1156,1221,1222],{"class":1169}," \"status\"",[1156,1224,1174],{"class":1173},[1156,1226,1227],{"class":1194}," \"ok\"",[1156,1229,1198],{"class":1173},[1156,1231,1232],{"class":1169}," \"tier\"",[1156,1234,1174],{"class":1173},[1156,1236,1237],{"class":1194}," \"http\"",[1156,1239,1240],{"class":1173},",\n",[1156,1242,1244,1247,1249,1252,1254,1257,1259,1261,1263,1266,1268,1271],{"class":1158,"line":1243},5,[1156,1245,1246],{"class":1169},"      \"started_at\"",[1156,1248,1174],{"class":1173},[1156,1250,1251],{"class":1194}," \"…\"",[1156,1253,1198],{"class":1173},[1156,1255,1256],{"class":1169}," \"finished_at\"",[1156,1258,1174],{"class":1173},[1156,1260,1251],{"class":1194},[1156,1262,1198],{"class":1173},[1156,1264,1265],{"class":1169}," \"duration_ms\"",[1156,1267,1174],{"class":1173},[1156,1269,1270],{"class":1206}," 41",[1156,1272,1240],{"class":1173},[1156,1274,1276,1279,1281,1284],{"class":1158,"line":1275},6,[1156,1277,1278],{"class":1169},"      \"snapshot\"",[1156,1280,1174],{"class":1173},[1156,1282,1283],{"class":1194}," \"\u002Fv1\u002Fjobs\u002Fjob_01J…\u002Fsnapshot?step=steps[1]\"",[1156,1285,1240],{"class":1173},[1156,1287,1289,1292,1294,1297,1299,1302,1304,1306,1308,1311,1313,1316,1318,1321,1323,1325,1327,1330,1332,1334],{"class":1158,"line":1288},7,[1156,1290,1291],{"class":1169},"      \"screenshot\"",[1156,1293,1174],{"class":1173},[1156,1295,1296],{"class":1206}," null",[1156,1298,1198],{"class":1173},[1156,1300,1301],{"class":1169}," \"error\"",[1156,1303,1174],{"class":1173},[1156,1305,1296],{"class":1206},[1156,1307,1198],{"class":1173},[1156,1309,1310],{"class":1169}," \"warnings\"",[1156,1312,1174],{"class":1173},[1156,1314,1315],{"class":1162}," []",[1156,1317,1198],{"class":1173},[1156,1319,1320],{"class":1169}," \"healed\"",[1156,1322,1174],{"class":1173},[1156,1324,1296],{"class":1206},[1156,1326,1198],{"class":1173},[1156,1328,1329],{"class":1169}," \"obstacle\"",[1156,1331,1174],{"class":1173},[1156,1333,1296],{"class":1206},[1156,1335,1240],{"class":1173},[1156,1337,1339,1342,1344],{"class":1158,"line":1338},8,[1156,1340,1341],{"class":1169},"      \"result_preview\"",[1156,1343,1174],{"class":1173},[1156,1345,1346],{"class":1206}," null\n",[1156,1348,1350],{"class":1158,"line":1349},9,[1156,1351,1352],{"class":1162},"    }\n",[1156,1354,1356],{"class":1158,"line":1355},10,[1156,1357,1358],{"class":1162},"  ]\n",[1156,1360,1362],{"class":1158,"line":1361},11,[1156,1363,1364],{"class":1162},"}\n",[1025,1366,1367,1370,1371,1374,1375,1378,1379,1382,1383,1386,1387,1390,1391,1394],{},[1058,1368,1369],{},"GET \u002Fv1\u002Fjobs\u002F{id}\u002Fsnapshot?step=steps[1]"," answers ",[1058,1372,1373],{},"302"," to a link to that step's snapshot JSON, valid for fifteen minutes; without ",[1058,1376,1377],{},"step"," it is the final step's. ",[1058,1380,1381],{},"GET \u002Fv1\u002Fjobs\u002F{id}\u002Fscreenshot?step=…"," does the same for the screenshot. A finished job's envelope carries the final snapshot's link as ",[1058,1384,1385],{},"meta.snapshot",", and a failed job's ",[1058,1388,1389],{},"error.snapshot"," points at the page it failed on. From the command line, ",[1058,1392,1393],{},"kaab jobs snapshot JOB_ID --step steps[1]"," downloads it.",[1029,1396,1398],{"id":1397},"replaying-a-program-against-a-snapshot","Replaying a program against a snapshot",[1025,1400,1401,1404],{},[1058,1402,1403],{},"POST \u002Fv1\u002Fprograms\u002F{id}\u002Fversions\u002F{n}\u002Freplay"," runs a version's extraction against a stored page instead of fetching one:",[1148,1406,1408],{"className":1150,"code":1407,"language":680,"meta":1152,"style":1152},"{ \"snapshot\": \"job_01J…:steps[1]\" }\n",[1058,1409,1410],{"__ignoreMap":1152},[1156,1411,1412,1415,1418,1420,1423],{"class":1158,"line":1159},[1156,1413,1414],{"class":1162},"{ ",[1156,1416,1417],{"class":1169},"\"snapshot\"",[1156,1419,1174],{"class":1173},[1156,1421,1422],{"class":1194}," \"job_01J…:steps[1]\"",[1156,1424,1425],{"class":1162}," }\n",[1025,1427,1428,1429,1432,1433,1436],{},"It answers ",[1058,1430,1431],{},"{ \"data\", \"raw\", \"warnings\" }",", exactly what a job would have returned, and costs no credits. Use ",[1058,1434,1435],{},"\"snapshot\": \"ground_truth\""," to replay against the pages the version's fields were confirmed on. The version may be a draft, so you can try a change before you publish it:",[1438,1439,1440],"code-group",{},[1148,1441,1446],{"className":1442,"code":1443,"filename":1444,"language":1445,"meta":1152,"style":1152},"language-ts shiki shiki-themes kaab-code kaab-code kaab-code","\u002F\u002F Run version 1 once: every step stores a snapshot of the page.\nconst run = await kaab.jobs.create({ program: `${name}@1`, wait: 30 });\n\n\u002F\u002F Version 2 reads one more field. Try it on the stored page: no fetch, no credits.\nconst v2 = await kaab.programs.versions.create(program.id, {\n  publish: false, \u002F\u002F a draft until the replay looks right\n  definition: {\n    kaab: \"1\",\n    name,\n    options: { max_tier: \"http\" },\n    steps: [\n      { goto: `${site}\u002Fp\u002F3` },\n      {\n        extract: {\n          title: \"h1\",\n          price: { selector: \".price\", type: \"money\" },\n          sku: { selector: \".sku\", regex: \"SKU:\\\\s*([A-Z0-9-]+)\" },\n        },\n      },\n    ],\n  },\n});\nconst replay = await kaab.programs.versions.replay(program.id, v2.version, {\n  snapshot: `${run.id}:steps[1]`,\n});\nconsole.log(`v${v2.version} on ${run.id}'s page: ${JSON.stringify(replay.data)}`);\n","TypeScript","ts",[1058,1447,1448,1454,1512,1518,1523,1560,1575,1584,1596,1603,1622,1631,1655,1661,1671,1684,1714,1743,1751,1759,1767,1775,1781,1823,1847,1852],{"__ignoreMap":1152},[1156,1449,1450],{"class":1158,"line":1159},[1156,1451,1453],{"class":1452},"sKog0","\u002F\u002F Run version 1 once: every step stores a snapshot of the page.\n",[1156,1455,1456,1459,1462,1465,1468,1471,1475,1477,1480,1483,1485,1488,1491,1493,1496,1499,1501,1504,1506,1509],{"class":1158,"line":1166},[1156,1457,1458],{"class":1169},"const",[1156,1460,1461],{"class":1206}," run",[1156,1463,1464],{"class":1169}," =",[1156,1466,1467],{"class":1169}," await",[1156,1469,1470],{"class":1206}," kaab",[1156,1472,1474],{"class":1473},"sJugJ",".",[1156,1476,171],{"class":1206},[1156,1478,1479],{"class":1473},".create",[1156,1481,1482],{"class":1162},"({ program",[1156,1484,1174],{"class":1169},[1156,1486,1487],{"class":1194}," `",[1156,1489,1490],{"class":1169},"${",[1156,1492,702],{"class":1162},[1156,1494,1495],{"class":1169},"}",[1156,1497,1498],{"class":1194},"@1`",[1156,1500,1198],{"class":1173},[1156,1502,1503],{"class":1162}," wait",[1156,1505,1174],{"class":1169},[1156,1507,1508],{"class":1206}," 30",[1156,1510,1511],{"class":1162}," });\n",[1156,1513,1514],{"class":1158,"line":1180},[1156,1515,1517],{"emptyLinePlaceholder":1516},true,"\n",[1156,1519,1520],{"class":1158,"line":1186},[1156,1521,1522],{"class":1452},"\u002F\u002F Version 2 reads one more field. Try it on the stored page: no fetch, no credits.\n",[1156,1524,1525,1527,1530,1532,1534,1536,1538,1540,1542,1545,1547,1550,1552,1555,1557],{"class":1158,"line":1243},[1156,1526,1458],{"class":1169},[1156,1528,1529],{"class":1206}," v2",[1156,1531,1464],{"class":1169},[1156,1533,1467],{"class":1169},[1156,1535,1470],{"class":1206},[1156,1537,1474],{"class":1473},[1156,1539,224],{"class":1206},[1156,1541,1474],{"class":1473},[1156,1543,1544],{"class":1206},"versions",[1156,1546,1479],{"class":1473},[1156,1548,1549],{"class":1162},"(",[1156,1551,489],{"class":1206},[1156,1553,1554],{"class":1162},".id",[1156,1556,1198],{"class":1173},[1156,1558,1559],{"class":1162}," {\n",[1156,1561,1562,1565,1567,1570,1572],{"class":1158,"line":1275},[1156,1563,1564],{"class":1162},"  publish",[1156,1566,1174],{"class":1169},[1156,1568,1569],{"class":1206}," false",[1156,1571,1198],{"class":1173},[1156,1573,1574],{"class":1452}," \u002F\u002F a draft until the replay looks right\n",[1156,1576,1577,1580,1582],{"class":1158,"line":1288},[1156,1578,1579],{"class":1162},"  definition",[1156,1581,1174],{"class":1169},[1156,1583,1559],{"class":1162},[1156,1585,1586,1589,1591,1594],{"class":1158,"line":1338},[1156,1587,1588],{"class":1162},"    kaab",[1156,1590,1174],{"class":1169},[1156,1592,1593],{"class":1194}," \"1\"",[1156,1595,1240],{"class":1173},[1156,1597,1598,1601],{"class":1158,"line":1349},[1156,1599,1600],{"class":1162},"    name",[1156,1602,1240],{"class":1173},[1156,1604,1605,1608,1610,1613,1615,1617,1620],{"class":1158,"line":1355},[1156,1606,1607],{"class":1162},"    options",[1156,1609,1174],{"class":1169},[1156,1611,1612],{"class":1162}," { max_tier",[1156,1614,1174],{"class":1169},[1156,1616,1237],{"class":1194},[1156,1618,1619],{"class":1162}," }",[1156,1621,1240],{"class":1173},[1156,1623,1624,1627,1629],{"class":1158,"line":1361},[1156,1625,1626],{"class":1162},"    steps",[1156,1628,1174],{"class":1169},[1156,1630,1177],{"class":1162},[1156,1632,1634,1637,1639,1641,1643,1646,1648,1651,1653],{"class":1158,"line":1633},12,[1156,1635,1636],{"class":1162},"      { goto",[1156,1638,1174],{"class":1169},[1156,1640,1487],{"class":1194},[1156,1642,1490],{"class":1169},[1156,1644,1645],{"class":1162},"site",[1156,1647,1495],{"class":1169},[1156,1649,1650],{"class":1194},"\u002Fp\u002F3`",[1156,1652,1619],{"class":1162},[1156,1654,1240],{"class":1173},[1156,1656,1658],{"class":1158,"line":1657},13,[1156,1659,1660],{"class":1162},"      {\n",[1156,1662,1664,1667,1669],{"class":1158,"line":1663},14,[1156,1665,1666],{"class":1162},"        extract",[1156,1668,1174],{"class":1169},[1156,1670,1559],{"class":1162},[1156,1672,1674,1677,1679,1682],{"class":1158,"line":1673},15,[1156,1675,1676],{"class":1162},"          title",[1156,1678,1174],{"class":1169},[1156,1680,1681],{"class":1194}," \"h1\"",[1156,1683,1240],{"class":1173},[1156,1685,1687,1690,1692,1695,1697,1700,1702,1705,1707,1710,1712],{"class":1158,"line":1686},16,[1156,1688,1689],{"class":1162},"          price",[1156,1691,1174],{"class":1169},[1156,1693,1694],{"class":1162}," { selector",[1156,1696,1174],{"class":1169},[1156,1698,1699],{"class":1194}," \".price\"",[1156,1701,1198],{"class":1173},[1156,1703,1704],{"class":1162}," type",[1156,1706,1174],{"class":1169},[1156,1708,1709],{"class":1194}," \"money\"",[1156,1711,1619],{"class":1162},[1156,1713,1240],{"class":1173},[1156,1715,1717,1720,1722,1724,1726,1729,1731,1734,1736,1739,1741],{"class":1158,"line":1716},17,[1156,1718,1719],{"class":1162},"          sku",[1156,1721,1174],{"class":1169},[1156,1723,1694],{"class":1162},[1156,1725,1174],{"class":1169},[1156,1727,1728],{"class":1194}," \".sku\"",[1156,1730,1198],{"class":1173},[1156,1732,1733],{"class":1162}," regex",[1156,1735,1174],{"class":1169},[1156,1737,1738],{"class":1194}," \"SKU:\\\\s*([A-Z0-9-]+)\"",[1156,1740,1619],{"class":1162},[1156,1742,1240],{"class":1173},[1156,1744,1746,1749],{"class":1158,"line":1745},18,[1156,1747,1748],{"class":1162},"        }",[1156,1750,1240],{"class":1173},[1156,1752,1754,1757],{"class":1158,"line":1753},19,[1156,1755,1756],{"class":1162},"      }",[1156,1758,1240],{"class":1173},[1156,1760,1762,1765],{"class":1158,"line":1761},20,[1156,1763,1764],{"class":1162},"    ]",[1156,1766,1240],{"class":1173},[1156,1768,1770,1773],{"class":1158,"line":1769},21,[1156,1771,1772],{"class":1162},"  }",[1156,1774,1240],{"class":1173},[1156,1776,1778],{"class":1158,"line":1777},22,[1156,1779,1780],{"class":1162},"});\n",[1156,1782,1784,1786,1789,1791,1793,1795,1797,1799,1801,1803,1806,1808,1810,1812,1814,1816,1819,1821],{"class":1158,"line":1783},23,[1156,1785,1458],{"class":1169},[1156,1787,1788],{"class":1206}," replay",[1156,1790,1464],{"class":1169},[1156,1792,1467],{"class":1169},[1156,1794,1470],{"class":1206},[1156,1796,1474],{"class":1473},[1156,1798,224],{"class":1206},[1156,1800,1474],{"class":1473},[1156,1802,1544],{"class":1206},[1156,1804,1805],{"class":1473},".replay",[1156,1807,1549],{"class":1162},[1156,1809,489],{"class":1206},[1156,1811,1554],{"class":1162},[1156,1813,1198],{"class":1173},[1156,1815,1529],{"class":1206},[1156,1817,1818],{"class":1162},".version",[1156,1820,1198],{"class":1173},[1156,1822,1559],{"class":1162},[1156,1824,1826,1829,1831,1833,1835,1838,1840,1842,1845],{"class":1158,"line":1825},24,[1156,1827,1828],{"class":1162},"  snapshot",[1156,1830,1174],{"class":1169},[1156,1832,1487],{"class":1194},[1156,1834,1490],{"class":1169},[1156,1836,1837],{"class":1206},"run",[1156,1839,1554],{"class":1162},[1156,1841,1495],{"class":1169},[1156,1843,1844],{"class":1194},":steps[1]`",[1156,1846,1240],{"class":1173},[1156,1848,1850],{"class":1158,"line":1849},25,[1156,1851,1780],{"class":1162},[1156,1853,1855,1858,1861,1863,1866,1868,1871,1873,1875,1878,1880,1882,1884,1886,1889,1891,1894,1897,1899,1902,1905,1907,1910],{"class":1158,"line":1854},26,[1156,1856,1857],{"class":1206},"console",[1156,1859,1860],{"class":1473},".log",[1156,1862,1549],{"class":1162},[1156,1864,1865],{"class":1194},"`v",[1156,1867,1490],{"class":1169},[1156,1869,1870],{"class":1206},"v2",[1156,1872,1818],{"class":1162},[1156,1874,1495],{"class":1169},[1156,1876,1877],{"class":1194}," on ",[1156,1879,1490],{"class":1169},[1156,1881,1837],{"class":1206},[1156,1883,1554],{"class":1162},[1156,1885,1495],{"class":1169},[1156,1887,1888],{"class":1194},"'s page: ",[1156,1890,1490],{"class":1169},[1156,1892,1893],{"class":1206},"JSON",[1156,1895,1896],{"class":1473},".stringify",[1156,1898,1549],{"class":1162},[1156,1900,1901],{"class":1206},"replay",[1156,1903,1904],{"class":1162},".data)",[1156,1906,1495],{"class":1169},[1156,1908,1909],{"class":1194},"`",[1156,1911,1912],{"class":1162},");\n",[1029,1914,1916],{"id":1915},"in-the-panel","In the panel",[1025,1918,1919,1920,1922,1923,1926,1927,1930],{},"On a job's page, the ",[1047,1921,536],{}," tab lists each step with its status, duration and a thumbnail of its screenshot. Expanding a step shows ",[1047,1924,1925],{},"Open the stored page",", which opens the snapshot beside the list. The page is scaled to fit the pane, and when the program version has ground truth for its fields, the elements those fields were confirmed on are outlined, with the note \"Outlined: fields with ground truth\". From the ",[1047,1928,1929],{},"Error"," tab, the same viewer opens the page the job failed on.",[1025,1932,1933,1934,1937,1938,1941],{},"The viewer renders a ",[1047,1935,1936],{},"sanitised copy"," in a sandboxed frame: scripts, inline event handlers, ",[1058,1939,1940],{},"javascript:"," links and nested frame sources are removed, and a policy that forbids scripts entirely is applied on top. The page looks the same and nothing in it runs. The builder uses the same copy when you pick fields on a stored page.",[1029,1943,1945],{"id":1944},"how-long-they-are-kept","How long they are kept",[1025,1947,1948,1949,1953,1954,1957],{},"Snapshots and screenshots follow your plan's retention: 7, 30 or 90 days, see ",[1950,1951,1008],"a",{"href":1952},"\u002Freference\u002Fplans",". The snapshots a program version's fields were confirmed against are exempt and live as long as the version is in use, because they are what healing compares against. A builder draft's own timeline is kept for 7 days. See ",[1950,1955,77],{"href":1956},"\u002Fconcepts\u002Fdata-retention"," for everything else.",[1029,1959,1961],{"id":1960},"worked-example","Worked example",[1025,1963,1964,1965,1968,1969,1132,1971,1474],{},"A program reads a shop's product page ",[1058,1966,1967],{},"https:\u002F\u002Fshop.example.com\u002Fp\u002F3"," at the http tier, with ",[1058,1970,612],{},[1058,1972,1973],{},"price",[1975,1976,1977,1991,2022,2036,2054],"ol",{},[1044,1978,1979,1980,1982,1983,1986,1987,1990],{},"Run it once. ",[1058,1981,1145],{}," shows two steps; ",[1058,1984,1985],{},"steps[1]",", the extract, has a ",[1058,1988,1989],{},"snapshot"," link.",[1044,1992,1993,1994,1996,1997,2000,2001,1115,2004,1115,2007,2010,2011,2014,2015,2018,2019,2021],{},"Follow ",[1058,1995,1369],{},": the snapshot JSON has ",[1058,1998,1999],{},"final_url"," ending in ",[1058,2002,2003],{},"\u002Fp\u002F3",[1058,2005,2006],{},"status: 200",[1058,2008,2009],{},"tier: \"http\"",", and an ",[1058,2012,2013],{},"embedded_json"," entry of kind ",[1058,2016,2017],{},"next_data"," for the page's ",[1058,2020,1087],{}," script.",[1044,2023,2024,2025,2028,2029,2032,2033,1474],{},"Create version 2 as a draft (",[1058,2026,2027],{},"publish: false",") that also reads ",[1058,2030,2031],{},"sku"," with the regex ",[1058,2034,2035],{},"SKU:\\s*([A-Z0-9-]+)",[1044,2037,2038,2039,2042,2043,2046,2047,1115,2049,1132,2051,2053],{},"Replay version 2 against ",[1058,2040,2041],{},"\"\u003Cjob id>:steps[1]\"",". The answer's ",[1058,2044,2045],{},"data"," has ",[1058,2048,612],{},[1058,2050,1973],{},[1058,2052,2031],{},", read from the page the first job stored. Nothing was fetched and nothing was charged.",[1044,2055,2056],{},"Publish version 2 when the replay looks right.",[1029,2058,2060],{"id":2059},"pitfalls","Pitfalls",[1041,2062,2063,2069,2078,2084,2090],{},[1044,2064,2065,2068],{},[1047,2066,2067],{},"The link expires."," A snapshot link is valid for fifteen minutes; ask the API for a fresh one rather than storing it.",[1044,2070,2071,2074,2075,2077],{},[1047,2072,2073],{},"Network bodies are capped."," A JSON response over 512 KB is recorded without its body, so a ",[1058,2076,626],{}," locator cannot read it.",[1044,2079,2080,2083],{},[1047,2081,2082],{},"A closed shadow root is empty in the snapshot."," It is empty to every script, and a field inside one cannot be extracted at any tier.",[1044,2085,2086,2089],{},[1047,2087,2088],{},"Replay reads; it does not act."," It runs extraction against a stored page. A change to steps that click or fill needs a real run, or a test run in the builder.",[1044,2091,2092,2095],{},[1047,2093,2094],{},"Retention is per plan."," A snapshot past your plan's retention is gone; replay against something recent.",[1029,2097,155],{"id":2098},"reference",[1041,2100,2101,2115,2121,2127],{},[1044,2102,2103,1115,2107,1115,2111],{},[1950,2104,2106],{"href":2105},"\u002Freference\u002Fapi\u002Fjobs\u002Flist-job-steps","List a job's steps",[1950,2108,2110],{"href":2109},"\u002Freference\u002Fapi\u002Fjobs\u002Fget-job-snapshot","get a step's snapshot",[1950,2112,2114],{"href":2113},"\u002Freference\u002Fapi\u002Fjobs\u002Fget-job-screenshot","get a screenshot",[1044,2116,2117],{},[1950,2118,2120],{"href":2119},"\u002Freference\u002Fapi\u002Fprograms\u002Freplay-program-version","Replay a program version",[1044,2122,2123],{},[1950,2124,2126],{"href":2125},"\u002Freference\u002Fapi\u002Fschemas\u002Fstep-record","Step record schema",[1044,2128,2129,1132,2134],{},[1950,2130,2132],{"href":2131},"\u002Freference\u002Fcli\u002Fkaab-jobs-snapshot",[1058,2133,899],{},[1950,2135,2137],{"href":2136},"\u002Freference\u002Fcli\u002Fkaab-jobs-steps",[1058,2138,902],{},[2140,2141,2142],"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 pre.shiki code .sHJIl, html code.shiki .sHJIl{--shiki-light:var(--kaab-code-token-constant);--shiki-default:var(--kaab-code-token-constant);--shiki-dark:var(--kaab-code-token-constant)}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sKog0, html code.shiki .sKog0{--shiki-light:var(--kaab-code-token-comment);--shiki-default:var(--kaab-code-token-comment);--shiki-dark:var(--kaab-code-token-comment)}html pre.shiki code .sJugJ, html code.shiki .sJugJ{--shiki-light:var(--kaab-code-token-function);--shiki-default:var(--kaab-code-token-function);--shiki-dark:var(--kaab-code-token-function)}",{"title":1152,"searchDepth":1180,"depth":1180,"links":2144},[2145,2146,2147,2148,2149,2150,2151,2152,2153,2154],{"id":1031,"depth":1166,"text":1032},{"id":1038,"depth":1166,"text":1039},{"id":1107,"depth":1166,"text":1108},{"id":1139,"depth":1166,"text":1140},{"id":1397,"depth":1166,"text":1398},{"id":1915,"depth":1166,"text":1916},{"id":1944,"depth":1166,"text":1945},{"id":1960,"depth":1166,"text":1961},{"id":2059,"depth":1166,"text":2060},{"id":2098,"depth":1166,"text":155},false,null,"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.","md",{},"\u002Fconcepts\u002Fsnapshots",{"title":65,"description":2157},"2.concepts\u002F13.snapshots","-UBaU1KrjKuazRyJsLDoWoSj66cmElqZ5HW8xUslhl0",[2165,2169],{"title":62,"path":2166,"stem":2167,"description":2168,"children":-1},"\u002Fconcepts\u002Flocators","2.concepts\u002F12.locators","How Kaabist points at an element, why it stores several candidate selectors, which classes it refuses to use, and how frames and shadow DOM are reached.",{"title":68,"path":2170,"stem":2171,"description":2172,"children":-1},"\u002Fconcepts\u002Fegress-and-proxies","2.concepts\u002F14.egress-and-proxies","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.",1793593413214]