Repository navigation
web sdk access control
Access control in Security Center answers a simple question: can this person access this place at this time?
In Web SDK terms, that question is built from a small set of entities:
-
CardholderandVisitorrepresent the people. -
Credentialis how the person is identified. -
CardholderGrouplets you manage multiple people together. -
Scheduledefines when access applies. -
Door,DoorSide,Elevator,Floor, andArearepresent where access applies. -
AccessRuleties those pieces together.
Access is granted or denied to people, not to credentials. A credential is only the way the system identifies the person who is requesting access.
This model is the foundation for the request patterns and examples later in the guide.
The access-control model can be summarized like this:
| Question | Main entities | Meaning |
|---|---|---|
| Who? |
Cardholder, Visitor, CardholderGroup
|
The person or group of people requesting access |
| How is the person identified? | Credential |
The card, PIN, mobile credential, or other format presented to the system |
| Where? |
Door, DoorSide, Elevator, Floor, Area
|
The place where access is requested |
| When? | Schedule |
The time window when access is allowed or denied |
| What decides the result? | AccessRule |
The configuration that combines people, places, and schedules |
The relationships between the main access-control entities look like this:
classDiagram
class Cardholder
class Visitor
class Credential
class CardholderGroup
class AccessRule
class Schedule
class Door
class DoorSide
class Elevator
class Floor
class Area
Visitor --|> Cardholder
Cardholder "1" --> "0..*" Credential : identified by
CardholderGroup "1" --> "0..*" Cardholder : contains
AccessRule --> Schedule : uses
AccessRule --> Cardholder : applies to
AccessRule --> CardholderGroup : applies to
AccessRule --> Door : applies to
AccessRule --> Elevator : applies to
AccessRule --> Area : applies to
Door "1" --> "2" DoorSide : has
Elevator "1" --> "0..*" Floor : serves
Area --> Door : groups
Area --> Elevator : groups
This diagram shows how the main access-control entities relate to each other in Web SDK workflows.
Cardholder is the standard person profile used for ongoing access.
Visitor represents a person who is managed with the same access-control model, but typically for short-term access. Visitors usually have a shorter lifecycle and are often checked in and checked out explicitly.
- Cardholders and visitors are the people to whom access is granted or denied.
- Visitors have a shorter lifecycle and visitor-specific fields such as
Arrival,VisitDate,Departure, escort assignment, and checkout state.
Cardholders and visitors also have status operations. You can activate or deactivate them through the Status member.
The Configuration section later in this guide covers their main Web SDK properties. The Operations section covers checkout behavior and other live lifecycle actions.
An escort is a cardholder who accompanies a visitor.
Escort requirements are part of the access-control model:
- A cardholder can be marked as eligible to escort visitors.
- A visitor can be assigned one or two escorts.
- A visitor can require an escort.
- The system also exposes a maximum number of visitors that one escort can accompany at the same time.
In Web SDK terms, the main escort-related members are:
Cardholder.CanEscort- Escort assignment
Visitor.MandatoryEscort-
MaximumVisitorsSingleEscort(read fromSystemConfigurationentity00000000-0000-0000-0000-000000000007;-1means unlimited)
Escort behavior can also appear in door-related access behavior, because escort requirements may affect whether a visitor is allowed through a controlled access point.
Credential is how the system identifies the person requesting access.
Examples include:
- Card formats
- PIN credentials
- License plate credentials
- Mobile credentials
One person can have multiple credentials. Replacing or adding a credential does not change who the person is or which access rules apply to that person.
The Configuration section later in this guide covers supported credential formats, value ranges, raw-data rules, and common credential lifecycle requests.
CardholderGroup lets you manage access for multiple people at once.
Instead of assigning the same access rule to many individuals one by one, you can add cardholders to a group and assign the rule to the group.
In Web SDK workflows, cardholder groups are typically used to:
- Organize people by role, team, tenant, or department
- Apply the same access rule to many people
- Change group membership without changing the access rule itself
Security Center includes two built-in cardholder groups used in access-control workflows:
| Group | GUID | Meaning |
|---|---|---|
All cardholders |
00000000-0000-0000-0000-000000000008 |
The built-in group that represents all cardholders |
Visitors |
00000000-0000-0000-0000-00000000000d |
The built-in group used for visitors |
These groups already exist in the system. You do not create them yourself.
The Visitors group is a cardholder group with IsVisitorGroup=true.
System-wide access behavior is often expressed through rules that target the All cardholders built-in group.
Schedule defines when access applies.
Schedules are used in two ways:
- On
AccessRule, to define when the rule is active. - On
DoorandFloor, to define unlock or free-access periods.
The distinction:
- An access rule schedule controls when a person is allowed or denied by that rule.
- A door or floor unlock schedule controls when the place itself is freely accessible.
This guide treats schedules mainly as entities that you assign to rules, doors, and floors.
AccessRule is the main access decision entity.
An access rule combines:
- The people it applies to.
- The schedule it uses.
- The places where it applies.
- Whether it grants or denies access while the rule is active.
In Web SDK workflows, access rules are usually:
- Permanent, for normal ongoing access
- Temporary, for time-limited access
Access rules are assigned to places such as doors, elevators, and areas. The rule then applies to the people or groups attached to that rule.
Because access rules apply to people and groups, not to credentials, replacing a credential does not require you to rebuild the person's access rules.
An access rule can be used in two different ways:
- As a grant rule
- As a deny rule
The Web SDK exposes this through IsDenyingRule.
-
IsDenyingRule=falsemeans the rule grants access while it is active. -
IsDenyingRule=truemeans the rule denies access while it is active.
Access rules and direct access are not the same thing.
Use an access rule when you want a reusable access decision that combines:
- People or groups
- A schedule
- One or more controlled places
Use direct access when you want to grant a specific person or group access on a specific access point without creating a reusable rule.
- Access rules are applied to places such as doors, elevators, and areas.
- Direct access is applied to specific access points such as a door side or a floor.
- Access rules manage ongoing access.
- Direct access is better suited to exceptions, special cases, or tightly targeted grants.
An access rule carries schedule logic, while a direct access grant does not create that same reusable rule structure.
Security Center also includes two built-in access rules:
| Rule | GUID | Meaning |
|---|---|---|
All open rule |
00000000-0000-0000-0000-00000000000a |
A built-in grant rule |
Lockdown rule |
00000000-0000-0000-0000-000000000009 |
A built-in deny rule |
These rules already exist in the system. They are system rules, not ordinary user-created rules.
In the Web SDK:
-
All open ruleis a permanent rule withIsSystemRule=trueandIsDenyingRule=false. -
Lockdown ruleis a permanent rule withIsSystemRule=trueandIsDenyingRule=true. - Both use the built-in
Alwaysschedule. - Both target the built-in
All cardholdersgroup.
Conceptually:
-
All open rulemeans access is granted to all cardholders while that rule is applied. -
Lockdown rulemeans access is denied to all cardholders while that rule is applied.
These rules are useful when you need a broad system behavior instead of a custom rule for a smaller set of people.
Door is one of the most common access-controlled entities.
A door has two sides:
DoorSideInDoorSideOut
Access is directional. A person might be allowed on one side of the door but not the other.
In Web SDK requests, you can work with the whole door or with one specific side:
- Use the door when you assign access rules or read door-level state.
- Use a door side when the direction matters.
Each door side can also expose its own nested access points, such as a reader, a request-to-exit device, and an entry sensor. Read DoorSideIn or DoorSideOut when you need that side-specific structure.
The Configuration section later in this guide covers door properties, door templates, hardware mapping, and side-specific rule application.
Elevator controls access to elevator usage.
Floor represents an elevator destination that can be attached to an elevator. Floors also have their own schedule-related operations.
Conceptually:
- The elevator is the access-controlled asset.
- Floors are the destinations that belong to that elevator.
- Access can be managed at the elevator level or the floor level, and schedules can also be applied at the floor level.
A floor can carry its own access rules and unlock schedules, even though it belongs to an elevator.
Area represents a secured space.
Areas let you model access in terms of spaces instead of only individual doors. An area can group related access-controlled elements and is also used in people-count workflows.
In Web SDK operations, areas distinguish between:
- Perimeter doors, which define the boundary of the area.
- Captive doors, which are inside the area but do not define that boundary.
The difference:
- A perimeter door is a door you cross to enter or exit the area.
- A captive door is a door that belongs to the area, but moving through it does not mean entering or leaving that area.
Perimeter doors are used for area entry and exit, while captive doors are internal to the area. Perimeter doors are the doors you use when you model area crossings, direction, people counting, and similar area-based access behavior.
In the Web SDK, the area members for this are:
PerimeterDoorsAllDoorsCaptiveAccessPointsEntryAccessPointsExitAccessPoints
Door sides are also relative to the area. For a perimeter door, the In and Out meaning depends on whether that side enters the area or exits it.
A typical access-control workflow looks like this:
- Create a
CardholderorVisitor. - Create or assign one or more
Credentialentities. - Optionally add the person to a
CardholderGroup. - Create an
AccessRule. - Assign a
Scheduleto that access rule. - Apply the access rule to a
Door,Elevator,Floor, orArea.
Use /entity when you are configuring access control:
- Configure people, credentials, groups, rules, schedules, doors, elevators, floors, and areas
- Assign credentials, groups, rules, schedules, doors, floors, and areas
- Read the current configuration state
The sections below describe each entity’s settings. The configuration examples show how to read and update them.
The main cardholder and visitor settings fall into three groups:
- Identity and contact fields such as
FirstName,LastName,EmailAddress, andMobilePhoneNumber - Access-control behavior such as
CanEscort,AntipassbackExemption,UseExtendedGrantTime, andTriggerCode - Lifecycle fields under
Status, plus visitor-specific timing fields such asArrival,VisitDate, andDeparture
Two details matter when you update these entities:
- Config Tool calls the security-clearance value
Security clearance, but the Web SDK member isAccessPermissionLevel. -
Statuschanges are method-based, not simple property assignments.
Visitors also have escort-specific settings:
EscortEscort2MandatoryEscortAssignEscorts({escort-guid},{escort2-guid})
Cardholders and visitors also support picture management:
PictureThumbnailCanSetPicture()
Use CanSetPicture() when you need to know whether the current person entity accepts a picture update. For the actual image-upload mechanics, see Working with entity properties.
The Creating people examples later in this guide show requests for reading and updating cardholders and visitors.
Read a cardholder picture:
GET /entity?q=entity={cardholder-guid},CanSetPicture(),Picture,ThumbnailUpdate a cardholder picture with multipart form data:
POST /entity?q=entity={cardholder-guid},Picture=$photoTo update a visitor picture:
POST /entity?q=entity={visitor-guid},Picture=$photoThe multipart field name must match the name after = in the query. For example, if the query uses Picture=$photo, the multipart body must include a field named $photo containing the Base64 image data.
Credential configuration is mainly about three things:
- Choosing the right credential format
- Supplying the correct field values for that format
- Assigning or unassigning the credential from a person
The guide uses these practical rules:
- Numeric constructor formats use decimal values unless the request explicitly uses raw or XML-based undecoded Wiegand.
-
{raw-data}is hexadecimal text without0x. - PIN values are numeric text. Quote the PIN value in
KeypadCredentialFormat(...)when leading zeroes must be preserved. - Custom card formats and FASC-N formats depend on exact field names and field representations.
The Web SDK enforces the fixed 16-digit maximum and the configured minimum PIN length. A PIN below the configured minimum causes the request to fail with a PIN-length error. When a PIN starts with 0, use the quoted form KeypadCredentialFormat(%22{pin}%22) so the stored PIN keeps that leading zero.
For custom formats, look up the definition first and then build the field map from that definition. For more information, see Working with Custom Card Formats.
The placeholders used in credential creation requests are not interchangeable. Each one has a specific meaning and expected value format.
| Placeholder | Meaning | Value format |
|---|---|---|
{facility} |
The facility code portion of the credential | Decimal integer |
{company-id} |
The company or facility portion used by that specific card format | Decimal integer |
{number} |
The card number portion of the credential | Decimal integer |
{card-id} |
The card identifier portion of the credential | Decimal integer in the constructor forms shown above |
{pin} |
The keypad PIN | Numeric text. Use %22{pin}%22 inside KeypadCredentialFormat(...) when leading zeroes must be preserved |
{license-plate} |
The plate text | Plain text |
{raw-data} |
The raw card payload for raw or undecoded Wiegand credentials | Hexadecimal text without 0x
|
{bit-length} |
The number of bits represented by the credential payload | Decimal integer |
{format-guid} |
The GUID of an existing custom card format definition | GUID |
{field-name} / {field-value}
|
A field from a custom card format or FASC-N field map | Exact field name and value format required by that format |
The constructor forms shown later in this guide use decimal numeric arguments unless the request uses the raw XML-based undecoded Wiegand form.
| Format | Fields | Allowed range |
|---|---|---|
| Standard 26-bit |
{facility}, {number}
|
{facility}: 0 to 255; {number}: 0 to 65535
|
| HID H10306 34-bit |
{facility}, {number}
|
{facility}: 0 to 65535; {number}: 0 to 65535
|
| HID Corporate 1000 35-bit |
{company-id}, {card-id}
|
{company-id}: 0 to 4095; {card-id}: 0 to 1048575
|
| HID H10302 37-bit | {number} |
0 to 34359738367
|
| HID H10304 37-bit |
{facility}, {card-id}
|
{facility}: 0 to 65535; {card-id}: 0 to 524287
|
| HID Corporate 1000 48-bit |
{company-id}, {card-id}
|
{company-id}: 0 to 4194303; {card-id}: 0 to 8388607
|
| CSN 32-bit | {card-id} |
Decimal 0 to 4294967295
|
| PIN | {pin} |
Up to 16 digits |
| License plate | {license-plate} |
Up to 12 characters after spaces are removed |
{raw-data} is hexadecimal text. Do not include a 0x prefix.
Use {bit-length} as the actual size of the credential payload in bits. Common values in the built-in formats are 26, 32, 34, 35, 37, 48, 75, and 200.
For raw-card and undecoded Wiegand formats, the hexadecimal value must fit inside the specified bit length.
For CSN 32-bit credentials, use the constructor form when you have the numeric value of the CSN. Use the undecoded Wiegand XML form when you want to send the raw hexadecimal payload directly.
Two additional format helpers exist, but they are only useful in advanced undecoded/custom Wiegand scenarios:
GetCredentialFormatId()ChangeCredentialFormat({format-guid})
Use them with these expectations:
-
GetCredentialFormatId()returns the current format GUID for anUndecodedWiegandcredential. For credential formats without a Wiegand format GUID, it returns00000000-0000-0000-0000-000000000000. -
ChangeCredentialFormat({format-guid})does not rewrite the credential payload. It asks Security Center to reinterpret the existing bit pattern as another compatible format.
This means:
- These helpers are not part of the normal credential lifecycle.
- They matter mainly when you are troubleshooting or correcting undecoded/custom Wiegand credentials.
- Built-in constructor formats such as
WiegandStandardCredentialFormat(...)are still how you create credentials. - When you need a
format-guid, read it from an existing credential'sFormat.FormatIdvalue or from the custom card format definition you want to target.
FASC-N formats use field-name/value maps instead of a short numeric constructor.
FASC-N 75-bit fields:
| Field | Allowed range |
|---|---|
Agency Code |
0 to 16383
|
System Code |
0 to 16383
|
Credential Number |
0 to 1048575
|
Exp Date |
0 to 33554431
|
FASC-N 200-bit fields:
| Field | Allowed range |
|---|---|
Agency Code |
0 to 9999
|
System Code |
0 to 9999
|
Credential Number |
0 to 999999
|
CS |
0 to 9
|
ICI |
0 to 9
|
PI |
0 to 9999999999
|
OC |
0 to 9
|
OI |
0 to 9999
|
POA |
0 to 9
|
LRC |
Hexadecimal 0 to 0x10
|
The Creating and assigning credentials examples later in this guide show requests for the supported credential formats.
Cardholder-group configuration is mostly about:
- Contact fields such as
EmailAddress - Visitor availability through
IsVisitorGroup - Security clearance through
AccessPermissionLevelandInheritAccessPermissionLevel - Membership through
Childrenand group membership methods
The main naming and support details are:
- Config Tool calls the security-clearance value
Security clearance, but the Web SDK member isAccessPermissionLevel. - You cannot configure
Bypass antipassback rulesthroughq=requests forCardholderGroup.
The Working with cardholder groups examples later in this guide show requests for reading and updating groups and changing their membership.
The Web SDK can create an empty Schedule entity, check whether a time is covered, and reset its coverage.
The important limitation is that creating the schedule entity is not the same thing as building a useful day-and-time definition. For access-control integrations, the practical approach is usually to use schedules that already exist in Security Center and assign them by GUID.
Access-rule configuration is mostly about:
- Whether the rule grants access or denies access through
IsDenyingRule. - Which
Schedulethe rule uses. - Which cardholders or groups are attached to it.
- Which places the rule is applied to.
Temporary rules add one more layer of configuration because they also carry their own start and end time window.
For doors, rule application can also be directional:
- Apply the rule to the whole door
- Apply it to
In - Apply it to
Out - Apply it to
Both
The Creating access rules and Applying access to places examples later in this guide show the requests.
Door configuration includes:
- Door-level state and timing such as
IsLocked,IsOpen,StandardGrantTimeInSeconds,ExtendedGrantTimeInSeconds,RelockDelayInSeconds, andAutoUnlockOverride - Nested behavior groups such as
DoorForced,DoorHeld,RequestToExit,VisitorEscort, andTwoPersonRule - Free-access and exception schedules through
UnlockSchedulesandUnlockExceptionSchedules - Reusable door-template configuration through
DoorTemplate - Wiring and device mapping through members such as
PreferredUnit,PreferredInterface,DoorLockDevice,DoorSideIn,DoorSideOut, andGetConnections({access-point-type})
Two practical distinctions matter:
- Side-specific access rules are still access rules, while direct door-side access is a different targeted grant model.
- Nested side hardware is easy to read, but you manage the mapping through the door's connection methods rather than a path such as
DoorSideIn.Reader.Device={device-guid}.
The Working with doors and Working with door templates and hardware mapping examples later in this guide show requests for these settings.
Elevator, floor, and area configuration is mostly about how access applies to places:
-
Elevatorexposes theFloorsthat belong to it. -
Floorcarries its ownAccessRules,UnlockSchedules, andUnlockExceptionSchedules. -
Areacarries perimeter and captive-door relationships, plus area-level access rules.
Two practical distinctions matter here:
-
AccessRulesdefine who is allowed or denied. -
UnlockSchedulesdefine when the place itself is freely accessible.
For floors, use the floor GUID returned by the parent elevator when you want to read or configure one specific floor.
Create floors in Config Tool.
For areas, distinguish clearly between:
- Perimeter doors added with
AddDoor({door-guid}) - Captive doors added with
AddCaptiveDoor({door-guid})
The Applying access to places and Working with floors and unlock schedules examples later in this guide show the requests.
Use /entity when you already know the entity GUID.
Use report endpoints when you need to search by name, status, format, or other criteria first.
The main search routes for access-control integrations are:
| What you want to find | Route | Typical filters |
|---|---|---|
| Cardholders | /report/CardholderConfiguration |
FirstName, LastName, FullName, Email, MobilePhoneNumber, CardholderGroupIds, AccessStatus
|
| Visitors | /report/Visitor |
VisitorStates, FirstName, LastName, FullName, Email, MobilePhoneNumber
|
| Credentials | /report/CredentialConfiguration |
UniqueIds, UnassignedOnly, FormatType, MobileCredentialOnly
|
| Access rules | /report/AccessRuleConfiguration |
Name, AccessRuleType
|
| Cardholder groups, schedules, doors, elevators, floors, and areas | /report/EntityConfiguration |
EntityTypes, Name, Description, ReturnFields (EntityTypes@AccessPoint for floors) |
A few practical search rules are worth keeping in mind:
- Use
/report/Visitorwhen you need visitor lifecycle search, especially active versus archived visitors. - Search
Doorfirst, then readDoorSideInorDoorSideOutfrom the door entity. - For floors, either search the elevator first and read
Floors, or search/report/EntityConfigurationwithEntityTypes@AccessPointwhen you already know the floor name. - For a more complete guide to report endpoints, filters,
ReturnFields, and specialized configuration queries, see Referencing entities.
The examples in this section show Web SDK requests for access-control tasks.
Search cardholders by first and last name:
GET /report/CardholderConfiguration?q=FirstName={first-name},LastName={last-name},PageSize=10Search cardholders by email address:
GET /report/CardholderConfiguration?q=Email={email},PageSize=10Search credentials by unique value:
GET /report/CredentialConfiguration?q=UniqueIds@KeypadCredentialFormat({pin}),PageSize=10Note
This PIN example is not guaranteed to return a single match. Multiple credentials can share the same PIN, and the response can return Rsp.Status: "TooManyResults".
Find unassigned credentials:
GET /report/CredentialConfiguration?q=UnassignedOnly=true,PageSize=10Search access rules by name:
GET /report/AccessRuleConfiguration?q=Name={rule-name},PageSize=10Search schedules by name:
GET /report/EntityConfiguration?q=EntityTypes@Schedule,Name={schedule-name},PageSize=10,ReturnFields@NameSearch cardholder groups by name:
GET /report/EntityConfiguration?q=EntityTypes@CardholderGroup,Name={group-name},PageSize=10,ReturnFields@NameSearch doors by entity type:
GET /report/EntityConfiguration?q=EntityTypes@Door,Page=1,PageSize=10,ReturnFields@NameSearch areas by entity type:
GET /report/EntityConfiguration?q=EntityTypes@Area,PageSize=10,ReturnFields@NameCreate a cardholder:
POST /entity?q=entity=NewEntity(Cardholder),Name={name},FirstName={first-name},LastName={last-name},EmailAddress={email},MobilePhoneNumber={mobile-phone},GuidRead the main cardholder properties:
GET /entity?q=entity={cardholder-guid},FirstName,LastName,EmailAddress,MobilePhoneNumber,UseExtendedGrantTime,CanEscort,AntipassbackExemption,TriggerCode,AccessPermissionLevel,InheritAccessPermissionLevel,OfflineToggleFunction,OfflineRevalidationPeriod,Status.State,Status.ActivationDate,Status.ExpirationDate,Status.ExpirationTypeUpdate the basic contact properties:
POST /entity?q=entity={cardholder-guid},FirstName={first-name},LastName={last-name},EmailAddress={email},MobilePhoneNumber={mobile-phone}Update the access-control properties:
POST /entity?q=entity={cardholder-guid},UseExtendedGrantTime=true,CanEscort=true,AntipassbackExemption=true,OfflineToggleFunction=true,OfflineRevalidationPeriod=14Set the trigger code:
POST /entity?q=entity={cardholder-guid},TriggerCode=5Set the security clearance:
POST /entity?q=entity={cardholder-guid},SetAccessPermissionLevel({level})level is the security-clearance value you want to apply to that cardholder.
Make the cardholder inherit the security clearance from its group:
POST /entity?q=entity={cardholder-guid},SetInheritAccessPermissionLevel(true)Stop inheriting the security clearance from the group:
POST /entity?q=entity={cardholder-guid},SetInheritAccessPermissionLevel(false)Read the current status:
GET /entity?q=entity={cardholder-guid},Status.State,Status.ActivationDate,Status.ExpirationDate,Status.ExpirationTypeDeactivate a cardholder now:
POST /entity?q=entity={cardholder-guid},Status.Deactivate()Set a cardholder expiration date:
POST /entity?q=entity={cardholder-guid},Status.Deactivate({expiration-date-time})expiration-date-time is when the cardholder should expire.
Activate a cardholder:
POST /entity?q=entity={cardholder-guid},Status.Activate()Create a visitor:
POST /entity?q=entity=NewEntity(Visitor),Name={name},FirstName={first-name},LastName={last-name},EmailAddress={email},MobilePhoneNumber={mobile-phone},GuidRead the main visitor properties:
GET /entity?q=entity={visitor-guid},FirstName,LastName,EmailAddress,MobilePhoneNumber,Arrival,VisitDate,Departure,CheckinDate,Escort,Escort2,MandatoryEscort,Status.State,Status.ActivationDate,Status.ExpirationDateUpdate the visitor timing and escort requirement:
POST /entity?q=entity={visitor-guid},Arrival={arrival-date-time},VisitDate={visit-date-time},Departure={departure-date-time},MandatoryEscort=trueCheck in a visitor:
POST /entity?q=entity={visitor-guid},Status.Activate()Note
After Status.Activate(), do not assume the planned timing values remain unchanged. The active-visitor lifecycle can replace Arrival and Status.ActivationDate with the actual check-in time, and it can clear Departure or stop returning Status.ExpirationDate as the planned end time.
Check out a visitor:
POST /entity?q=entity={visitor-guid},Checkout()Allow a cardholder to escort visitors:
POST /entity?q=entity={cardholder-guid},CanEscort=trueRequire an escort for a visitor:
POST /entity?q=entity={visitor-guid},MandatoryEscort=trueAssign escorts to a visitor:
POST /entity?q=entity={visitor-guid},AssignEscorts({escort-guid},{escort2-guid})Note
The selected escort cardholder must already have CanEscort=true. Otherwise AssignEscorts(...) fails.
Find active visitors by name:
GET /report/Visitor?q=VisitorStates@Active,FirstName={first-name},LastName={last-name}Find archived visitors by name:
GET /report/Visitor?q=VisitorStates@Archived,FirstName={first-name},LastName={last-name}Find archived visitors by full name:
GET /report/Visitor?q=VisitorStates@Archived,FullName={full-name}Find archived visitors by email address:
GET /report/Visitor?q=VisitorStates@Archived,Email={email}Create a PIN credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=KeypadCredentialFormat(%22{pin}%22),GuidUse the quoted form shown above to preserve leading zeroes. Without quotes, a numeric PIN value such as 01234567890123456 can be stored as 1234567890123456.
Create a standard 26-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=WiegandStandardCredentialFormat({facility},{number}),GuidCreate an HID H10302 37-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=WiegandH10302CredentialFormat({number}),GuidCreate an HID H10306 34-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=WiegandH10306CredentialFormat({facility},{number}),GuidCreate an HID H10304 37-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=WiegandH10304CredentialFormat({facility},{card-id}),GuidCreate a Corporate 1000 35-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=WiegandCorporate1000CredentialFormat({company-id},{card-id}),GuidCreate a Corporate 1000 48-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=Wiegand48BitCorporate1000CredentialFormat({company-id},{card-id}),GuidCreate a CSN 32-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=WiegandCsn32CredentialFormat({number}),GuidCreate a license plate credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=LicensePlateCredentialFormat({license-plate}),GuidCreate a raw card credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=RawCardCredentialFormat({raw-data},{bit-length}),GuidCreate a credential using a custom card format:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=CustomCredentialFormat({format-guid},{{field-name,value}}),GuidThe {format-guid} is the custom card format GUID. The field names and values must match the format definition exactly.
Create a FASC-N 75-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=FascN75BitCardCredentialFormat({{Agency%20Code,{agency}},{System%20Code,{system}},{Credential%20Number,{number}},{Exp%20Date,{expiration}}}),GuidCreate a FASC-N 200-bit credential:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=FascN200BitCardCredentialFormat({{Agency%20Code,{agency}},{System%20Code,{system}},{Credential%20Number,{number}},{CS,{cs}},{ICI,{ici}},{PI,{pi}},{OC,{oc}},{OI,{oi}},{POA,{poa}},{LRC,{lrc}}}),GuidNote
FASC-N field names contain spaces and must be URL-encoded (for example, Agency%20Code). See Built-in credential ranges for allowed field values.
Create a credential request:
POST /entity?q=entity=NewEntity(Credential),Name={name},Format=CardRequestCredentialFormat(),GuidRead the current credential request:
GET /entity?q=entity={credential-guid},GetCredentialRequest()If no request exists for that credential, the call can still return Ok without a GetCredentialRequest object in the result.
Cancel the current credential request:
POST /entity?q=entity={credential-guid},CancelCredentialRequest()Read the credential format that was stored:
GET /entity?q=entity={credential-guid},FormatRead the current credential format GUID for an undecoded/custom Wiegand credential:
GET /entity?q=entity={credential-guid},GetCredentialFormatId()This helper is mainly useful for UndecodedWiegand and custom-format troubleshooting. It returns the format GUID currently associated with the credential, which can differ from Format.FormatId. For example, after a custom card format is deleted, the credential's Format.FormatId can fall back to the raw-format GUID while GetCredentialFormatId() still returns the deleted custom format GUID.
Try to reinterpret an undecoded/custom Wiegand credential as another compatible format:
POST /entity?q=entity={credential-guid},ChangeCredentialFormat({format-guid})format-guid is the GUID of a compatible card format. The call returns true only when Security Center can interpret the existing raw bit pattern as that format.
Assign a credential to a cardholder:
POST /entity?q=entity={credential-guid},Cardholder={cardholder-guid}Unassign a credential from a cardholder:
POST /entity?q=entity={credential-guid},CardholderGuid=00000000-0000-0000-0000-000000000000Deactivate a credential:
POST /entity?q=entity={credential-guid},Status.Deactivate()Activate a credential:
POST /entity?q=entity={credential-guid},Status.Activate()Check whether a credential has access on a specific door side at a specific time:
GET /entity?q=entity={credential-guid},HasAccess({door-side-guid},{date-time-utc})date-time-utc is the UTC time you want to evaluate, for example 2026-03-10T12:00:00Z.
Create a cardholder group:
POST /entity?q=entity=NewEntity(CardholderGroup),Name={name},GuidRead the main group properties:
GET /entity?q=entity={cardholder-group-guid},EmailAddress,IsVisitorGroup,AccessPermissionLevel,InheritAccessPermissionLevel,Children,Parents,AccessRulesRead the built-in All cardholders group:
GET /entity?q=entity=00000000-0000-0000-0000-000000000008,Name,IsVisitorGroup,Children,AccessRulesRead the built-in Visitors group:
GET /entity?q=entity=00000000-0000-0000-0000-00000000000d,Name,EmailAddress,IsVisitorGroup,AccessPermissionLevel,InheritAccessPermissionLevelSet the group email address:
POST /entity?q=entity={cardholder-group-guid},EmailAddress={email}Make a group available to visitors:
POST /entity?q=entity={cardholder-group-guid},IsVisitorGroup=trueSet the group security clearance:
POST /entity?q=entity={cardholder-group-guid},SetAccessPermissionLevel({level})Make the group inherit its security clearance:
POST /entity?q=entity={cardholder-group-guid},SetInheritAccessPermissionLevel(true)Add a cardholder to a group:
POST /entity?q=entity={cardholder-group-guid},AddCardholderIntoGroup({cardholder-guid})Remove a cardholder from a group:
POST /entity?q=entity={cardholder-group-guid},RemoveCardholderFromGroup({cardholder-guid})Create a permanent access rule:
POST /entity?q=entity=NewEntity(AccessRule),Name={name},GuidCreate a deny access rule:
POST /entity?q=entity=NewEntity(AccessRule),Name={name},IsDenyingRule=true,GuidCreate a temporary access rule:
POST /entity?q=entity=NewEntity(AccessRule,Temporary),Name={name},StartTime={start-time},EndTime={end-time},GuidAssign a schedule to an access rule:
POST /entity?q=entity={access-rule-guid},Schedule={schedule-guid}Add a cardholder to an access rule:
POST /entity?q=entity={access-rule-guid},AddCardholders({cardholder-guid})Add a cardholder group to an access rule:
POST /entity?q=entity={access-rule-guid},AddCardholders({cardholder-group-guid})Check whether a cardholder or group is already assigned to an access rule:
GET /entity?q=entity={access-rule-guid},IsMember({entity-guid})Remove one or more cardholders or groups from an access rule:
POST /entity?q=entity={access-rule-guid},RemoveCardholders({entity-guid-1,entity-guid-2})Clear all cardholders and groups from an access rule:
POST /entity?q=entity={access-rule-guid},ClearCardholders()Read the schedule currently assigned to an access rule:
GET /entity?q=entity={access-rule-guid},ScheduleRead whether an access rule is currently a grant rule or a deny rule:
GET /entity?q=entity={access-rule-guid},IsDenyingRuleRead the built-in All open rule:
GET /entity?q=entity=00000000-0000-0000-0000-00000000000a,Name,IsSystemRule,IsDenyingRule,AccessRuleType,ScheduleGuid,CardholdersRead the built-in Lockdown rule:
GET /entity?q=entity=00000000-0000-0000-0000-000000000009,Name,IsSystemRule,IsDenyingRule,AccessRuleType,ScheduleGuid,CardholdersTurn an existing access rule into a deny rule:
POST /entity?q=entity={access-rule-guid},IsDenyingRule=trueRead common door properties:
GET /entity?q=entity={door-guid},Name,DoorType,IsLocked,IsOpen,StandardGrantTimeInSeconds,ExtendedGrantTimeInSeconds,StandardEntryTimeInSeconds,ExtendedEntryTimeInSeconds,RelockDelayInSeconds,RelockOnClose,UnlockSchedules,UnlockExceptionSchedulesRead the door-forced settings:
GET /entity?q=entity={door-guid},DoorForced.IsActive,DoorForced.BuzzerBehaviorRead the door-held settings:
GET /entity?q=entity={door-guid},DoorHeld.IsActive,DoorHeld.TriggerTime,DoorHeld.BuzzerBehaviorRead the request-to-exit settings:
GET /entity?q=entity={door-guid},RequestToExit.UnlockOnRex,RequestToExit.IgnoreRexEventsWhenDoorOpen,RequestToExit.HoldoffAfterClosedDelayInSeconds,RequestToExit.HoldoffAfterGrantedDelayInSecondsRead both door sides and their side-specific access points:
GET /entity?q=entity={door-guid},DoorSideIn,DoorSideOutUpdate the standard and extended grant times:
POST /entity?q=entity={door-guid},StandardGrantTimeInSeconds={standard-seconds},ExtendedGrantTimeInSeconds={extended-seconds}Update the relock delay:
POST /entity?q=entity={door-guid},RelockDelayInSeconds={seconds}Ignore access events while the door is unlocked by schedule:
POST /entity?q=entity={door-guid},IgnoreAccessEventsWhenUnlockedBySchedule=trueUpdate the request-to-exit delay after the door closes:
POST /entity?q=entity={door-guid},RequestToExit.HoldoffAfterClosedDelayInSeconds={seconds}Update the maximum delay allowed between a visitor and an escort presentation:
POST /entity?q=entity={door-guid},VisitorEscort.MaximumDelayBetweenCardPresentations={seconds}Update the door-held trigger time:
POST /entity?q=entity={door-guid},DoorHeld.TriggerTime={seconds}DoorHeld.TriggerTime cannot be changed while DoorHeld.IsActive=false. Either enable DoorHeld.IsActive first, or set DoorHeld.IsActive=true and DoorHeld.TriggerTime={seconds} in the same request.
Note
Door timing constraints:
-
StandardGrantTimeInSecondsandExtendedGrantTimeInSeconds: 1 to 1000. Standard must be less than or equal to extended. -
StandardEntryTimeInSecondsandExtendedEntryTimeInSeconds: 1 to 1000. Both require a configured entry sensor. -
RelockDelayInSeconds: 0 to 86439. -
DoorHeld.TriggerTime: 0 to 3699.
These are advanced configuration operations. Use them only when you have the required units, interface modules, and devices, and when it is safe to change the door's hardware mapping.
Query door templates:
GET /report/EntityConfiguration?q=EntityTypes@DoorTemplate,Page=1,PageSize=10,ReturnFields@NameCreate a door template:
POST /entity?q=entity=NewEntity(DoorTemplate),Name={name},GuidRead the main door-template flags:
GET /entity?q=entity={door-template-guid},Name,IsHardwareMappingEnabled,IsHardwareSettingsEnabled,IsDoorPropertiesEnabled,IsAccessRulesEnabledRead the current door-template selectors and assignments:
GET /entity?q=entity={door-template-guid},GetCurrentAccessPointSelectors(),GetCurrentAccessRuleDescriptors(),GetCurrentCardAndPinSettings(),GetAppliedDoors()Apply a door template to a door:
POST /entity?q=entity={door-template-guid},Apply({door-guid},{unit-guid},{interface-guid})door-guid is the door that should receive the template. unit-guid is the preferred access control unit, and interface-guid is the preferred interface module to use when applying the template.
Read the door's current hardware mapping:
GET /entity?q=entity={door-guid},PreferredUnit,PreferredInterface,DoorLockDeviceRead the side-specific reader, request-to-exit device, and entry sensor:
GET /entity?q=entity={door-guid},DoorSideIn.Reader,DoorSideIn.Rex,DoorSideIn.EntrySensor
GET /entity?q=entity={door-guid},DoorSideOut.Reader,DoorSideOut.Rex,DoorSideOut.EntrySensorRead the mapped door lock and door sensor connections:
GET /entity?q=entity={door-guid},GetConnections(DoorLock)
GET /entity?q=entity={door-guid},GetConnections(DoorSensor)In GetConnections({access-point-type}), the argument is an AccessPointType such as DoorLock, DoorSensor, Rex, PullStation, Buzzer, or LockSensor.
Set the preferred unit:
POST /entity?q=entity={door-guid},SetPreferredUnit({unit-guid})Set the preferred interface:
POST /entity?q=entity={door-guid},SetPreferredInterface({interface-guid})Remove the preferred unit:
POST /entity?q=entity={door-guid},RemovePreferredUnit()Remove the preferred interface:
POST /entity?q=entity={door-guid},RemovePreferredInterface()Set the door lock device:
POST /entity?q=entity={door-guid},DoorLockDevice={device-guid}Add a mapped connection:
POST /entity?q=entity={door-guid},AddConnection({device-guid},{access-point-type})device-guid identifies the hardware device to connect. access-point-type specifies the type of access point, such as DoorLock, DoorSensor, Rex, PullStation, Buzzer, or LockSensor.
Update a mapped connection:
POST /entity?q=entity={door-guid},UpdateConnection({access-point-guid},{device-guid})access-point-guid is the existing mapped access point on the door. device-guid is the replacement hardware device.
Note
A hardware device can only be assigned to one access point at a time. If the target device is already mapped elsewhere, remove the existing connection first.
Remove a mapped connection:
POST /entity?q=entity={door-guid},RemoveConnection({access-point-guid})Use the access-point-guid returned by the current door mapping when you want to remove one specific mapped connection.
Remove a mapped connection by hardware device:
POST /entity?q=entity={door-guid},RemoveConnectionByDevice({device-guid})Use this form when you know the underlying hardware device GUID but not the mapped access-point GUID.
Apply an access rule to both sides of a door explicitly:
POST /entity?q=entity={door-guid},AddAccessRule({access-rule-guid},Both)Apply an access rule to the In side of a door only:
POST /entity?q=entity={door-guid},AddAccessRule({access-rule-guid},In)Apply an access rule to the Out side of a door only:
POST /entity?q=entity={door-guid},AddAccessRule({access-rule-guid},Out)Read the access rules assigned to the In side of a door:
GET /entity?q=entity={door-guid},FetchAccessRulesForSide(In)Apply an access rule to both sides of an area:
POST /entity?q=entity={area-guid},AddAccessRule({access-rule-guid},Both)Apply an access rule to an elevator:
POST /entity?q=entity={elevator-guid},AddAccessRule({access-rule-guid})Remove an access rule from both sides of a door:
POST /entity?q=entity={door-guid},RemoveAccessRule({access-rule-guid},Both)Remove an access rule from the In side of a door only:
POST /entity?q=entity={door-guid},RemoveAccessRule({access-rule-guid},In)Remove an access rule from the Out side of a door only:
POST /entity?q=entity={door-guid},RemoveAccessRule({access-rule-guid},Out)Remove an access rule from both sides of an area:
POST /entity?q=entity={area-guid},RemoveAccessRule({access-rule-guid},Both)Remove an access rule from an elevator:
POST /entity?q=entity={elevator-guid},RemoveAccessRule({access-rule-guid})Add a perimeter door to an area:
POST /entity?q=entity={area-guid},AddDoor({door-guid}),PerimeterDoorsAdd a captive door to an area:
POST /entity?q=entity={area-guid},AddCaptiveDoor({door-guid}),CaptiveAccessPointsRemove a perimeter door from an area:
POST /entity?q=entity={area-guid},RemoveDoor({door-guid})Grant direct access on one door side:
POST /entity?q=entity={door-side-in-guid},AddCardholderOrGroup({cardholder-guid})Grant direct access to a cardholder group on one door side:
POST /entity?q=entity={door-side-in-guid},AddCardholderOrGroup({cardholder-group-guid})Remove a direct cardholder or group grant from one door side:
POST /entity?q=entity={door-side-in-guid},RemoveCardholderOrGroup({cardholder-or-group-guid})Read the floor GUIDs attached to an elevator:
GET /entity?q=entity={elevator-guid},FloorsRead a floor directly:
GET /entity?q=entity={floor-guid},Name,Elevator,LogicalOrder,UnlockSchedules,UnlockExceptionSchedules,AccessRulesGrant access to a floor through an access rule:
POST /entity?q=entity={floor-guid},AccessRules@{access-rule-guid}Read both door sides and their current side-specific access configuration:
GET /entity?q=entity={door-guid},DoorSideIn,DoorSideOutdoor-side-in-guid is the card-reader access point GUID. Read it from DoorSideIn.Reader.Guid or DoorSideOut.Reader.Guid on the parent door.
Create an empty schedule record:
POST /entity?q=entity=NewEntity(Schedule),Name={name},GuidThis creates the schedule entity itself, but not a full working coverage definition. For most access-control workflows, use an existing schedule.
Attach a floor to an elevator:
POST /entity?q=entity={elevator-guid},AddFloor({floor-guid})Add an unlock schedule to a door:
POST /entity?q=entity={door-guid},UnlockSchedules@{schedule-guid}Add an unlock schedule to a floor:
POST /entity?q=entity={floor-guid},UnlockSchedules@{schedule-guid}Find a floor by name:
GET /report/EntityConfiguration?q=EntityTypes@AccessPoint,Name={floor-name},NameSearchMode=Is,PageSize=10,ReturnFields@Name@EntityType@EntitySubTypeCheck whether a schedule covers a specific time:
GET /entity?q=entity={schedule-guid},IsTimeCovered({date-time})date-time is the exact instant you want to test against the schedule.
Read the current coverage and twilight support of a schedule:
GET /entity?q=entity={schedule-guid},Coverage,SupportTwilightCoverageReset a schedule to an empty coverage:
POST /entity?q=entity={schedule-guid},Reset()This section groups live runtime behavior. Some of these operations use /entity, and some use /action, but they all affect how the running system behaves rather than how the long-term access-control model is configured.
Checkout() changes how the visitor is accessed through the Web SDK.
After a visitor checks out:
- The active visitor no longer resolves through
/entity. - The visitor no longer appears in active
/report/Visitorresults. - The visitor becomes searchable in archived
/report/Visitorresults. - Credentials assigned to the visitor are unassigned but remain active. The credential's
CardholderGuidis set to the empty GUID and the credential'sStatus.StatestaysActive. If you need to deactivate or delete the credential after checkout, do it in a separate request.
Archived visitors are searched through /report/Visitor, not through /entity.
Note
The archived visitor record uses a different GUID than the original active visitor. After checkout, search archived visitors again instead of reusing the original active visitor GUID.
Search archived visitors with the same visitor-report fields you use for active visitors, such as FirstName, LastName, FullName, Email, and MobilePhoneNumber.
Archived visitor results include lifecycle details that matter to visitor-management integrations, such as CheckinDate, CheckoutDate, VisitorState, escort fields, and contact information.
Deleting archived visitors is not supported through Web SDK q= requests.
Check out an active visitor, find the archived record, and reconcile the credential:
-
Check the visitor out:
POST /entity?q=entity={active-visitor-guid},Checkout()
-
Search for the archived record by the attributes you already have:
GET /report/Visitor?q=VisitorStates@Archived,LastName={last-name},LastNameSearchMode=Is,MaximumResultCount=10
The archived record returns a different
Guidthan the original active visitor. -
Read the formerly assigned credential:
GET /entity?q=entity={credential-guid},CardholderGuid,Status.State
CardholderGuidis now the empty GUID andStateisActive. -
Deactivate the credential if your workflow requires it:
POST /entity?q=entity={credential-guid},Status.Deactivate()
Use /action when you want to perform a live operational command such as:
- Momentarily unlock a door
- Override a door or floor locking schedule for a time window
- Turn a door buzzer on or off
- Forgive antipassback
- Correct area people-count state
Some live door operations also use /entity, especially when they change the door's current runtime state rather than the long-term access-control model.
By contrast, Configuration uses /entity to define or change the long-term access-control model.
Antipassback and people counting are runtime concepts, not just configuration concepts.
People counting keeps track of whether a person is considered inside or outside an area. Antipassback uses that same movement state to prevent impossible or repeated movements, such as entering twice in a row without a matching exit.
For Web SDK integrations, the practical consequence is:
- Use access rules, areas, and doors to model normal movement
- Use
/actionwhen you need to correct runtime state after an exception, operator intervention, or data mismatch
The runtime correction actions are:
ForgiveAntipassback({cardholder-guid})ModifyPeopleCount({area-guid},{cardholder-guid},true|false)ResetPeopleCount({area-guid})
ModifyPeopleCount(...) simulates an in or out access for a cardholder. If hardware antipassback is used, the operation does not modify the hardware status and is ignored. ResetPeopleCount(...) resets the area's people count and also affects nested areas.
Set a temporary auto-unlock override on a door:
POST /entity?q=entity={door-guid},SetAutoUnlockOverride({unlock},{start-time},{end-time})unlock=true means the override unlocks the door during the time window. start-time and end-time are UTC timestamps.
Remove the current auto-unlock override from a door:
POST /entity?q=entity={door-guid},RemoveAutoUnlockOverride()Note
If no auto-unlock override is set, the Web SDK does not return one consistent empty response. In mixed /entity reads, AutoUnlockOverride can be omitted from Result. When AutoUnlockOverride is the only requested member, the response can be Ok with no Result object at all. Treat both cases as "no current override".
Read whether maintenance mode is currently active on a door:
GET /entity?q=entity={door-guid},MaintenanceModeActiveEnable maintenance mode on a door:
POST /entity?q=entity={door-guid},SetMaintenanceMode(true)Disable maintenance mode on a door:
POST /entity?q=entity={door-guid},SetMaintenanceMode(false)Momentarily unlock a door:
POST /action?q=UnlockDoor({door-guid})Perform the same momentary unlock using the alternate action name:
POST /action?q=Open({door-guid})These two actions have the same behavior. Use whichever name is clearer for your integration. This guide prefers UnlockDoor({door-guid}).
Turn the buzzer off on a door:
POST /action?q=SetBuzzerState({door-guid},false)Forgive antipassback for a cardholder:
POST /action?q=ForgiveAntipassback({cardholder-guid})Raise a lock-state event from a door:
POST /entity?q=entity={door-guid},SetIsLockedAndRaiseEvent(true)Raise an open-state event from a door:
POST /entity?q=entity={door-guid},SetIsOpenAndRaiseEvent(true)Enable the door-held trigger and set its threshold:
POST /entity?q=entity={door-guid},DoorHeld.IsActive=true,DoorHeld.TriggerTime={seconds}If you later need to disable the trigger again, send DoorHeld.IsActive=false in a separate request.
Other operational access-control actions that are often relevant in integrations include:
OverrideLockingScheduleOnDoor({door-guid},{unlock},{start-time},{end-time})OverrideLockingScheduleOnFloor({elevator-guid},{floor-guid},{unlock},{all-floors},{start-time},{end-time})ModifyPeopleCount({area-guid},{cardholder-guid},true|false)ResetPeopleCount({area-guid})
In these schedule-override actions, unlock=true requests free access and unlock=false requests controlled access. start-time and end-time are the UTC bounds of the override. Use all-floors=true to apply the override to all floors of the elevator. These are runtime schedule overrides, not direct replacements for UnlockDoor(...) or Open(...). Successful override calls do not necessarily cause immediate changes to door IsLocked or to the persisted UnlockSchedules / UnlockExceptionSchedules collections. In ModifyPeopleCount({area-guid},{cardholder-guid},true|false), true simulates an in access and false simulates an out access.
- Getting started with Security Center Web SDK: Authentication, your first API call, and Web SDK role setup.
-
The /entity endpoint: The
/entityendpoint and sharedq=query syntax. -
The /action endpoint: The
/actionendpoint and operational commands. - Reference: Well-known GUIDs, card format identifiers, and enumerations.
- Overview
- Connecting to Security Center
- SDK certificates
- Referencing SDK assemblies
- ASP.NET hosting
- SDK compatibility
- Migrating to modern .NET
- Entities
- Entity cache
- Entity loading, cache, and query options
- Detecting entity changes
- Entity change event reference
- Transactions
- Security Center events
- Actions
- Security Desk
- Custom events
- Event-to-actions
- Managing macros
- ReportManager
- ReportManager query reference
- Access control raw events
- DownloadAllRelatedData and StrictResults
- Privileges
- Partitions
- Entity write restrictions
- About custom fields
- About video
- About cameras
- Enrolling a video unit
- Ingesting third-party video
- Archiver and auxiliary archiver roles
- Archive transfer
- About access control
- About cardholders and credentials
- About doors, areas, elevators, and access points
- About access rules and schedules
- About access control units and interface modules
- Enrolling an access control unit
- Door templates
- Visitors
- Mobile credentials
- About threat levels
- About alarms
- About incidents
- Maps
- Logging
- Overview
- Localization
- Certificates
- Lifecycle
- Threading
- State management
- Configuration
- Restricted configuration
- Events
- Queries
- Request manager
- Database
- Entity ownership
- Engine extensions
- Entity mappings
- Server management
- Custom privileges
- Custom entity types
- Resolving non-SDK assemblies
- Deploying plugins
- Modern .NET support
- Overview
- Localization
- Certificates
- Creating modules
- Tasks
- Pages
- Components
- Tile extensions
- Services
- Contextual actions
- Custom actions
- Options extensions
- Configuration pages
- Monitors
- Shared components
- Commands
- Extending events
- Map extensions
- Timeline providers
- Image extractors
- Credential encoders
- Credential readers
- Cardholder fields extractors
- Badge printers
- Content builders
- Dashboard widgets
- Incidents
- Logon providers
- Pinnable content builders
- Custom report pages
- Overview
- Getting started
- Media file formats
- MediaPlayer
- VideoSourceFilter
- MediaExporter
- MediaFile
- G64 converters
- FileCryptingManager
- PlaybackSequenceQuerier
- PlaybackStreamReader
- OverlayFactory
- PtzCoordinatesManager
- AudioTransmitter
- AudioRecorder
- AnalogMonitorController
- Camera blocking
- Overview
- Getting started
- Referencing entities
- Entity operations
- About access control in the Web SDK
- About video in the Web SDK
- Users and user groups
- Partitions
- Custom fields
- Custom card formats
- Actions
- Events and alarms
- Incidents
- Reports
- Tasks
- Macros
- Custom entity types
- System endpoints
- Performance guide
- Reference
- Endpoints
- Constants
- Enumerations
- Under the hood
- Troubleshooting