Skip to main content
Extract structured data from construction drawings. Detect annotations, build knowledge graphs, and search across entire drawing sets. Built for: AEC firms, software integrators, document management platforms, and AEC startups building on top of drawing intelligence.

Use Cases

Cross-Reference Indexing

Automatically link section tags, detail callouts, and sheet references across a drawing set

QA/QC Automation

Validate drawing consistency, detect missing references, flag revision conflicts

Quantity Takeoffs

Extract and count components, connections, and annotations

Analytical Model Generation

Build structured data for BIM/analysis workflows

Pricing

CapabilityEndpointPrice
Raw DetectionPOST /v1/drawings$0.02/page
Graph IngestionPOST /v1/projects/{id}/sheets$0.15/page
SearchPOST /v1/projects/{id}/search$0.005/query
Query (NL answers)POST /v1/projects/{id}/query$0.03/query
NeedUseCost Example
Fast annotation detection, no storageRaw Detection100 pages = $2
Searchable knowledge graph across sheetsGraph Ingestion100 pages = $15
Find specific entities or componentsSearch200 queries = $1
Ask questions in plain EnglishQuery50 questions = $1.50
A 96-page structural set with Graph Ingestion + 100 searches + 20 queries = $15.10

Quickstart

1

Get your API key

Sign up at app.stru.ai to get your API key.
2

Detect annotations (Tier 1)

Fast detection with instant results:
curl -X POST https://api.stru.ai/v1/drawings \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "[email protected]" \
  -F "page=1"
3

Or ingest into knowledge graph (Tier 2)

Create a project and ingest pages for searchable graphs:
# Create project
curl -X POST https://api.stru.ai/v1/projects \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "My Project"}'

# Ingest a page
curl -X POST https://api.stru.ai/v1/projects/proj_xxx/sheets \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "[email protected]" \
  -F "page=1"

Authentication

All requests require a Bearer token:
Authorization: Bearer <your-api-key>

Tier 1: Raw Detection

Fast geometric detection. No LLM, no graph storage. Returns annotations in ~1-2 seconds. Detects: Leaders, Section Tags, Detail Tags, Revision Triangles, Revision Clouds, Title Block bounds.

POST /v1/drawings

Submit a PDF page for annotation detection. Request (multipart/form-data):
FieldTypeRequiredDescription
filefileYesPDF file (max 50MB)
pageintegerYesPage number (1-indexed)
curl -X POST https://api.stru.ai/v1/drawings \
  -H "Authorization: Bearer sk-xxx" \
  -F "[email protected]" \
  -F "page=4"
{
  "id": "drw_7f8a9b2c",
  "page": 4,
  "dimensions": {"width": 2592, "height": 1728},
  "processing_ms": 1250,
  "annotations": {
    "leaders": [
      {
        "id": "ldr_001",
        "bbox": [1200, 450, 1400, 520],
        "arrow_tip": [1200, 485],
        "text_bbox": [1280, 450, 1400, 520],
        "texts_inside": [{"id": 45, "text": "W12x26"}]
      }
    ],
    "section_tags": [
      {
        "id": "sec_001",
        "bbox": [800, 600, 850, 650],
        "circle": {"center": [825, 625], "radius": 22},
        "direction": "right",
        "texts_inside": [{"id": 12, "text": "A"}, {"id": 13, "text": "S1.5"}],
        "section_line": {"start": [200, 625], "end": [800, 625]}
      }
    ],
    "detail_tags": [
      {
        "id": "det_001",
        "bbox": [1500, 900, 1550, 950],
        "circle": {"center": [1525, 925], "radius": 22},
        "texts_inside": [{"id": 78, "text": "3"}, {"id": 79, "text": "S1.6"}],
        "has_dashed_bbox": true
      }
    ],
    "revision_triangles": [
      {
        "id": "tri_001",
        "bbox": [600, 300, 620, 330],
        "vertices": [[610, 300], [600, 330], [620, 330]],
        "text": "B"
      }
    ],
    "revision_clouds": [
      {
        "id": "cld_001",
        "bbox": [400, 200, 700, 450]
      }
    ]
  },
  "titleblock": {
    "bounds": [2100, 50, 2550, 1700],
    "viewport": [50, 50, 2100, 1700]
  }
}

GET /v1/drawings/

Retrieve a previously processed drawing.

DELETE /v1/drawings/

Delete a drawing result.

Tier 2: Graph + Search

