Files
2025-11-29 18:18:03 +08:00

25 KiB

Fabric CLI Command Reference

Comprehensive reference for Microsoft Fabric CLI commands, flags, and patterns.

Table of Contents

Item Types

All 35 supported item types:

Extension Description
.Workspace Workspaces (containers)
.SemanticModel Power BI datasets/semantic models
.Report Power BI reports
.Dashboard Power BI dashboards
.PaginatedReport Paginated reports
.Notebook Fabric notebooks
.DataPipeline Data pipelines
.SparkJobDefinition Spark job definitions
.Lakehouse Lakehouses
.Warehouse Warehouses
.SQLDatabase SQL databases
.SQLEndpoint SQL endpoints
.MirroredDatabase Mirrored databases
.MirroredWarehouse Mirrored warehouses
.KQLDatabase KQL databases
.KQLDashboard KQL dashboards
.KQLQueryset KQL querysets
.Eventhouse Eventhouses
.Eventstream Event streams
.Datamart Datamarts
.Environment Spark environments
.Reflex Reflex items
.MLModel ML models
.MLExperiment ML experiments
.GraphQLApi GraphQL APIs
.MountedDataFactory Mounted data factories
.CopyJob Copy jobs
.VariableLibrary Variable libraries
.SparkPool Spark pools
.ManagedIdentity Managed identities
.ManagedPrivateEndpoint Managed private endpoints
.ExternalDataShare External data shares
.Folder Folders
.Capacity Capacities
.Personal Personal workspaces

File System Commands

ls (dir) - List Resources

Syntax

fab ls [path] [-l] [-a]

Flags

  • -l - Long format (detailed)
  • -a - Show hidden items

Examples

# List workspaces
fab ls

# List items in workspace with details
fab ls "Production.Workspace" -l

# Show hidden items (capacities, connections, domains, gateways)
fab ls -la

# List lakehouse contents
fab ls "Data.Workspace/LH.Lakehouse"
fab ls "Data.Workspace/LH.Lakehouse/Files"
fab ls "Data.Workspace/LH.Lakehouse/Tables/dbo"

cd - Change Directory

Syntax

fab cd <path>

Examples

# Navigate to workspace
fab cd "Production.Workspace"

# Navigate to item
fab cd "/Analytics.Workspace/Sales.SemanticModel"

# Relative navigation
fab cd "../Dev.Workspace"

# Personal workspace
fab cd ~

pwd - Print Working Directory

Syntax

fab pwd

exists - Check Existence

Syntax

fab exists <path>

Returns

* true or * false

Examples

fab exists "Production.Workspace"
fab exists "Production.Workspace/Sales.SemanticModel"

get - Get Resource Details

Syntax

fab get <path> [-v] [-q <jmespath>] [-o <output>]

Flags

  • -v, --verbose - Show all properties
  • -q, --query - JMESPath query
  • -o, --output - Save to file

Examples

# Get workspace
fab get "Production.Workspace"

# Get item with all properties
fab get "Production.Workspace/Sales.Report" -v

# Query specific property
fab get "Production.Workspace" -q "id"
fab get "Production.Workspace/Sales.SemanticModel" -q "definition.parts[0]"

# Save to file
fab get "Production.Workspace/Sales.SemanticModel" -o /tmp/model.json

set - Set Resource Properties

Syntax

fab set <path> -q <property_path> -i <value>

Flags

  • -q, --query - Property path (JMESPath-style)
  • -i, --input - New value (string or JSON)

Examples

# Update display name
fab set "Production.Workspace/Item.Notebook" -q displayName -i "New Name"

# Update description
fab set "Production.Workspace" -q description -i "Production environment"

# Update Spark runtime
fab set "Production.Workspace" -q sparkSettings.environment.runtimeVersion -i 1.2

# Assign Spark pool
fab set "Production.Workspace" -q sparkSettings.pool.defaultPool -i '{"name": "Starter Pool", "type": "Workspace"}'

