Account Admin Bulk Management

Manage users across multiple ACC/BIM 360 projects with bulk operations, resumable state, and progress tracking.

Workflow Overview

User Operations
Add Users
Remove Users
Update Roles
Folder Rights
Project Files
Plans
Custom Folders
Bulk Features
50 Parallel Requests
Auto-Retry (429)
Progress Tracking
State Management
Resumable Ops
Dry-Run Mode
Operation History
Select Projects → Configure Operation → Execute → Track Progress

CLI Approach

Add User to Multiple Projects

ACCOUNT_ID="your-account-id"
EMAIL="newuser@company.com"

# Add user to all projects
raps admin user add "$ACCOUNT_ID" "$EMAIL" --role project_admin

# Add user to specific projects (regex filter)
raps admin user add "$ACCOUNT_ID" "$EMAIL" --role project_admin \
  --filter "^Downtown|^Hospital"

# Preview changes with dry-run
raps admin user add "$ACCOUNT_ID" "$EMAIL" --role project_admin --dry-run

Remove User from Projects

# Remove user from all projects
raps admin user remove "$ACCOUNT_ID" "departed@company.com"

# Remove from specific projects
raps admin user remove "$ACCOUNT_ID" "departed@company.com" \
  --filter "^2024-.*"

# Dry-run to preview
raps admin user remove "$ACCOUNT_ID" "departed@company.com" --dry-run

Update User Roles

# Promote user across all projects
raps admin user update-role "$ACCOUNT_ID" "user@company.com" --role project_admin

# Update role in filtered projects
raps admin user update-role "$ACCOUNT_ID" "user@company.com" \
  --role viewer --filter "^Archive-"

Manage Folder Permissions

# Grant access to Project Files folder
raps admin folder rights "$ACCOUNT_ID" "contractor@partner.com" \
  --permission edit --folder project_files

# Grant access to Plans folder
raps admin folder rights "$ACCOUNT_ID" "reviewer@client.com" \
  --permission view --folder plans

# Custom folder by ID
raps admin folder rights "$ACCOUNT_ID" "user@company.com" \
  --permission control --folder "urn:adsk.wipprod:fs.folder:abc123"

List and Filter Projects

# List all projects
raps admin project list "$ACCOUNT_ID"

# Filter by name pattern
raps admin project list "$ACCOUNT_ID" --filter "Downtown"

# Filter by status and platform
raps admin project list "$ACCOUNT_ID" --status active --platform acc

# Limit results
raps admin project list "$ACCOUNT_ID" --limit 10 --output json

Operation Management

Track Operation Progress

# View current operation status
raps admin operation status

# View specific operation
raps admin operation status --id "550e8400-e29b-41d4-a716-446655440000"

# List all operations
raps admin operation list

# Filter by status
raps admin operation list --status in_progress

Resume Interrupted Operations

# Resume most recent in-progress operation
raps admin operation resume

# Resume specific operation
raps admin operation resume --id "550e8400-e29b-41d4-a716-446655440000"

Cancel Operations

# Cancel current operation
raps admin operation cancel

# Cancel specific operation
raps admin operation cancel --id "550e8400-e29b-41d4-a716-446655440000"

CI/CD Pipeline

# .github/workflows/user-onboarding.yml
name: User Onboarding

on:
  workflow_dispatch:
    inputs:
      email:
        description: 'User email to onboard'
        required: true
      role:
        description: 'Role to assign'
        required: true
        default: 'project_admin'
        type: choice
        options:
          - project_admin
          - project_manager
          - viewer
      filter:
        description: 'Project filter regex (optional)'
        required: false

env:
  ACCOUNT_ID: ${{ secrets.ACC_ACCOUNT_ID }}

jobs:
  onboard-user:
    runs-on: ubuntu-latest
    steps:
      - name: Install RAPS
        run: cargo install raps

      - name: Authenticate
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
          APS_REFRESH_TOKEN: ${{ secrets.APS_REFRESH_TOKEN }}
        run: raps auth refresh

      - name: Add user to projects
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          FILTER_ARG=""
          if [ -n "${{ github.event.inputs.filter }}" ]; then
            FILTER_ARG="--filter ${{ github.event.inputs.filter }}"
          fi

          raps admin user add "$ACCOUNT_ID" "${{ github.event.inputs.email }}" \
            --role ${{ github.event.inputs.role }} \
            $FILTER_ARG \
            --output json > result.json

      - name: Generate report
        run: |
          echo "# User Onboarding Report" > report.md
          echo "**User:** ${{ github.event.inputs.email }}" >> report.md
          echo "**Role:** ${{ github.event.inputs.role }}" >> report.md
          echo "**Date:** $(date)" >> report.md
          echo "" >> report.md

          TOTAL=$(jq '.total' result.json)
          SUCCESS=$(jq '.succeeded' result.json)
          SKIPPED=$(jq '.skipped' result.json)
          FAILED=$(jq '.failed' result.json)

          echo "## Results" >> report.md
          echo "- Total projects: $TOTAL" >> report.md
          echo "- Succeeded: $SUCCESS" >> report.md
          echo "- Skipped: $SKIPPED" >> report.md
          echo "- Failed: $FAILED" >> report.md

      - name: Upload report
        uses: actions/upload-artifact@v4
        with:
          name: onboarding-report
          path: |
            report.md
            result.json

