Skip to content

Warning codes

A 200 never means “perfect”. It means we produced a result, and here is everything that was wrong with it. Every degradation produces a machine-readable warning at page granularity: silence is forbidden.

Each code has a page of its own at https://docs.kaho.ai/warnings/<code>, which is exactly the doc_url the warning object carries.

SeverityWhat it meansBilling
infoOutput is correct; we are telling you something usefulBilled
degradedOutput for the named scope is best effort and may be wrongBilled
criticalWe produced no useful content for the named scopeNot billed at page scope

A critical page-scope warning removes its page from the bill. Nothing else does, at any severity. That invariant is contractual and machine-checkable in both directions: every page named by a critical page-scope warning appears in usage.pages_not_billed, and every page in usage.pages_not_billed has one. Assert it in your own tests; we do.

A critical document-scope warning bills the pages we did deliver. There is exactly one, result_truncated: killing work we performed and charging nothing for it is worse for both sides than delivering it.

At most 1,000 warnings travel in one response, with a trailing warnings_truncated carrying the true count. warning_summary is computed over the untruncated set, so alerting never has to walk the array.

Emitted by /v1/convert. The three rows worth reading together are page_empty, which is informational and billed because a genuinely blank page correctly converts to nothing; page_has_no_text_layer, which is critical and not billed because an image-only page produced nothing of value; and page_budget_exceeded, which is named for a deterministic work budget rather than a timeout, because a wall-clock trigger would make your bill a function of how busy our machines were.

CodeSeverityScopeBilled
document_untaggedinfodocumentYes
document_partially_taggedinfodocumentYes
document_permissions_restrictedinfodocumentYes
metadata_unavailableinfodocumentYes
page_range_clampedinfodocumentYes
page_count_declared_mismatchinfodocumentYes
engine_alias_floatinginfodocumentYes
header_footer_detection_skippedinfodocumentYes
warnings_truncatedinfodocumentYes
security_fix_appliedinfodocumentYes
security_fix_availabledegradeddocumentYes
form_fields_not_extractedinfodocumentYes
annotations_not_extractedinfodocumentYes
result_truncatedcriticaldocumentDelivered pages only
font_tounicode_brokendegradedpageYes
text_layer_unreliabledegradedpageYes
reading_order_low_confidencedegradedpageYes
multi_column_detectedinfopageYes
vertical_text_detecteddegradedpageYes
rtl_text_detecteddegradedpageYes
table_spans_flattenedinfopageYes
table_nested_flatteneddegradedpageYes
repeated_content_removedinfopageYes
invisible_text_includedinfopageYes
invisible_text_droppedinfopageYes
page_rotation_appliedinfopageYes
content_outside_cropbox_droppedinfopageYes
link_scheme_blockedinfopageYes
page_emptyinfopageYes
table_not_extracteddegradedpageYes
page_has_no_text_layercriticalpageNo
page_render_failedcriticalpageNo
page_budget_exceededcriticalpageNo

Emitted by /v1/toc.

CodeSeverityScopeBilled
toc_outline_unusableinfodocumentYes
toc_inferredinfodocumentYes
toc_inference_low_confidencedegradeddocumentYes
toc_entry_unresolvedinfodocumentYes
toc_truncatedinfodocumentYes
toc_title_sanitizedinfodocumentYes