# Rebind report to model
fab set "Production.Workspace/Report.Report" -q semanticModelId -i "<model-id>"

mkdir (create) - Create Resources

Syntax

fab mkdir <path> [-P <param=value>]

Flags

  • -P, --params - Parameters (key=value format)

Examples

# Create workspace
fab mkdir "NewWorkspace.Workspace"
fab mkdir "NewWorkspace.Workspace" -P capacityname=MyCapacity
fab mkdir "NewWorkspace.Workspace" -P capacityname=none

# Create items
fab mkdir "Production.Workspace/NewLakehouse.Lakehouse"
fab mkdir "Production.Workspace/Notebook.Notebook"

# Create with parameters
fab mkdir "Production.Workspace/LH.Lakehouse" -P enableSchemas=true
fab mkdir "Production.Workspace/DW.Warehouse" -P enableCaseInsensitive=true

# Check supported parameters
fab mkdir "Item.Lakehouse" -P

cp (copy) - Copy Resources

Syntax

fab cp <source> <destination>

Supported types

.Notebook, .SparkJobDefinition, .DataPipeline, .Report, .SemanticModel, .KQLDatabase, .KQLDashboard, .KQLQueryset, .Eventhouse, .Eventstream, .MirroredDatabase, .Reflex, .MountedDataFactory, .CopyJob, .VariableLibrary

Examples

# Copy item to workspace (keeps same name)
fab cp "Dev.Workspace/Pipeline.DataPipeline" "Production.Workspace"

# Copy with new name
fab cp "Dev.Workspace/Pipeline.DataPipeline" "Production.Workspace/ProdPipeline.DataPipeline"

# Copy to folder
fab cp "Dev.Workspace/Report.Report" "Production.Workspace/Reports.Folder"

# Copy files to/from lakehouse
fab cp ./local-data.csv "Data.Workspace/LH.Lakehouse/Files/data.csv"
fab cp "Data.Workspace/LH.Lakehouse/Files/data.csv" ~/Downloads/

mv (move) - Move Resources

Syntax

fab mv <source> <destination>

Examples

# Move item to workspace
fab mv "Dev.Workspace/Pipeline.DataPipeline" "Production.Workspace"

# Move with rename
fab mv "Dev.Workspace/Pipeline.DataPipeline" "Production.Workspace/NewPipeline.DataPipeline"

# Move to folder
fab mv "Dev.Workspace/Report.Report" "Production.Workspace/Archive.Folder"

rm (del) - Delete Resources

Syntax

fab rm <path> [-f]

Flags

  • -f, --force - Skip confirmation

Examples

# Delete with confirmation (interactive)
fab rm "Dev.Workspace/OldReport.Report"

# Force delete
fab rm "Dev.Workspace/OldLakehouse.Lakehouse" -f

# Delete workspace and all contents
fab rm "OldWorkspace.Workspace" -f

export - Export Item Definitions

Syntax

fab export <item_path> -o <output_path> [-a]

Flags

  • -o, --output - Output directory (local or lakehouse Files)
  • -a - Export all items (when exporting workspace)

Supported types

Same as cp command

Examples

# Export item to local
fab export "Production.Workspace/Sales.SemanticModel" -o /tmp/exports

# Export all workspace items
fab export "Production.Workspace" -o /tmp/backup -a

# Export to lakehouse
fab export "Production.Workspace/Pipeline.DataPipeline" -o "Data.Workspace/Archive.Lakehouse/Files/exports"

import - Import Item Definitions

Syntax

fab import <item_path> -i <input_path> [--format <format>]

Flags

  • -i, --input - Input directory or file
  • --format - Format override (e.g., py for notebooks)

Examples

# Import item from local
fab import "Production.Workspace/Pipeline.DataPipeline" -i /tmp/exports/Pipeline.DataPipeline