Pipeline Flow

Trigger
Manual Dispatch
Auth
Refresh Token
3-Leg OAuth
Bulk Operation
Filter Projects
Add User (50 parallel)
Report
report.md
result.json

Offboarding Script

#!/bin/bash
# offboard-user.sh - Complete user removal

set -e

ACCOUNT_ID="$1"
EMAIL="$2"

if [ -z "$ACCOUNT_ID" ] || [ -z "$EMAIL" ]; then
  echo "Usage: offboard-user.sh <account_id> <email>"
  exit 1
fi

echo "Offboarding user: $EMAIL"
echo "================================"

# Step 1: Preview changes
echo "Step 1: Preview removal..."
raps admin user remove "$ACCOUNT_ID" "$EMAIL" --dry-run

read -p "Proceed with removal? (y/N) " confirm
if [ "$confirm" != "y" ]; then
  echo "Cancelled."
  exit 0
fi

# Step 2: Remove user from all projects
echo "Step 2: Removing user from projects..."
raps admin user remove "$ACCOUNT_ID" "$EMAIL" --output json > removal-result.json

# Step 3: Generate report
echo "Step 3: Generating report..."
TOTAL=$(jq '.total' removal-result.json)
REMOVED=$(jq '.succeeded' removal-result.json)
SKIPPED=$(jq '.skipped' removal-result.json)

echo ""
echo "Offboarding Complete"
echo "===================="
echo "User: $EMAIL"
echo "Projects processed: $TOTAL"
echo "Successfully removed: $REMOVED"
echo "Skipped (not in project): $SKIPPED"
echo ""
echo "Full results saved to: removal-result.json"

Batch User Management

Onboard Multiple Users

#!/bin/bash
# batch-onboard.sh

ACCOUNT_ID="your-account-id"
ROLE="project_admin"

# Users to onboard (one per line)
USERS=(
  "user1@company.com"
  "user2@company.com"
  "user3@company.com"
)

for email in "${USERS[@]}"; do
  echo "Onboarding: $email"
  raps admin user add "$ACCOUNT_ID" "$email" --role "$ROLE" \
    --output json >> onboarding-results.jsonl
  echo "---"
done

echo "Batch onboarding complete. Results in onboarding-results.jsonl"

Role Migration

#!/bin/bash
# migrate-roles.sh - Migrate users from one role to another

ACCOUNT_ID="your-account-id"
OLD_ROLE="viewer"
NEW_ROLE="project_admin"
PROJECT_FILTER="^2024-Active"

# Get users with old role
raps admin project list "$ACCOUNT_ID" --filter "$PROJECT_FILTER" --output json |
  jq -r '.[].id' | while read project_id; do
    raps acc project-user list "$project_id" --output json |
      jq -r --arg role "$OLD_ROLE" '.[] | select(.role == $role) | .email'
  done | sort -u > users-to-migrate.txt

echo "Found $(wc -l < users-to-migrate.txt) users to migrate"

# Migrate each user
while read email; do
  echo "Migrating: $email"
  raps admin user update-role "$ACCOUNT_ID" "$email" \
    --role "$NEW_ROLE" --filter "$PROJECT_FILTER"
done < users-to-migrate.txt

Permission Levels

LevelActionsUse Case
viewView filesRead-only access
view_downloadView + downloadReviewers, clients
uploadView + download + uploadContributors
editFull edit accessTeam members
controlFull control + permissionsAdministrators

Exit Codes

CodeMeaning
0All operations succeeded
1Partial success (some failed)
2Operation failed to start
3User cancelled

Troubleshooting

Rate Limiting

The bulk operations automatically handle rate limits with exponential backoff:

[2/100] Rate limited, waiting 2s before retry...
[2/100] Retry 1/3 for project-123
[2/100] Success after retry

User Not Found

If a user doesn’t exist in the account:

# The operation will skip projects where user isn't found
raps admin user remove "$ACCOUNT_ID" "unknown@company.com"
# Output: Skipped 50 projects (user not in project)

Resuming Failed Operations

# Check operation history
raps admin operation list --status failed

# Resume with specific ID
raps admin operation resume --id "operation-uuid"