---
llm-context: developer-guide
category: workflows
title: Emergency Lockdown Workflow
difficulty: beginner
time: 3 minutes
format: markdown
updated: 
---


# Emergency Lockdown Workflow

Complete code to lock down all doors immediately during security incidents. Fast, simple, and reversible.

## The Workflow

**Scenario:** Security incident. Need to lock down entire building immediately.

**What we&#39;ll do:**
1. Get all channels (doors)
2. Set each to lockdown mode
3. Verify lockdown complete

**Time:** About 2-5 seconds (depends on number of doors)

## When to Use

**Emergency lockdown for:**
- Active security threat
- Fire alarm (if building requires lockdown)
- Evacuation procedures
- After-hours security
- Testing emergency procedures

**How it works:**
- Lockdown mode locks all doors
- No credentials work (cards, PINs, mobile)
- Doors remain locked until manually restored to normal

## Quick Lockdown Script

### Bash Version

Fast command-line lockdown:

```bash
#!/bin/bash
# Emergency Lockdown Script
# Usage: ./lockdown.sh

ACCESS_TOKEN=&quot;your_access_token_here&quot;
BASE_URL=&quot;https://api.doorflow.com/api/3&quot;

echo &quot;INITIATING EMERGENCY LOCKDOWN...&quot;
echo &quot;&quot;

# Get all channels
CHANNELS_RESPONSE=$(curl -s -X GET &quot;$BASE_URL/channels&quot; \
  -H &quot;Authorization: Bearer $ACCESS_TOKEN&quot;)

# Extract channel IDs
CHANNEL_IDS=$(echo $CHANNELS_RESPONSE | jq -r &#39;.channels[].id&#39;)
CHANNEL_COUNT=$(echo $CHANNEL_IDS | wc -w)

echo &quot;Locking down $CHANNEL_COUNT doors...&quot;
echo &quot;&quot;

# Lockdown each channel
for CHANNEL_ID in $CHANNEL_IDS; do
  CHANNEL_NAME=$(echo $CHANNELS_RESPONSE | jq -r &quot;.channels[] | select(.id==$CHANNEL_ID) | .name&quot;)

  echo &quot;Locking: $CHANNEL_NAME (ID: $CHANNEL_ID)...&quot;

  curl -s -X POST &quot;$BASE_URL/channels/$CHANNEL_ID/lockdown&quot; \
    -H &quot;Authorization: Bearer $ACCESS_TOKEN&quot; &gt; /dev/null

  echo &quot;[OK] $CHANNEL_NAME locked down&quot;
done

echo &quot;&quot;
echo &quot;=============================&quot;
echo &quot;LOCKDOWN COMPLETE&quot;
echo &quot;=============================&quot;
echo &quot;&quot;
echo &quot;All $CHANNEL_COUNT doors are now in lockdown mode.&quot;
echo &quot;No credentials will grant access.&quot;
echo &quot;&quot;
echo &quot;To restore normal operation: ./unlock_all.sh&quot;
```

**Save as:** `lockdown.sh`

**Run:**
```bash
chmod +x lockdown.sh
./lockdown.sh
```

### JavaScript Version