# Import notebook from Python file
fab import "Production.Workspace/ETL.Notebook" -i /tmp/etl_script.py --format py

# Import from lakehouse
fab import "Production.Workspace/Report.Report" -i "Data.Workspace/Archive.Lakehouse/Files/exports/Report.Report"

open - Open in Browser

Syntax

fab open <path>

Examples

fab open "Production.Workspace"
fab open "Production.Workspace/Sales.Report"

Syntax

fab ln <source> <destination>

assign / unassign - Capacity Assignment

Syntax

fab assign <workspace> -P capacityId=<capacity-id>
fab unassign <workspace>

start / stop - Start/Stop Resources

Syntax

fab start <path> [-f]
fab stop <path> [-f]

Supported

.MirroredDatabase

Examples

fab start "Data.Workspace/Mirror.MirroredDatabase" -f
fab stop "Data.Workspace/Mirror.MirroredDatabase" -f

API Commands

api - Make API Requests

Syntax

fab api <endpoint> [-A <audience>] [-X <method>] [-i <input>] [-q <query>] [-P <params>] [-H <headers>] [--show_headers]

Flags

  • -A, --audience - API audience (fabric, powerbi, storage, azure)
  • -X, --method - HTTP method (get, post, put, delete, patch)
  • -i, --input - Request body (JSON string or file path)
  • -q, --query - JMESPath query to filter response
  • -P, --params - Query parameters (key=value format)
  • -H, --headers - Additional headers (key=value format)
  • --show_headers - Include response headers

Audiences

Audience Base URL Use For
fabric (default) https://api.fabric.microsoft.com Fabric REST API
powerbi https://api.powerbi.com Power BI REST API, DAX queries
storage https://*.dfs.fabric.microsoft.com OneLake Storage API
azure https://management.azure.com Azure Resource Manager

Examples

Fabric API

# GET requests
fab api workspaces
fab api "workspaces/<workspace-id>"
fab api "workspaces/<workspace-id>/items"
fab api workspaces -q "value[?type=='Workspace']"

# POST request with inline JSON
fab api -X post "workspaces/<workspace-id>/items" -i '{"displayName": "New Item", "type": "Lakehouse"}'

# POST with file
fab api -X post "workspaces/<workspace-id>/lakehouses" -i /tmp/config.json

# PUT to update
fab api -X put "workspaces/<workspace-id>/items/<item-id>" -i '{"displayName": "Updated"}'

# DELETE
fab api -X delete "workspaces/<workspace-id>/items/<item-id>"

# Update semantic model definition
fab api -X post "workspaces/<workspace-id>/semanticModels/<model-id>/updateDefinition" -i /tmp/definition.json --show_headers

Power BI API

# List groups (workspaces)
fab api -A powerbi groups

# Get datasets in workspace
fab api -A powerbi "groups/<workspace-id>/datasets"

# Execute DAX query
fab api -A powerbi "datasets/<model-id>/executeQueries" -X post -i '{"queries": [{"query": "EVALUATE VALUES(Date[Year])"}]}'

# Refresh dataset
fab api -A powerbi "datasets/<model-id>/refreshes" -X post -i '{}'

# Get refresh history
fab api -A powerbi "datasets/<model-id>/refreshes"

OneLake Storage API

# List files with parameters
fab api -A storage "WorkspaceName.Workspace/LH.Lakehouse/Files" -P resource=filesystem,recursive=false

# With query string
fab api -A storage "WorkspaceName/LH.Lakehouse/Files?resource=filesystem&recursive=false"

Azure Resource Manager

# List Fabric capacities
fab api -A azure "subscriptions/<subscription-id>/providers/Microsoft.Fabric/capacities?api-version=2023-11-01"

# Get available SKUs
fab api -A azure "subscriptions/<subscription-id>/providers/Microsoft.Fabric/skus?api-version=2023-11-01"

Job Commands

job run - Run Job Synchronously