Full pipeline: detection → LLM enrichment → Neo4j graph → semantic search. What you get:
  • Entities with semantic descriptions
  • Relationships between entities
  • Cross-sheet reference linking
  • Natural language search and query

Projects

POST /v1/projects

Create a project to group related sheets.
{
  "name": "Building A Structural",
  "description": "96-page structural drawing set"
}
{
  "id": "proj_abc123",
  "name": "Building A Structural",
  "created_at": "2026-01-29T10:00:00Z"
}

GET /v1/projects

List all projects.

GET /v1/projects/

Get project details and stats.

DELETE /v1/projects/

Delete project and all sheets/entities.

Sheets

POST /v1/projects//sheets

Ingest a PDF page into the knowledge graph. Request (multipart/form-data):
FieldTypeRequiredDescription
filefileYesPDF file
pageintegerYesPage number (1-indexed)
webhook_urlstringNoCallback when complete
{
  "job_id": "job_xyz789",
  "status": "processing",
  "steps": {
    "detection": "pending",
    "enrichment": "pending",
    "synthesis": "pending",
    "graph": "pending"
  }
}

GET /v1/projects//jobs/

Check ingestion progress.
{
  "job_id": "job_xyz789",
  "status": "complete",
  "steps": {
    "detection": {"status": "complete", "duration_ms": 1200},
    "enrichment": {"status": "complete", "duration_ms": 8500, "tokens": 12400},
    "synthesis": {"status": "complete", "duration_ms": 15000, "tokens": 45000},
    "graph": {"status": "complete", "duration_ms": 800}
  },
  "result": {
    "sheet_id": "S1.4",
    "entities_created": 87,
    "relationships_created": 42
  }
}

GET /v1/projects//sheets

List all sheets in project.

GET /v1/projects//sheets/

Get sheet with all entities.

DELETE /v1/projects//sheets/

Remove sheet from graph.

POST /v1/projects//search

Hybrid semantic search (vector + fulltext + graph traversal).
Price: $0.005 per query
Request:
{
  "query": "W12x26 beam connections at grid A",
  "limit": 10,
  "filters": {
    "sheet_id": "S1.4",
    "entity_type": ["Component", "Connection"]
  },
  "include_graph_context": true
}
{
  "results": [
    {
      "entity": {
        "id": "ent_abc123",
        "type": "Component",
        "label": "W12x26 Steel Beam",
        "description": "Wide flange beam spanning grid A to C",
        "sheet_id": "S1.4",
        "bbox": [450, 320, 1200, 380]
      },
      "score": 0.94,
      "graph_context": {
        "connected_entities": [
          {"id": "ent_def456", "type": "Connection", "label": "Bolted Connection"},
          {"id": "ent_ghi789", "type": "Datum", "label": "Grid A"}
        ],
        "relationships": [
          {"type": "CONNECTS_TO", "fact": "W12x26 beam connects to column at grid A"}
        ]
      }
    }
  ],
  "search_ms": 245
}

Query

POST /v1/projects//query

Ask questions in natural language.
Price: $0.03 per query
Request:
{
  "question": "What beams connect to column C3 on the second floor?"
}
{
  "answer": "Three beams connect to column C3: a W16x31 running east to D3, a W12x26 north to C4, and a W12x26 south to C2.",
  "sources": [
    {"entity_id": "ent_abc", "sheet_id": "S1.4", "label": "W16x31 Beam", "bbox": [800, 400, 1400, 450]}
  ],
  "confidence": 0.92
}

Entities & Relationships

GET /v1/projects//entities

List entities. Filter by sheet_id, type.

GET /v1/projects//entities/

Get entity with all relationships.

GET /v1/projects//relationships

List relationships. Filter by source_id, target_id, type.

Reference

TypeExamples
SheetS1.1, A2.3
ViewPlan, Section, Detail, Elevation
ZoneTitle Block, General Notes, Legend
ComponentBeam, Column, Duct, Pipe
ConnectionWeld, Bolt
DatumGrid Line, Level
AnnotationLeader Note, Dimension
CalloutSection Tag, Detail Tag
SymbolNorth Arrow, Revision Triangle

Errors

{"error": {"code": "invalid_page", "message": "Page 15 does not exist (total: 10)"}}
{"error": {"code": "rate_limited", "message": "Too many requests", "retry_after": 30}}

Webhooks

When you provide a webhook_url during sheet ingestion, we’ll POST to it when processing completes:
{
  "event": "sheet.complete",
  "project_id": "proj_abc123",
  "sheet_id": "S1.4",
  "entities_created": 87
}
Header: X-Signature: sha256=<hmac>