Scheduled Access Levels


title: “Scheduled Access Levels”

Scheduled access levels allow temporary access assignment to cardholders. Access levels are automatically activated and removed based on configured date ranges by the Scheduled Access Level Service.


Overview

Feature Description
Activation Access level automatically assigned when ActiveOn date is reached
Expiration Access level automatically removed when ExpiresOn date is reached
Service-Managed The Scheduled Access Level Service handles all assignments
Object Links Uses ScheduledAccessLevel relation with metadata

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                    Scheduled Access Level                       │
├─────────────────────────────────────────────────────────────────┤
│  1. User assigns ScheduledAccessLevel to Person                 │
│  2. Service checks ActiveOn/ExpiresOn dates on schedule         │
│  3. When ActiveOn <= now: Service adds AccessLevel link         │
│  4. When ExpiresOn <= now: Service removes both links           │
└─────────────────────────────────────────────────────────────────┘

Assigning a Scheduled Access Level

Required Information

Field Description
accessLevel The access level object to schedule
ActiveOn When the access level should be activated
ExpiresOn When the access level should expire

C# Example

// Schedule an access level for a visitor
DateTime? activeOn = new DateTime(2025, 08, 20);  // Starts Aug 20, 2025
DateTime expiresOn = new DateTime(2025, 08, 27);  // Expires Aug 27, 2025

await client.AssignConnectedObjectAsync(
    person, 
    accessLevel, 
    "ScheduledAccessLevel", 
    false, 
    new { ActiveOn = activeOn, ExpiresOn = expiresOn }
);

Before Activation (Scheduled Only)

{
    "ObjectLinks": [
        {
            "LinkedObjectId": "12345",
            "CommonName": "Visitor Access",
            "Relation": "ScheduledAccessLevel",
            "Metadata": {
                "ActiveOn": "2025-08-20 12:00:00 AM",
                "ExpiresOn": "2025-08-27 12:00:00 AM"
            }
        }
    ]
}
{
    "ObjectLinks": [
        {
            "LinkedObjectId": "12345",
            "CommonName": "Visitor Access",
            "Relation": "ScheduledAccessLevel",
            "Metadata": {
                "ActiveOn": null,
                "ExpiresOn": "2025-08-27 12:00:00 AM"
            }
        },
        {
            "LinkedObjectId": "12345",
            "CommonName": "Visitor Access",
            "Relation": "AccessLevel"
        }
    ]
}

Note: After activation, ActiveOn is set to null to prevent duplicate processing.


Service Behavior

Activation Logic

The service activates an access level when:

  • ActiveOn <= now
  • ExpiresOn >= now
  • Access level is not already assigned to the person

Expiration Logic

The service removes access when:

  • ExpiresOn <= now
  • Both ScheduledAccessLevel and AccessLevel links are removed

Service Query Optimization

The service only queries for scheduled access levels where:

  • ActiveOn <= now (needs activation)
  • ExpiresOn <= now (needs removal)

Edge Cases

Scenario Behavior
Missing ExpiresOn Object link is deleted entirely
Invalid metadata Object link is deleted entirely
Already assigned No duplicate assignment occurs
Future ActiveOn No action until date is reached

Use Cases

Scenario ActiveOn ExpiresOn
Visitor access Arrival date Departure date
Contractor Project start Project end
Temporary employee Start date Contract end
Event access Event day 8 AM Event day 6 PM

Add Scheduled Access Level Batch For Person Async

Example in C#

// Returns: nothing
await client.AddScheduledAccessLevelBatchForPersonAsync(PersonInfo person, ObjectLinkItem scheduledAccessLevelLinkItems);

Overview of AddScheduledAccessLevelBatchForPersonAsync goes here.

Add Scheduled Access Level Batch For Person Async

Example in C#

// Returns: nothing
await client.AddScheduledAccessLevelBatchForPersonAsync(String personHref, ObjectLinkItem scheduledAccessLevelLinkItems, String batchLink);

Overview of AddScheduledAccessLevelBatchForPersonAsync goes here.

Add Scheduled Access Level Group Batch For Person Async

Example in C#

// Returns: nothing
await client.AddScheduledAccessLevelGroupBatchForPersonAsync(PersonInfo person, ObjectLinkItem scheduledAccessLevelGroupLinkItems);

Overview of AddScheduledAccessLevelGroupBatchForPersonAsync goes here.

Add Scheduled Access Level Group Batch For Person Async

Example in C#

// Returns: nothing
await client.AddScheduledAccessLevelGroupBatchForPersonAsync(String personHref, ObjectLinkItem scheduledAccessLevelGroupLinkItems, String batchLink);

Overview of AddScheduledAccessLevelGroupBatchForPersonAsync goes here.

Remove Scheduled Access Level Batch For Person Async

Example in C#

// Returns: nothing
await client.RemoveScheduledAccessLevelBatchForPersonAsync(PersonInfo person, ObjectLinkItem scheduledAccessLevelLinkItems);

Overview of RemoveScheduledAccessLevelBatchForPersonAsync goes here.

Remove Scheduled Access Level Batch For Person Async

Example in C#

// Returns: nothing
await client.RemoveScheduledAccessLevelBatchForPersonAsync(String personHref, ObjectLinkItem scheduledAccessLevelLinkItems, String batchLink);

Overview of RemoveScheduledAccessLevelBatchForPersonAsync goes here.

Remove Scheduled Access Level Group Batch For Person Async

Example in C#

// Returns: nothing
await client.RemoveScheduledAccessLevelGroupBatchForPersonAsync(PersonInfo person, ObjectLinkItem scheduledAccessLevelGroupLinkItems);

Overview of RemoveScheduledAccessLevelGroupBatchForPersonAsync goes here.

Remove Scheduled Access Level Group Batch For Person Async

Example in C#

// Returns: nothing
await client.RemoveScheduledAccessLevelGroupBatchForPersonAsync(String personHref, ObjectLinkItem scheduledAccessLevelGroupLinkItems, String batchLink);

Overview of RemoveScheduledAccessLevelGroupBatchForPersonAsync goes here.

Set Scheduled Access Level Batch For Person Async

Example in C#

// Returns: nothing
await client.SetScheduledAccessLevelBatchForPersonAsync(PersonInfo person, ObjectLinkItem scheduledAccessLevelLinkItems);

Overview of SetScheduledAccessLevelBatchForPersonAsync goes here.

Set Scheduled Access Level Batch For Person Async

Example in C#

// Returns: nothing
await client.SetScheduledAccessLevelBatchForPersonAsync(String personHref, ObjectLinkItem scheduledAccessLevelLinkItems, String batchLink);

Overview of SetScheduledAccessLevelBatchForPersonAsync goes here.

Set Scheduled Access Level Group Batch For Person Async

Example in C#

// Returns: nothing
await client.SetScheduledAccessLevelGroupBatchForPersonAsync(PersonInfo person, ObjectLinkItem scheduledAccessLevelGroupLinkItems);

Overview of SetScheduledAccessLevelGroupBatchForPersonAsync goes here.

Set Scheduled Access Level Group Batch For Person Async

Example in C#

// Returns: nothing
await client.SetScheduledAccessLevelGroupBatchForPersonAsync(String personHref, ObjectLinkItem scheduledAccessLevelGroupLinkItems, String batchLink);

Overview of SetScheduledAccessLevelGroupBatchForPersonAsync goes here.