Skip to content

Report JSON

schema_version is 16. It moves when this shape moves, which is the field to branch on when reading a report programmatically.

The same shape reaches you from report.to_dict() in Python and from complydoc audit --print-json on the command line.

{
  "schema_version": 16,
  "top_level_keys": [
    "run",
    "documents",
    "skipped",
    "cost",
    "aggregate",
    "overall",
    "quick_wins",
    "loader",
    "loader_comparison",
    "routing",
    "verification",
    "limitations",
    "staleness_warnings",
    "signal_weights",
    "config_masking"
  ],
  "run": {
    "components_run": "list of cost | readiness | sensitive",
    "offline_guard": "armed | not_armed",
    "content_sent_to": "hosts sent document text or page images, empty unless a hosted classifier or a vision model ran",
    "verify_model": "the vision reader pages were checked against, null unless --verify",
    "verify_scope": "flagged | all, null unless --verify",
    "classifier_missed_workers": "documents a registered classifier could not reach",
    "classifier_calls": "calls a registered classifier made, 0 unless one ran",
    "classifier_failures": "of those, calls that raised and so produced no score",
    "reveal_used": "bool \u2014 true means values are NOT masked",
    "page_images_used": "bool",
    "extracted_text_used": "bool",
    "report_detail": "summary | full \u2014 summary leaves out documents[].cost.models, documents[].previews and cost.documents; full writes every field",
    "jobs": "worker processes used",
    "timeout_seconds": "seconds each document was given, when --timeout was used",
    "documents_read_after_worker_failure": "documents re-read after a worker stopped",
    "config_digest": "identifies the config that produced these numbers"
  },
  "documents[]": {
    "relative_path": "str",
    "sha256": "str",
    "format": "pdf | image | docx | xlsx | pptx | html | markdown | text | email | other",
    "cost": "pages, page_count, text layer and coverage for this document",
    "cost.models[]": "full only: every priced model against this document, with text and vision token counts and USD",
    "previews[]": "full only: page geometry the HTML report draws its page views from",
    "readiness.signals[]": "id, value, rating, weight, why, status",
    "readiness.score": "value 0-100, higher is better; label; low_confidence",
    "sensitive.matches[]": "category, page, line, column, masked, severity, and evidence: confirmed | corroborated | pattern | model",
    "sensitive.unreadable_pages": "pages that were not searched at all",
    "sensitive.models_used": "category -> the detector and model that answered for it, where a model rather than a pattern read it",
    "extractions[]": "one per reader asked for; the first is the one kept",
    "extracted_text[].costs": "reader -> usd, basis (local | actual | estimated | unpriced), model, input_tokens, output_tokens: what each reading of the page cost",
    "extracted_text[].seconds": "reader -> seconds it took on this page, where timed",
    "extracted_text[].tokens": "reader -> tokenizer -> text tokens in that reading of the page",
    "extracted_text[].image_tokens": "vision formula -> image tokens for the page",
    "extracted_text[].vision_estimate": "what the cheapest priced vision model would cost for this page, estimated",
    "verification": "null unless --verify: model, scope, pages[] (number, status: agrees | disagrees | filled | failed | not_rendered, why, similarity, coverage, missing, cost), unreadable_pages[], sent_to[]",
    "metadata_findings[]": "key, category, severity, evidence, masked (from metadata)",
    "content_findings[]": "page, visibility (visible | not_measured | suspected | confirmed), instruction (confirmed | pattern | model | none), severity, excerpt, hidden_reasons[], instruction_reasons[], score, in_loader_output",
    "visibility_checked": "bool, null when the scan did not run",
    "path_exposures": "metadata keys holding an absolute filesystem path"
  },
  "cost": "null unless cost ran: currency, headline_resolution, resolutions[], volume, models[] (the folder's cost per model and per path: text_layer, text_ocr, vision, each with folder_usd, per_1000_usd and annual_usd; and the model's input_per_mtok_usd, supports_vision, vision_formula and tokenizer, to price one page), and, full only, documents[] (every document against every model)",
  "overall": {
    "score": "global readiness 0-100, content and cost path and exposure",
    "factors[]": "name, score (null when not measured), weight, why",
    "bands": "documents per band \u2014 the composition the mean hides"
  },
  "quick_wins[]": "id, title, detail, documents[], actor (complydoc | you), effect",
  "loader": "null unless documents came from an external loader: name, documents_returned, seconds, network_allowed, network_attempts[], error, tags[], metadata_keys[]",
  "loader_comparison": "null unless compare_loaders ran: baseline, loaders[] (per-loader totals, network, scores, failures, facts_found, parser_usd, tags[]), facts[] (found, scores, and nearest: the passage that came closest where a fact was missed), identifier_differences[] (found_by[], missed_by[]), metadata_keys (key -> loaders returning it), documents (path -> loaders), recommended (the loader to use, null where the run cannot tell), verdict (what decided it), ranked[]",
  "aggregate": "folder totals: cost, signal_distribution, sensitive_by_category, content_matrix (instruction -> visibility -> passages)",
  "verification": "null unless --verify: model, scope, min_coverage, pages_total, pages_checked, pages_agree, pages_disagree, pages_filled, pages_failed, pages_unreadable, usd, usd_basis, headline",
  "limitations[]": "area, statement, affected[], severity (info | important)"
}