Syntax

fab job run <item_path> [--timeout <seconds>] [-P <params>] [-C <config>] [-i <input>]

Flags

  • --timeout - Timeout in seconds
  • -P, --params - Job parameters (typed: name:type=value)
  • -C, --config - Configuration JSON (file or inline)
  • -i, --input - Raw JSON input (file or inline)

Supported items

.Notebook, .DataPipeline, .SparkJobDefinition, .Lakehouse (maintenance)

Parameter types

  • Notebook: string, int, float, bool
  • DataPipeline: string, int, float, bool, object, array, secureString

Examples

# Run notebook
fab job run "Production.Workspace/ETL.Notebook"

# Run with timeout
fab job run "Production.Workspace/LongProcess.Notebook" --timeout 300

# Run with parameters
fab job run "Production.Workspace/ETL.Notebook" -P date:string=2024-01-01,batch_size:int=1000,debug:bool=false

# Run pipeline with complex parameters
fab job run "Production.Workspace/Pipeline.DataPipeline" -P 'config:object={"source":"s3","batch":100},ids:array=[1,2,3],secret:secureString=mysecret'

# Run with Spark configuration
fab job run "Production.Workspace/ETL.Notebook" -C '{"conf": {"spark.executor.memory": "8g"}, "environment": {"id": "<env-id>", "name": "ProdEnv"}}'

# Run with default lakehouse
fab job run "Production.Workspace/Process.Notebook" -C '{"defaultLakehouse": {"name": "MainLH", "id": "<lh-id>"}}'

# Run with workspace pool
fab job run "Production.Workspace/BigData.Notebook" -C '{"useStarterPool": false, "useWorkspacePool": "HighMemoryPool"}'

# Run with raw JSON
fab job run "Production.Workspace/ETL.Notebook" -i '{"parameters": {"date": {"type": "string", "value": "2024-01-01"}}, "configuration": {"conf": {"spark.conf1": "value"}}}'

job start - Start Job Asynchronously

Syntax

fab job start <item_path> [-P <params>] [-C <config>] [-i <input>]

Examples

# Start and return immediately
fab job start "Production.Workspace/ETL.Notebook"

# Start with parameters
fab job start "Production.Workspace/Pipeline.DataPipeline" -P source:string=salesdb,batch:int=500

job run-list - List Job History

Syntax

fab job run-list <item_path> [--schedule]

Flags

  • --schedule - Show only scheduled job runs

Examples

# List all job runs
fab job run-list "Production.Workspace/ETL.Notebook"

# List scheduled runs only
fab job run-list "Production.Workspace/ETL.Notebook" --schedule

job run-status - Get Job Status

Syntax

fab job run-status <item_path> --id <job_id> [--schedule]

Flags

  • --id - Job or schedule ID
  • --schedule - Check scheduled job status

Examples

# Check job instance status
fab job run-status "Production.Workspace/ETL.Notebook" --id <job-id>

# Check schedule status
fab job run-status "Production.Workspace/Pipeline.DataPipeline" --id <schedule-id> --schedule

job run-cancel - Cancel Job

Syntax

fab job run-cancel <item_path> --id <job_id>

Examples

fab job run-cancel "Production.Workspace/ETL.Notebook" --id <job-id>

job run-sch - Schedule Job

Syntax

fab job run-sch <item_path> --type <type> --interval <interval> [--days <days>] --start <datetime> [--end <datetime>] [--enable] [-i <json>]

Flags

  • --type - Schedule type (cron, daily, weekly)
  • --interval - Interval (minutes for cron, HH:MM for daily/weekly)
  • --days - Days for weekly (Monday,Friday)
  • --start - Start datetime (ISO 8601)
  • --end - End datetime (ISO 8601)
  • --enable - Enable schedule immediately
  • -i, --input - Raw JSON schedule configuration

Examples