```javascript
async function emergencyLockdown() {
  const accessToken = process.env.DOORFLOW_ACCESS_TOKEN;
  const baseURL = &#39;https://api.doorflow.com/api/3&#39;;

  try {
    console.log(&#39;INITIATING EMERGENCY LOCKDOWN...\n&#39;);

    // Step 1: Get all channels
    const channelsResponse = await fetch(`${baseURL}/channels`, {
      headers: {
        &#39;Authorization&#39;: `Bearer ${accessToken}`,
      },
    });

    if (!channelsResponse.ok) {
      throw new Error(`Failed to get channels: ${await channelsResponse.text()}`);
    }

    const { channels } = await channelsResponse.json();
    console.log(`Locking down ${channels.length} doors...\n`);

    // Step 2: Lockdown each channel
    const results = [];

    for (const channel of channels) {
      try {
        console.log(`Locking: ${channel.name} (ID: ${channel.id})...`);

        const lockdownResponse = await fetch(`${baseURL}/channels/${channel.id}/lockdown`, {
          method: &#39;POST&#39;,
          headers: {
            &#39;Authorization&#39;: `Bearer ${accessToken}`,
          },
        });

        if (lockdownResponse.ok) {
          console.log(`[OK] ${channel.name} locked down`);
          results.push({ channelId: channel.id, name: channel.name, success: true });
        } else {
          console.log(`[ERROR] Failed to lock ${channel.name}`);
          results.push({ channelId: channel.id, name: channel.name, success: false });
        }

      } catch (error) {
        console.error(`[ERROR] ${channel.name}: ${error.message}`);
        results.push({ channelId: channel.id, name: channel.name, success: false, error: error.message });
      }
    }

    // Summary
    const successful = results.filter(r =&gt; r.success);
    const failed = results.filter(r =&gt; !r.success);

    console.log(&#39;\n=============================&#39;);
    console.log(&#39;LOCKDOWN COMPLETE&#39;);
    console.log(&#39;=============================\n&#39;);
    console.log(`Doors locked: ${successful.length}`);
    console.log(`Failed: ${failed.length}`);

    if (failed.length &gt; 0) {
      console.log(&#39;\nFailed doors:&#39;);
      failed.forEach(f =&gt; console.log(`  - ${f.name} (ID: ${f.channelId})`));
    }

    console.log(&#39;\nAll doors are in lockdown mode.&#39;);
    console.log(&#39;No credentials will grant access.&#39;);
    console.log(&#39;\nTo restore: unlockAll()&#39;);

    return {
      totalDoors: channels.length,
      locked: successful.length,
      failed: failed.length,
      results: results,
    };

  } catch (error) {
    console.error(&#39;LOCKDOWN FAILED:&#39;, error);
    throw error;
  }
}

// Usage
emergencyLockdown()
  .then(result =&gt; {
    console.log(&#39;\nLockdown result:&#39;, result);
  })
  .catch(error =&gt; {
    console.error(&#39;Error:&#39;, error.message);
  });
```

## Restore Normal Operation

Unlock all doors after emergency is over:

### Bash Version

```bash
#!/bin/bash
# Restore Normal Operation Script
# Usage: ./unlock_all.sh

ACCESS_TOKEN=&quot;your_access_token_here&quot;
BASE_URL=&quot;https://api.doorflow.com/api/3&quot;

echo &quot;Restoring normal operation...&quot;
echo &quot;&quot;

# Get all channels
CHANNELS_RESPONSE=$(curl -s -X GET &quot;$BASE_URL/channels&quot; \
  -H &quot;Authorization: Bearer $ACCESS_TOKEN&quot;)

CHANNEL_IDS=$(echo $CHANNELS_RESPONSE | jq -r &#39;.channels[].id&#39;)

# Restore each channel to normal
for CHANNEL_ID in $CHANNEL_IDS; do
  CHANNEL_NAME=$(echo $CHANNELS_RESPONSE | jq -r &quot;.channels[] | select(.id==$CHANNEL_ID) | .name&quot;)

  curl -s -X POST &quot;$BASE_URL/channels/$CHANNEL_ID/normal&quot; \
    -H &quot;Authorization: Bearer $ACCESS_TOKEN&quot; &gt; /dev/null

  echo &quot;[OK] $CHANNEL_NAME restored to normal&quot;
done

echo &quot;&quot;
echo &quot;[OK] All channels restored to normal operation&quot;
echo &quot;[OK] Access control is now active&quot;
```

### JavaScript Version

```javascript
async function unlockAll() {
  const accessToken = process.env.DOORFLOW_ACCESS_TOKEN;
  const baseURL = &#39;https://api.doorflow.com/api/3&#39;;

  try {
    console.log(&#39;Restoring normal operation...\n&#39;);

    // Get all channels
    const channelsResponse = await fetch(`${baseURL}/channels`, {
      headers: {
        &#39;Authorization&#39;: `Bearer ${accessToken}`,
      },
    });

    const { channels } = await channelsResponse.json();
    console.log(`Restoring ${channels.length} doors...\n`);

    // Restore each channel to normal mode
    for (const channel of channels) {
      console.log(`Restoring: ${channel.name}...`);

      await fetch(`${baseURL}/channels/${channel.id}/normal`, {
        method: &#39;POST&#39;,
        headers: {
          &#39;Authorization&#39;: `Bearer ${accessToken}`,
        },
      });

      console.log(`[OK] ${channel.name} restored`);
    }

    console.log(&#39;\n[OK] All channels restored to normal operation&#39;);
    console.log(&#39;[OK] Access control is now active&#39;);

    return {
      totalDoors: channels.length,
      restored: channels.length,
    };

  } catch (error) {
    console.error(&#39;Restore failed:&#39;, error);
    throw error;
  }
}

// Usage
unlockAll()
  .then(result =&gt; console.log(&#39;Restore complete:&#39;, result))
  .catch(error =&gt; console.error(&#39;Error:&#39;, error.message));
```

