curl --request POST \
--url https://api.bedrock.cv/parse \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sheet_id": "sht_01JABCD123",
"features": [
"symbols"
],
"options": {
"symbols": {
"count": true
}
}
}
'{
"job_id": "job_01JABCD123",
"type": "parse",
"status": "Completed",
"target": {
"type": "sheet",
"id": "sht_01JABCD123"
},
"results": {
"legend": [
{
"block_id": "blk_01JABCD200",
"symbols_detected": 24,
"symbols_with_graphic": 18,
"symbols": [
{
"feature_id": "ftr_01JABCD300",
"label": "duplex_receptacle",
"description": "DUPLEX RECEPTACLE",
"has_graphic": true
}
]
}
],
"symbols": [
{
"label": "duplex_receptacle",
"description": "DUPLEX RECEPTACLE",
"legend_feature_id": "ftr_01JABCD300",
"instance_count": 4,
"instances": [
{
"feature_id": "ftr_01JABCD400",
"block_id": "blk_01JABCD100",
"bounds": {
"x_min": 333,
"y_min": 207,
"x_max": 345,
"y_max": 222
},
"confidence": 0.694
}
]
}
],
"summary": {
"total_symbols_searched": 5,
"total_instances_found": 21
}
},
"created_at": "2024-01-15T10:00:00Z",
"completed_at": "2024-01-15T10:01:30Z"
}Detect and extract structured features from a sheet using legend-driven symbol matching.
curl --request POST \
--url https://api.bedrock.cv/parse \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sheet_id": "sht_01JABCD123",
"features": [
"symbols"
],
"options": {
"symbols": {
"count": true
}
}
}
'{
"job_id": "job_01JABCD123",
"type": "parse",
"status": "Completed",
"target": {
"type": "sheet",
"id": "sht_01JABCD123"
},
"results": {
"legend": [
{
"block_id": "blk_01JABCD200",
"symbols_detected": 24,
"symbols_with_graphic": 18,
"symbols": [
{
"feature_id": "ftr_01JABCD300",
"label": "duplex_receptacle",
"description": "DUPLEX RECEPTACLE",
"has_graphic": true
}
]
}
],
"symbols": [
{
"label": "duplex_receptacle",
"description": "DUPLEX RECEPTACLE",
"legend_feature_id": "ftr_01JABCD300",
"instance_count": 4,
"instances": [
{
"feature_id": "ftr_01JABCD400",
"block_id": "blk_01JABCD100",
"bounds": {
"x_min": 333,
"y_min": 207,
"x_max": 345,
"y_max": 222
},
"confidence": 0.694
}
]
}
],
"summary": {
"total_symbols_searched": 5,
"total_instances_found": 21
}
},
"created_at": "2024-01-15T10:00:00Z",
"completed_at": "2024-01-15T10:01:30Z"
}features 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 | 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) |
POST /files to get a signed upload URLPOST /files/{file_id}/confirmPOST /parse with file_id{
"file_id": "fil_01JABCD111",
"features": ["symbols"]
}
features: ["symbols"], the pipeline runs:
defined_by relations from each detected symbol back to its legend entry{
"sheet_id": "sht_xxx",
"features": ["symbols"]
}
legend_block_id so the pipeline knows which legend to use:
{
"block_id": "blk_xxx",
"features": ["symbols"],
"options": {
"symbols": {
"legend_block_id": "blk_yyy"
}
}
}
confidence score (0-1) indicating how closely it matches the legend symbol template.
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:
{
"type": "parse.child.completed",
"data": {
"job_id": "job_01JABCD125",
"parent_job_id": "job_01JABCD123",
"child_job_type": "vision.legend.parse",
"status": "completed",
"target": { "type": "block", "id": "blk_01JABCD200" },
"results": {
"block_id": "blk_01JABCD200",
"symbols_detected": 24,
"symbols_with_graphic": 18,
"symbols": [
{
"feature_id": "ftr_01JABCD300",
"label": "duplex_receptacle",
"description": "DUPLEX RECEPTACLE",
"has_graphic": true
}
]
}
}
}
parse.block.completed): Fired when a view block finishes symbol detection. Includes per-block detection results:
{
"type": "parse.block.completed",
"data": {
"job_id": "job_01JABCD126",
"parse_job_id": "job_01JABCD123",
"block_id": "blk_01JABCD100",
"status": "completed",
"results": {
"symbols": [
{
"label": "duplex_receptacle",
"description": "DUPLEX RECEPTACLE",
"instance_count": 4,
"instances": [
{
"feature_id": "ftr_01JABCD400",
"bounds": { "x_min": 333, "y_min": 207, "x_max": 345, "y_max": 222 },
"confidence": 0.694
}
]
}
],
"summary": {
"total_symbols_searched": 5,
"total_instances_found": 21
}
}
}
}
{
"legend": [
{
"block_id": "blk_01JABCD200",
"symbols_detected": 24,
"symbols_with_graphic": 18,
"symbols": [
{
"feature_id": "ftr_01JABCD300",
"label": "duplex_receptacle",
"description": "DUPLEX RECEPTACLE (NEW DEVICE, PROVIDE BACKBOX & WIRING)",
"has_graphic": true
}
]
}
],
"symbols": [
{
"label": "duplex_receptacle",
"description": "DUPLEX RECEPTACLE (NEW DEVICE, PROVIDE BACKBOX & WIRING)",
"legend_feature_id": "ftr_01JABCD300",
"instance_count": 4,
"instances": [
{
"feature_id": "ftr_01JABCD400",
"block_id": "blk_01JABCD100",
"bounds": { "x_min": 333, "y_min": 207, "x_max": 345, "y_max": 222 },
"confidence": 0.694
}
]
}
],
"summary": {
"total_symbols_searched": 5,
"total_instances_found": 21
}
}
| 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 |
API key prefixed with sk_. Example: Authorization: Bearer sk_xxx
API version
Completed job result (returned when polling or via webhook).
Completed parse job result with symbol detections.