# Cron schedule (every 10 minutes)
fab job run-sch "Production.Workspace/Pipeline.DataPipeline" --type cron --interval 10 --start 2024-11-15T09:00:00 --end 2024-12-15T10:00:00 --enable

# Daily schedule
fab job run-sch "Production.Workspace/Pipeline.DataPipeline" --type daily --interval 10:00,16:00 --start 2024-11-15T09:00:00 --end 2024-12-16T10:00:00

# Weekly schedule
fab job run-sch "Production.Workspace/Pipeline.DataPipeline" --type weekly --interval 10:00,16:00 --days Monday,Friday --start 2024-11-15T09:00:00 --end 2024-12-16T10:00:00 --enable

# Custom JSON configuration
fab job run-sch "Production.Workspace/Pipeline.DataPipeline" -i '{"enabled": true, "configuration": {"startDateTime": "2024-04-28T00:00:00", "endDateTime": "2024-04-30T23:59:00", "localTimeZoneId": "Central Standard Time", "type": "Cron", "interval": 10}}'

job run-update - Update Job Schedule

Syntax

fab job run-update <item_path> --id <schedule_id> [--type <type>] [--interval <interval>] [--enable] [--disable] [-i <json>]

Examples

# Disable schedule
fab job run-update "Production.Workspace/Pipeline.DataPipeline" --id <schedule-id> --disable

# Update frequency
fab job run-update "Production.Workspace/Pipeline.DataPipeline" --id <schedule-id> --type cron --interval 5 --enable

# Update with JSON
fab job run-update "Production.Workspace/Pipeline.DataPipeline" --id <schedule-id> -i '{"enabled": false}'

Table Commands

table schema - View Table Schema

Syntax

fab table schema <table_path>

Supported items

.Lakehouse, .Warehouse, .MirroredDatabase, .SQLDatabase, .SemanticModel, .KQLDatabase

Examples

fab table schema "Data.Workspace/LH.Lakehouse/Tables/dbo/customers"
fab table schema "Analytics.Workspace/DW.Warehouse/Tables/sales/orders"

table load - Load Data

Syntax

fab table load <table_path> --file <file_path> [--mode <mode>] [--format <format>] [--extension <ext>]

Flags

  • --file - Source file or folder path (lakehouse Files location)
  • --mode - Load mode (append, overwrite) - default: append
  • --format - Format options (e.g., format=csv,header=true,delimiter=;)
  • --extension - File extension filter

Note

Not supported in schema-enabled lakehouses.

Examples

# Load CSV from folder
fab table load "Data.Workspace/LH.Lakehouse/Tables/customers" --file "Data.Workspace/LH.Lakehouse/Files/csv/customers"

# Load specific CSV with append mode
fab table load "Data.Workspace/LH.Lakehouse/Tables/sales" --file "Data.Workspace/LH.Lakehouse/Files/daily_sales.csv" --mode append

# Load with custom CSV format
fab table load "Data.Workspace/LH.Lakehouse/Tables/products" --file "Data.Workspace/LH.Lakehouse/Files/data" --format "format=csv,header=false,delimiter=;"

# Load Parquet files
fab table load "Data.Workspace/LH.Lakehouse/Tables/events" --file "Data.Workspace/LH.Lakehouse/Files/parquet/events" --format format=parquet --mode append

table optimize - Optimize Table

Syntax

fab table optimize <table_path> [--vorder] [--zorder <columns>]

Flags

  • --vorder - Enable V-Order optimization
  • --zorder - Z-Order columns (comma-separated)

Note

Lakehouse only.

Examples

# Basic optimization
fab table optimize "Data.Workspace/LH.Lakehouse/Tables/transactions"

# V-Order optimization
fab table optimize "Data.Workspace/LH.Lakehouse/Tables/sales" --vorder

# V-Order + Z-Order
fab table optimize "Data.Workspace/LH.Lakehouse/Tables/customers" --vorder --zorder customer_id,region_id

