[{"data":1,"prerenderedAt":1797},["ShallowReactive",2],{"navigation":3,"page:\u002Fconcepts\u002Fdocuments-and-pdfs":1019,"surround:\u002Fconcepts\u002Fdocuments-and-pdfs":1789},[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":80,"body":1021,"breaking":1779,"date":1780,"description":1781,"extension":1782,"generated":1779,"meta":1783,"navigation":1784,"path":1785,"seo":1786,"stem":1787,"version":1780,"__hash__":1788},"docs\u002F2.concepts\u002F18.documents-and-pdfs.md",{"type":1022,"value":1023,"toc":1772},"minimark",[1024,1028,1033,1044,1048,1058,1091,1094,1098,1140,1144,1155,1254,1260,1479,1601,1612,1634,1645,1649,1760,1768],[1025,1026,1027],"p",{},"Some pages are not pages. A price list, a datasheet or a statement is often a PDF, reached by a link, a redirect or a download button. Kaabist treats every PDF as untrusted input: before it stores the file, reads its text, shows any of it to a model or gives you a link to it, the PDF passes a security gate. A file the gate refuses is never stored, and the step that met it fails with a code that says why.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1039,1040,1043],{},"Read this page when a job or an agent browser meets a PDF, when a ",[1037,1038,578],"code",{}," step fails with a ",[1037,1041,1042],{},"pdf_*"," code, when you want a PDF's tables as data, or when you want to know what Kaabist does with documents before you point it at a site that publishes them.",[1029,1045,1047],{"id":1046},"what-the-gate-checks","What the gate checks",[1025,1049,1050,1051,1057],{},"Every PDF goes through the same four stages, whatever brought it in: a navigation that ended in a PDF, a ",[1052,1053,1055],"a",{"href":1054},"\u002Freference\u002Fdsl\u002Factions\u002Fdownload",[1037,1056,578],{}," step, or an agent browser's download.",[1059,1060,1061,1073,1079,1085],"ol",{},[1062,1063,1064,1068,1069,1072],"li",{},[1065,1066,1067],"strong",{},"Is it a PDF?"," The file must start like one: ",[1037,1070,1071],{},"%PDF-"," within its first kilobyte. A file that only claims to be a PDF is refused.",[1062,1074,1075,1078],{},[1065,1076,1077],{},"Malware scan."," A malware scanner Kaabist runs in its own infrastructure checks the file; no file is sent to a scanning service. If the scanner cannot answer, the file is refused rather than passed unscanned.",[1062,1080,1081,1084],{},[1065,1082,1083],{},"Structure limits."," The file's structure is measured before any parser reads it: at most 500 pages, 200 000 objects and 64 levels of nesting, and its compressed streams may expand to at most 50 MB each and 200 MB in total. Encrypted, password-protected files are refused.",[1062,1086,1087,1090],{},[1065,1088,1089],{},"Parsing in a sandbox."," Reading the file's text happens in an isolated process with a memory and time limit and no network. A file that crashes it or runs out of either is refused, and nothing else is affected.",[1025,1092,1093],{},"PDFs can carry scripts and actions. Kaabist never runs, follows or extracts them: scripts, open actions, rich media and forms are recorded as flags and left alone. A file that would launch a program, or that carries an executable attachment, is refused. Files over 64 MB, the limit for any download, are refused while they arrive.",[1029,1095,1097],{"id":1096},"what-you-get-back","What you get back",[1099,1100,1101,1125,1134],"ul",{},[1062,1102,1103,1106,1107,1110,1111,1113,1114,1117,1118,1124],{},[1065,1104,1105],{},"A navigation that ends in a PDF"," stores the file as the artifact ",[1037,1108,1109],{},"source.pdf"," and records the step's snapshot as a PDF: it has no HTML, so an ",[1037,1112,569],{}," step over it returns ",[1037,1115,1116],{},"null"," fields with the warning ",[1052,1119,1121],{"href":1120},"\u002Freference\u002Fcodes#warnings",[1037,1122,1123],{},"pdf_source_not_extractable"," instead of failing.",[1062,1126,1127,1133],{},[1065,1128,1129,1130,1132],{},"A ",[1037,1131,578],{}," step"," stores the PDF under its artifact name, as for any other file.",[1062,1135,1136,1139],{},[1065,1137,1138],{},"An agent browser's download"," stores it the same way, and the tool answers with the block code when the gate refuses it.",[1029,1141,1143],{"id":1142},"reading-a-pdfs-tables","Reading a PDF's tables",[1025,1145,1129,1146,1151,1152,1154],{},[1052,1147,1149],{"href":1148},"\u002Freference\u002Fdsl\u002Factions\u002Fread-pdf",[1037,1150,580],{}," step reads the tables of a PDF the job has stored: the page it is on when that page is a PDF, or a ",[1037,1153,578],{},"'s artifact by name. The file already passed the gate, so nothing is fetched or scanned again; it is parsed in the same sandbox.",[1156,1157,1161],"pre",{"className":1158,"code":1159,"language":680,"meta":1160,"style":1160},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{\n  \"kaab\": \"1\",\n  \"inputs\": { \"url\": \"string\" },\n  \"steps\": [{ \"goto\": \"{{inputs.url}}\" }, { \"read_pdf\": {} }]\n}\n","",[1037,1162,1163,1172,1190,1214,1248],{"__ignoreMap":1160},[1164,1165,1168],"span",{"class":1166,"line":1167},"line",1,[1164,1169,1171],{"class":1170},"sTzsn","{\n",[1164,1173,1175,1179,1183,1187],{"class":1166,"line":1174},2,[1164,1176,1178],{"class":1177},"sqn18","  \"kaab\"",[1164,1180,1182],{"class":1181},"sQm2-",":",[1164,1184,1186],{"class":1185},"suOy4"," \"1\"",[1164,1188,1189],{"class":1181},",\n",[1164,1191,1193,1196,1198,1201,1204,1206,1209,1212],{"class":1166,"line":1192},3,[1164,1194,1195],{"class":1177},"  \"inputs\"",[1164,1197,1182],{"class":1181},[1164,1199,1200],{"class":1170}," { ",[1164,1202,1203],{"class":1177},"\"url\"",[1164,1205,1182],{"class":1181},[1164,1207,1208],{"class":1185}," \"string\"",[1164,1210,1211],{"class":1170}," }",[1164,1213,1189],{"class":1181},[1164,1215,1217,1220,1222,1225,1228,1230,1233,1235,1238,1240,1243,1245],{"class":1166,"line":1216},4,[1164,1218,1219],{"class":1177},"  \"steps\"",[1164,1221,1182],{"class":1181},[1164,1223,1224],{"class":1170}," [{ ",[1164,1226,1227],{"class":1177},"\"goto\"",[1164,1229,1182],{"class":1181},[1164,1231,1232],{"class":1185}," \"{{inputs.url}}\"",[1164,1234,1211],{"class":1170},[1164,1236,1237],{"class":1181},",",[1164,1239,1200],{"class":1170},[1164,1241,1242],{"class":1177},"\"read_pdf\"",[1164,1244,1182],{"class":1181},[1164,1246,1247],{"class":1170}," {} }]\n",[1164,1249,1251],{"class":1166,"line":1250},5,[1164,1252,1253],{"class":1170},"}\n",[1025,1255,1256,1257,1182],{},"The reading lands in ",[1037,1258,1259],{},"data.pdf",[1156,1261,1263],{"className":1158,"code":1262,"language":680,"meta":1160,"style":1160},"{\n  \"artifact\": \"source.pdf\",\n  \"sha256\": \"…\",\n  \"tables\": [\n    { \"id\": \"t1\", \"page\": 1, \"pages\": [1, 2], \"header\": [\"Code\", \"Description\", \"Price (TL)\"], \"rows\": [[\"HW-100\", \"Copper wire 1.5 mm\", \"41,20\"]] }\n  ],\n  \"stats\": { \"pages\": 2, \"pages_read\": 2, \"tables\": 1, \"rows\": 1, \"no_text\": false },\n  \"truncated\": false\n}\n",[1037,1264,1265,1269,1281,1293,1303,1398,1406,1463,1474],{"__ignoreMap":1160},[1164,1266,1267],{"class":1166,"line":1167},[1164,1268,1171],{"class":1170},[1164,1270,1271,1274,1276,1279],{"class":1166,"line":1174},[1164,1272,1273],{"class":1177},"  \"artifact\"",[1164,1275,1182],{"class":1181},[1164,1277,1278],{"class":1185}," \"source.pdf\"",[1164,1280,1189],{"class":1181},[1164,1282,1283,1286,1288,1291],{"class":1166,"line":1192},[1164,1284,1285],{"class":1177},"  \"sha256\"",[1164,1287,1182],{"class":1181},[1164,1289,1290],{"class":1185}," \"…\"",[1164,1292,1189],{"class":1181},[1164,1294,1295,1298,1300],{"class":1166,"line":1216},[1164,1296,1297],{"class":1177},"  \"tables\"",[1164,1299,1182],{"class":1181},[1164,1301,1302],{"class":1170}," [\n",[1164,1304,1305,1308,1311,1313,1316,1318,1321,1323,1327,1329,1332,1334,1337,1340,1342,1345,1348,1350,1353,1355,1357,1360,1362,1365,1367,1370,1372,1374,1377,1379,1382,1385,1387,1390,1392,1395],{"class":1166,"line":1250},[1164,1306,1307],{"class":1170},"    { ",[1164,1309,1310],{"class":1177},"\"id\"",[1164,1312,1182],{"class":1181},[1164,1314,1315],{"class":1185}," \"t1\"",[1164,1317,1237],{"class":1181},[1164,1319,1320],{"class":1177}," \"page\"",[1164,1322,1182],{"class":1181},[1164,1324,1326],{"class":1325},"sHJIl"," 1",[1164,1328,1237],{"class":1181},[1164,1330,1331],{"class":1177}," \"pages\"",[1164,1333,1182],{"class":1181},[1164,1335,1336],{"class":1170}," [",[1164,1338,1339],{"class":1325},"1",[1164,1341,1237],{"class":1181},[1164,1343,1344],{"class":1325}," 2",[1164,1346,1347],{"class":1170},"]",[1164,1349,1237],{"class":1181},[1164,1351,1352],{"class":1177}," \"header\"",[1164,1354,1182],{"class":1181},[1164,1356,1336],{"class":1170},[1164,1358,1359],{"class":1185},"\"Code\"",[1164,1361,1237],{"class":1181},[1164,1363,1364],{"class":1185}," \"Description\"",[1164,1366,1237],{"class":1181},[1164,1368,1369],{"class":1185}," \"Price (TL)\"",[1164,1371,1347],{"class":1170},[1164,1373,1237],{"class":1181},[1164,1375,1376],{"class":1177}," \"rows\"",[1164,1378,1182],{"class":1181},[1164,1380,1381],{"class":1170}," [[",[1164,1383,1384],{"class":1185},"\"HW-100\"",[1164,1386,1237],{"class":1181},[1164,1388,1389],{"class":1185}," \"Copper wire 1.5 mm\"",[1164,1391,1237],{"class":1181},[1164,1393,1394],{"class":1185}," \"41,20\"",[1164,1396,1397],{"class":1170},"]] }\n",[1164,1399,1401,1404],{"class":1166,"line":1400},6,[1164,1402,1403],{"class":1170},"  ]",[1164,1405,1189],{"class":1181},[1164,1407,1409,1412,1414,1416,1419,1421,1423,1425,1428,1430,1432,1434,1437,1439,1441,1443,1445,1447,1449,1451,1454,1456,1459,1461],{"class":1166,"line":1408},7,[1164,1410,1411],{"class":1177},"  \"stats\"",[1164,1413,1182],{"class":1181},[1164,1415,1200],{"class":1170},[1164,1417,1418],{"class":1177},"\"pages\"",[1164,1420,1182],{"class":1181},[1164,1422,1344],{"class":1325},[1164,1424,1237],{"class":1181},[1164,1426,1427],{"class":1177}," \"pages_read\"",[1164,1429,1182],{"class":1181},[1164,1431,1344],{"class":1325},[1164,1433,1237],{"class":1181},[1164,1435,1436],{"class":1177}," \"tables\"",[1164,1438,1182],{"class":1181},[1164,1440,1326],{"class":1325},[1164,1442,1237],{"class":1181},[1164,1444,1376],{"class":1177},[1164,1446,1182],{"class":1181},[1164,1448,1326],{"class":1325},[1164,1450,1237],{"class":1181},[1164,1452,1453],{"class":1177}," \"no_text\"",[1164,1455,1182],{"class":1181},[1164,1457,1458],{"class":1325}," false",[1164,1460,1211],{"class":1170},[1164,1462,1189],{"class":1181},[1164,1464,1466,1469,1471],{"class":1166,"line":1465},8,[1164,1467,1468],{"class":1177},"  \"truncated\"",[1164,1470,1182],{"class":1181},[1164,1472,1473],{"class":1325}," false\n",[1164,1475,1477],{"class":1166,"line":1476},9,[1164,1478,1253],{"class":1170},[1099,1480,1481,1494,1521,1546,1564,1578,1589],{},[1062,1482,1483,1486,1487,1490,1491,1493],{},[1065,1484,1485],{},"Cells are verbatim strings."," ",[1037,1488,1489],{},"41,20"," stays ",[1037,1492,1489],{},": Kaabist does not parse numbers or dates out of a PDF, so you map the columns and their formats yourself.",[1062,1495,1496,1499,1500,1503,1504,1507,1508,1510,1511,1513,1514,1513,1517,1520],{},[1065,1497,1498],{},"A table that continues over pages is one table",", with every page it covers in ",[1037,1501,1502],{},"pages",". A header repeated at the top of each page is dropped; ",[1037,1505,1506],{},"header"," is ",[1037,1509,1116],{}," when no first row reads as one. A row of column numbers (",[1037,1512,1339],{},", ",[1037,1515,1516],{},"2",[1037,1518,1519],{},"3",", …) above or under the column titles is dropped, so the titles are the header.",[1062,1522,1523,1528,1529,1532,1533,1538,1539,1541,1542,1545],{},[1065,1524,1525],{},[1037,1526,1527],{},"max_pages"," (1 to 500, the gate's page limit and the default) reads only the first pages of a long document. A document longer than that is read up to it with ",[1037,1530,1531],{},"truncated: true"," and the warning ",[1052,1534,1535],{"href":1120},[1037,1536,1537],{},"pdf_pages_truncated",", whose ",[1037,1540,624],{}," and ",[1037,1543,1544],{},"of"," say how many pages were read of how many.",[1062,1547,1548,1551,1552,1555,1556,1559,1560,1563],{},[1065,1549,1550],{},"Headings inside a table are rows of it."," Up to three lines with a single cell (a section heading such as ",[1037,1553,1554],{},"NHXMH-J cables",", or a description that wraps) between two parts of the same table are kept as rows: one non-empty cell, in the column where the text starts, every other cell ",[1037,1557,1558],{},"\"\"",". A single-cell line above a table's first row or below its last is not a row, and a heading followed by a new header row starts a new table; ",[1037,1561,1562],{},"include_text"," shows those lines.",[1062,1565,1566,1571,1572,1574,1575,1577],{},[1065,1567,1568],{},[1037,1569,1570],{},"min_table_rows"," (1 to 20, default 3) is the fewest lines with two or more cells a table needs. Set ",[1037,1573,1516],{}," to keep a header with one row, or ",[1037,1576,1339],{}," for any line that splits into cells; single-cell rows are not counted.",[1062,1579,1580,1585,1586,1588],{},[1065,1581,1582],{},[1037,1583,1584],{},"include_text: true"," adds each page's lines under ",[1037,1587,622],{},", to see the headings above a table.",[1062,1590,1591,1596,1597,1600],{},[1065,1592,1593],{},[1037,1594,1595],{},"into: \"vars\""," with a ",[1037,1598,1599],{},"field"," keeps the reading for later steps instead of returning it.",[1025,1602,1603,1604,1607,1608,1611],{},"A scanned PDF succeeds with no tables and the warning ",[1037,1605,1606],{},"pdf_no_text",". A step with nothing to read (the page is not a PDF, or the job stored no artifact by that name) fails ",[1037,1609,1610],{},"pdf_source_missing",". A large reading, such as a 300-page price book of 20 000 rows, is returned like any large result.",[1025,1613,1614,1615,1617,1618,1513,1621,1624,1625,1628,1629,1633],{},"Each ",[1037,1616,580],{}," is billed by the pages it read: one credit for every started 50 pages (",[1037,1619,1620],{},"config\u002Fpricing.yaml",[1037,1622,1623],{},"pdf_read","), counted as compute and shown as ",[1037,1626,1627],{},"PDF reading"," in the job's cost lines. A ",[1052,1630,1632],{"href":1631},"\u002Freference\u002Fapi\u002Fprograms\u002Freplay-program-version","replay"," of a stored run reads the stored PDF again at no charge.",[1025,1635,1636,1637,1639,1640,1644],{},"A PDF that passes the gate but has no text at all, because its pages are blank or scanned images, is reported with the warning ",[1037,1638,1606],{},". Kaabist does not run OCR: to get data out of a PDF, use a ",[1052,1641,1642],{"href":1148},[1037,1643,580],{}," step, and expect no tables from a scanned file.",[1029,1646,1648],{"id":1647},"when-a-pdf-is-refused","When a PDF is refused",[1650,1651,1652,1665],"table",{},[1653,1654,1655],"thead",{},[1656,1657,1658,1662],"tr",{},[1659,1660,1661],"th",{},"Code",[1659,1663,1664],{},"Why",[1666,1667,1668,1679,1689,1699,1709,1719,1729,1739,1749],"tbody",{},[1656,1669,1670,1676],{},[1671,1672,1673],"td",{},[1037,1674,1675],{},"pdf_not_pdf",[1671,1677,1678],{},"The file does not start like a PDF.",[1656,1680,1681,1686],{},[1671,1682,1683],{},[1037,1684,1685],{},"pdf_too_large",[1671,1687,1688],{},"The file is over 64 MB.",[1656,1690,1691,1696],{},[1671,1692,1693],{},[1037,1694,1695],{},"pdf_malware",[1671,1697,1698],{},"The malware scanner found a known signature.",[1656,1700,1701,1706],{},[1671,1702,1703],{},[1037,1704,1705],{},"pdf_scanner_unavailable",[1671,1707,1708],{},"The scanner did not answer; retry shortly. This is the only one of these codes worth retrying as is.",[1656,1710,1711,1716],{},[1671,1712,1713],{},[1037,1714,1715],{},"pdf_encrypted",[1671,1717,1718],{},"The file is encrypted or needs a password.",[1656,1720,1721,1726],{},[1671,1722,1723],{},[1037,1724,1725],{},"pdf_too_complex",[1671,1727,1728],{},"A structure limit, or the sandbox's time or memory limit, was exceeded.",[1656,1730,1731,1736],{},[1671,1732,1733],{},[1037,1734,1735],{},"pdf_malformed",[1671,1737,1738],{},"The file could not be parsed.",[1656,1740,1741,1746],{},[1671,1742,1743],{},[1037,1744,1745],{},"pdf_active_content",[1671,1747,1748],{},"The file launches a program or carries an executable attachment.",[1656,1750,1751,1755],{},[1671,1752,1753],{},[1037,1754,1610],{},[1671,1756,1129,1757,1759],{},[1037,1758,580],{}," step had no PDF to read (not a refusal of a file).",[1025,1761,1762,1763,1767],{},"The step fails with the code and nothing is written: there is no artifact to fetch and no link to share. The full list of codes is in the ",[1052,1764,1766],{"href":1765},"\u002Freference\u002Fcodes","codes reference",".",[1769,1770,1771],"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":1160,"searchDepth":1192,"depth":1192,"links":1773},[1774,1775,1776,1777,1778],{"id":1031,"depth":1174,"text":1032},{"id":1046,"depth":1174,"text":1047},{"id":1096,"depth":1174,"text":1097},{"id":1142,"depth":1174,"text":1143},{"id":1647,"depth":1174,"text":1648},false,null,"How Kaabist handles PDFs: the gate every PDF passes before it is stored or read, the limits it enforces, and the codes you get when a file is refused.","md",{},true,"\u002Fconcepts\u002Fdocuments-and-pdfs",{"title":80,"description":1781},"2.concepts\u002F18.documents-and-pdfs","7EbLqteamObkLj0-QHKfaoaeg3HhbefS_FGTshfSneE",[1790,1794],{"title":77,"path":1791,"stem":1792,"description":1793,"children":-1},"\u002Fconcepts\u002Fdata-retention","2.concepts\u002F17.data-retention","What Kaabist stores about your work, where it lives, when it is deleted, and how to ask for everything to be erased.",{"title":27,"path":84,"stem":1795,"description":1796,"children":-1},"3.guides\u002Findex","Step-by-step guides for the tasks Kaabist is used for, from logins with a one-time code to schedules, webhooks and testing.",1793593414323]