Metadata Extraction

Pull metadata from translated Revit models for analysis or reporting.

Workflow Overview

Input

Translated Model
SVF2 URN

Model Derivative API
Get Metadata
Get Tree
Get Properties
Get Views
Outputs
metadata.jsonGUIDs, Info
tree.jsonHierarchy
properties.jsonBIM Data
views.jsonView List
Export
Reports
CSV
Database
InputAPIOutputsExport

CLI Approach

Step 1: Get Model URN

URN=$(raps object urn my-bucket building.rvt --output plain)

Step 2: Check Translation Status

raps translate manifest "$URN"

Step 3: Extract All Metadata

# Model metadata (GUID, views, etc.)
raps derivative metadata "$URN" --output json > metadata.json

# Model hierarchy
raps derivative tree "$URN" --output json > model-tree.json

# All properties (BIM data)
raps derivative properties "$URN" --output json > properties.json

# Available views
raps derivative views "$URN" --output json > views.json

Step 4: Analyze Data

# Count elements by category
cat properties.json | jq 'group_by(.category) | .[] | {category: .[0].category, count: length}'

# Export specific properties to CSV
cat properties.json | jq -r '
  ["ObjectId", "Name", "Category"],
  (.[] | [.objectid, .name, .category])
  | @csv' > elements.csv

CI/CD Pipeline

# .github/workflows/metadata-extraction.yml
name: BIM Metadata Extraction

on:
  workflow_dispatch:
    inputs:
      bucket:
        description: 'Bucket name'
        required: true
      model:
        description: 'Model filename'
        required: true

jobs:
  extract-metadata:
    runs-on: ubuntu-latest
    steps:
      - name: Install RAPS
        run: cargo install raps

      - name: Extract all metadata
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          URN=$(raps object urn "${{ inputs.bucket }}" "${{ inputs.model }}" --output plain)

          mkdir -p ./metadata-export

          raps derivative metadata "$URN" --output json > ./metadata-export/metadata.json
          raps derivative tree "$URN" --output json > ./metadata-export/tree.json
          raps derivative properties "$URN" --output json > ./metadata-export/properties.json
          raps derivative views "$URN" --output json > ./metadata-export/views.json

      - name: Generate summary
        run: |
          echo "# Metadata Summary" > ./metadata-export/summary.md
          echo "Model: ${{ inputs.model }}" >> ./metadata-export/summary.md
          echo "Elements: $(jq 'length' ./metadata-export/properties.json)" >> ./metadata-export/summary.md
          echo "Views: $(jq 'length' ./metadata-export/views.json)" >> ./metadata-export/summary.md

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: bim-metadata-${{ github.run_id }}
          path: ./metadata-export/

Pipeline Flow

Manual Trigger

workflow_dispatch
bucket + model

Extraction
Get URN
metadata.json
tree.json
properties.json
views.json
Analysis
Generate Summary
Artifacts
bim-metadata.zip

MCP Integration

Extract and Summarize

User: "Extract all metadata from building.rvt and summarize the room count"
User
AI Assistant
RAPS MCP
APS Cloud
Extract metadata, summarize rooms
aps_object_urn()
Get URN
URN
aps_derivative_properties()
Get properties
Properties JSON
Filter rooms, calculate areas
Room summary by level

AI Response:

I found 47 rooms in the model:

  • Level 1: 15 rooms (3,450 sq ft total)
  • Level 2: 18 rooms (4,200 sq ft total)
  • Level 3: 14 rooms (3,100 sq ft total)

Compare Models

User: "Compare the element counts between v1 and v2 of the building model"

AI Response:

Model Comparison:

Categoryv1v2Change
Walls245258+13
Doors8992+3
Windows1561560
Rooms4752+5

Common Queries

Count by Category

cat properties.json | jq '
  group_by(.category) |
  map({category: .[0].category, count: length}) |
  sort_by(-.count)'

Find Specific Elements

# Find all doors
cat properties.json | jq '[.[] | select(.category == "Doors")]'

# Find elements by name pattern
cat properties.json | jq '[.[] | select(.name | test("Wall.*Exterior"))]'

Export to Database Format

# Generate SQL inserts
cat properties.json | jq -r '.[] |
  "INSERT INTO elements (id, name, category) VALUES (\(.objectid), '\''\(.name)'\'', '\''\(.category)'\'');"'