table vacuum - Vacuum Table

Syntax

fab table vacuum <table_path> [--retain_n_hours <hours>]

Flags

  • --retain_n_hours - Retention period in hours (default: 168 = 7 days)

Note

Lakehouse only.

Examples

# Vacuum with default retention (7 days)
fab table vacuum "Data.Workspace/LH.Lakehouse/Tables/transactions"

# Vacuum with custom retention (48 hours)
fab table vacuum "Data.Workspace/LH.Lakehouse/Tables/temp_data" --retain_n_hours 48

Advanced Patterns

Batch Operations with Shell Scripts

#!/bin/bash

# Export all semantic models from workspace
WORKSPACE="Production.Workspace"
MODELS=$(fab api workspaces -q "value[?displayName=='Production'].id | [0]" | xargs -I {} fab api workspaces/{}/items -q "value[?type=='SemanticModel'].displayName")

for MODEL in $MODELS; do
  fab export "$WORKSPACE/$MODEL.SemanticModel" -o /tmp/exports
done

DAX Query Workflow

# 1. Get model ID
MODEL_ID=$(fab get "Production.Workspace/Sales.SemanticModel" -q "id")

# 2. Execute DAX query
fab api -A powerbi "datasets/$MODEL_ID/executeQueries" -X post -i '{
  "queries": [{
    "query": "EVALUATE TOPN(10, Sales, Sales[Amount], DESC)"
  }],
  "serializerSettings": {
    "includeNulls": false
  }
}'

# 3. Execute multiple queries
fab api -A powerbi "datasets/$MODEL_ID/executeQueries" -X post -i '{
  "queries": [
    {"query": "EVALUATE VALUES(Date[Year])"},
    {"query": "EVALUATE SUMMARIZE(Sales, Date[Year], \"Total\", SUM(Sales[Amount]))"}
  ]
}'

Semantic Model Update Workflow

# 1. Get current definition
fab get "Production.Workspace/Sales.SemanticModel" -q definition -o /tmp/current-def.json

# 2. Modify definition (edit JSON file)
# ... edit /tmp/current-def.json ...

# 3. Get workspace and model IDs
WS_ID=$(fab get "Production.Workspace" -q "id")
MODEL_ID=$(fab get "Production.Workspace/Sales.SemanticModel" -q "id")

# 4. Prepare update request (wrap definition)
cat > /tmp/update-request.json <<EOF
{
  "definition": $(cat /tmp/current-def.json)
}
EOF

# 5. Update definition
fab api -X post "workspaces/$WS_ID/semanticModels/$MODEL_ID/updateDefinition" -i /tmp/update-request.json --show_headers

# 6. Poll operation status (extract operation ID from Location header)
# Operation ID is in Location header: .../operations/{operation-id}
fab api "operations/<operation-id>"

Environment Migration Script

#!/bin/bash

SOURCE_WS="Dev.Workspace"
TARGET_WS="Production.Workspace"

# Export all exportable items
fab export "$SOURCE_WS" -o /tmp/migration -a