## Selective Lockdown

Lock down specific doors only (e.g., one floor):

```javascript
async function selectiveLockdown(channelIds) {
  const accessToken = process.env.DOORFLOW_ACCESS_TOKEN;
  const baseURL = &#39;https://api.doorflow.com/api/3&#39;;

  try {
    console.log(`Locking down ${channelIds.length} specific doors...\n`);

    for (const channelId of channelIds) {
      // Get channel name for logging
      const channelResponse = await fetch(`${baseURL}/channels/${channelId}`, {
        headers: { &#39;Authorization&#39;: `Bearer ${accessToken}` },
      });

      const channel = await channelResponse.json();
      console.log(`Locking: ${channel.name}...`);

      // Lockdown this channel
      await fetch(`${baseURL}/channels/${channelId}/lockdown`, {
        method: &#39;POST&#39;,
        headers: {
          &#39;Authorization&#39;: `Bearer ${accessToken}`,
        },
      });

      console.log(`[OK] ${channel.name} locked down`);
    }

    console.log(&#39;\n[OK] Selective lockdown complete&#39;);

    return {
      doorsLocked: channelIds.length,
    };

  } catch (error) {
    console.error(&#39;Selective lockdown failed:&#39;, error);
    throw error;
  }
}

// Usage: Lock down only floors 2 and 3
const floor2And3Doors = [1340, 1341, 1342, 1343];
selectiveLockdown(floor2And3Doors)
  .then(result =&gt; console.log(&#39;Selective lockdown complete:&#39;, result));
```

## Lockdown Status Check

Verify which doors are in lockdown:

```javascript
async function checkLockdownStatus() {
  const accessToken = process.env.DOORFLOW_ACCESS_TOKEN;
  const baseURL = &#39;https://api.doorflow.com/api/3&#39;;

  try {
    // Get all channels
    const channelsResponse = await fetch(`${baseURL}/channels`, {
      headers: { &#39;Authorization&#39;: `Bearer ${accessToken}` },
    });

    const { channels } = await channelsResponse.json();

    // Check mode of each channel
    const lockdownDoors = [];
    const normalDoors = [];

    for (const channel of channels) {
      if (channel.mode === &#39;lockdown&#39;) {
        lockdownDoors.push(channel);
      } else if (channel.mode === &#39;normal&#39;) {
        normalDoors.push(channel);
      }
    }

    console.log(&#39;Lockdown Status:\n&#39;);
    console.log(`Doors in lockdown: ${lockdownDoors.length}`);
    console.log(`Doors normal: ${normalDoors.length}`);

    if (lockdownDoors.length &gt; 0) {
      console.log(&#39;\nDoors in lockdown:&#39;);
      lockdownDoors.forEach(d =&gt; console.log(`  - ${d.name} (ID: ${d.id})`));
    }

    return {
      totalDoors: channels.length,
      lockdownDoors: lockdownDoors.length,
      normalDoors: normalDoors.length,
      lockedDownList: lockdownDoors,
    };

  } catch (error) {
    console.error(&#39;Status check failed:&#39;, error);
    throw error;
  }
}

// Usage
checkLockdownStatus()
  .then(result =&gt; console.log(&#39;Status:&#39;, result));
```

## Lockdown with Notification

Send alerts when lockdown is activated:

