Parse features
Vision API
Parse
Detect and extract structured features from a sheet using legend-driven symbol matching.
POST
Parse features
Parse answers “what is on this sheet?” by running detection and extraction tasks that populate the Drawing Index with structured features, metadata, and relationships.
Only
Parsing will automatically render PDF pages, create Drawing and Sheet records, detect blocks, then run symbol detection.
For block-level parsing, provide a
Block symbols matched (
Supported Features
Thefeatures array selects which tasks to run.
| Feature | Status | Description |
|---|---|---|
symbols | Available | Legend-driven symbol detection (doors, windows, fixtures, MEP equipment) |
legend | Coming soon | Legend block parsing (standalone) |
rooms | Coming soon | Room boundary detection and labeling |
grid | Coming soon | Grid line and axis detection |
schedule | Coming soon | Table and schedule extraction |
notes | Coming soon | General and key notes extraction |
title_block | Coming soon | Title block metadata extraction |
symbols is currently accepted by the API. Requesting a “coming soon” feature will return a validation error.
Target Options
Parse from an existing sheet, block, drawing, or an uploaded file:| Target | Description |
|---|---|
sheet_id | Parse from an existing sheet in the system |
block_id | Parse a specific block directly (requires legend_block_id) |
drawing_id | Parse all sheets in a drawing (auto-detects legends) |
file_id | Parse from an uploaded PDF file (creates Drawing + Sheets automatically) |
Parsing from Uploaded Files
For new documents, use the file upload flow:- Upload the file via
POST /filesto get a signed upload URL - Upload the PDF to the signed URL
- Confirm the upload via
POST /files/{file_id}/confirm - Start parsing via
POST /parsewithfile_id - Poll or stream for results
Symbol Detection
Symbol detection is the primary feature extraction pipeline. It is always legend-driven: every drawing set defines its own symbols in its legend blocks, and detection uses those definitions as the source of truth. Doors, windows, hatching patterns, and MEP equipment (valves, fixtures, etc.) are all symbols. They appear in the drawing’s legend and are detected via this pipeline.Pipeline
When you requestfeatures: ["symbols"], the pipeline runs:
- Parse legend blocks - detect each symbol graphic in the legend with its bounding box, label, and description
- Crop symbol templates - extract each legend symbol as an image crop (the exemplar)
- Template match on view blocks - find instances of each legend symbol across plan views using tiled image matching
- Verify with embeddings - filter false positives using DINOv2 embedding similarity
- Cross-symbol NMS - resolve overlapping detections from different symbol types using LLM-based reasoning
- Link results - create
defined_byrelations from each detected symbol back to its legend entry
legend_block_id so the pipeline knows which legend to use:
Matching Capabilities
The matching engine handles symbols printed at different scales across sheets (0.5x - 2.0x range). Each detection includes aconfidence score (0-1) indicating how closely it matches the legend symbol template.
Current Limitations
- Target symbols of scale range of 0.5x - 2.0x relative to the legend template size
- Does not account for “suffix text” associated with a symbol (e.g., circuit numbers next to receptacles). The matcher will attempt to match the text as part of the symbol graphic, which can reduce confidence or cause misses.
- Detections are skipped for symbols smaller than 10px wide or 10px high when rendered at 300 DPI
- Does not reliably detect symbols where the stroke thickness differs drastically between the plan view and the legend template
Incremental Webhooks
Parse fires incremental webhooks as each stage completes, so you can process results as they arrive rather than waiting for the entire job. See Webhooks for payload details. Legend parsed (parse.child.completed with child_job_type: "vision.legend.parse"): Fired when a legend block finishes parsing. Includes the list of symbols detected in that legend:
parse.block.completed): Fired when a view block finishes symbol detection. Includes per-block detection results:
Result Payload
When the parse job completes, the results contain the combined symbol detections across all blocks:| Field | Description |
|---|---|
legend[] | Per-legend-block results array |
legend[].block_id | Legend block ID |
legend[].symbols_detected | Total symbols found in this legend block |
legend[].symbols_with_graphic | Symbols with a visual graphic (excludes text-only entries) |
legend[].symbols[].feature_id | Feature ID of the legend entry |
legend[].symbols[].has_graphic | Whether the symbol has a visual graphic for matching |
symbols[].legend_feature_id | Reference to the legend entry feature |
symbols[].instances[].bounds | Pixel coordinates within the parent block image |
symbols[].instances[].confidence | Score (0-1) indicating how closely the detection matches the legend symbol template |
summary.total_symbols_searched | Unique symbol types with at least one detection |
summary.total_instances_found | Total detections across all blocks |
Authorizations
API key prefixed with sk_. Example: Authorization: Bearer sk_xxx
Headers
API version
Body
application/json
Response
Completed job result (returned when polling or via webhook).