# Import items to target workspace
for ITEM in /tmp/migration/*.Notebook; do
  ITEM_NAME=$(basename "$ITEM")
  fab import "$TARGET_WS/$ITEM_NAME" -i "$ITEM"
done

for ITEM in /tmp/migration/*.DataPipeline; do
  ITEM_NAME=$(basename "$ITEM")
  fab import "$TARGET_WS/$ITEM_NAME" -i "$ITEM"
done

Job Monitoring Loop

#!/bin/bash

# Start job
JOB_ID=$(fab job start "Production.Workspace/ETL.Notebook" | grep -o '"id": "[^"]*"' | cut -d'"' -f4)

# Poll status every 10 seconds
while true; do
  STATUS=$(fab job run-status "Production.Workspace/ETL.Notebook" --id "$JOB_ID" -q "status")
  echo "Job status: $STATUS"

  if [[ "$STATUS" == "Completed" ]] || [[ "$STATUS" == "Failed" ]]; then
    break
  fi

  sleep 10
done

echo "Job finished with status: $STATUS"

Workspace Inventory

#!/bin/bash

# Get all workspaces and their item counts
WORKSPACES=$(fab api workspaces -q "value[].{name: displayName, id: id}")

echo "$WORKSPACES" | jq -r '.[] | [.name, .id] | @tsv' | while IFS=$'\t' read -r NAME ID; do
  ITEM_COUNT=$(fab api "workspaces/$ID/items" -q "value | length")
  echo "$NAME: $ITEM_COUNT items"
done

JMESPath Quick Reference

Common JMESPath patterns for -q flag:

# Get field
-q "id"
-q "displayName"

# Get nested field
-q "properties.sqlEndpointProperties"
-q "definition.parts[0]"

# Filter array
-q "value[?type=='Lakehouse']"
-q "value[?contains(name, 'prod')]"
-q "value[?starts_with(displayName, 'Test')]"

# Get first/last element
-q "value[0]"
-q "value[-1]"

# Pipe operations
-q "definition.parts[?path=='model.tmdl'] | [0]"
-q "definition.parts[?path=='definition/tables/Sales.tmdl'].payload | [0]"

# Projections (select specific fields)
-q "value[].{name: displayName, id: id, type: type}"

# Length/count
-q "value | length"

# Multi-select list
-q "value[].[displayName, id, type]"

# Flatten
-q "value[].items[]"

# Sort
-q "sort_by(value, &displayName)"

# Boolean logic
-q "value[?type=='Lakehouse' && contains(displayName, 'prod')]"
-q "value[?type=='Lakehouse' || type=='Warehouse']"

# Contains
-q "contains(value[].type, 'Lakehouse')"

Common Error Scenarios

Authentication Issues

# 403 Forbidden - Check authentication
fab auth login

# 401 Unauthorized - Token expired, re-authenticate
fab auth login

# Use service principal for automation
fab auth login -u <client-id> -p <client-secret> --tenant <tenant-id>

Resource Not Found

# 404 Not Found - Check resource exists
fab exists "Production.Workspace/Sales.SemanticModel"

# List available resources
fab ls "Production.Workspace"

# Get resource ID for API calls
fab get "Production.Workspace/Sales.SemanticModel" -q "id"

Job Failures

# Check job status
fab job run-status "Production.Workspace/ETL.Notebook" --id <job-id>

# View job history for patterns
fab job run-list "Production.Workspace/ETL.Notebook"

# Run with timeout to prevent hanging
fab job run "Production.Workspace/ETL.Notebook" --timeout 300

API Errors

# 400 Bad Request - Check JSON payload
fab api -X post "workspaces/<ws-id>/items" -i /tmp/payload.json --show_headers

# Debug with headers
fab api workspaces --show_headers

# Save response to inspect
fab api workspaces -o /tmp/debug.json

Performance Tips

  1. Use ls instead of get for checking existence - 10-20x faster
  2. Use exists before get operations - Avoids expensive failed gets
  3. Filter with JMESPath -q - Reduce response size
  4. Use GUIDs in automation - More stable than display names
  5. Batch exports - Export workspace with -a instead of individual items
  6. Parallel job execution - Use job start + polling for multiple jobs
  7. Cache workspace/item IDs - Avoid repeated get calls for IDs
  8. Use appropriate API audience - Power BI API is faster for dataset queries

Security Best Practices

  1. Use service principals for automation - Don't use interactive auth in scripts
  2. Store credentials securely - Use environment variables or key vaults
  3. Use least-privilege access - Grant minimal required permissions
  4. Audit API calls - Log all API operations in production
  5. Validate inputs - Sanitize user inputs before passing to API
  6. Use force flag carefully - -f skips confirmations, easy to delete wrong resources