```javascript
async function lockdownWithAlert(reason) {
  try {
    console.log(`EMERGENCY LOCKDOWN: ${reason}\n`);

    // Lockdown all doors
    const result = await emergencyLockdown();

    // Log the incident
    await db.insert(&#39;security_incidents&#39;, {
      type: &#39;lockdown&#39;,
      reason: reason,
      initiated_by: currentUser.id,
      initiated_at: new Date(),
      doors_locked: result.locked,
    });

    // Send alerts
    await sendEmergencyAlerts({
      type: &#39;lockdown&#39;,
      reason: reason,
      doorsLocked: result.locked,
      time: new Date(),
    });

    console.log(&#39;[OK] Emergency alerts sent&#39;);

    return result;

  } catch (error) {
    console.error(&#39;Lockdown with alert failed:&#39;, error);
    throw error;
  }
}

async function sendEmergencyAlerts(details) {
  // Email security team
  await emailService.send({
    to: [&#39;security@company.com&#39;, &#39;facilities@company.com&#39;],
    subject: `EMERGENCY: Building Lockdown Activated`,
    body: `
      Emergency lockdown has been activated.

      Reason: ${details.reason}
      Time: ${details.time.toLocaleString()}
      Doors locked: ${details.doorsLocked}

      All building access is now restricted.
    `,
    priority: &#39;high&#39;,
  });

  // SMS security team
  await smsService.send({
    to: [&#39;+1234567890&#39;, &#39;+0987654321&#39;],
    message: `EMERGENCY LOCKDOWN: ${details.reason}. ${details.doorsLocked} doors locked at ${details.time.toLocaleTimeString()}`,
  });

  // Post to Slack security channel
  await slackApp.client.chat.postMessage({
    channel: &#39;#security-alerts&#39;,
    text: `EMERGENCY LOCKDOWN ACTIVATED`,
    blocks: [
      {
        type: &#39;section&#39;,
        text: {
          type: &#39;mrkdwn&#39;,
          text: `*EMERGENCY: Building Lockdown*\n\nReason: ${details.reason}\nTime: ${details.time.toLocaleString()}\nDoors locked: ${details.doorsLocked}`,
        },
      },
    ],
  });
}

// Usage
lockdownWithAlert(&#39;Active security threat in building&#39;)
  .then(result =&gt; console.log(&#39;Lockdown complete with alerts sent&#39;));
```

## Best Practices

**1. Test lockdown regularly:**
```javascript
// Monthly lockdown test
async function testLockdown() {
  console.log(&#39;LOCKDOWN TEST - This is a drill\n&#39;);

  await emergencyLockdown();

  // Wait 30 seconds
  await new Promise(resolve =&gt; setTimeout(resolve, 30000));

  await unlockAll();

  console.log(&#39;LOCKDOWN TEST COMPLETE&#39;);
}
```

**2. Log all lockdowns:**
```javascript
// Always log lockdown events
await db.insert(&#39;lockdown_log&#39;, {
  initiated_by: currentUser.id,
  reason: reason,
  doors_locked: result.locked,
  timestamp: new Date(),
});
```

**3. Verify lockdown succeeded:**
```javascript
async function verifyLockdown() {
  const status = await checkLockdownStatus();

  if (status.normalDoors &gt; 0) {
    console.log(&#39;[WARNING] Some doors not in lockdown!&#39;);
    return false;
  }

  console.log(&#39;[OK] All doors locked down&#39;);
  return true;
}
```

**4. Have manual override process:**
- Physical key override at doors
- Manual unlock button inside building
- Don&#39;t rely solely on API

**5. Document lockdown procedures:**
- Who can initiate lockdown
- When to use lockdown
- How to restore normal operation
- Emergency contact numbers

## Channel Modes Reference

**Available modes:**
- `normal` - Standard access control (credentials work)
- `lockdown` - All access denied (no credentials work)
- `unlock` - Door stays unlocked (anyone can enter)

**Set mode:**
```bash
# Lockdown
POST /api/3/channels/{channel_id}/lockdown

# Normal
POST /api/3/channels/{channel_id}/normal

# Unlock (open)
POST /api/3/channels/{channel_id}/unlock
```

## Required OAuth Scopes

- `account.channel.readonly` - List channels
- `account.channel.admit` - Change channel modes

## Next Steps

**Related workflows:**
- [After-Hours Access] - Remote unlock for specific people
- [Events and Audit Trail] - Monitor lockdown events

**Learn more:**
- [Core Resources] - Understanding channels
- [Access Control Model] - How access works

