# Fabric CLI Quick Start Guide Real working examples using Fabric workspaces and items. These commands are ready to copy-paste and modify for your own workspaces. ## Finding Items ### List Workspaces ```bash # List all workspaces fab ls # List with details (shows IDs, types, etc.) fab ls -l # Find specific workspace fab ls | grep "Sales" ``` ### List Items in Workspace ```bash # List all items in workspace fab ls "Sales.Workspace" # List with details (shows IDs, modification dates) fab ls "Sales.Workspace" -l # Filter by type fab ls "Sales.Workspace" | grep "Notebook" fab ls "Sales.Workspace" | grep "SemanticModel" fab ls "Sales.Workspace" | grep "Lakehouse" ``` ### Check if Item Exists ```bash # Check workspace exists fab exists "Sales.Workspace" # Check specific item exists fab exists "Sales.Workspace/Sales Model.SemanticModel" fab exists "Sales.Workspace/SalesLH.Lakehouse" fab exists "Sales.Workspace/ETL - Extract.Notebook" ``` ### Get Item Details ```bash # Get basic properties fab get "Sales.Workspace/Sales Model.SemanticModel" # Get all properties (verbose) fab get "Sales.Workspace/Sales Model.SemanticModel" -v # Get specific property (workspace ID) fab get "Sales.Workspace" -q "id" # Get specific property (model ID) fab get "Sales.Workspace/Sales Model.SemanticModel" -q "id" # Get display name fab get "Sales.Workspace/Sales Model.SemanticModel" -q "displayName" ``` ## Working with Semantic Models ### Get Model Information ```bash # Get model definition (full TMDL structure) fab get "Sales.Workspace/Sales Model.SemanticModel" -q "definition" # Save definition to file fab get "Sales.Workspace/Sales Model.SemanticModel" -q "definition" > sales-model-definition.json # Get model creation date fab get "Sales.Workspace/Sales Model.SemanticModel" -q "properties.createdDateTime" # Get model type (DirectLake, Import, etc.) fab get "Sales.Workspace/Sales Model.SemanticModel" -q "properties.mode" ``` ### Check Refresh Status ```bash # First, get the workspace ID fab get "Sales.Workspace" -q "id" # Returns: a1b2c3d4-e5f6-7890-abcd-ef1234567890 # Then get the model ID fab get "Sales.Workspace/Sales Model.SemanticModel" -q "id" # Returns: 12345678-abcd-ef12-3456-789abcdef012 # Now use those IDs to get latest refresh (put $top in the URL) fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/refreshes?\$top=1" # Get full refresh history fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/refreshes" ``` ### Query Model with DAX ```bash # First, get the model definition to see table/column names fab get "Sales.Workspace/Sales Model.SemanticModel" -q "definition" # Get the workspace and model IDs fab get "Sales.Workspace" -q "id" fab get "Sales.Workspace/Sales Model.SemanticModel" -q "id" # Execute DAX query (using proper table qualification) fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/executeQueries" -X post -i '{"queries":[{"query":"EVALUATE TOPN(1, '\''Orders'\'', '\''Orders'\''[OrderDate], DESC)"}],"serializerSettings":{"includeNulls":true}}' # Query top 5 records from a table fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/executeQueries" -X post -i '{"queries":[{"query":"EVALUATE TOPN(5, '\''Orders'\'')"}],"serializerSettings":{"includeNulls":true}}' ``` ### Trigger Model Refresh ```bash # Get workspace and model IDs fab get "Sales.Workspace" -q "id" fab get "Sales.Workspace/Sales Model.SemanticModel" -q "id" # Trigger full refresh fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/refreshes" -X post -i '{"type": "Full", "commitMode": "Transactional"}' # Monitor refresh status fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/refreshes?\$top=1" ``` ## Working with Notebooks ### List Notebooks ```bash # List all notebooks in workspace fab ls "Sales.Workspace" | grep "Notebook" # Get specific notebook details fab get "Sales.Workspace/ETL - Extract.Notebook" # Get notebook ID fab get "Sales.Workspace/ETL - Extract.Notebook" -q "id" ``` ### Run Notebook ```bash # Run notebook synchronously (wait for completion) fab job run "Sales.Workspace/ETL - Extract.Notebook" # Run with timeout (300 seconds = 5 minutes) fab job run "Sales.Workspace/ETL - Extract.Notebook" --timeout 300 # Run with parameters fab job run "Sales.Workspace/ETL - Extract.Notebook" -P \ date:string=2025-10-17,\ debug:bool=true ``` ### Run Notebook Asynchronously ```bash # Start notebook and return immediately fab job start "Sales.Workspace/ETL - Extract.Notebook" # Check execution history fab job run-list "Sales.Workspace/ETL - Extract.Notebook" # Check specific job status (replace with actual ID) fab job run-status "Sales.Workspace/ETL - Extract.Notebook" --id ``` ### Get Notebook Definition ```bash # Get full notebook definition fab get "Sales.Workspace/ETL - Extract.Notebook" -q "definition" # Save to file fab get "Sales.Workspace/ETL - Extract.Notebook" -q "definition" > etl-extract-notebook.json # Get notebook code content fab get "Sales.Workspace/ETL - Extract.Notebook" -q "definition.parts[?path=='notebook-content.py'].payload | [0]" | base64 -d ``` ## Working with Lakehouses ### Browse Lakehouse ```bash # List lakehouse contents fab ls "Sales.Workspace/SalesLH.Lakehouse" # List Files directory fab ls "Sales.Workspace/SalesLH.Lakehouse/Files" # List specific folder in Files fab ls "Sales.Workspace/SalesLH.Lakehouse/Files/2025/10" # List Tables fab ls "Sales.Workspace/SalesLH.Lakehouse/Tables" # List with details (shows sizes, modified dates) fab ls "Sales.Workspace/SalesLH.Lakehouse/Tables" -l # List specific schema tables fab ls "Sales.Workspace/SalesLH.Lakehouse/Tables/bronze" fab ls "Sales.Workspace/SalesLH.Lakehouse/Tables/gold" ``` ### Get Table Schema ```bash # View table schema fab table schema "Sales.Workspace/SalesLH.Lakehouse/Tables/bronze/raw_orders" fab table schema "Sales.Workspace/SalesLH.Lakehouse/Tables/gold/orders" # Save schema to file fab table schema "Sales.Workspace/SalesLH.Lakehouse/Tables/gold/orders" > orders-schema.json ``` ### Check Table Last Modified ```bash # List tables with modification times fab ls "Sales.Workspace/SalesLH.Lakehouse/Tables/gold" -l # Get specific table details fab get "Sales.Workspace/SalesLH.Lakehouse/Tables/gold/orders" ``` ## Working with Reports ### List Reports ```bash # List all reports fab ls "Sales.Workspace" | grep "Report" # Get report details fab get "Sales.Workspace/Sales Dashboard.Report" # Get report ID fab get "Sales.Workspace/Sales Dashboard.Report" -q "id" ``` ### Export Report Definition ```bash # Get report definition as JSON fab get "Sales.Workspace/Sales Dashboard.Report" -q "definition" > sales-report.json # Export report to local directory (creates PBIR structure) fab export "Sales.Workspace/Sales Dashboard.Report" -o ./reports-backup -f ``` ### Get Report Metadata ```bash # Get connected semantic model ID fab get "Sales.Workspace/Sales Dashboard.Report" -q "properties.datasetId" # Get report connection string fab get "Sales.Workspace/Sales Dashboard.Report" -q "definition.parts[?path=='definition.pbir'].payload.datasetReference" ``` ## Download and Re-upload Workflows ### Backup Semantic Model ```bash # 1. Get model definition fab get "Sales.Workspace/Sales Model.SemanticModel" -q "definition" > backup-sales-model-$(date +%Y%m%d).json # 2. Get model metadata fab get "Sales.Workspace/Sales Model.SemanticModel" > backup-sales-model-metadata-$(date +%Y%m%d).json ``` ### Export and Import Notebook ```bash # Export notebook fab export "Sales.Workspace/ETL - Extract.Notebook" -o ./notebooks-backup # Import to another workspace (or same workspace with different name) fab import "Dev.Workspace/ETL Extract Copy.Notebook" -i ./notebooks-backup/ETL\ -\ Extract.Notebook ``` ### Copy Items Between Workspaces ```bash # Copy semantic model fab cp "Sales.Workspace/Sales Model.SemanticModel" "Dev.Workspace" # Copy with new name fab cp "Sales.Workspace/Sales Model.SemanticModel" "Dev.Workspace/Sales Model Test.SemanticModel" # Copy notebook fab cp "Sales.Workspace/ETL - Extract.Notebook" "Dev.Workspace" # Copy report fab cp "Sales.Workspace/Sales Dashboard.Report" "Dev.Workspace" ``` ## Combined Workflows ### Complete Model Status Check ```bash # Check last refresh fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/refreshes?\$top=1" # Check latest data in model fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/executeQueries" -X post -i '{"queries":[{"query":"EVALUATE TOPN(1, '\''Orders'\'', '\''Orders'\''[OrderDate], DESC)"}],"serializerSettings":{"includeNulls":true}}' # Check lakehouse data freshness fab ls "Sales.Workspace/SalesLH.Lakehouse/Tables/gold/orders" -l ``` ### Check All Notebooks in Workspace ```bash # List all notebooks fab ls "Sales.Workspace" | grep Notebook # Check execution history for each fab job run-list "Sales.Workspace/ETL - Extract.Notebook" fab job run-list "Sales.Workspace/ETL - Transform.Notebook" ``` ### Monitor Lakehouse Data Freshness ```bash # Check gold layer tables fab ls "Sales.Workspace/SalesLH.Lakehouse/Tables/gold" -l # Check bronze layer tables fab ls "Sales.Workspace/SalesLH.Lakehouse/Tables/bronze" -l # Check latest files fab ls "Sales.Workspace/SalesLH.Lakehouse/Files/2025/10" -l ``` ## Tips and Tricks ### Get IDs for API Calls ```bash # Get workspace ID fab get "Sales.Workspace" -q "id" # Get model ID fab get "Sales.Workspace/Sales Model.SemanticModel" -q "id" # Get lakehouse ID fab get "Sales.Workspace/SalesLH.Lakehouse" -q "id" # Then use the IDs directly in API calls fab api "workspaces/a1b2c3d4-e5f6-7890-abcd-ef1234567890/items" fab api -A powerbi "groups/a1b2c3d4-e5f6-7890-abcd-ef1234567890/datasets/12345678-abcd-ef12-3456-789abcdef012/refreshes" ``` ### Pipe to jq for Pretty JSON ```bash # Pretty print JSON output fab get "Sales.Workspace/Sales Model.SemanticModel" | jq . # Extract specific fields fab get "Sales.Workspace/Sales Model.SemanticModel" | jq '{id: .id, name: .displayName, created: .properties.createdDateTime}' # Get workspace ID first, then filter arrays fab get "Sales.Workspace" -q "id" fab api "workspaces/a1b2c3d4-e5f6-7890-abcd-ef1234567890/items" | jq '.value[] | select(.type=="Notebook") | .displayName' ``` ### Use with grep for Filtering ```bash # Find items by pattern fab ls "Sales.Workspace" | grep -i "etl" fab ls "Sales.Workspace" | grep -i "sales" # Count items by type fab ls "Sales.Workspace" | grep -c "Notebook" fab ls "Sales.Workspace" | grep -c "SemanticModel" ``` ### Create Aliases for Common Commands ```bash # Add to ~/.bashrc or ~/.zshrc alias sales-ls='fab ls "Sales.Workspace"' alias sales-notebooks='fab ls "Sales.Workspace" | grep Notebook' alias sales-refresh='fab api -A powerbi "groups//datasets//refreshes?\$top=1"' # Then use: sales-ls sales-notebooks sales-refresh ``` ## Common Patterns ### Get All Items of a Type ```bash # Get workspace ID first fab get "Sales.Workspace" -q "id" # Get all notebooks fab api "workspaces/a1b2c3d4-e5f6-7890-abcd-ef1234567890/items" -q "value[?type=='Notebook']" # Get all semantic models fab api "workspaces/a1b2c3d4-e5f6-7890-abcd-ef1234567890/items" -q "value[?type=='SemanticModel']" # Get all lakehouses fab api "workspaces/a1b2c3d4-e5f6-7890-abcd-ef1234567890/items" -q "value[?type=='Lakehouse']" # Get all reports fab api "workspaces/a1b2c3d4-e5f6-7890-abcd-ef1234567890/items" -q "value[?type=='Report']" ``` ### Export Entire Workspace ```bash # Export all items in workspace fab export "Sales.Workspace" -o ./sales-workspace-backup -a # This creates a full backup with all items ``` ### Find Items by Name Pattern ```bash # Get workspace ID first fab get "Sales.Workspace" -q "id" # Find items with "ETL" in name fab api "workspaces/a1b2c3d4-e5f6-7890-abcd-ef1234567890/items" -q "value[?contains(displayName, 'ETL')]" # Find items with "Sales" in name fab api "workspaces/a1b2c3d4-e5f6-7890-abcd-ef1234567890/items" -q "value[?contains(displayName, 'Sales')]" ``` ## Next Steps - See [semantic-models.md](./semantic-models.md) for advanced model operations - See [notebooks.md](./notebooks.md) for notebook scheduling and orchestration - See [reports.md](./reports.md) for report deployment workflows - See [scripts/README.md](../scripts/README.md) for helper scripts